From 48cb8cea46e310acf2f250809b55a929518ecf95 Mon Sep 17 00:00:00 2001 From: Keghani Kouzoujian Date: Fri, 18 Nov 2016 15:56:11 +0100 Subject: [PATCH] Test filter metadata (#1437) --- tools/java/common/pom.xml | 6 + .../i18n/phonenumbers/MetadataFilter.java | 73 ++--- .../BuildMetadataFromXmlTest.java | 9 + .../MetadataFilterCoverageTest.java | 102 ++++++ .../i18n/phonenumbers/MetadataFilterTest.java | 307 ++++++++++++++---- ...ild-1.0-SNAPSHOT-jar-with-dependencies.jar | Bin 611998 -> 611982 bytes ...ild-1.0-SNAPSHOT-jar-with-dependencies.jar | Bin 472306 -> 472291 bytes 7 files changed, 388 insertions(+), 109 deletions(-) create mode 100644 tools/java/common/test/com/google/i18n/phonenumbers/MetadataFilterCoverageTest.java diff --git a/tools/java/common/pom.xml b/tools/java/common/pom.xml index ee297d9b0..0273d6521 100644 --- a/tools/java/common/pom.xml +++ b/tools/java/common/pom.xml @@ -17,6 +17,12 @@ src test + + + src/com/google/i18n/phonenumbers + com/google/i18n/phonenumbers + + org.apache.maven.plugins diff --git a/tools/java/common/src/com/google/i18n/phonenumbers/MetadataFilter.java b/tools/java/common/src/com/google/i18n/phonenumbers/MetadataFilter.java index b9d290e7f..7d39db78b 100644 --- a/tools/java/common/src/com/google/i18n/phonenumbers/MetadataFilter.java +++ b/tools/java/common/src/com/google/i18n/phonenumbers/MetadataFilter.java @@ -19,7 +19,6 @@ package com.google.i18n.phonenumbers; import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc; import java.util.Arrays; -import java.util.Map; import java.util.TreeMap; import java.util.TreeSet; @@ -36,14 +35,14 @@ final class MetadataFilter { // The following 3 sets comprise all the PhoneMetadata fields as defined at phonemetadata.proto // which may be excluded from customized serializations of the binary metadata. Fields that are // core to the library functionality may not be listed here. - // EXCLUDABLE_PARENT_FIELDS are PhoneMetadata fields of type PhoneNumberDesc. - // EXCLUDABLE_CHILD_FIELDS are PhoneNumberDesc fields of primitive type. - // EXCLUDABLE_CHILDLESS_FIELDS are PhoneMetadata fields of primitive type. + // excludableParentFields are PhoneMetadata fields of type PhoneNumberDesc. + // excludableChildFields are PhoneNumberDesc fields of primitive type. + // excludableChildlessFields are PhoneMetadata fields of primitive type. // Currently we support only one non-primitive type and the depth of the "family tree" is 2, // meaning a field may have only direct descendants, who may not have descendants of their // own. If this changes, the blacklist handling in this class should also change. // @VisibleForTesting - static final TreeSet EXCLUDABLE_PARENT_FIELDS = new TreeSet(Arrays.asList( + static final TreeSet excludableParentFields = new TreeSet(Arrays.asList( "fixedLine", "mobile", "tollFree", @@ -61,14 +60,14 @@ final class MetadataFilter { "noInternationalDialling")); // @VisibleForTesting - static final TreeSet EXCLUDABLE_CHILD_FIELDS = new TreeSet(Arrays.asList( + static final TreeSet excludableChildFields = new TreeSet(Arrays.asList( "nationalNumberPattern", "possibleLength", "possibleLengthLocalOnly", "exampleNumber")); // @VisibleForTesting - static final TreeSet EXCLUDABLE_CHILDLESS_FIELDS = new TreeSet(Arrays.asList( + static final TreeSet excludableChildlessFields = new TreeSet(Arrays.asList( "preferredInternationalPrefix", "nationalPrefix", "preferredExtnPrefix", @@ -165,28 +164,28 @@ final class MetadataFilter { metadata.setNoInternationalDialling(getFiltered("noInternationalDialling", metadata.getNoInternationalDialling())); } - if (drop("preferredInternationalPrefix")) { + if (shouldDrop("preferredInternationalPrefix")) { metadata.clearPreferredInternationalPrefix(); } - if (drop("nationalPrefix")) { + if (shouldDrop("nationalPrefix")) { metadata.clearNationalPrefix(); } - if (drop("preferredExtnPrefix")) { + if (shouldDrop("preferredExtnPrefix")) { metadata.clearPreferredExtnPrefix(); } - if (drop("nationalPrefixTransformRule")) { + if (shouldDrop("nationalPrefixTransformRule")) { metadata.clearNationalPrefixTransformRule(); } - if (drop("sameMobileAndFixedLinePattern")) { + if (shouldDrop("sameMobileAndFixedLinePattern")) { metadata.clearSameMobileAndFixedLinePattern(); } - if (drop("mainCountryForCode")) { + if (shouldDrop("mainCountryForCode")) { metadata.clearMainCountryForCode(); } - if (drop("leadingZeroPossible")) { + if (shouldDrop("leadingZeroPossible")) { metadata.clearLeadingZeroPossible(); } - if (drop("mobileNumberPortableRegion")) { + if (shouldDrop("mobileNumberPortableRegion")) { metadata.clearMobileNumberPortableRegion(); } } @@ -216,17 +215,17 @@ final class MetadataFilter { int leftParenIndex = group.indexOf('('); int rightParenIndex = group.indexOf(')'); if (leftParenIndex < 0 && rightParenIndex < 0) { - if (EXCLUDABLE_PARENT_FIELDS.contains(group)) { + if (excludableParentFields.contains(group)) { if (fieldMap.containsKey(group)) { throw new RuntimeException(group + " given more than once in " + string); } - fieldMap.put(group, new TreeSet(EXCLUDABLE_CHILD_FIELDS)); - } else if (EXCLUDABLE_CHILDLESS_FIELDS.contains(group)) { + fieldMap.put(group, new TreeSet(excludableChildFields)); + } else if (excludableChildlessFields.contains(group)) { if (fieldMap.containsKey(group)) { throw new RuntimeException(group + " given more than once in " + string); } fieldMap.put(group, new TreeSet()); - } else if (EXCLUDABLE_CHILD_FIELDS.contains(group)) { + } else if (excludableChildFields.contains(group)) { if (wildcardChildren.contains(group)) { throw new RuntimeException(group + " given more than once in " + string); } @@ -238,7 +237,7 @@ final class MetadataFilter { // We don't check for duplicate parentheses or illegal characters since these will be caught // as not being part of valid field tokens. String parent = group.substring(0, leftParenIndex); - if (!EXCLUDABLE_PARENT_FIELDS.contains(parent)) { + if (!excludableParentFields.contains(parent)) { throw new RuntimeException(parent + " is not a valid parent token"); } if (fieldMap.containsKey(parent)) { @@ -246,7 +245,7 @@ final class MetadataFilter { } TreeSet children = new TreeSet(); for (String child : group.substring(leftParenIndex + 1, rightParenIndex).split(",", -1)) { - if (!EXCLUDABLE_CHILD_FIELDS.contains(child)) { + if (!excludableChildFields.contains(child)) { throw new RuntimeException(child + " is not a valid child token"); } if (!children.add(child)) { @@ -259,14 +258,14 @@ final class MetadataFilter { } } for (String wildcardChild : wildcardChildren) { - for (String parent : EXCLUDABLE_PARENT_FIELDS) { + for (String parent : excludableParentFields) { TreeSet children = fieldMap.get(parent); if (children == null) { children = new TreeSet(); fieldMap.put(parent, children); } if (!children.add(wildcardChild) - && fieldMap.get(parent).size() != EXCLUDABLE_CHILD_FIELDS.size()) { + && fieldMap.get(parent).size() != excludableChildFields.size()) { // The map already contains parent -> wildcardChild but not all possible children. // So wildcardChild was given explicitly as a child of parent, which is a duplication // since it's also given as a wildcard child. @@ -285,16 +284,16 @@ final class MetadataFilter { static TreeMap> computeComplement( TreeMap> fieldMap) { TreeMap> complement = new TreeMap>(); - for (String parent : EXCLUDABLE_PARENT_FIELDS) { + for (String parent : excludableParentFields) { if (!fieldMap.containsKey(parent)) { - complement.put(parent, new TreeSet(EXCLUDABLE_CHILD_FIELDS)); + complement.put(parent, new TreeSet(excludableChildFields)); } else { TreeSet otherChildren = fieldMap.get(parent); // If the other map has all the children for this parent then we don't want to include the // parent as a key. - if (otherChildren.size() != EXCLUDABLE_CHILD_FIELDS.size()) { + if (otherChildren.size() != excludableChildFields.size()) { TreeSet children = new TreeSet(); - for (String child : EXCLUDABLE_CHILD_FIELDS) { + for (String child : excludableChildFields) { if (!otherChildren.contains(child)) { children.add(child); } @@ -303,7 +302,7 @@ final class MetadataFilter { } } } - for (String childlessField : EXCLUDABLE_CHILDLESS_FIELDS) { + for (String childlessField : excludableChildlessFields) { if (!fieldMap.containsKey(childlessField)) { complement.put(childlessField, new TreeSet()); } @@ -312,19 +311,19 @@ final class MetadataFilter { } // @VisibleForTesting - boolean drop(String parent, String child) { - if (!EXCLUDABLE_PARENT_FIELDS.contains(parent)) { + boolean shouldDrop(String parent, String child) { + if (!excludableParentFields.contains(parent)) { throw new RuntimeException(parent + " is not an excludable parent field"); } - if (!EXCLUDABLE_CHILD_FIELDS.contains(child)) { + if (!excludableChildFields.contains(child)) { throw new RuntimeException(child + " is not an excludable child field"); } return blacklist.containsKey(parent) && blacklist.get(parent).contains(child); } // @VisibleForTesting - boolean drop(String childlessField) { - if (!EXCLUDABLE_CHILDLESS_FIELDS.contains(childlessField)) { + boolean shouldDrop(String childlessField) { + if (!excludableChildlessFields.contains(childlessField)) { throw new RuntimeException(childlessField + " is not an excludable childless field"); } return blacklist.containsKey(childlessField); @@ -332,16 +331,16 @@ final class MetadataFilter { private PhoneNumberDesc getFiltered(String type, PhoneNumberDesc desc) { PhoneNumberDesc.Builder builder = PhoneNumberDesc.newBuilder().mergeFrom(desc); - if (drop(type, "nationalNumberPattern")) { + if (shouldDrop(type, "nationalNumberPattern")) { builder.clearNationalNumberPattern(); } - if (drop(type, "possibleLength")) { + if (shouldDrop(type, "possibleLength")) { builder.clearPossibleLength(); } - if (drop(type, "possibleLengthLocalOnly")) { + if (shouldDrop(type, "possibleLengthLocalOnly")) { builder.clearPossibleLengthLocalOnly(); } - if (drop(type, "exampleNumber")) { + if (shouldDrop(type, "exampleNumber")) { builder.clearExampleNumber(); } return builder.build(); diff --git a/tools/java/common/test/com/google/i18n/phonenumbers/BuildMetadataFromXmlTest.java b/tools/java/common/test/com/google/i18n/phonenumbers/BuildMetadataFromXmlTest.java index 60a4fb04e..8a8086e02 100644 --- a/tools/java/common/test/com/google/i18n/phonenumbers/BuildMetadataFromXmlTest.java +++ b/tools/java/common/test/com/google/i18n/phonenumbers/BuildMetadataFromXmlTest.java @@ -495,6 +495,9 @@ public class BuildMetadataFromXmlTest extends TestCase { PhoneMetadata metadata = metadataCollection.getMetadataList().get(0); assertTrue(metadata.hasGeneralDesc()); assertFalse(metadata.getGeneralDesc().hasExampleNumber()); + // Some Phonemetadata.java implementations may have custom logic, so we ensure this + // implementation is doing the right thing by checking the value of the example number even when + // hasExampleNumber is false. assertEquals("", metadata.getGeneralDesc().getExampleNumber()); assertTrue(metadata.hasFixedLine()); assertFalse(metadata.getFixedLine().hasExampleNumber()); @@ -538,6 +541,9 @@ public class BuildMetadataFromXmlTest extends TestCase { PhoneMetadata metadata = metadataCollection.getMetadataList().get(0); assertTrue(metadata.hasGeneralDesc()); assertFalse(metadata.getGeneralDesc().hasExampleNumber()); + // Some Phonemetadata.java implementations may have custom logic, so we ensure this + // implementation is doing the right thing by checking the value of the example number even when + // hasExampleNumber is false. assertEquals("", metadata.getGeneralDesc().getExampleNumber()); // TODO: Consider clearing fixed-line if empty after being filtered. assertTrue(metadata.hasFixedLine()); @@ -582,6 +588,9 @@ public class BuildMetadataFromXmlTest extends TestCase { PhoneMetadata metadata = metadataCollection.getMetadataList().get(0); assertTrue(metadata.hasGeneralDesc()); assertFalse(metadata.getGeneralDesc().hasExampleNumber()); + // Some Phonemetadata.java implementations may have custom logic, so we ensure this + // implementation is doing the right thing by checking the value of the example number even when + // hasExampleNumber is false. assertEquals("", metadata.getGeneralDesc().getExampleNumber()); assertTrue(metadata.hasFixedLine()); assertTrue(metadata.getFixedLine().hasExampleNumber()); diff --git a/tools/java/common/test/com/google/i18n/phonenumbers/MetadataFilterCoverageTest.java b/tools/java/common/test/com/google/i18n/phonenumbers/MetadataFilterCoverageTest.java new file mode 100644 index 000000000..6f56e3600 --- /dev/null +++ b/tools/java/common/test/com/google/i18n/phonenumbers/MetadataFilterCoverageTest.java @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2016 The Libphonenumber Authors + * + * 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 com.google.i18n.phonenumbers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.BufferedInputStream; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.Charset; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** + * Tests to ensure that the {@link MetadataFilter} logic over excludable fields cover all applicable + * fields. + */ +@RunWith(JUnit4.class) +public final class MetadataFilterCoverageTest { + private static final String CODE; + + static { + try { + BufferedReader source = new BufferedReader(new InputStreamReader(new BufferedInputStream( + MetadataFilterTest.class.getResourceAsStream( + "/com/google/i18n/phonenumbers/MetadataFilter.java")), + Charset.forName("UTF-8"))); + StringBuilder codeBuilder = new StringBuilder(); + for (String line = source.readLine(); line != null; line = source.readLine()) { + codeBuilder.append(line).append("\n"); + } + CODE = codeBuilder.toString(); + } catch (IOException e) { + throw new RuntimeException("MetadataFilter.java resource not set up properly", e); + } + } + + @Test + public void testCoverageOfExcludableParentFields() { + for (String field : MetadataFilter.excludableParentFields) { + String capitalized = Character.toUpperCase(field.charAt(0)) + field.substring(1); + String conditional = String.format( + "if (metadata.has%s()) {\n metadata.set%s(getFiltered(\"%s\", metadata.get%s()));\n" + + " }", capitalized, capitalized, field, capitalized); + assertTrue("Code is missing correct conditional for " + field, CODE.contains(conditional)); + } + + assertEquals(countOccurrencesOf("metadata.has", CODE), + MetadataFilter.excludableParentFields.size()); + } + + @Test + public void testCoverageOfExcludableChildFields() { + for (String field : MetadataFilter.excludableChildFields) { + String capitalized = Character.toUpperCase(field.charAt(0)) + field.substring(1); + String conditional = String.format( + "if (shouldDrop(type, \"%s\")) {\n builder.clear%s();\n }", field, capitalized); + assertTrue("Code is missing correct conditional for " + field, CODE.contains(conditional)); + } + + assertEquals(countOccurrencesOf("shouldDrop(type, \"", CODE), + MetadataFilter.excludableChildFields.size()); + } + + @Test + public void testCoverageOfExcludableChildlessFields() { + for (String field : MetadataFilter.excludableChildlessFields) { + String capitalized = Character.toUpperCase(field.charAt(0)) + field.substring(1); + String conditional = String.format( + "if (shouldDrop(\"%s\")) {\n metadata.clear%s();\n }", field, capitalized); + assertTrue("Code is missing correct conditional for " + field, CODE.contains(conditional)); + } + + assertEquals(countOccurrencesOf("shouldDrop(\"", CODE), + MetadataFilter.excludableChildlessFields.size()); + } + + private static int countOccurrencesOf(String substring, String string) { + int count = 0; + for (int i = string.indexOf(substring); i != -1; i = string.indexOf(substring, i + 1)) { + count++; + } + return count; + } +} diff --git a/tools/java/common/test/com/google/i18n/phonenumbers/MetadataFilterTest.java b/tools/java/common/test/com/google/i18n/phonenumbers/MetadataFilterTest.java index 8c8494c79..d1f1276d8 100644 --- a/tools/java/common/test/com/google/i18n/phonenumbers/MetadataFilterTest.java +++ b/tools/java/common/test/com/google/i18n/phonenumbers/MetadataFilterTest.java @@ -16,15 +16,35 @@ package com.google.i18n.phonenumbers; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc; import java.util.Arrays; +import java.util.List; import java.util.TreeMap; import java.util.TreeSet; -import junit.framework.TestCase; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** + * Unit tests for {@link MetadataFilter}. + */ +@RunWith(JUnit4.class) +public class MetadataFilterTest { + private static final String NATIONAL_NUMBER_PATTERN = "[1-9]\\d{7}"; + private static final int[] possibleLengths = {8}; + private static final int[] possibleLengthsLocalOnly = {5, 6}; + private static final String EXAMPLE_NUMBER = "10123456"; -public class MetadataFilterTest extends TestCase { // If this behavior changes then consider whether the change in the blacklist is intended, or you // should change the special build configuration. Also look into any change in the size of the // build. + @Test public void testForLiteBuild() { TreeMap> blacklist = new TreeMap>(); blacklist.put("fixedLine", new TreeSet(Arrays.asList("exampleNumber"))); @@ -50,23 +70,24 @@ public class MetadataFilterTest extends TestCase { // If this behavior changes then consider whether the change in the blacklist is intended, or you // should change the special build configuration. Also look into any change in the size of the // build. + @Test public void testForSpecialBuild() { TreeMap> blacklist = new TreeMap>(); - blacklist.put("fixedLine", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - blacklist.put("tollFree", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - blacklist.put("premiumRate", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - blacklist.put("sharedCost", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - blacklist.put("personalNumber", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - blacklist.put("voip", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - blacklist.put("pager", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - blacklist.put("uan", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - blacklist.put("emergency", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - blacklist.put("voicemail", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - blacklist.put("shortCode", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - blacklist.put("standardRate", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - blacklist.put("carrierSpecific", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); + blacklist.put("fixedLine", new TreeSet(MetadataFilter.excludableChildFields)); + blacklist.put("tollFree", new TreeSet(MetadataFilter.excludableChildFields)); + blacklist.put("premiumRate", new TreeSet(MetadataFilter.excludableChildFields)); + blacklist.put("sharedCost", new TreeSet(MetadataFilter.excludableChildFields)); + blacklist.put("personalNumber", new TreeSet(MetadataFilter.excludableChildFields)); + blacklist.put("voip", new TreeSet(MetadataFilter.excludableChildFields)); + blacklist.put("pager", new TreeSet(MetadataFilter.excludableChildFields)); + blacklist.put("uan", new TreeSet(MetadataFilter.excludableChildFields)); + blacklist.put("emergency", new TreeSet(MetadataFilter.excludableChildFields)); + blacklist.put("voicemail", new TreeSet(MetadataFilter.excludableChildFields)); + blacklist.put("shortCode", new TreeSet(MetadataFilter.excludableChildFields)); + blacklist.put("standardRate", new TreeSet(MetadataFilter.excludableChildFields)); + blacklist.put("carrierSpecific", new TreeSet(MetadataFilter.excludableChildFields)); blacklist.put("noInternationalDialling", - new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); + new TreeSet(MetadataFilter.excludableChildFields)); blacklist.put("preferredInternationalPrefix", new TreeSet()); blacklist.put("nationalPrefix", new TreeSet()); blacklist.put("preferredExtnPrefix", new TreeSet()); @@ -79,11 +100,13 @@ public class MetadataFilterTest extends TestCase { assertEquals(MetadataFilter.forSpecialBuild(), new MetadataFilter(blacklist)); } + @Test public void testEmptyFilter() { assertEquals(MetadataFilter.emptyFilter(), new MetadataFilter(new TreeMap>())); } + @Test public void testParseFieldMapFromString_parentAsGroup() { TreeMap> fieldMap = new TreeMap>(); fieldMap.put("fixedLine", new TreeSet(Arrays.asList( @@ -92,6 +115,7 @@ public class MetadataFilterTest extends TestCase { assertEquals(MetadataFilter.parseFieldMapFromString("fixedLine"), fieldMap); } + @Test public void testParseFieldMapFromString_childAsGroup() { TreeMap> fieldMap = new TreeMap>(); fieldMap.put("fixedLine", new TreeSet(Arrays.asList("exampleNumber"))); @@ -113,6 +137,7 @@ public class MetadataFilterTest extends TestCase { assertEquals(MetadataFilter.parseFieldMapFromString("exampleNumber"), fieldMap); } + @Test public void testParseFieldMapFromString_childlessFieldAsGroup() { TreeMap> fieldMap = new TreeMap>(); fieldMap.put("nationalPrefix", new TreeSet()); @@ -120,6 +145,7 @@ public class MetadataFilterTest extends TestCase { assertEquals(MetadataFilter.parseFieldMapFromString("nationalPrefix"), fieldMap); } + @Test public void testParseFieldMapFromString_parentWithOneChildAsGroup() { TreeMap> fieldMap = new TreeMap>(); fieldMap.put("fixedLine", new TreeSet(Arrays.asList("exampleNumber"))); @@ -127,6 +153,7 @@ public class MetadataFilterTest extends TestCase { assertEquals(MetadataFilter.parseFieldMapFromString("fixedLine(exampleNumber)"), fieldMap); } + @Test public void testParseFieldMapFromString_parentWithTwoChildrenAsGroup() { TreeMap> fieldMap = new TreeMap>(); fieldMap.put("fixedLine", new TreeSet(Arrays.asList( @@ -137,6 +164,7 @@ public class MetadataFilterTest extends TestCase { fieldMap); } + @Test public void testParseFieldMapFromString_mixOfGroups() { TreeMap> fieldMap = new TreeMap>(); fieldMap.put("uan", new TreeSet(Arrays.asList( @@ -169,6 +197,7 @@ public class MetadataFilterTest extends TestCase { fieldMap); } + @Test // Many of the strings in this test may be possible to express in shorter ways with the current // sets of excludable fields, but their shortest representation changes as those sets change, as // do their semantics; therefore we allow currently longer expressions, and we allow explicit @@ -286,6 +315,7 @@ public class MetadataFilterTest extends TestCase { + ":noInternationalDialling")); } + @Test public void testParseFieldMapFromString_RuntimeExceptionCases() { // Null input. try { @@ -702,24 +732,25 @@ public class MetadataFilterTest extends TestCase { } } + @Test public void testComputeComplement_allAndNothing() { TreeMap> map1 = new TreeMap>(); - map1.put("fixedLine", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - map1.put("mobile", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - map1.put("tollFree", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - map1.put("premiumRate", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - map1.put("sharedCost", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - map1.put("personalNumber", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - map1.put("voip", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - map1.put("pager", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - map1.put("uan", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - map1.put("emergency", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - map1.put("voicemail", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - map1.put("shortCode", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - map1.put("standardRate", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - map1.put("carrierSpecific", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); + map1.put("fixedLine", new TreeSet(MetadataFilter.excludableChildFields)); + map1.put("mobile", new TreeSet(MetadataFilter.excludableChildFields)); + map1.put("tollFree", new TreeSet(MetadataFilter.excludableChildFields)); + map1.put("premiumRate", new TreeSet(MetadataFilter.excludableChildFields)); + map1.put("sharedCost", new TreeSet(MetadataFilter.excludableChildFields)); + map1.put("personalNumber", new TreeSet(MetadataFilter.excludableChildFields)); + map1.put("voip", new TreeSet(MetadataFilter.excludableChildFields)); + map1.put("pager", new TreeSet(MetadataFilter.excludableChildFields)); + map1.put("uan", new TreeSet(MetadataFilter.excludableChildFields)); + map1.put("emergency", new TreeSet(MetadataFilter.excludableChildFields)); + map1.put("voicemail", new TreeSet(MetadataFilter.excludableChildFields)); + map1.put("shortCode", new TreeSet(MetadataFilter.excludableChildFields)); + map1.put("standardRate", new TreeSet(MetadataFilter.excludableChildFields)); + map1.put("carrierSpecific", new TreeSet(MetadataFilter.excludableChildFields)); map1.put("noInternationalDialling", - new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); + new TreeSet(MetadataFilter.excludableChildFields)); map1.put("preferredInternationalPrefix", new TreeSet()); map1.put("nationalPrefix", new TreeSet()); map1.put("preferredExtnPrefix", new TreeSet()); @@ -735,19 +766,20 @@ public class MetadataFilterTest extends TestCase { assertEquals(MetadataFilter.computeComplement(map2), map1); } + @Test public void testComputeComplement_inBetween() { TreeMap> map1 = new TreeMap>(); - map1.put("fixedLine", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - map1.put("mobile", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - map1.put("tollFree", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - map1.put("premiumRate", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); + map1.put("fixedLine", new TreeSet(MetadataFilter.excludableChildFields)); + map1.put("mobile", new TreeSet(MetadataFilter.excludableChildFields)); + map1.put("tollFree", new TreeSet(MetadataFilter.excludableChildFields)); + map1.put("premiumRate", new TreeSet(MetadataFilter.excludableChildFields)); map1.put("emergency", new TreeSet(Arrays.asList("nationalNumberPattern"))); map1.put("voicemail", new TreeSet(Arrays.asList("possibleLength", "exampleNumber"))); map1.put("shortCode", new TreeSet(Arrays.asList("exampleNumber"))); - map1.put("standardRate", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - map1.put("carrierSpecific", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); + map1.put("standardRate", new TreeSet(MetadataFilter.excludableChildFields)); + map1.put("carrierSpecific", new TreeSet(MetadataFilter.excludableChildFields)); map1.put("noInternationalDialling", - new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); + new TreeSet(MetadataFilter.excludableChildFields)); map1.put("nationalPrefixTransformRule", new TreeSet()); map1.put("sameMobileAndFixedLinePattern", new TreeSet()); map1.put("mainCountryForCode", new TreeSet()); @@ -755,11 +787,11 @@ public class MetadataFilterTest extends TestCase { map1.put("mobileNumberPortableRegion", new TreeSet()); TreeMap> map2 = new TreeMap>(); - map2.put("sharedCost", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - map2.put("personalNumber", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - map2.put("voip", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - map2.put("pager", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - map2.put("uan", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); + map2.put("sharedCost", new TreeSet(MetadataFilter.excludableChildFields)); + map2.put("personalNumber", new TreeSet(MetadataFilter.excludableChildFields)); + map2.put("voip", new TreeSet(MetadataFilter.excludableChildFields)); + map2.put("pager", new TreeSet(MetadataFilter.excludableChildFields)); + map2.put("uan", new TreeSet(MetadataFilter.excludableChildFields)); map2.put("emergency", new TreeSet(Arrays.asList( "possibleLength", "possibleLengthLocalOnly", "exampleNumber"))); map2.put("voicemail", new TreeSet(Arrays.asList( @@ -774,20 +806,21 @@ public class MetadataFilterTest extends TestCase { assertEquals(MetadataFilter.computeComplement(map2), map1); } - public void testDrop() { + @Test + public void testShouldDrop() { TreeMap> blacklist = new TreeMap>(); - blacklist.put("fixedLine", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - blacklist.put("mobile", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - blacklist.put("tollFree", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - blacklist.put("premiumRate", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); + blacklist.put("fixedLine", new TreeSet(MetadataFilter.excludableChildFields)); + blacklist.put("mobile", new TreeSet(MetadataFilter.excludableChildFields)); + blacklist.put("tollFree", new TreeSet(MetadataFilter.excludableChildFields)); + blacklist.put("premiumRate", new TreeSet(MetadataFilter.excludableChildFields)); blacklist.put("emergency", new TreeSet(Arrays.asList("nationalNumberPattern"))); blacklist.put("voicemail", new TreeSet(Arrays.asList( "possibleLength", "exampleNumber"))); blacklist.put("shortCode", new TreeSet(Arrays.asList("exampleNumber"))); - blacklist.put("standardRate", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); - blacklist.put("carrierSpecific", new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); + blacklist.put("standardRate", new TreeSet(MetadataFilter.excludableChildFields)); + blacklist.put("carrierSpecific", new TreeSet(MetadataFilter.excludableChildFields)); blacklist.put("noInternationalDialling", - new TreeSet(MetadataFilter.EXCLUDABLE_CHILD_FIELDS)); + new TreeSet(MetadataFilter.excludableChildFields)); blacklist.put("nationalPrefixTransformRule", new TreeSet()); blacklist.put("sameMobileAndFixedLinePattern", new TreeSet()); blacklist.put("mainCountryForCode", new TreeSet()); @@ -795,54 +828,184 @@ public class MetadataFilterTest extends TestCase { blacklist.put("mobileNumberPortableRegion", new TreeSet()); MetadataFilter filter = new MetadataFilter(blacklist); - assertTrue(filter.drop("fixedLine", "exampleNumber")); - assertFalse(filter.drop("sharedCost", "exampleNumber")); - assertFalse(filter.drop("emergency", "exampleNumber")); - assertTrue(filter.drop("emergency", "nationalNumberPattern")); - assertFalse(filter.drop("preferredInternationalPrefix")); - assertTrue(filter.drop("mobileNumberPortableRegion")); + assertTrue(filter.shouldDrop("fixedLine", "exampleNumber")); + assertFalse(filter.shouldDrop("sharedCost", "exampleNumber")); + assertFalse(filter.shouldDrop("emergency", "exampleNumber")); + assertTrue(filter.shouldDrop("emergency", "nationalNumberPattern")); + assertFalse(filter.shouldDrop("preferredInternationalPrefix")); + assertTrue(filter.shouldDrop("mobileNumberPortableRegion")); // Integration tests starting with flag values. assertTrue(BuildMetadataFromXml.getMetadataFilter(true, false) - .drop("fixedLine", "exampleNumber")); + .shouldDrop("fixedLine", "exampleNumber")); // Integration tests starting with blacklist strings. assertTrue(new MetadataFilter(MetadataFilter.parseFieldMapFromString("fixedLine")) - .drop("fixedLine", "exampleNumber")); + .shouldDrop("fixedLine", "exampleNumber")); assertFalse(new MetadataFilter(MetadataFilter.parseFieldMapFromString("uan")) - .drop("fixedLine", "exampleNumber")); + .shouldDrop("fixedLine", "exampleNumber")); // Integration tests starting with whitelist strings. assertFalse(new MetadataFilter(MetadataFilter.computeComplement( MetadataFilter.parseFieldMapFromString("exampleNumber"))) - .drop("fixedLine", "exampleNumber")); + .shouldDrop("fixedLine", "exampleNumber")); assertTrue(new MetadataFilter(MetadataFilter.computeComplement( - MetadataFilter.parseFieldMapFromString("uan"))).drop("fixedLine", "exampleNumber")); + MetadataFilter.parseFieldMapFromString("uan"))).shouldDrop("fixedLine", "exampleNumber")); // Integration tests with an empty blacklist. assertFalse(new MetadataFilter(new TreeMap>()) - .drop("fixedLine", "exampleNumber")); + .shouldDrop("fixedLine", "exampleNumber")); + } + + // Test that a fake PhoneMetadata filtered for liteBuild ends up clearing exactly the expected + // fields. The lite build is used to clear example_number fields from all PhoneNumberDescs. + @Test + public void testFilterMetadata_liteBuild() { + PhoneMetadata.Builder metadata = getFakeArmeniaPhoneMetadata(); + + MetadataFilter.forLiteBuild().filterMetadata(metadata); + + // id, country_code, and international_prefix should never be cleared. + assertEquals(metadata.getId(), "AM"); + assertEquals(metadata.getCountryCode(), 374); + assertEquals(metadata.getInternationalPrefix(), "0[01]"); + + // preferred_international_prefix should not be cleared in liteBuild. + assertEquals(metadata.getPreferredInternationalPrefix(), "00"); + + // All PhoneNumberDescs must have only example_number cleared. + for (PhoneNumberDesc desc : Arrays.asList( + metadata.getGeneralDesc(), + metadata.getFixedLine(), + metadata.getMobile(), + metadata.getTollFree())) { + assertEquals(desc.getNationalNumberPattern(), NATIONAL_NUMBER_PATTERN); + assertContentsEqual(desc.getPossibleLengthList(), possibleLengths); + assertContentsEqual(desc.getPossibleLengthLocalOnlyList(), possibleLengthsLocalOnly); + assertFalse(desc.hasExampleNumber()); + } + } + + // Test that a fake PhoneMetadata filtered for specialBuild ends up clearing exactly the expected + // fields. The special build is used to clear PhoneNumberDescs other than general_desc and mobile, + // and non-PhoneNumberDesc PhoneMetadata fields that aren't needed for parsing. + @Test + public void testFilterMetadata_specialBuild() { + PhoneMetadata.Builder metadata = getFakeArmeniaPhoneMetadata(); + + MetadataFilter.forSpecialBuild().filterMetadata(metadata); + + // id, country_code, and international_prefix should never be cleared. + assertEquals(metadata.getId(), "AM"); + assertEquals(metadata.getCountryCode(), 374); + assertEquals(metadata.getInternationalPrefix(), "0[01]"); + + // preferred_international_prefix should be cleared in specialBuild. + assertFalse(metadata.hasPreferredInternationalPrefix()); + + // general_desc should have all fields but example_number; mobile should have all fields. + for (PhoneNumberDesc desc : Arrays.asList( + metadata.getGeneralDesc(), + metadata.getMobile())) { + assertEquals(desc.getNationalNumberPattern(), NATIONAL_NUMBER_PATTERN); + assertContentsEqual(desc.getPossibleLengthList(), possibleLengths); + assertContentsEqual(desc.getPossibleLengthLocalOnlyList(), possibleLengthsLocalOnly); + } + assertFalse(metadata.getGeneralDesc().hasExampleNumber()); + assertEquals(metadata.getMobile().getExampleNumber(), EXAMPLE_NUMBER); + + // All other PhoneNumberDescs must have all fields cleared. + for (PhoneNumberDesc desc : Arrays.asList( + metadata.getFixedLine(), + metadata.getTollFree())) { + assertFalse(desc.hasNationalNumberPattern()); + assertEquals(desc.getPossibleLengthList().size(), 0); + assertEquals(desc.getPossibleLengthLocalOnlyList().size(), 0); + assertFalse(desc.hasExampleNumber()); + } + } + + // Test that filtering a fake PhoneMetadata with the empty MetadataFilter results in no change. + @Test + public void testFilterMetadata_emptyFilter() { + PhoneMetadata.Builder metadata = getFakeArmeniaPhoneMetadata(); + + MetadataFilter.emptyFilter().filterMetadata(metadata); + + // None of the fields should be cleared. + assertEquals(metadata.getId(), "AM"); + assertEquals(metadata.getCountryCode(), 374); + assertEquals(metadata.getInternationalPrefix(), "0[01]"); + assertEquals(metadata.getPreferredInternationalPrefix(), "00"); + for (PhoneNumberDesc desc : Arrays.asList( + metadata.getGeneralDesc(), + metadata.getFixedLine(), + metadata.getMobile(), + metadata.getTollFree())) { + assertEquals(desc.getNationalNumberPattern(), NATIONAL_NUMBER_PATTERN); + assertContentsEqual(desc.getPossibleLengthList(), possibleLengths); + assertContentsEqual(desc.getPossibleLengthLocalOnlyList(), possibleLengthsLocalOnly); + } + assertFalse(metadata.getGeneralDesc().hasExampleNumber()); + assertEquals(metadata.getFixedLine().getExampleNumber(), EXAMPLE_NUMBER); + assertEquals(metadata.getMobile().getExampleNumber(), EXAMPLE_NUMBER); + assertEquals(metadata.getTollFree().getExampleNumber(), EXAMPLE_NUMBER); } + @Test public void testIntegrityOfFieldSets() { TreeSet union = new TreeSet(); - union.addAll(MetadataFilter.EXCLUDABLE_PARENT_FIELDS); - union.addAll(MetadataFilter.EXCLUDABLE_CHILD_FIELDS); - union.addAll(MetadataFilter.EXCLUDABLE_CHILDLESS_FIELDS); + union.addAll(MetadataFilter.excludableParentFields); + union.addAll(MetadataFilter.excludableChildFields); + union.addAll(MetadataFilter.excludableChildlessFields); // Mutually exclusive sets. - assertTrue(union.size() == MetadataFilter.EXCLUDABLE_PARENT_FIELDS.size() - + MetadataFilter.EXCLUDABLE_CHILD_FIELDS.size() - + MetadataFilter.EXCLUDABLE_CHILDLESS_FIELDS.size()); + assertTrue(union.size() == MetadataFilter.excludableParentFields.size() + + MetadataFilter.excludableChildFields.size() + + MetadataFilter.excludableChildlessFields.size()); // Nonempty sets. - assertTrue(MetadataFilter.EXCLUDABLE_PARENT_FIELDS.size() > 0 - && MetadataFilter.EXCLUDABLE_CHILD_FIELDS.size() > 0 - && MetadataFilter.EXCLUDABLE_CHILDLESS_FIELDS.size() > 0); + assertTrue(MetadataFilter.excludableParentFields.size() > 0 + && MetadataFilter.excludableChildFields.size() > 0 + && MetadataFilter.excludableChildlessFields.size() > 0); // Nonempty and canonical field names. for (String field : union) { assertTrue(field.length() > 0 && field.trim().equals(field)); } } + + private static PhoneMetadata.Builder getFakeArmeniaPhoneMetadata() { + PhoneMetadata.Builder metadata = PhoneMetadata.newBuilder(); + metadata.setId("AM"); + metadata.setCountryCode(374); + metadata.setInternationalPrefix("0[01]"); + metadata.setPreferredInternationalPrefix("00"); + metadata.setGeneralDesc(getFakeArmeniaPhoneNumberDesc(true)); + metadata.setFixedLine(getFakeArmeniaPhoneNumberDesc(false)); + metadata.setMobile(getFakeArmeniaPhoneNumberDesc(false)); + metadata.setTollFree(getFakeArmeniaPhoneNumberDesc(false)); + return metadata; + } + + private static PhoneNumberDesc getFakeArmeniaPhoneNumberDesc(boolean generalDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc().setNationalNumberPattern(NATIONAL_NUMBER_PATTERN); + if (!generalDesc) { + desc.setExampleNumber(EXAMPLE_NUMBER); + } + for (int i : possibleLengths) { + desc.addPossibleLength(i); + } + for (int i : possibleLengthsLocalOnly) { + desc.addPossibleLengthLocalOnly(i); + } + return desc; + } + + private static void assertContentsEqual(List list, int[] array) { + assertEquals(list.size(), array.length); + for (int i = 0; i < list.size(); i++) { + assertEquals((int) list.get(i), array[i]); + } + } } diff --git a/tools/java/cpp-build/target/cpp-build-1.0-SNAPSHOT-jar-with-dependencies.jar b/tools/java/cpp-build/target/cpp-build-1.0-SNAPSHOT-jar-with-dependencies.jar index 48dd0e36a6796dd6c00acd9439c9891f6262d570..af88e9f8db6d8bfbc91ebca2a5366d0fcdc0afa1 100644 GIT binary patch delta 11641 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 delta 11928 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