diff options
author | Guang Zhu <guangzhu@google.com> | 2017-06-20 17:57:35 -0700 |
---|---|---|
committer | Guang Zhu <guangzhu@google.com> | 2017-06-21 21:49:23 +0000 |
commit | f7677d5fce287263f158d9d65c27b4a3123c43d1 (patch) | |
tree | 204eb7c52dae2f66fdb81e08f2f1a8906260e07d | |
parent | c7c0ea87f517b96c1ff0fb39d34083b5932ca2c6 (diff) | |
download | platform_cts-f7677d5fce287263f158d9d65c27b4a3123c43d1.tar.gz platform_cts-f7677d5fce287263f158d9d65c27b4a3123c43d1.tar.bz2 platform_cts-f7677d5fce287263f158d9d65c27b4a3123c43d1.zip |
add capability to filter modules by metadata field
Bug: 36140955
Bug: 35360169
Test: added unit test
Change-Id: I00bf5b2a49ef7bc933e90db6e94ec3a3149d1b17
Merged-In: Iae6470c90f09e35bf9c6b74c3e7c75762d8dc865
4 files changed, 356 insertions, 18 deletions
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/CompatibilityTest.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/CompatibilityTest.java index bba0c009d87..b5159d799cd 100644 --- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/CompatibilityTest.java +++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/CompatibilityTest.java @@ -58,6 +58,7 @@ import com.android.tradefed.testtype.ITestCollector; import com.android.tradefed.util.AbiFormatter; import com.android.tradefed.util.AbiUtils; import com.android.tradefed.util.ArrayUtil; +import com.android.tradefed.util.MultiMap; import com.android.tradefed.util.StreamUtil; import com.android.tradefed.util.TimeUtil; @@ -270,6 +271,23 @@ public class CompatibilityTest implements IDeviceTest, IShardableTest, IBuildRec + "actually carried out.") private Boolean mCollectTestsOnly = null; + @Option(name = "module-metadata-include-filter", + description = "Include modules for execution based on matching of metadata fields: " + + "for any of the specified filter name and value, if a module has a metadata " + + "field with the same name and value, it will be included. When both module " + + "inclusion and exclusion rules are applied, inclusion rules will be " + + "evaluated first. Using this together with test filter inclusion rules may " + + "result in no tests to execute if the rules don't overlap.") + private MultiMap<String, String> mModuleMetadataIncludeFilter = new MultiMap<>(); + + @Option(name = "module-metadata-exclude-filter", + description = "Exclude modules for execution based on matching of metadata fields: " + + "for any of the specified filter name and value, if a module has a metadata " + + "field with the same name and value, it will be excluded. When both module " + + "inclusion and exclusion rules are applied, inclusion rules will be " + + "evaluated first.") + private MultiMap<String, String> mModuleMetadataExcludeFilter = new MultiMap<>(); + private int mTotalShards; private Integer mShardIndex = null; private IModuleRepo mModuleRepo; @@ -358,7 +376,9 @@ public class CompatibilityTest implements IDeviceTest, IShardableTest, IBuildRec // throw a {@link FileNotFoundException} mModuleRepo.initialize(mTotalShards, mShardIndex, mBuildHelper.getTestsDir(), getAbis(), mDeviceTokens, mTestArgs, mModuleArgs, mIncludeFilters, - mExcludeFilters, mBuildHelper.getBuildInfo()); + mExcludeFilters, + mModuleMetadataIncludeFilter, mModuleMetadataExcludeFilter, + mBuildHelper.getBuildInfo()); // Add the entire list of modules to the CompatibilityBuildHelper for reporting mBuildHelper.setModuleIds(mModuleRepo.getModuleIds()); diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/IModuleRepo.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/IModuleRepo.java index f75fbd1b22e..b0c1bbed9b3 100644 --- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/IModuleRepo.java +++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/IModuleRepo.java @@ -17,6 +17,7 @@ package com.android.compatibility.common.tradefed.testtype; import com.android.tradefed.build.IBuildInfo; import com.android.tradefed.testtype.IAbi; +import com.android.tradefed.util.MultiMap; import java.io.File; import java.util.LinkedList; @@ -38,7 +39,10 @@ public interface IModuleRepo { */ void initialize(int shards, Integer shardIndex, File testsDir, Set<IAbi> abis, List<String> deviceTokens, List<String> testArgs, List<String> moduleArgs, - Set<String> mIncludeFilters, Set<String> mExcludeFilters, IBuildInfo buildInfo); + Set<String> mIncludeFilters, Set<String> mExcludeFilters, + MultiMap<String, String> metadataIncludeFilters, + MultiMap<String, String> metadataExcludeFilters, + IBuildInfo buildInfo); /** * @return a {@link LinkedList} of all modules to run on the device referenced by the given diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/ModuleRepo.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/ModuleRepo.java index 42385080078..388a1aa98af 100644 --- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/ModuleRepo.java +++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/ModuleRepo.java @@ -35,8 +35,11 @@ import com.android.tradefed.testtype.ITestFileFilterReceiver; import com.android.tradefed.testtype.ITestFilterReceiver; import com.android.tradefed.util.AbiUtils; import com.android.tradefed.util.FileUtil; +import com.android.tradefed.util.MultiMap; import com.android.tradefed.util.TimeUtil; +import com.google.common.annotations.VisibleForTesting; + import java.io.File; import java.io.FilenameFilter; import java.io.IOException; @@ -165,7 +168,10 @@ public class ModuleRepo implements IModuleRepo { @Override public void initialize(int totalShards, Integer shardIndex, File testsDir, Set<IAbi> abis, List<String> deviceTokens, List<String> testArgs, List<String> moduleArgs, - Set<String> includeFilters, Set<String> excludeFilters, IBuildInfo buildInfo) { + Set<String> includeFilters, Set<String> excludeFilters, + MultiMap<String, String> metadataIncludeFilters, + MultiMap<String, String> metadataExcludeFilters, + IBuildInfo buildInfo) { CLog.d("Initializing ModuleRepo\nShards:%d\nTests Dir:%s\nABIs:%s\nDevice Tokens:%s\n" + "Test Args:%s\nModule Args:%s\nIncludes:%s\nExcludes:%s", totalShards, testsDir.getAbsolutePath(), abis, deviceTokens, testArgs, moduleArgs, @@ -224,7 +230,12 @@ public class ModuleRepo implements IModuleRepo { // skip this name/abi combination. continue; } - + if (!filterByConfigMetadata(config, + metadataIncludeFilters, metadataExcludeFilters)) { + // if the module config did not pass the metadata filters, it's excluded + // from execution + continue; + } Map<String, List<String>> args = new HashMap<>(); if (mModuleArgs.containsKey(name)) { args.putAll(mModuleArgs.get(name)); @@ -370,6 +381,47 @@ public class ModuleRepo implements IModuleRepo { } } + @VisibleForTesting + protected boolean filterByConfigMetadata(IConfiguration config, + MultiMap<String, String> include, MultiMap<String, String> exclude) { + MultiMap<String, String> metadata = config.getConfigurationDescription().getAllMetaData(); + boolean shouldInclude = false; + for (String key : include.keySet()) { + Set<String> filters = new HashSet<>(include.get(key)); + if (metadata.containsKey(key)) { + filters.retainAll(metadata.get(key)); + if (!filters.isEmpty()) { + // inclusion filter is not empty and there's at least one matching inclusion + // rule so there's no need to match other inclusion rules + shouldInclude = true; + break; + } + } + } + if (!include.isEmpty() && !shouldInclude) { + // if inclusion filter is not empty and we didn't find a match, the module will not be + // included + return false; + } + // Now evaluate exclusion rules, this ordering also means that exclusion rules may override + // inclusion rules: a config already matched for inclusion may still be excluded if matching + // rules exist + for (String key : exclude.keySet()) { + Set<String> filters = new HashSet<>(exclude.get(key)); + if (metadata.containsKey(key)) { + filters.retainAll(metadata.get(key)); + if (!filters.isEmpty()) { + // we found at least one matching exclusion rules, so we are excluding this + // this module + return false; + } + } + } + // we've matched at least one inclusion rule (if there's any) AND we didn't match any of the + // exclusion rules (if there's any) + return true; + } + private boolean shouldRunModule(String moduleId) { List<TestFilter> mdIncludes = getFilter(mIncludeFilters, moduleId); List<TestFilter> mdExcludes = getFilter(mExcludeFilters, moduleId); diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ModuleRepoTest.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ModuleRepoTest.java index 23fc90c2f44..8beb9a73441 100644 --- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ModuleRepoTest.java +++ b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ModuleRepoTest.java @@ -19,7 +19,9 @@ package com.android.compatibility.common.tradefed.testtype; import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper; import com.android.compatibility.common.tradefed.testtype.ModuleRepo.ConfigFilter; import com.android.tradefed.build.IBuildInfo; +import com.android.tradefed.config.Configuration; import com.android.tradefed.config.ConfigurationDescriptor; +import com.android.tradefed.config.IConfiguration; import com.android.tradefed.device.DeviceNotAvailableException; import com.android.tradefed.result.ITestInvocationListener; import com.android.tradefed.targetprep.ITargetPreparer; @@ -33,6 +35,7 @@ import com.android.tradefed.testtype.ITestCollector; import com.android.tradefed.testtype.ITestFilterReceiver; import com.android.tradefed.util.AbiUtils; import com.android.tradefed.util.FileUtil; +import com.android.tradefed.util.MultiMap; import junit.framework.TestCase; @@ -77,6 +80,8 @@ public class ModuleRepoTest extends TestCase { private static final List<String> MODULE_ARGS = new ArrayList<>(); private static final Set<String> INCLUDES = new HashSet<>(); private static final Set<String> EXCLUDES = new HashSet<>(); + private static final MultiMap<String, String> METADATA_INCLUDES = new MultiMap<>(); + private static final MultiMap<String, String> METADATA_EXCLUDES = new MultiMap<>(); private static final Set<String> FILES = new HashSet<>(); private static final String FILENAME = "%s.config"; private static final String ROOT_DIR_ATTR = "ROOT_DIR"; @@ -185,7 +190,7 @@ public class ModuleRepoTest extends TestCase { public void testInitialization() throws Exception { mRepo.initialize(3, null, mTestsDir, ABIS, DEVICE_TOKENS, TEST_ARGS, MODULE_ARGS, INCLUDES, - EXCLUDES, mMockBuildInfo); + EXCLUDES, METADATA_INCLUDES, METADATA_EXCLUDES, mMockBuildInfo); assertTrue("Should be initialized", mRepo.isInitialized()); assertEquals("Wrong number of shards", 3, mRepo.getNumberOfShards()); Map<String, Set<String>> deviceTokens = mRepo.getDeviceTokens(); @@ -200,7 +205,7 @@ public class ModuleRepoTest extends TestCase { public void testGetModules() throws Exception { mRepo.initialize(1, null, mTestsDir, ABIS, DEVICE_TOKENS, TEST_ARGS, MODULE_ARGS, INCLUDES, - EXCLUDES, mMockBuildInfo); + EXCLUDES, METADATA_INCLUDES, METADATA_EXCLUDES, mMockBuildInfo); assertTrue("Should be initialized", mRepo.isInitialized()); assertEquals("Wrong number of tokens", 2, mRepo.getTokenModules().size()); assertEquals("Wrong number of tokens", 4, mRepo.getNonTokenModules().size()); @@ -211,7 +216,7 @@ public class ModuleRepoTest extends TestCase { */ public void testGetModulesSharded() throws Exception { mRepo.initialize(2, null, mTestsDir, ABIS, new ArrayList<String>(), TEST_ARGS, MODULE_ARGS, - INCLUDES, EXCLUDES, mMockBuildInfo); + INCLUDES, EXCLUDES, METADATA_INCLUDES, METADATA_EXCLUDES, mMockBuildInfo); assertTrue("Should be initialized", mRepo.isInitialized()); assertEquals("Wrong number of tokens", 2, mRepo.getTokenModules().size()); assertEquals("Wrong number of tokens", 4, mRepo.getNonTokenModules().size()); @@ -233,7 +238,7 @@ public class ModuleRepoTest extends TestCase { Set<String> includes = new HashSet<>(); includes.add(MODULE_NAME_C); mRepo.initialize(1, null, mTestsDir, ABIS, new ArrayList<String>(), TEST_ARGS, MODULE_ARGS, - includes, EXCLUDES, mMockBuildInfo); + includes, EXCLUDES, METADATA_INCLUDES, METADATA_EXCLUDES, mMockBuildInfo); assertTrue("Should be initialized", mRepo.isInitialized()); assertEquals("Wrong number of tokens", 2, mRepo.getTokenModules().size()); assertEquals("Wrong number of tokens", 0, mRepo.getNonTokenModules().size()); @@ -255,7 +260,7 @@ public class ModuleRepoTest extends TestCase { tokens.add(String.format("%s:%s", SERIAL1, FOOBAR_TOKEN)); tokens.add(String.format("%s:%s", SERIAL2, "foobar2")); mRepo.initialize(2, null, mTestsDir, ABIS, tokens, TEST_ARGS, MODULE_ARGS, - includes, EXCLUDES, mMockBuildInfo); + includes, EXCLUDES, METADATA_INCLUDES, METADATA_EXCLUDES, mMockBuildInfo); assertTrue("Should be initialized", mRepo.isInitialized()); assertEquals("Wrong number of tokens", 4, mRepo.getTokenModules().size()); assertEquals("Wrong number of tokens", 0, mRepo.getNonTokenModules().size()); @@ -278,7 +283,7 @@ public class ModuleRepoTest extends TestCase { public void testGetModulesSharded_uneven() throws Exception { createConfig(mTestsDir, "FooModuleD", null); mRepo.initialize(4, null, mTestsDir, ABIS, new ArrayList<String>(), TEST_ARGS, MODULE_ARGS, - INCLUDES, EXCLUDES, mMockBuildInfo); + INCLUDES, EXCLUDES, METADATA_INCLUDES, METADATA_EXCLUDES, mMockBuildInfo); assertTrue("Should be initialized", mRepo.isInitialized()); assertEquals("Wrong number of tokens", 2, mRepo.getTokenModules().size()); assertEquals("Wrong number of tokens", 6, mRepo.getNonTokenModules().size()); @@ -320,7 +325,8 @@ public class ModuleRepoTest extends TestCase { excludeFilters.add(ID_A_32); excludeFilters.add(MODULE_NAME_B); mRepo.initialize(1, null, mTestsDir, ABIS, DEVICE_TOKENS, TEST_ARGS, MODULE_ARGS, - includeFilters, excludeFilters, mMockBuildInfo); + includeFilters, excludeFilters, METADATA_INCLUDES, METADATA_EXCLUDES, + mMockBuildInfo); List<IModuleDef> modules = mRepo.getModules(SERIAL1, 0); assertEquals("Incorrect number of modules", 1, modules.size()); IModuleDef module = modules.get(0); @@ -333,11 +339,11 @@ public class ModuleRepoTest extends TestCase { */ public void testInitialization_ExcludeModule_SkipLoadingConfig() { try { - Set<String> excludeFilters = new HashSet<String>() {{ - add(NON_EXISTS_MODULE_NAME); - }}; + Set<String> excludeFilters = new HashSet<String>(); + excludeFilters.add(NON_EXISTS_MODULE_NAME); mRepo.initialize(1, null, mTestsDir, ABIS, DEVICE_TOKENS, TEST_ARGS, MODULE_ARGS, Collections.emptySet(), excludeFilters, + METADATA_INCLUDES, METADATA_EXCLUDES, mMockBuildInfo); } catch (Exception e) { fail("Initialization should not fail if non-existing module is excluded"); @@ -354,14 +360,15 @@ public class ModuleRepoTest extends TestCase { excludeFilters.add(MODULE_NAME_B); excludeFilters.add(MODULE_NAME_C); mRepo.initialize(1, null, mTestsDir, ABIS, DEVICE_TOKENS, TEST_ARGS, MODULE_ARGS, - includeFilters, excludeFilters, mMockBuildInfo); + includeFilters, excludeFilters, + METADATA_INCLUDES, METADATA_EXCLUDES, mMockBuildInfo); List<IModuleDef> modules = mRepo.getModules(SERIAL1, 0); assertEquals("Incorrect number of modules", 0, modules.size()); } public void testParsing() throws Exception { mRepo.initialize(1, null, mTestsDir, ABIS, DEVICE_TOKENS, TEST_ARGS, MODULE_ARGS, INCLUDES, - EXCLUDES, mMockBuildInfo); + EXCLUDES, METADATA_INCLUDES, METADATA_EXCLUDES, mMockBuildInfo); List<IModuleDef> modules = mRepo.getModules(SERIAL3, 0); Set<String> idSet = new HashSet<>(); for (IModuleDef module : modules) { @@ -396,7 +403,7 @@ public class ModuleRepoTest extends TestCase { ArrayList<String> emptyList = new ArrayList<>(); mRepo.initialize(3, 0, mTestsDir, abis, DEVICE_TOKENS, emptyList, emptyList, INCLUDES, - EXCLUDES, mMockBuildInfo); + EXCLUDES, METADATA_INCLUDES, METADATA_EXCLUDES, mMockBuildInfo); List<IModuleDef> modules = new ArrayList<>(); modules.addAll(mRepo.getNonTokenModules()); @@ -414,7 +421,7 @@ public class ModuleRepoTest extends TestCase { public void testGetModuleIds() { mRepo.initialize(3, null, mTestsDir, ABIS, DEVICE_TOKENS, TEST_ARGS, MODULE_ARGS, INCLUDES, - EXCLUDES, mMockBuildInfo); + EXCLUDES, METADATA_INCLUDES, METADATA_EXCLUDES, mMockBuildInfo); assertTrue("Should be initialized", mRepo.isInitialized()); assertArrayEquals(EXPECTED_MODULE_IDS, mRepo.getModuleIds()); @@ -506,4 +513,259 @@ public class ModuleRepoTest extends TestCase { List<IModuleDef> res = mRepo.getShard(testList, 1, 2); assertNull(res); } + + /** + * When there are no metadata based filters specified, config should be included + * @throws Exception + */ + public void testMetadataFilter_emptyFilters() throws Exception { + IConfiguration config = new Configuration("foo", "bar"); + assertTrue("config not included when metadata filters are empty", + mRepo.filterByConfigMetadata(config, METADATA_INCLUDES, METADATA_EXCLUDES)); + } + + /** + * When inclusion filter is specified, config matching the filter is included + * @throws Exception + */ + public void testMetadataFilter_matchInclude() throws Exception { + IConfiguration config = new Configuration("foo", "bar"); + ConfigurationDescriptor desc = config.getConfigurationDescription(); + MultiMap<String, String> metadata = new MultiMap<>(); + metadata.put("component", "foo"); + desc.setMetaData(metadata); + MultiMap<String, String> includeFilter = new MultiMap<>(); + includeFilter.put("component", "foo"); + assertTrue("config not included with matching inclusion filter", + mRepo.filterByConfigMetadata(config, includeFilter, METADATA_EXCLUDES)); + } + + /** + * When inclusion filter is specified, config not matching the filter is excluded + * @throws Exception + */ + public void testMetadataFilter_noMatchInclude_mismatchValue() throws Exception { + IConfiguration config = new Configuration("foo", "bar"); + ConfigurationDescriptor desc = config.getConfigurationDescription(); + MultiMap<String, String> metadata = new MultiMap<>(); + metadata.put("component", "foo"); + desc.setMetaData(metadata); + MultiMap<String, String> includeFilter = new MultiMap<>(); + includeFilter.put("component", "bar"); + assertFalse("config not excluded with mismatching inclusion filter", + mRepo.filterByConfigMetadata(config, includeFilter, METADATA_EXCLUDES)); + } + + /** + * When inclusion filter is specified, config not matching the filter is excluded + * @throws Exception + */ + public void testMetadataFilter_noMatchInclude_mismatchKey() throws Exception { + IConfiguration config = new Configuration("foo", "bar"); + ConfigurationDescriptor desc = config.getConfigurationDescription(); + MultiMap<String, String> metadata = new MultiMap<>(); + metadata.put("component", "foo"); + desc.setMetaData(metadata); + MultiMap<String, String> includeFilter = new MultiMap<>(); + includeFilter.put("group", "bar"); + assertFalse("config not excluded with mismatching inclusion filter", + mRepo.filterByConfigMetadata(config, includeFilter, METADATA_EXCLUDES)); + } + + /** + * When exclusion filter is specified, config matching the filter is excluded + * @throws Exception + */ + public void testMetadataFilter_matchExclude() throws Exception { + IConfiguration config = new Configuration("foo", "bar"); + ConfigurationDescriptor desc = config.getConfigurationDescription(); + MultiMap<String, String> metadata = new MultiMap<>(); + metadata.put("component", "foo"); + desc.setMetaData(metadata); + MultiMap<String, String> excludeFilter = new MultiMap<>(); + excludeFilter.put("component", "foo"); + assertFalse("config not excluded with matching exclusion filter", + mRepo.filterByConfigMetadata(config, METADATA_INCLUDES, excludeFilter)); + } + + /** + * When exclusion filter is specified, config not matching the filter is included + * @throws Exception + */ + public void testMetadataFilter_noMatchExclude_mismatchKey() throws Exception { + IConfiguration config = new Configuration("foo", "bar"); + ConfigurationDescriptor desc = config.getConfigurationDescription(); + MultiMap<String, String> metadata = new MultiMap<>(); + metadata.put("component", "foo"); + desc.setMetaData(metadata); + MultiMap<String, String> excludeFilter = new MultiMap<>(); + excludeFilter.put("component", "bar"); + assertTrue("config not included with mismatching exclusion filter", + mRepo.filterByConfigMetadata(config, METADATA_INCLUDES, excludeFilter)); + } + + /** + * When exclusion filter is specified, config not matching the filter is included + * @throws Exception + */ + public void testMetadataFilter_noMatchExclude_mismatchValue() throws Exception { + IConfiguration config = new Configuration("foo", "bar"); + ConfigurationDescriptor desc = config.getConfigurationDescription(); + MultiMap<String, String> metadata = new MultiMap<>(); + metadata.put("component", "foo"); + desc.setMetaData(metadata); + MultiMap<String, String> excludeFilter = new MultiMap<>(); + excludeFilter.put("group", "bar"); + assertTrue("config not included with mismatching exclusion filter", + mRepo.filterByConfigMetadata(config, METADATA_INCLUDES, excludeFilter)); + } + + /** + * When inclusion filter is specified, config with one of the metadata field matching the filter + * is included + * @throws Exception + */ + public void testMetadataFilter_matchInclude_multipleMetadataField() throws Exception { + IConfiguration config = new Configuration("foo", "bar"); + ConfigurationDescriptor desc = config.getConfigurationDescription(); + MultiMap<String, String> metadata = new MultiMap<>(); + metadata.put("component", "foo"); + metadata.put("component", "bar"); + desc.setMetaData(metadata); + MultiMap<String, String> includeFilter = new MultiMap<>(); + includeFilter.put("component", "foo"); + assertTrue("config not included with matching inclusion filter", + mRepo.filterByConfigMetadata(config, includeFilter, METADATA_EXCLUDES)); + } + + /** + * When exclusion filter is specified, config with one of the metadata field matching the filter + * is excluded + * @throws Exception + */ + public void testMetadataFilter_matchExclude_multipleMetadataField() throws Exception { + IConfiguration config = new Configuration("foo", "bar"); + ConfigurationDescriptor desc = config.getConfigurationDescription(); + MultiMap<String, String> metadata = new MultiMap<>(); + metadata.put("component", "foo"); + metadata.put("component", "bar"); + desc.setMetaData(metadata); + MultiMap<String, String> excludeFilter = new MultiMap<>(); + excludeFilter.put("component", "foo"); + assertFalse("config not excluded with matching exclusion filter", + mRepo.filterByConfigMetadata(config, METADATA_INCLUDES, excludeFilter)); + } + + /** + * When inclusion filters are specified, config with metadata field matching one of the filter + * is included + * @throws Exception + */ + public void testMetadataFilter_matchInclude_multipleFilters() throws Exception { + IConfiguration config = new Configuration("foo", "bar"); + ConfigurationDescriptor desc = config.getConfigurationDescription(); + MultiMap<String, String> metadata = new MultiMap<>(); + metadata.put("component", "foo"); + desc.setMetaData(metadata); + MultiMap<String, String> includeFilter = new MultiMap<>(); + includeFilter.put("component", "foo"); + includeFilter.put("component", "bar"); + assertTrue("config not included with matching inclusion filter", + mRepo.filterByConfigMetadata(config, includeFilter, METADATA_EXCLUDES)); + } + + /** + * When exclusion filters are specified, config with metadata field matching one of the filter + * is excluded + * @throws Exception + */ + public void testMetadataFilter_matchExclude_multipleFilters() throws Exception { + IConfiguration config = new Configuration("foo", "bar"); + ConfigurationDescriptor desc = config.getConfigurationDescription(); + MultiMap<String, String> metadata = new MultiMap<>(); + metadata.put("component", "foo"); + desc.setMetaData(metadata); + MultiMap<String, String> excludeFilter = new MultiMap<>(); + excludeFilter.put("component", "foo"); + excludeFilter.put("component", "bar"); + assertFalse("config not excluded with matching exclusion filter", + mRepo.filterByConfigMetadata(config, METADATA_INCLUDES, excludeFilter)); + } + + /** + * When inclusion filters are specified, config with metadata field matching one of the filter + * is included + * @throws Exception + */ + public void testMetadataFilter_matchInclude_multipleMetadataAndFilters() throws Exception { + IConfiguration config = new Configuration("foo", "bar"); + ConfigurationDescriptor desc = config.getConfigurationDescription(); + MultiMap<String, String> metadata = new MultiMap<>(); + metadata.put("component", "foo1"); + metadata.put("group", "bar1"); + desc.setMetaData(metadata); + MultiMap<String, String> includeFilter = new MultiMap<>(); + includeFilter.put("component", "foo1"); + includeFilter.put("group", "bar2"); + assertTrue("config not included with matching inclusion filter", + mRepo.filterByConfigMetadata(config, includeFilter, METADATA_EXCLUDES)); + } + + /** + * When exclusion filters are specified, config with metadata field matching one of the filter + * is excluded + * @throws Exception + */ + public void testMetadataFilter_matchExclude_multipleMetadataAndFilters() throws Exception { + IConfiguration config = new Configuration("foo", "bar"); + ConfigurationDescriptor desc = config.getConfigurationDescription(); + MultiMap<String, String> metadata = new MultiMap<>(); + metadata.put("component", "foo1"); + metadata.put("group", "bar1"); + desc.setMetaData(metadata); + MultiMap<String, String> excludeFilter = new MultiMap<>(); + excludeFilter.put("component", "foo1"); + excludeFilter.put("group", "bar2"); + assertFalse("config not excluded with matching exclusion filter", + mRepo.filterByConfigMetadata(config, METADATA_INCLUDES, excludeFilter)); + } + + /** + * When inclusion and exclusion filters are both specified, config can pass through the filters + * as expected. + * @throws Exception + */ + public void testMetadataFilter_includeAndExclude() throws Exception { + IConfiguration config = new Configuration("foo", "bar"); + ConfigurationDescriptor desc = config.getConfigurationDescription(); + MultiMap<String, String> metadata = new MultiMap<>(); + metadata.put("component", "foo"); + metadata.put("group", "bar1"); + desc.setMetaData(metadata); + MultiMap<String, String> includeFilter = new MultiMap<>(); + includeFilter.put("component", "foo"); + MultiMap<String, String> excludeFilter = new MultiMap<>(); + excludeFilter.put("group", "bar2"); + assertTrue("config not included with matching inclusion and mismatching exclusion filters", + mRepo.filterByConfigMetadata(config, includeFilter, excludeFilter)); + } + + /** + * When inclusion and exclusion filters are both specified, config be excluded as specified + * @throws Exception + */ + public void testMetadataFilter_includeThenExclude() throws Exception { + IConfiguration config = new Configuration("foo", "bar"); + ConfigurationDescriptor desc = config.getConfigurationDescription(); + MultiMap<String, String> metadata = new MultiMap<>(); + metadata.put("component", "foo"); + metadata.put("group", "bar"); + desc.setMetaData(metadata); + MultiMap<String, String> includeFilter = new MultiMap<>(); + includeFilter.put("component", "foo"); + MultiMap<String, String> excludeFilter = new MultiMap<>(); + excludeFilter.put("group", "bar"); + assertFalse("config not excluded with matching inclusion and exclusion filters", + mRepo.filterByConfigMetadata(config, includeFilter, excludeFilter)); + } } |