diff --git a/src/main/java/org/gcube/accounting/datamodel/basetypes/AbstractJobUsageRecord.java b/src/main/java/org/gcube/accounting/datamodel/basetypes/AbstractJobUsageRecord.java index 3f64647..38ba487 100644 --- a/src/main/java/org/gcube/accounting/datamodel/basetypes/AbstractJobUsageRecord.java +++ b/src/main/java/org/gcube/accounting/datamodel/basetypes/AbstractJobUsageRecord.java @@ -43,10 +43,11 @@ public abstract class AbstractJobUsageRecord extends BasicUsageRecord { public static final String JOB_START_TIME = "jobStartTime"; @RequiredField @ValidLong @CalculateWallDuration public static final String JOB_END_TIME = "jobEndTime"; - @MoveToOperationResult + @MoveToOperationResult @Deprecated protected static final String JOB_STATUS = "jobStatus"; @ValidInteger public static final String VMS_USED = "vmsUsed"; + @ComputedField @ValidLong @CalculateWallDuration protected static final String WALL_DURATION = "wallDuration"; @@ -106,7 +107,6 @@ public abstract class AbstractJobUsageRecord extends BasicUsageRecord { public void setJobStartTime(Calendar jobStartTime) throws InvalidValueException { setResourceProperty(JOB_START_TIME, jobStartTime.getTimeInMillis()); - } public Calendar getJobEndTime() { @@ -116,7 +116,6 @@ public abstract class AbstractJobUsageRecord extends BasicUsageRecord { public void setJobEndTime(Calendar jobEndTime) throws InvalidValueException { 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 startTime = (Long) this.resourceProperties.get(JOB_START_TIME); long wallDuration = endTime - startTime; - setResourceProperty(WALL_DURATION, wallDuration); return wallDuration; }catch(Exception e){ throw new InvalidValueException(String.format("To calculate Wall Duration both %s and %s must be set", diff --git a/src/main/java/org/gcube/accounting/datamodel/basetypes/TestUsageRecord.java b/src/main/java/org/gcube/accounting/datamodel/basetypes/TestUsageRecord.java index abc21a0..eff96e8 100644 --- a/src/main/java/org/gcube/accounting/datamodel/basetypes/TestUsageRecord.java +++ b/src/main/java/org/gcube/accounting/datamodel/basetypes/TestUsageRecord.java @@ -5,6 +5,8 @@ package org.gcube.accounting.datamodel.basetypes; import java.net.URI; import java.net.URISyntaxException; +import java.util.Calendar; +import java.util.UUID; import org.gcube.accounting.datamodel.UsageRecord.OperationResult; 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_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 MAX_DURATION = 1000; // millisec @@ -170,14 +179,29 @@ public class TestUsageRecord { JobUsageRecord usageRecord = new JobUsageRecord(); try { - usageRecord.setConsumerId(TEST_CONSUMER_ID); - usageRecord.setOperationResult(OperationResult.SUCCESS); - //usageRecord.setJobId(JOB_ID); + usageRecord.setJobId(UUID.randomUUID().toString()); + usageRecord.setJobQualifier(TEST_JOB_QUALIFIER); + + 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) { logger.error(" ------ You SHOULD NOT SEE THIS MESSAGE. Error Creating a test Usage Record", e); } + return usageRecord; } } diff --git a/src/test/java/org/gcube/accounting/datamodel/usagerecords/JobUsageRecordTest.java b/src/test/java/org/gcube/accounting/datamodel/usagerecords/JobUsageRecordTest.java new file mode 100644 index 0000000..60eccc5 --- /dev/null +++ b/src/test/java/org/gcube/accounting/datamodel/usagerecords/JobUsageRecordTest.java @@ -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 getExpectedRequiredFields(){ + Set expectedRequiredFields = new HashSet(); + 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 expectedRequiredFields = getExpectedRequiredFields(); + Set 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 expectedRequiredFields = getExpectedRequiredFields(); + + Set gotRequiredFields = serviceUsageRecord.getRequiredFields(); + + Assert.assertTrue(expectedRequiredFields.containsAll(gotRequiredFields)); + Assert.assertTrue(gotRequiredFields.containsAll(expectedRequiredFields)); + + serviceUsageRecord.validate(); + } +} diff --git a/src/test/java/org/gcube/accounting/datamodel/usagerecords/StorageUsageRecordTest.java b/src/test/java/org/gcube/accounting/datamodel/usagerecords/StorageUsageRecordTest.java index fda8254..8a9cba1 100644 --- a/src/test/java/org/gcube/accounting/datamodel/usagerecords/StorageUsageRecordTest.java +++ b/src/test/java/org/gcube/accounting/datamodel/usagerecords/StorageUsageRecordTest.java @@ -8,11 +8,12 @@ import java.util.Set; import org.gcube.accounting.datamodel.BasicUsageRecord; 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.exception.InvalidValueException; import org.gcube.common.scope.api.ScopeProvider; +import org.junit.After; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,6 +26,18 @@ public class StorageUsageRecordTest { 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 getExpectedRequiredFields(){ Set expectedRequiredFields = new HashSet(); expectedRequiredFields.add(BasicUsageRecordUtility.ID); @@ -33,58 +46,54 @@ public class StorageUsageRecordTest { expectedRequiredFields.add(BasicUsageRecordUtility.USAGE_RECORD_TYPE); expectedRequiredFields.add(BasicUsageRecord.SCOPE); expectedRequiredFields.add(BasicUsageRecord.OPERATION_RESULT); - expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractStorageUsageRecord.RESOURCE_OWNER); - expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractStorageUsageRecord.RESOURCE_SCOPE); - expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractStorageUsageRecord.RESOURCE_URI); - expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractStorageUsageRecord.PROVIDER_URI); - expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractStorageUsageRecord.OPERATION_TYPE); - expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractStorageUsageRecord.DATA_TYPE); - expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractStorageUsageRecord.DATA_VOLUME); + expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractJobUsageRecord.JOB_ID); + expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractJobUsageRecord.JOB_QUALIFIER); + expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractJobUsageRecord.JOB_NAME); + expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractJobUsageRecord.JOB_START_TIME); + expectedRequiredFields.add(org.gcube.accounting.datamodel.basetypes.AbstractJobUsageRecord.JOB_END_TIME); return expectedRequiredFields; } @Test(expected=InvalidValueException.class) public void scopeNotSetValidationError() throws InvalidValueException { ScopeProvider.instance.reset(); - StorageUsageRecord storageUsageRecord = TestUsageRecord.createTestStorageUsageRecordAutomaticScope(); - storageUsageRecord.validate(); + JobUsageRecord jobUsageRecord = TestUsageRecord.createTestJobUsageRecordAutomaticScope(); + jobUsageRecord.validate(); } @Test public void testRequiredFields() throws InvalidValueException{ - ScopeProvider.instance.set(TestUsageRecord.TEST_SCOPE); - StorageUsageRecord storageUsageRecord = TestUsageRecord.createTestStorageUsageRecordAutomaticScope(); + JobUsageRecord jobUsageRecord = TestUsageRecord.createTestJobUsageRecordAutomaticScope(); + Set expectedRequiredFields = getExpectedRequiredFields(); - Set gotRequiredFields = storageUsageRecord.getRequiredFields(); + Set gotRequiredFields = jobUsageRecord.getRequiredFields(); Assert.assertTrue(expectedRequiredFields.containsAll(gotRequiredFields)); Assert.assertTrue(gotRequiredFields.containsAll(expectedRequiredFields)); - storageUsageRecord.validate(); + jobUsageRecord.validate(); } @Test public void testRequiredFieldsWithScopeSetExplicitely() throws InvalidValueException{ - StorageUsageRecord storageUsageRecord = TestUsageRecord.createTestStorageUsageRecordAutomaticScope(); - storageUsageRecord.setScope(TestUsageRecord.TEST_SCOPE); - Set expectedRequiredFields = getExpectedRequiredFields(); + ScopeProvider.instance.reset(); + JobUsageRecord jobUsageRecord = TestUsageRecord.createTestJobUsageRecordAutomaticScope(); + Assert.assertTrue(jobUsageRecord.getScope()==null); + jobUsageRecord.setScope(TestUsageRecord.TEST_SCOPE); - Set gotRequiredFields = storageUsageRecord.getRequiredFields(); + Set expectedRequiredFields = getExpectedRequiredFields(); + Set gotRequiredFields = jobUsageRecord.getRequiredFields(); Assert.assertTrue(expectedRequiredFields.containsAll(gotRequiredFields)); Assert.assertTrue(gotRequiredFields.containsAll(expectedRequiredFields)); - storageUsageRecord.validate(); + jobUsageRecord.validate(); } @Test - public void signBasedOnOperation() throws InvalidValueException { - ScopeProvider.instance.set(TestUsageRecord.TEST_SCOPE); - StorageUsageRecord storageUsageRecord = TestUsageRecord.createTestStorageUsageRecordAutomaticScope(); - logger.debug("{}", storageUsageRecord.toString()); - storageUsageRecord.setOperationType(OperationType.DELETE); - storageUsageRecord.validate(); - logger.debug("{}", storageUsageRecord.toString()); - Assert.assertTrue(storageUsageRecord.getDataVolume()<0); + public void testWallDuration() throws InvalidValueException{ + JobUsageRecord jobUsageRecord = TestUsageRecord.createTestJobUsageRecordAutomaticScope(); + Assert.assertTrue(jobUsageRecord.getWallDuration()==(TestUsageRecord.HALF_DURATION*2)); + jobUsageRecord.validate(); } }