diff --git a/src/main/java/org/gcube/accounting/datamodel/basetypes/AbstractTaskUsageRecord.java b/src/main/java/org/gcube/accounting/datamodel/basetypes/AbstractTaskUsageRecord.java index 805cc3b..5131123 100644 --- a/src/main/java/org/gcube/accounting/datamodel/basetypes/AbstractTaskUsageRecord.java +++ b/src/main/java/org/gcube/accounting/datamodel/basetypes/AbstractTaskUsageRecord.java @@ -26,15 +26,15 @@ public abstract class AbstractTaskUsageRecord extends BasicUsageRecord { */ private static final long serialVersionUID = -2208425042550641240L; - @NotEmpty + @RequiredField @NotEmpty public static final String TASK_ID = "taskId"; @NotEmptyIfNotNull public static final String REF_JOB_ID = "refJobId"; - @RequiredField @NotEmpty + @NotEmptyIfNotNull public static final String HOST = "host"; @NotEmptyIfNotNull - public static final String REF_HOSTING_NODE = "refHostingNode"; + public static final String REF_HOSTING_NODE_ID = "refHostingNodeId"; @RequiredField @ValidLong @CalculateTaskWallDuration public static final String TASK_START_TIME = "taskStartTime"; @@ -99,16 +99,16 @@ public abstract class AbstractTaskUsageRecord extends BasicUsageRecord { return (String) this.resourceProperties.get(HOST); } - public void setRefHost(String host) throws InvalidValueException { + public void setHost(String host) throws InvalidValueException { setResourceProperty(HOST, host); } - public String getRefHostingNode() { - return (String) this.resourceProperties.get(REF_HOSTING_NODE); + public String getRefHostingNodeId() { + return (String) this.resourceProperties.get(REF_HOSTING_NODE_ID); } - public void setRefHostingNode(String refHostingNode) throws InvalidValueException { - setResourceProperty(REF_HOSTING_NODE, refHostingNode); + public void setRefHostingNodeId(String refHostingNodeId) throws InvalidValueException { + setResourceProperty(REF_HOSTING_NODE_ID, refHostingNodeId); } public Calendar getTaskStartTime() { @@ -155,12 +155,12 @@ public abstract class AbstractTaskUsageRecord extends BasicUsageRecord { } @SuppressWarnings("unchecked") - public Map getInputParameters(){ + public Map getInputParameters(){ return (Map) getResourceProperty(INPUT_PARAMETERS); } @SuppressWarnings("unchecked") - public void setInputParameters(Map inputParameters) throws InvalidValueException{ + public void setInputParameters(Map inputParameters) throws InvalidValueException{ setResourceProperty(INPUT_PARAMETERS, (Comparable) inputParameters); } 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 2a6061e..e85d48f 100644 --- a/src/main/java/org/gcube/accounting/datamodel/basetypes/TestUsageRecord.java +++ b/src/main/java/org/gcube/accounting/datamodel/basetypes/TestUsageRecord.java @@ -3,15 +3,19 @@ */ package org.gcube.accounting.datamodel.basetypes; +import java.io.Serializable; import java.net.URI; import java.net.URISyntaxException; import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; import java.util.UUID; import org.gcube.accounting.datamodel.UsageRecord.OperationResult; import org.gcube.accounting.datamodel.usagerecords.JobUsageRecord; import org.gcube.accounting.datamodel.usagerecords.ServiceUsageRecord; import org.gcube.accounting.datamodel.usagerecords.StorageUsageRecord; +import org.gcube.accounting.datamodel.usagerecords.TaskUsageRecord; import org.gcube.documentstore.exception.InvalidValueException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,13 +41,17 @@ 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_ID = UUID.randomUUID().toString(); 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; + public final static String TEST_TASK_ID = UUID.randomUUID().toString(); + + public final static String TEST_NESTED_MAP = "TestNestedMap"; + private final static long MIN_DURATION = 60; // millisec private final static long MAX_DURATION = 1000; // millisec @@ -179,13 +187,14 @@ public class TestUsageRecord { JobUsageRecord usageRecord = new JobUsageRecord(); try { - usageRecord.setJobId(UUID.randomUUID().toString()); - usageRecord.setJobQualifier(TEST_JOB_QUALIFIER); - usageRecord.setConsumerId(TEST_CONSUMER_ID); usageRecord.setOperationResult(TEST_JOB_OPERATION_RESULT); + usageRecord.setJobId(TEST_JOB_ID); + usageRecord.setJobName(TEST_JOB_NAME); + usageRecord.setJobQualifier(TEST_JOB_QUALIFIER); + Calendar startTime = Calendar.getInstance(); Calendar endTime = Calendar.getInstance(); @@ -195,7 +204,65 @@ public class TestUsageRecord { usageRecord.setJobStartTime(startTime); usageRecord.setJobEndTime(endTime); - usageRecord.setOperationResult(OperationResult.SUCCESS); + + } catch (InvalidValueException e) { + logger.error(" ------ You SHOULD NOT SEE THIS MESSAGE. Error Creating a test Usage Record", e); + } + + return usageRecord; + } + + + /** + * @return + */ + public static TaskUsageRecord createTestTaskUsageRecordExplicitScope() { + + TaskUsageRecord usageRecord = createTestTaskUsageRecordAutomaticScope(); + try { + usageRecord.setScope(TEST_SCOPE); + } catch (InvalidValueException e) { + logger.error(" ------ You SHOULD NOT SEE THIS MESSAGE. Error Setting the Scope", e); + throw new RuntimeException(e); + } + return usageRecord; + } + + /** + * @return + */ + public static TaskUsageRecord createTestTaskUsageRecordAutomaticScope() { + + TaskUsageRecord usageRecord = new TaskUsageRecord(); + try { + usageRecord.setConsumerId(TEST_CONSUMER_ID); + usageRecord.setOperationResult(TEST_JOB_OPERATION_RESULT); + + usageRecord.setTaskId(TEST_TASK_ID); + usageRecord.setTaskId(TEST_JOB_ID); + usageRecord.setHost(TEST_HOST); + + usageRecord.setRefHostingNodeId(UUID.randomUUID().toString()); + + Calendar startTime = Calendar.getInstance(); + Calendar endTime = Calendar.getInstance(); + endTime.setTimeInMillis(startTime.getTimeInMillis() + HALF_DURATION); + startTime.setTimeInMillis(startTime.getTimeInMillis() - HALF_DURATION); + + usageRecord.setTaskStartTime(startTime); + usageRecord.setTaskEndTime(endTime); + + Map inputParameters = new HashMap<>(); + inputParameters.put(TEST_PROPERTY_NAME, TEST_PROPERTY_VALUE); + inputParameters.put(TEST_PROPERTY_VALUE, TEST_PROPERTY_NAME); + + HashMap> parameter = new HashMap<>(); + parameter.put(TEST_PROPERTY_NAME, TEST_PROPERTY_VALUE); + parameter.put(TEST_PROPERTY_VALUE, TEST_PROPERTY_NAME); + + inputParameters.put(TEST_NESTED_MAP, parameter); + + usageRecord.setInputParameters(inputParameters); } catch (InvalidValueException e) { logger.error(" ------ You SHOULD NOT SEE THIS MESSAGE. Error Creating a test Usage Record", e); diff --git a/src/test/java/org/gcube/accounting/datamodel/usagerecords/JobUsageRecordTest.java b/src/test/java/org/gcube/accounting/datamodel/usagerecords/JobUsageRecordTest.java index 7a223a2..6581ca0 100644 --- a/src/test/java/org/gcube/accounting/datamodel/usagerecords/JobUsageRecordTest.java +++ b/src/test/java/org/gcube/accounting/datamodel/usagerecords/JobUsageRecordTest.java @@ -30,8 +30,6 @@ public class JobUsageRecordTest { expectedRequiredFields.add(UsageRecord.SCOPE); expectedRequiredFields.add(UsageRecord.OPERATION_RESULT); expectedRequiredFields.add(AbstractJobUsageRecord.JOB_ID); - expectedRequiredFields.add(AbstractJobUsageRecord.JOB_QUALIFIER); - expectedRequiredFields.add(AbstractJobUsageRecord.JOB_NAME); expectedRequiredFields.add(AbstractJobUsageRecord.JOB_START_TIME); expectedRequiredFields.add(AbstractJobUsageRecord.JOB_END_TIME); return expectedRequiredFields; diff --git a/src/test/java/org/gcube/accounting/datamodel/usagerecords/TaskUsageRecordTest.java b/src/test/java/org/gcube/accounting/datamodel/usagerecords/TaskUsageRecordTest.java new file mode 100644 index 0000000..302b444 --- /dev/null +++ b/src/test/java/org/gcube/accounting/datamodel/usagerecords/TaskUsageRecordTest.java @@ -0,0 +1,72 @@ +/** + * + */ +package org.gcube.accounting.datamodel.usagerecords; + +import java.util.HashSet; +import java.util.Set; + +import org.gcube.accounting.datamodel.UsageRecord; +import org.gcube.accounting.datamodel.basetypes.AbstractTaskUsageRecord; +import org.gcube.accounting.datamodel.basetypes.TestUsageRecord; +import org.gcube.common.scope.api.ScopeProvider; +import org.gcube.documentstore.exception.InvalidValueException; +import org.gcube.documentstore.records.Record; +import org.junit.Assert; +import org.junit.Test; + +/** + * @author Luca Frosini (ISTI - CNR) http://www.lucafrosini.com/ + * + */ +public class TaskUsageRecordTest { + + public static Set getExpectedRequiredFields(){ + Set expectedRequiredFields = new HashSet(); + expectedRequiredFields.add(Record.ID); + expectedRequiredFields.add(UsageRecord.CONSUMER_ID); + expectedRequiredFields.add(UsageRecord.CREATION_TIME); + expectedRequiredFields.add(UsageRecord.RECORD_TYPE); + expectedRequiredFields.add(UsageRecord.SCOPE); + expectedRequiredFields.add(UsageRecord.OPERATION_RESULT); + expectedRequiredFields.add(AbstractTaskUsageRecord.TASK_ID); + expectedRequiredFields.add(AbstractTaskUsageRecord.TASK_START_TIME); + expectedRequiredFields.add(AbstractTaskUsageRecord.TASK_END_TIME); + return expectedRequiredFields; + } + + @Test(expected=InvalidValueException.class) + public void scopeNotSetValidationError() throws InvalidValueException { + ScopeProvider.instance.reset(); + TaskUsageRecord taskUsageRecord = TestUsageRecord.createTestTaskUsageRecordAutomaticScope(); + taskUsageRecord.validate(); + } + + @Test + public void testRequiredFields() throws InvalidValueException{ + ScopeProvider.instance.set(TestUsageRecord.TEST_SCOPE); + TaskUsageRecord taskUsageRecord = TestUsageRecord.createTestTaskUsageRecordAutomaticScope(); + + Set expectedRequiredFields = getExpectedRequiredFields(); + Set gotRequiredFields = taskUsageRecord.getRequiredFields(); + + Assert.assertTrue(expectedRequiredFields.containsAll(gotRequiredFields)); + Assert.assertTrue(gotRequiredFields.containsAll(expectedRequiredFields)); + + taskUsageRecord.validate(); + } + + @Test + public void testRequiredFieldsWithScopeSetExplicitely() throws InvalidValueException{ + TaskUsageRecord taskUsageRecord = TestUsageRecord.createTestTaskUsageRecordExplicitScope(); + taskUsageRecord.setScope(TestUsageRecord.TEST_SCOPE); + + Set expectedRequiredFields = getExpectedRequiredFields(); + Set gotRequiredFields = taskUsageRecord.getRequiredFields(); + + Assert.assertTrue(expectedRequiredFields.containsAll(gotRequiredFields)); + Assert.assertTrue(gotRequiredFields.containsAll(expectedRequiredFields)); + + taskUsageRecord.validate(); + } +}