refs #1117: Accounting lib's StackOverflow
https://support.d4science.org/issues/1117 The bug should be fixed. Some junit tests were added git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/accounting/accounting-lib@119889 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
parent
90ca3ebafd
commit
f9b21e7f9e
|
@ -43,10 +43,11 @@ public abstract class AbstractJobUsageRecord extends BasicUsageRecord {
|
||||||
public static final String JOB_START_TIME = "jobStartTime";
|
public static final String JOB_START_TIME = "jobStartTime";
|
||||||
@RequiredField @ValidLong @CalculateWallDuration
|
@RequiredField @ValidLong @CalculateWallDuration
|
||||||
public static final String JOB_END_TIME = "jobEndTime";
|
public static final String JOB_END_TIME = "jobEndTime";
|
||||||
@MoveToOperationResult
|
@MoveToOperationResult @Deprecated
|
||||||
protected static final String JOB_STATUS = "jobStatus";
|
protected static final String JOB_STATUS = "jobStatus";
|
||||||
@ValidInteger
|
@ValidInteger
|
||||||
public static final String VMS_USED = "vmsUsed";
|
public static final String VMS_USED = "vmsUsed";
|
||||||
|
|
||||||
@ComputedField @ValidLong @CalculateWallDuration
|
@ComputedField @ValidLong @CalculateWallDuration
|
||||||
protected static final String WALL_DURATION = "wallDuration";
|
protected static final String WALL_DURATION = "wallDuration";
|
||||||
|
|
||||||
|
@ -106,7 +107,6 @@ public abstract class AbstractJobUsageRecord extends BasicUsageRecord {
|
||||||
|
|
||||||
public void setJobStartTime(Calendar jobStartTime) throws InvalidValueException {
|
public void setJobStartTime(Calendar jobStartTime) throws InvalidValueException {
|
||||||
setResourceProperty(JOB_START_TIME, jobStartTime.getTimeInMillis());
|
setResourceProperty(JOB_START_TIME, jobStartTime.getTimeInMillis());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Calendar getJobEndTime() {
|
public Calendar getJobEndTime() {
|
||||||
|
@ -116,7 +116,6 @@ public abstract class AbstractJobUsageRecord extends BasicUsageRecord {
|
||||||
|
|
||||||
public void setJobEndTime(Calendar jobEndTime) throws InvalidValueException {
|
public void setJobEndTime(Calendar jobEndTime) throws InvalidValueException {
|
||||||
setResourceProperty(JOB_END_TIME, jobEndTime.getTimeInMillis());
|
setResourceProperty(JOB_END_TIME, jobEndTime.getTimeInMillis());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -144,7 +143,6 @@ public abstract class AbstractJobUsageRecord extends BasicUsageRecord {
|
||||||
long endTime = (Long) this.resourceProperties.get(JOB_END_TIME);
|
long endTime = (Long) this.resourceProperties.get(JOB_END_TIME);
|
||||||
long startTime = (Long) this.resourceProperties.get(JOB_START_TIME);
|
long startTime = (Long) this.resourceProperties.get(JOB_START_TIME);
|
||||||
long wallDuration = endTime - startTime;
|
long wallDuration = endTime - startTime;
|
||||||
setResourceProperty(WALL_DURATION, wallDuration);
|
|
||||||
return wallDuration;
|
return wallDuration;
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
throw new InvalidValueException(String.format("To calculate Wall Duration both %s and %s must be set",
|
throw new InvalidValueException(String.format("To calculate Wall Duration both %s and %s must be set",
|
||||||
|
|
|
@ -5,6 +5,8 @@ package org.gcube.accounting.datamodel.basetypes;
|
||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
import org.gcube.accounting.datamodel.UsageRecord.OperationResult;
|
import org.gcube.accounting.datamodel.UsageRecord.OperationResult;
|
||||||
import org.gcube.accounting.datamodel.usagerecords.JobUsageRecord;
|
import org.gcube.accounting.datamodel.usagerecords.JobUsageRecord;
|
||||||
|
@ -35,6 +37,13 @@ public class TestUsageRecord {
|
||||||
public final static String TEST_PROPERTY_NAME = "TestPropertyName";
|
public final static String TEST_PROPERTY_NAME = "TestPropertyName";
|
||||||
public final static String TEST_PROPERTY_VALUE = "TestPropertyValue";
|
public final static String TEST_PROPERTY_VALUE = "TestPropertyValue";
|
||||||
|
|
||||||
|
|
||||||
|
public final static String TEST_JOB_NAME = "TestJobName";
|
||||||
|
public final static int TEST_VMS_USED = 2;
|
||||||
|
public final static String TEST_JOB_QUALIFIER = "TestJobQualifier";
|
||||||
|
public final static long HALF_DURATION = 10 * 60 * 1000; // 10 min
|
||||||
|
public final static OperationResult TEST_JOB_OPERATION_RESULT = OperationResult.SUCCESS;
|
||||||
|
|
||||||
private final static long MIN_DURATION = 60; // millisec
|
private final static long MIN_DURATION = 60; // millisec
|
||||||
private final static long MAX_DURATION = 1000; // millisec
|
private final static long MAX_DURATION = 1000; // millisec
|
||||||
|
|
||||||
|
@ -170,14 +179,29 @@ public class TestUsageRecord {
|
||||||
|
|
||||||
JobUsageRecord usageRecord = new JobUsageRecord();
|
JobUsageRecord usageRecord = new JobUsageRecord();
|
||||||
try {
|
try {
|
||||||
usageRecord.setConsumerId(TEST_CONSUMER_ID);
|
usageRecord.setJobId(UUID.randomUUID().toString());
|
||||||
usageRecord.setOperationResult(OperationResult.SUCCESS);
|
usageRecord.setJobQualifier(TEST_JOB_QUALIFIER);
|
||||||
//usageRecord.setJobId(JOB_ID);
|
|
||||||
|
usageRecord.setConsumerId(TEST_CONSUMER_ID);
|
||||||
|
usageRecord.setOperationResult(TEST_JOB_OPERATION_RESULT);
|
||||||
|
|
||||||
|
usageRecord.setJobName(TEST_JOB_NAME);
|
||||||
|
|
||||||
|
Calendar startTime = Calendar.getInstance();
|
||||||
|
Calendar endTime = Calendar.getInstance();
|
||||||
|
endTime.setTimeInMillis(startTime.getTimeInMillis() + HALF_DURATION);
|
||||||
|
startTime.setTimeInMillis(startTime.getTimeInMillis() - HALF_DURATION);
|
||||||
|
|
||||||
|
usageRecord.setJobStartTime(startTime);
|
||||||
|
usageRecord.setJobEndTime(endTime);
|
||||||
|
|
||||||
|
usageRecord.setOperationResult(OperationResult.SUCCESS);
|
||||||
|
usageRecord.setVmsUsed(TEST_VMS_USED);
|
||||||
|
|
||||||
|
|
||||||
} catch (InvalidValueException e) {
|
} catch (InvalidValueException e) {
|
||||||
logger.error(" ------ You SHOULD NOT SEE THIS MESSAGE. Error Creating a test Usage Record", e);
|
logger.error(" ------ You SHOULD NOT SEE THIS MESSAGE. Error Creating a test Usage Record", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
return usageRecord;
|
return usageRecord;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package org.gcube.accounting.datamodel.usagerecords;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.gcube.accounting.datamodel.BasicUsageRecord;
|
||||||
|
import org.gcube.accounting.datamodel.BasicUsageRecordUtility;
|
||||||
|
import org.gcube.accounting.datamodel.basetypes.TestUsageRecord;
|
||||||
|
import org.gcube.accounting.exception.InvalidValueException;
|
||||||
|
import org.gcube.common.scope.api.ScopeProvider;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Luca Frosini (ISTI - CNR) http://www.lucafrosini.com/
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class JobUsageRecordTest {
|
||||||
|
|
||||||
|
public static Set<String> getExpectedRequiredFields(){
|
||||||
|
Set<String> expectedRequiredFields = new HashSet<String>();
|
||||||
|
expectedRequiredFields.add(BasicUsageRecordUtility.ID);
|
||||||
|
expectedRequiredFields.add(BasicUsageRecord.CONSUMER_ID);
|
||||||
|
expectedRequiredFields.add(BasicUsageRecord.CREATION_TIME);
|
||||||
|
expectedRequiredFields.add(BasicUsageRecordUtility.USAGE_RECORD_TYPE);
|
||||||
|
expectedRequiredFields.add(BasicUsageRecord.SCOPE);
|
||||||
|
expectedRequiredFields.add(BasicUsageRecord.OPERATION_RESULT);
|
||||||
|
expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractServiceUsageRecord.CALLER_HOST);
|
||||||
|
|
||||||
|
return expectedRequiredFields;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected=InvalidValueException.class)
|
||||||
|
public void scopeNotSetValidationError() throws InvalidValueException {
|
||||||
|
ScopeProvider.instance.reset();
|
||||||
|
ServiceUsageRecord serviceUsageRecord = TestUsageRecord.createTestServiceUsageRecordAutomaticScope();
|
||||||
|
serviceUsageRecord.validate();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRequiredFields() throws InvalidValueException{
|
||||||
|
ScopeProvider.instance.set(TestUsageRecord.TEST_SCOPE);
|
||||||
|
ServiceUsageRecord serviceUsageRecord = TestUsageRecord.createTestServiceUsageRecordAutomaticScope();
|
||||||
|
Set<String> expectedRequiredFields = getExpectedRequiredFields();
|
||||||
|
Set<String> gotRequiredFields = serviceUsageRecord.getRequiredFields();
|
||||||
|
|
||||||
|
Assert.assertTrue(expectedRequiredFields.containsAll(gotRequiredFields));
|
||||||
|
Assert.assertTrue(gotRequiredFields.containsAll(expectedRequiredFields));
|
||||||
|
|
||||||
|
serviceUsageRecord.validate();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRequiredFieldsWithScopeSetExplicitely() throws InvalidValueException{
|
||||||
|
ServiceUsageRecord serviceUsageRecord = TestUsageRecord.createTestServiceUsageRecordAutomaticScope();
|
||||||
|
serviceUsageRecord.setScope(TestUsageRecord.TEST_SCOPE);
|
||||||
|
Set<String> expectedRequiredFields = getExpectedRequiredFields();
|
||||||
|
|
||||||
|
Set<String> gotRequiredFields = serviceUsageRecord.getRequiredFields();
|
||||||
|
|
||||||
|
Assert.assertTrue(expectedRequiredFields.containsAll(gotRequiredFields));
|
||||||
|
Assert.assertTrue(gotRequiredFields.containsAll(expectedRequiredFields));
|
||||||
|
|
||||||
|
serviceUsageRecord.validate();
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,11 +8,12 @@ import java.util.Set;
|
||||||
|
|
||||||
import org.gcube.accounting.datamodel.BasicUsageRecord;
|
import org.gcube.accounting.datamodel.BasicUsageRecord;
|
||||||
import org.gcube.accounting.datamodel.BasicUsageRecordUtility;
|
import org.gcube.accounting.datamodel.BasicUsageRecordUtility;
|
||||||
import org.gcube.accounting.datamodel.basetypes.AbstractStorageUsageRecord.OperationType;
|
|
||||||
import org.gcube.accounting.datamodel.basetypes.TestUsageRecord;
|
import org.gcube.accounting.datamodel.basetypes.TestUsageRecord;
|
||||||
import org.gcube.accounting.exception.InvalidValueException;
|
import org.gcube.accounting.exception.InvalidValueException;
|
||||||
import org.gcube.common.scope.api.ScopeProvider;
|
import org.gcube.common.scope.api.ScopeProvider;
|
||||||
|
import org.junit.After;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
@ -25,6 +26,18 @@ public class StorageUsageRecordTest {
|
||||||
|
|
||||||
private static Logger logger = LoggerFactory.getLogger(StorageUsageRecordTest.class);
|
private static Logger logger = LoggerFactory.getLogger(StorageUsageRecordTest.class);
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void before(){
|
||||||
|
ScopeProvider.instance.set(TestUsageRecord.TEST_SCOPE);
|
||||||
|
logger.trace("Setting {} scope", TestUsageRecord.TEST_SCOPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void after(){
|
||||||
|
ScopeProvider.instance.reset();
|
||||||
|
logger.trace("Scope reset");
|
||||||
|
}
|
||||||
|
|
||||||
public static Set<String> getExpectedRequiredFields(){
|
public static Set<String> getExpectedRequiredFields(){
|
||||||
Set<String> expectedRequiredFields = new HashSet<String>();
|
Set<String> expectedRequiredFields = new HashSet<String>();
|
||||||
expectedRequiredFields.add(BasicUsageRecordUtility.ID);
|
expectedRequiredFields.add(BasicUsageRecordUtility.ID);
|
||||||
|
@ -33,58 +46,54 @@ public class StorageUsageRecordTest {
|
||||||
expectedRequiredFields.add(BasicUsageRecordUtility.USAGE_RECORD_TYPE);
|
expectedRequiredFields.add(BasicUsageRecordUtility.USAGE_RECORD_TYPE);
|
||||||
expectedRequiredFields.add(BasicUsageRecord.SCOPE);
|
expectedRequiredFields.add(BasicUsageRecord.SCOPE);
|
||||||
expectedRequiredFields.add(BasicUsageRecord.OPERATION_RESULT);
|
expectedRequiredFields.add(BasicUsageRecord.OPERATION_RESULT);
|
||||||
expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractStorageUsageRecord.RESOURCE_OWNER);
|
expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractJobUsageRecord.JOB_ID);
|
||||||
expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractStorageUsageRecord.RESOURCE_SCOPE);
|
expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractJobUsageRecord.JOB_QUALIFIER);
|
||||||
expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractStorageUsageRecord.RESOURCE_URI);
|
expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractJobUsageRecord.JOB_NAME);
|
||||||
expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractStorageUsageRecord.PROVIDER_URI);
|
expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractJobUsageRecord.JOB_START_TIME);
|
||||||
expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractStorageUsageRecord.OPERATION_TYPE);
|
expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractJobUsageRecord.JOB_END_TIME);
|
||||||
expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractStorageUsageRecord.DATA_TYPE);
|
|
||||||
expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractStorageUsageRecord.DATA_VOLUME);
|
|
||||||
return expectedRequiredFields;
|
return expectedRequiredFields;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected=InvalidValueException.class)
|
@Test(expected=InvalidValueException.class)
|
||||||
public void scopeNotSetValidationError() throws InvalidValueException {
|
public void scopeNotSetValidationError() throws InvalidValueException {
|
||||||
ScopeProvider.instance.reset();
|
ScopeProvider.instance.reset();
|
||||||
StorageUsageRecord storageUsageRecord = TestUsageRecord.createTestStorageUsageRecordAutomaticScope();
|
JobUsageRecord jobUsageRecord = TestUsageRecord.createTestJobUsageRecordAutomaticScope();
|
||||||
storageUsageRecord.validate();
|
jobUsageRecord.validate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRequiredFields() throws InvalidValueException{
|
public void testRequiredFields() throws InvalidValueException{
|
||||||
ScopeProvider.instance.set(TestUsageRecord.TEST_SCOPE);
|
JobUsageRecord jobUsageRecord = TestUsageRecord.createTestJobUsageRecordAutomaticScope();
|
||||||
StorageUsageRecord storageUsageRecord = TestUsageRecord.createTestStorageUsageRecordAutomaticScope();
|
|
||||||
Set<String> expectedRequiredFields = getExpectedRequiredFields();
|
Set<String> expectedRequiredFields = getExpectedRequiredFields();
|
||||||
Set<String> gotRequiredFields = storageUsageRecord.getRequiredFields();
|
Set<String> gotRequiredFields = jobUsageRecord.getRequiredFields();
|
||||||
|
|
||||||
Assert.assertTrue(expectedRequiredFields.containsAll(gotRequiredFields));
|
Assert.assertTrue(expectedRequiredFields.containsAll(gotRequiredFields));
|
||||||
Assert.assertTrue(gotRequiredFields.containsAll(expectedRequiredFields));
|
Assert.assertTrue(gotRequiredFields.containsAll(expectedRequiredFields));
|
||||||
|
|
||||||
storageUsageRecord.validate();
|
jobUsageRecord.validate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRequiredFieldsWithScopeSetExplicitely() throws InvalidValueException{
|
public void testRequiredFieldsWithScopeSetExplicitely() throws InvalidValueException{
|
||||||
StorageUsageRecord storageUsageRecord = TestUsageRecord.createTestStorageUsageRecordAutomaticScope();
|
ScopeProvider.instance.reset();
|
||||||
storageUsageRecord.setScope(TestUsageRecord.TEST_SCOPE);
|
JobUsageRecord jobUsageRecord = TestUsageRecord.createTestJobUsageRecordAutomaticScope();
|
||||||
Set<String> expectedRequiredFields = getExpectedRequiredFields();
|
Assert.assertTrue(jobUsageRecord.getScope()==null);
|
||||||
|
jobUsageRecord.setScope(TestUsageRecord.TEST_SCOPE);
|
||||||
|
|
||||||
Set<String> gotRequiredFields = storageUsageRecord.getRequiredFields();
|
Set<String> expectedRequiredFields = getExpectedRequiredFields();
|
||||||
|
Set<String> gotRequiredFields = jobUsageRecord.getRequiredFields();
|
||||||
|
|
||||||
Assert.assertTrue(expectedRequiredFields.containsAll(gotRequiredFields));
|
Assert.assertTrue(expectedRequiredFields.containsAll(gotRequiredFields));
|
||||||
Assert.assertTrue(gotRequiredFields.containsAll(expectedRequiredFields));
|
Assert.assertTrue(gotRequiredFields.containsAll(expectedRequiredFields));
|
||||||
|
|
||||||
storageUsageRecord.validate();
|
jobUsageRecord.validate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void signBasedOnOperation() throws InvalidValueException {
|
public void testWallDuration() throws InvalidValueException{
|
||||||
ScopeProvider.instance.set(TestUsageRecord.TEST_SCOPE);
|
JobUsageRecord jobUsageRecord = TestUsageRecord.createTestJobUsageRecordAutomaticScope();
|
||||||
StorageUsageRecord storageUsageRecord = TestUsageRecord.createTestStorageUsageRecordAutomaticScope();
|
Assert.assertTrue(jobUsageRecord.getWallDuration()==(TestUsageRecord.HALF_DURATION*2));
|
||||||
logger.debug("{}", storageUsageRecord.toString());
|
jobUsageRecord.validate();
|
||||||
storageUsageRecord.setOperationType(OperationType.DELETE);
|
|
||||||
storageUsageRecord.validate();
|
|
||||||
logger.debug("{}", storageUsageRecord.toString());
|
|
||||||
Assert.assertTrue(storageUsageRecord.getDataVolume()<0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue