diff --git a/Core/test/unit/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/GetArtifactsTest.java b/Core/test/unit/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceInfoUtilitiesTest.java similarity index 77% rename from Core/test/unit/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/GetArtifactsTest.java rename to Core/test/unit/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceInfoUtilitiesTest.java index ebb7db601a..f1c02701b9 100644 --- a/Core/test/unit/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/GetArtifactsTest.java +++ b/Core/test/unit/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/DataSourceInfoUtilitiesTest.java @@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.datasourcesummary.datamodel; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.Date; import java.util.List; import org.junit.Assert; import org.junit.Rule; @@ -35,6 +36,7 @@ import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.autopsy.testutils.TskMockUtils; import static org.mockito.Mockito.*; +import org.sleuthkit.autopsy.testutils.RandomizationUtils; import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE; import org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE; import org.sleuthkit.datamodel.BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE; @@ -42,7 +44,7 @@ import org.sleuthkit.datamodel.BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALU /** * Unit tests for DataSourceInfoUtilities.getArtifacts */ -public class GetArtifactsTest { +public class DataSourceInfoUtilitiesTest { @Rule public ExpectedException thrown = ExpectedException.none(); @@ -145,37 +147,14 @@ public class GetArtifactsTest { List toRet = new ArrayList<>(); for (int i = 0; i < values.size(); i++) { - toRet.add(TskMockUtils.mockArtifact(new BlackboardArtifact.Type(artifactType), 1000 + i, dataSource, + toRet.add(TskMockUtils.getArtifact(new BlackboardArtifact.Type(artifactType), 1000 + i, dataSource, attrMaker.make(attrType, "TEST SOURCE", values.get(i)))); } return toRet; } - /** - * Returns list in 0, n-1, 1, n-2 ... order. Deterministic so same results - * each time, but not in original order. - * - * @return Mixed up list. - */ - private List getMixedUp(List list) { - int forward = 0; - int backward = list.size() - 1; - List newList = new ArrayList<>(); - while (forward <= backward) { - newList.add(list.get(forward)); - - if (forward < backward) { - newList.add(list.get(backward)); - } - - forward++; - backward--; - } - - return newList; - } /** * Does a basic test passing a list of generated artifacts in mixed up order @@ -194,11 +173,11 @@ public class GetArtifactsTest { private void testSorted(ARTIFACT_TYPE artifactType, ATTRIBUTE_TYPE attrType, List values, AttrMaker attrMaker, SortOrder sortOrder, int count) throws TskCoreException { - DataSource dataSource = TskMockUtils.mockDataSource(1); + DataSource dataSource = TskMockUtils.getDataSource(1); List sortedArtifacts = getArtifacts(artifactType, new BlackboardAttribute.Type(attrType), dataSource, values, attrMaker); - List mixedUpArtifacts = getMixedUp(sortedArtifacts); + List mixedUpArtifacts = RandomizationUtils.getMixedUp(sortedArtifacts); List expectedArtifacts = count == 0 ? sortedArtifacts @@ -281,11 +260,11 @@ public class GetArtifactsTest { private void testFailOnBadAttrType(BlackboardArtifact.Type artifactType, BlackboardAttribute.Type attributeType, T val, AttrMaker attrMaker) throws TskCoreException { - DataSource dataSource = TskMockUtils.mockDataSource(1); + DataSource dataSource = TskMockUtils.getDataSource(1); List artifacts = Arrays.asList( - TskMockUtils.mockArtifact(artifactType, 2, dataSource, attrMaker.make(attributeType, "TEST SOURCE", val)), - TskMockUtils.mockArtifact(artifactType, 3, dataSource, attrMaker.make(attributeType, "TEST SOURCE", val)) + TskMockUtils.getArtifact(artifactType, 2, dataSource, attrMaker.make(attributeType, "TEST SOURCE", val)), + TskMockUtils.getArtifact(artifactType, 3, dataSource, attrMaker.make(attributeType, "TEST SOURCE", val)) ); test(artifactType, dataSource, @@ -319,18 +298,18 @@ public class GetArtifactsTest { @Test public void testPurgeAttrNotPresent() throws TskCoreException { long day = 24 * 60 * 60; - DataSource dataSource = TskMockUtils.mockDataSource(1); + DataSource dataSource = TskMockUtils.getDataSource(1); BlackboardArtifact.Type ART_TYPE = new BlackboardArtifact.Type(ARTIFACT_TYPE.TSK_PROG_RUN); - BlackboardArtifact mock1 = TskMockUtils.mockArtifact(ART_TYPE, 10, dataSource, + BlackboardArtifact mock1 = TskMockUtils.getArtifact(ART_TYPE, 10, dataSource, new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_COUNT, "TEST SOURCE", 5), new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_DATETIME, "TEST SOURCE", day)); - BlackboardArtifact mock2 = TskMockUtils.mockArtifact(ART_TYPE, 20, dataSource, + BlackboardArtifact mock2 = TskMockUtils.getArtifact(ART_TYPE, 20, dataSource, new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_COUNT, "TEST SOURCE", 6)); - BlackboardArtifact mock3 = TskMockUtils.mockArtifact(ART_TYPE, 30, dataSource, + BlackboardArtifact mock3 = TskMockUtils.getArtifact(ART_TYPE, 30, dataSource, new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_COUNT, "TEST SOURCE", 7), new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_DATETIME, "TEST SOURCE", 3 * day)); @@ -348,18 +327,18 @@ public class GetArtifactsTest { @Test public void testMultAttrsPresent() throws TskCoreException { long day = 24 * 60 * 60; - DataSource dataSource = TskMockUtils.mockDataSource(1); + DataSource dataSource = TskMockUtils.getDataSource(1); BlackboardArtifact.Type ART_TYPE = new BlackboardArtifact.Type(ARTIFACT_TYPE.TSK_PROG_RUN); - BlackboardArtifact mock1 = TskMockUtils.mockArtifact(ART_TYPE, 10, dataSource, + BlackboardArtifact mock1 = TskMockUtils.getArtifact(ART_TYPE, 10, dataSource, new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_COUNT, "TEST SOURCE", 7), new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_DATETIME, "TEST SOURCE", day)); - BlackboardArtifact mock2 = TskMockUtils.mockArtifact(ART_TYPE, 20, dataSource, + BlackboardArtifact mock2 = TskMockUtils.getArtifact(ART_TYPE, 20, dataSource, new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_COUNT, "TEST SOURCE", 6)); - BlackboardArtifact mock3 = TskMockUtils.mockArtifact(ART_TYPE, 30, dataSource, + BlackboardArtifact mock3 = TskMockUtils.getArtifact(ART_TYPE, 30, dataSource, new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_COUNT, "TEST SOURCE", 5), new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_DATETIME, "TEST SOURCE", 3 * day)); @@ -377,7 +356,7 @@ public class GetArtifactsTest { @Test public void testTskCoreExceptionThrown() throws TskCoreException { test(new BlackboardArtifact.Type(ARTIFACT_TYPE.TSK_ACCOUNT), - TskMockUtils.mockDataSource(1), + TskMockUtils.getDataSource(1), new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_ACCOUNT_TYPE), SortOrder.ASCENDING, 0, @@ -390,7 +369,7 @@ public class GetArtifactsTest { @Test public void testThrowOnLessThan0() throws TskCoreException { test(new BlackboardArtifact.Type(ARTIFACT_TYPE.TSK_ACCOUNT), - TskMockUtils.mockDataSource(1), + TskMockUtils.getDataSource(1), new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_ACCOUNT_TYPE), SortOrder.ASCENDING, -1, @@ -403,7 +382,7 @@ public class GetArtifactsTest { @Test public void testEmptyListReturned() throws TskCoreException { test(new BlackboardArtifact.Type(ARTIFACT_TYPE.TSK_ACCOUNT), - TskMockUtils.mockDataSource(1), + TskMockUtils.getDataSource(1), new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_ACCOUNT_TYPE), SortOrder.ASCENDING, 0, @@ -412,4 +391,67 @@ public class GetArtifactsTest { Collections.emptyList(), null); } + + private interface GetAttrVal { + public T getOrNull(BlackboardArtifact artifact, BlackboardAttribute.Type type); + } + + private void testNullAttrValue(String id, GetAttrVal getter, ARTIFACT_TYPE artifactType, + ATTRIBUTE_TYPE attributeType, T nonNullVal) + throws TskCoreException { + + BlackboardAttribute.Type attrType = new BlackboardAttribute.Type(attributeType); + BlackboardArtifact.Type artType = new BlackboardArtifact.Type(artifactType); + + BlackboardArtifact noAttribute = TskMockUtils.getArtifact(artType, 1000, + TskMockUtils.getDataSource(1), new ArrayList<>()); + + T nullValue = getter.getOrNull(noAttribute, attrType); + Assert.assertNull(String.format("Expected function %s to return null when no attribute present", id), nullValue); + + BlackboardArtifact hasAttribute = TskMockUtils.getArtifact(artType, 1000, + TskMockUtils.getDataSource(1), TskMockUtils.getAttribute(attributeType, nonNullVal)); + + T valueReceived = getter.getOrNull(hasAttribute, attrType); + + Assert.assertEquals(String.format("%s did not return the same value present in the attribute", id), nonNullVal, valueReceived); + } + + @Test + public void testGetStringOrNull() throws TskCoreException { + testNullAttrValue("getStringOrNull", DataSourceInfoUtilities::getStringOrNull, + ARTIFACT_TYPE.TSK_ACCOUNT, ATTRIBUTE_TYPE.TSK_ACCOUNT_TYPE, "Skype"); + } + + @Test + public void testGetIntOrNull() throws TskCoreException { + testNullAttrValue("getIntOrNull", DataSourceInfoUtilities::getIntOrNull, + ARTIFACT_TYPE.TSK_PROG_RUN, ATTRIBUTE_TYPE.TSK_COUNT, 16); + } + + @Test + public void testGetLongOrNull() throws TskCoreException { + testNullAttrValue("getLongOrNull", DataSourceInfoUtilities::getLongOrNull, + ARTIFACT_TYPE.TSK_ASSOCIATED_OBJECT, ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT, 1001L); + } + + @Test + public void testGetDateOrNull() throws TskCoreException { + BlackboardAttribute.Type attrType = new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME); + BlackboardArtifact.Type artType = new BlackboardArtifact.Type(ARTIFACT_TYPE.TSK_BLUETOOTH_PAIRING); + + long dateTime = 24 * 60 * 60 *42; + + BlackboardArtifact noAttribute = TskMockUtils.getArtifact(artType, 1000, + TskMockUtils.getDataSource(1), new ArrayList<>()); + + Date nullValue = DataSourceInfoUtilities.getDateOrNull(noAttribute, attrType); + Assert.assertNull(nullValue); + + BlackboardArtifact hasAttribute = TskMockUtils.getArtifact(artType, 1000, + TskMockUtils.getDataSource(1), TskMockUtils.getAttribute(ATTRIBUTE_TYPE.TSK_DATETIME, dateTime)); + + Date curVal = DataSourceInfoUtilities.getDateOrNull(hasAttribute, attrType); + Assert.assertEquals(dateTime, curVal.getTime() / 1000); + } } diff --git a/Core/test/unit/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/UserActivitySummaryTests.java b/Core/test/unit/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/UserActivitySummaryTest.java similarity index 75% rename from Core/test/unit/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/UserActivitySummaryTests.java rename to Core/test/unit/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/UserActivitySummaryTest.java index 53e908fb19..48a79f58f3 100644 --- a/Core/test/unit/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/UserActivitySummaryTests.java +++ b/Core/test/unit/src/org/sleuthkit/autopsy/datasourcesummary/datamodel/UserActivitySummaryTest.java @@ -19,17 +19,18 @@ package org.sleuthkit.autopsy.datasourcesummary.datamodel; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import org.apache.commons.lang3.tuple.Pair; import org.junit.Assert; import static org.junit.Assert.fail; -import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.mock; @@ -58,7 +59,7 @@ import org.sleuthkit.datamodel.TskCoreException; /** * Tests for UserActivitySummary. */ -public class UserActivitySummaryTests { +public class UserActivitySummaryTest { private interface DataFunction { List retrieve(UserActivitySummary userActivitySummary, DataSource datasource, int count) throws @@ -128,7 +129,7 @@ public class UserActivitySummaryTests { UserActivitySummary summary = getTestClass(tskPair.getLeft(), false, null); try { - funct.retrieve(summary, TskMockUtils.mockDataSource(1), -1); + funct.retrieve(summary, TskMockUtils.getDataSource(1), -1); } catch (IllegalArgumentException ignored) { // this exception is expected so continue if getArtifacts never called verify(tskPair.getRight(), never().description( @@ -180,7 +181,7 @@ public class UserActivitySummaryTests { int count = 10; Pair tskPair = getArtifactsTSKMock(new ArrayList<>()); UserActivitySummary summary = getTestClass(tskPair.getLeft(), false, null); - List retArr = funct.retrieve(summary, TskMockUtils.mockDataSource(dataSourceId), count); + List retArr = funct.retrieve(summary, TskMockUtils.getDataSource(dataSourceId), count); Assert.assertTrue(String.format("Expected non null empty list returned from %s", id), retArr != null); Assert.assertTrue(String.format("Expected non null empty list returned from %s", id), retArr.isEmpty()); @@ -195,13 +196,59 @@ public class UserActivitySummaryTests { } } - // does not contain excluded - // ROOT HUB - // queries correct data sources (i.e. the 3 messages) - // sorted and limited appropriately + private static List EXCLUDED_DEVICES = Arrays.asList("ROOT_HUB", "ROOT_HUB20"); + private static BlackboardArtifact getRecentDeviceArtifact(long artifactId, DataSource dataSource, + String deviceId, String deviceMake, String deviceModel, Long date) throws TskCoreException { + + return TskMockUtils.getArtifact(new BlackboardArtifact.Type(ARTIFACT_TYPE.TSK_DEVICE_ATTACHED), artifactId, dataSource, + TskMockUtils.getAttribute(ATTRIBUTE_TYPE.TSK_DEVICE_ID, deviceId), + TskMockUtils.getAttribute(ATTRIBUTE_TYPE.TSK_DATETIME, date), + TskMockUtils.getAttribute(ATTRIBUTE_TYPE.TSK_DEVICE_MAKE, deviceMake), + TskMockUtils.getAttribute(ATTRIBUTE_TYPE.TSK_DEVICE_MODEL, deviceModel) + ); + } - // public List getRecentDomains(DataSource dataSource, int count) throws TskCoreException, SleuthkitCaseProvider.SleuthkitCaseProviderException - // public List getMostRecentWebSearches(DataSource dataSource, int count) throws SleuthkitCaseProvider.SleuthkitCaseProviderException, TskCoreException - // public List getRecentDevices(DataSource dataSource, int count) throws SleuthkitCaseProviderException, TskCoreException + @Test + public void testRecentDevicesFiltering() throws TskCoreException, NoServiceProviderException, + SleuthkitCaseProviderException, TranslationException { + + long dataSourceId = 1; + int count = 10; + long time = 24 * 60 * 60 * 42; + String acceptedDevice = "ACCEPTED DEVICE"; + + DataSource ds = TskMockUtils.getDataSource(dataSourceId); + + List allKeys = new ArrayList<>(EXCLUDED_DEVICES); + allKeys.add(acceptedDevice); + + List artifacts = IntStream.range(0, allKeys.size()) + .mapToObj((idx) -> { + String key = allKeys.get(idx); + try { + return getRecentDeviceArtifact(1000L + idx, ds, "ID " + key, "MAKE " + key, key, time); + } catch (TskCoreException ex) { + fail("Unable to create artifacts correctly"); + return null; + } + }) + .collect(Collectors.toList()); + + Pair tskPair = getArtifactsTSKMock(artifacts); + UserActivitySummary summary = getTestClass(tskPair.getLeft(), false, null); + List results = summary.getRecentDevices(ds, count); + + Assert.assertEquals(1, results.size()); + Assert.assertEquals(acceptedDevice, results.get(0).getDeviceModel()); + Assert.assertEquals("MAKE " + acceptedDevice, results.get(0).getDeviceMake()); + Assert.assertEquals("ID " + acceptedDevice, results.get(0).getDeviceId()); + Assert.assertEquals(time, results.get(0).getDateAccessed().getTime() / 1000); + } + + @Test + public void testRecentDevicesLimiting() { + + } + } diff --git a/Core/test/unit/src/org/sleuthkit/autopsy/discovery/search/DomainSearchTestUtils.java b/Core/test/unit/src/org/sleuthkit/autopsy/discovery/search/DomainSearchTestUtils.java index ffadb3a16b..9596ae432f 100755 --- a/Core/test/unit/src/org/sleuthkit/autopsy/discovery/search/DomainSearchTestUtils.java +++ b/Core/test/unit/src/org/sleuthkit/autopsy/discovery/search/DomainSearchTestUtils.java @@ -32,7 +32,7 @@ public class DomainSearchTestUtils { public static ResultDomain mockDomainResult(String domain, long start, long end, long totalVisits, long visits, long filesDownloaded, long dataSourceId) { - Content dataSource = TskMockUtils.mockDataSource(dataSourceId); + Content dataSource = TskMockUtils.getDataSource(dataSourceId); return new ResultDomain(domain, start, end, totalVisits, visits, filesDownloaded, dataSource); } diff --git a/Core/test/unit/src/org/sleuthkit/autopsy/testutils/RandomizationUtils.java b/Core/test/unit/src/org/sleuthkit/autopsy/testutils/RandomizationUtils.java new file mode 100644 index 0000000000..0f9636f296 --- /dev/null +++ b/Core/test/unit/src/org/sleuthkit/autopsy/testutils/RandomizationUtils.java @@ -0,0 +1,53 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2020 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.testutils; + +import java.util.ArrayList; +import java.util.List; + +/** + * Tools for pseudo-randomization. + */ +public class RandomizationUtils { + + /** + * Returns list in 0, n-1, 1, n-2 ... order. Deterministic so same results + * each time, but not in original order. + * + * @return Mixed up list. + */ + public static List getMixedUp(List list) { + int forward = 0; + int backward = list.size() - 1; + + List newList = new ArrayList<>(); + while (forward <= backward) { + newList.add(list.get(forward)); + + if (forward < backward) { + newList.add(list.get(backward)); + } + + forward++; + backward--; + } + + return newList; + } +} diff --git a/Core/test/unit/src/org/sleuthkit/autopsy/testutils/TskMockUtils.java b/Core/test/unit/src/org/sleuthkit/autopsy/testutils/TskMockUtils.java index 0982671d4a..4017e8608e 100644 --- a/Core/test/unit/src/org/sleuthkit/autopsy/testutils/TskMockUtils.java +++ b/Core/test/unit/src/org/sleuthkit/autopsy/testutils/TskMockUtils.java @@ -18,9 +18,8 @@ */ package org.sleuthkit.autopsy.testutils; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.logging.ConsoleHandler; @@ -37,6 +36,7 @@ import org.sleuthkit.autopsy.texttranslation.TextTranslationService; import org.sleuthkit.autopsy.texttranslation.TranslationException; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; +import org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE; import org.sleuthkit.datamodel.DataSource; import org.sleuthkit.datamodel.TskCoreException; @@ -53,7 +53,7 @@ public class TskMockUtils { * * @return The mocked datasource. */ - public static DataSource mockDataSource(long dataSourceId) { + public static DataSource getDataSource(long dataSourceId) { DataSource dataSource = mock(DataSource.class); when(dataSource.getName()).thenReturn(""); when(dataSource.getId()).thenReturn(dataSourceId); @@ -74,7 +74,7 @@ public class TskMockUtils { * * @throws TskCoreException */ - public static BlackboardArtifact mockArtifact(BlackboardArtifact.Type artifactType, long artifactId, + public static BlackboardArtifact getArtifact(BlackboardArtifact.Type artifactType, long artifactId, DataSource dataSource, BlackboardAttribute... attributes) throws TskCoreException { BlackboardArtifact artifact = mock(BlackboardArtifact.class); @@ -97,6 +97,55 @@ public class TskMockUtils { when(artifact.getDataSource()).thenReturn(dataSource); return artifact; } + + public static BlackboardArtifact getArtifact(BlackboardArtifact.Type artifactType, long artifactId, + DataSource dataSource, List attributes) throws TskCoreException { + + return getArtifact(artifactType, artifactId, dataSource, attributes.toArray(new BlackboardAttribute[attributes.size()])); + } + + private static final String DEFAULT_ATTR_SOURCE = "TEST SOURCE"; + + public static BlackboardAttribute getAttribute(ATTRIBUTE_TYPE attrType, Object value) { + + return getAttribute(new BlackboardAttribute.Type(attrType), DEFAULT_ATTR_SOURCE, value); + } + + public static BlackboardAttribute getAttribute(BlackboardAttribute.Type attrType, String source, Object value) { + switch (attrType.getValueType()) { + case STRING: + case JSON: + if (value instanceof String) { + return new BlackboardAttribute(attrType, source, (String) value); + } + break; + case DATETIME: + case LONG: + if (value instanceof Long) { + return new BlackboardAttribute(attrType, source, (Long) value); + } + break; + case INTEGER: + if (value instanceof Integer) { + return new BlackboardAttribute(attrType, source, (Integer) value); + } + break; + case DOUBLE: + if (value instanceof Double) { + return new BlackboardAttribute(attrType, source, (Double) value); + } + break; + case BYTE: + if (value instanceof byte[]) { + return new BlackboardAttribute(attrType, source, (byte[]) value); + } + break; + default: throw new IllegalArgumentException(String.format("Unknown attribute value type: %s", attrType.getValueType())); + } + + throw new IllegalArgumentException(String.format("Attribute type expected type of %s but received argument of %s", attrType.getValueType(), value)); + } + /** * Returns a mock TextTranslationService.