Refactor existing android tz generation tools

Refactor existing android tz generation tools to enable the addition of
other, similar tools.

Also, switch to atest for the test code.

This commit contains small corrects to comments and a test fix.

Bug: 143451294
Test: atest tztools_common_tests
Test: atest tzlookup_generator_test
Change-Id: Ib1ca79afd711a8c7b133c8e85aba6ca6818905e5
diff --git a/input_tools/android/common/Android.bp b/input_tools/android/common/Android.bp
new file mode 100644
index 0000000..4baf656
--- /dev/null
+++ b/input_tools/android/common/Android.bp
@@ -0,0 +1,43 @@
+// Copyright (C) 2019 The Android Open Source Project
+//
+// 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.
+
+
+// Code common to various time zone host tools.
+java_library_host {
+    name: "tztools_common",
+
+    srcs: ["src/main/java/**/*.java"],
+}
+
+// Code common to various time zone host tests.
+java_library_host {
+    name: "tztools_common_testing",
+
+    srcs: ["src/testing/java/**/*.java"],
+    libs: [
+        "junit",
+    ],
+}
+
+// Tests for tztools_common and tztools_common_testing.
+java_test_host {
+    name: "tztools_common_tests",
+
+    srcs: ["src/test/java/**/*.java"],
+    static_libs: [
+        "junit",
+        "tztools_common",
+        "tztools_common_testing",
+    ],
+}
diff --git a/input_tools/android/common/README.android b/input_tools/android/common/README.android
new file mode 100644
index 0000000..7c7b63f
--- /dev/null
+++ b/input_tools/android/common/README.android
@@ -0,0 +1 @@
+Common code used in several tools.
diff --git a/input_tools/android/tzlookup_generator/src/main/java/com/android/libcore/timezone/tzlookup/Errors.java b/input_tools/android/common/src/main/java/com/android/libcore/timezone/util/Errors.java
similarity index 81%
rename from input_tools/android/tzlookup_generator/src/main/java/com/android/libcore/timezone/tzlookup/Errors.java
rename to input_tools/android/common/src/main/java/com/android/libcore/timezone/util/Errors.java
index 5b01fcb..24c608c 100644
--- a/input_tools/android/tzlookup_generator/src/main/java/com/android/libcore/timezone/tzlookup/Errors.java
+++ b/input_tools/android/common/src/main/java/com/android/libcore/timezone/util/Errors.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.libcore.timezone.tzlookup;
+package com.android.libcore.timezone.util;
 
 import java.util.ArrayList;
 import java.util.LinkedList;
@@ -23,7 +23,7 @@
 /**
  * Stores context, errors and error severity for logging and flow control.
  */
-final class Errors {
+public final class Errors {
 
     private final static int LEVEL_WARNING = 1;
     private final static int LEVEL_ERROR = 2;
@@ -34,33 +34,33 @@
     private final LinkedList<String> scopes = new LinkedList<>();
     private final List<String> messages = new ArrayList<>();
 
-    Errors() {
+    public Errors() {
     }
 
-    void pushScope(String name) {
+    public void pushScope(String name) {
         scopes.add(name);
     }
 
-    String popScope() {
+    public String popScope() {
         return scopes.removeLast();
     }
 
-    void addFatal(String msg) {
+    public void addFatal(String msg) {
         level = Math.max(level, LEVEL_FATAL);
         add(msg);
     }
 
-    void addError(String msg) {
+    public void addError(String msg) {
         level = Math.max(level, LEVEL_ERROR);
         add(msg);
     }
 
-    void addWarning(String msg) {
+    public void addWarning(String msg) {
         level = Math.max(level, LEVEL_WARNING);
         add(msg);
     }
 
-    String asString() {
+    public String asString() {
         StringBuilder sb = new StringBuilder();
         for (String message : messages) {
             sb.append(message);
@@ -69,15 +69,15 @@
         return sb.toString();
     }
 
-    boolean isEmpty() {
+    public boolean isEmpty() {
         return messages.isEmpty();
     }
 
-    boolean hasError() {
+    public boolean hasError() {
         return level >= LEVEL_ERROR;
     }
 
-    boolean hasFatal() {
+    public boolean hasFatal() {
         return level >= LEVEL_FATAL;
     }
 
diff --git a/input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/ErrorsTest.java b/input_tools/android/common/src/test/java/com/android/libcore/timezone/util/ErrorsTest.java
similarity index 96%
rename from input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/ErrorsTest.java
rename to input_tools/android/common/src/test/java/com/android/libcore/timezone/util/ErrorsTest.java
index a7874b9..5a6e717 100644
--- a/input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/ErrorsTest.java
+++ b/input_tools/android/common/src/test/java/com/android/libcore/timezone/util/ErrorsTest.java
@@ -14,13 +14,15 @@
  * limitations under the License.
  */
 
-package com.android.libcore.timezone.tzlookup;
+package com.android.libcore.timezone.util;
 
 import org.junit.Test;
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import com.android.libcore.timezone.testing.TestUtils;
+
 public class ErrorsTest {
 
     @Test
diff --git a/input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/TestUtils.java b/input_tools/android/common/src/testing/java/com/android/libcore/timezone/testing/TestUtils.java
similarity index 85%
rename from input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/TestUtils.java
rename to input_tools/android/common/src/testing/java/com/android/libcore/timezone/testing/TestUtils.java
index ce2bd28..55bb215 100644
--- a/input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/TestUtils.java
+++ b/input_tools/android/common/src/testing/java/com/android/libcore/timezone/testing/TestUtils.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.libcore.timezone.tzlookup;
+package com.android.libcore.timezone.testing;
 
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
@@ -32,17 +32,17 @@
 /**
  * Arbitrary static utility methods to help with testing.
  */
-class TestUtils {
+public final class TestUtils {
 
     private TestUtils() {}
 
-    static String createFile(Path dir, String... lines) throws IOException {
+    public static String createFile(Path dir, String... lines) throws IOException {
         Path tempFile = Files.createTempFile(dir, "tmp", null /* suffix */);
         Files.write(tempFile, Arrays.asList(lines), StandardCharsets.US_ASCII);
         return tempFile.toString();
     }
 
-    static void deleteDir(Path tempDir) throws IOException {
+    public static void deleteDir(Path tempDir) throws IOException {
         FileVisitor<? super Path> deleter = new SimpleFileVisitor<Path>() {
             @Override
             public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
@@ -64,13 +64,13 @@
         Files.walkFileTree(tempDir, deleter);
     }
 
-    static void assertAbsent(String s, String... absents) {
+    public static void assertAbsent(String s, String... absents) {
         for (String absent : absents) {
             assertFalse(s + " must not contain " + absent, s.contains(absent));
         }
     }
 
-    static void assertContains(String s, String... expecteds) {
+    public static void assertContains(String s, String... expecteds) {
         for (String expected : expecteds) {
             assertTrue(s + " must contain " + expected, s.contains(expected));
         }
diff --git a/input_tools/android/tzlookup_generator/Android.bp b/input_tools/android/tzlookup_generator/Android.bp
index 7e7c2b9..610fb44 100644
--- a/input_tools/android/tzlookup_generator/Android.bp
+++ b/input_tools/android/tzlookup_generator/Android.bp
@@ -29,12 +29,22 @@
 
     main_class: "com.android.libcore.timezone.tzlookup.TzLookupGenerator",
     srcs: ["src/main/java/**/*.java"],
-    javacflags: [
-        "-encoding UTF-8",
-    ],
     static_libs: [
         "icu4j",
         "countryzonesprotos",
         "libprotobuf-java-full",
+        "tztools_common",
+    ],
+}
+
+// The tzlookup_generator host tool.
+java_test_host {
+    name: "tzlookup_generator_tests",
+
+    srcs: ["src/test/java/**/*.java"],
+    static_libs: [
+        "junit",
+        "tzlookup_generator",
+        "tztools_common_testing",
     ],
 }
diff --git a/input_tools/android/tzlookup_generator/README.android b/input_tools/android/tzlookup_generator/README.android
index 6807c91..4c993d4 100644
--- a/input_tools/android/tzlookup_generator/README.android
+++ b/input_tools/android/tzlookup_generator/README.android
@@ -1,10 +1,2 @@
 This tool generates the tzlookup.xml file from the countryzones.txt (proto text) file.
 The tool also uses ICU4J and IANA data to synthesize some time zone metadata.
-
-Tests in this directory can be run with vogar:
-
-make -j30 vogar tzlookup_generator
-
-cd system/timezone/input_tools/android/tzlookup_generator
-vogar --mode=jvm --classpath ${ANDROID_HOST_OUT}/../common/obj/JAVA_LIBRARIES/tzlookup_generator_intermediates/javalib.jar src/test/
-
diff --git a/input_tools/android/tzlookup_generator/src/main/java/com/android/libcore/timezone/tzlookup/CountryZonesFileSupport.java b/input_tools/android/tzlookup_generator/src/main/java/com/android/libcore/timezone/tzlookup/CountryZonesFileSupport.java
index 2266c92..9f9ad77 100644
--- a/input_tools/android/tzlookup_generator/src/main/java/com/android/libcore/timezone/tzlookup/CountryZonesFileSupport.java
+++ b/input_tools/android/tzlookup_generator/src/main/java/com/android/libcore/timezone/tzlookup/CountryZonesFileSupport.java
@@ -26,7 +26,7 @@
 import java.util.stream.Collectors;
 
 /**
- * A class containing utility methods for details with CountryZonesFile proto objects.
+ * A class containing utility methods for dealing with CountryZonesFile proto objects.
  */
 public final class CountryZonesFileSupport {
 
diff --git a/input_tools/android/tzlookup_generator/src/main/java/com/android/libcore/timezone/tzlookup/TzLookupGenerator.java b/input_tools/android/tzlookup_generator/src/main/java/com/android/libcore/timezone/tzlookup/TzLookupGenerator.java
index 3d840d6..ac3684a 100644
--- a/input_tools/android/tzlookup_generator/src/main/java/com/android/libcore/timezone/tzlookup/TzLookupGenerator.java
+++ b/input_tools/android/tzlookup_generator/src/main/java/com/android/libcore/timezone/tzlookup/TzLookupGenerator.java
@@ -18,6 +18,7 @@
 import com.android.libcore.timezone.tzlookup.proto.CountryZonesFile;
 import com.android.libcore.timezone.tzlookup.zonetree.CountryZoneTree;
 import com.android.libcore.timezone.tzlookup.zonetree.CountryZoneUsage;
+import com.android.libcore.timezone.util.Errors;
 import com.ibm.icu.util.BasicTimeZone;
 import com.ibm.icu.util.Calendar;
 import com.ibm.icu.util.GregorianCalendar;
@@ -82,7 +83,7 @@
     public static void main(String[] args) throws Exception {
         if (args.length != 3) {
             System.err.println(
-                    "usage: java com.android.libcore.timezone.tzlookup.proto.TzLookupGenerator"
+                    "usage: java com.android.libcore.timezone.tzlookup.TzLookupGenerator"
                             + " <input proto file> <zone.tab file> <output xml file>");
             System.exit(0);
         }
diff --git a/input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/TzLookupGeneratorTest.java b/input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/TzLookupGeneratorTest.java
index cfd35d3..6a4843f 100644
--- a/input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/TzLookupGeneratorTest.java
+++ b/input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/TzLookupGeneratorTest.java
@@ -16,6 +16,7 @@
 
 package com.android.libcore.timezone.tzlookup;
 
+import com.android.libcore.timezone.testing.TestUtils;
 import com.android.libcore.timezone.tzlookup.proto.CountryZonesFile;
 import com.google.protobuf.TextFormat;
 import com.ibm.icu.util.TimeZone;
@@ -34,9 +35,9 @@
 import java.util.List;
 import java.util.stream.Collectors;
 
-import static com.android.libcore.timezone.tzlookup.TestUtils.assertAbsent;
-import static com.android.libcore.timezone.tzlookup.TestUtils.assertContains;
-import static com.android.libcore.timezone.tzlookup.TestUtils.createFile;
+import static com.android.libcore.timezone.testing.TestUtils.assertAbsent;
+import static com.android.libcore.timezone.testing.TestUtils.assertContains;
+import static com.android.libcore.timezone.testing.TestUtils.createFile;
 import static com.android.libcore.timezone.tzlookup.proto.CountryZonesFile.Country;
 import static junit.framework.TestCase.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -454,7 +455,7 @@
                 + "<id notafter=\"436359600000\">America/Juneau</id>\n"
                 + "<id notafter=\"436356000000\">America/Yakutat</id>\n"
                 + "<id notafter=\"436363200000\">America/Nome</id>\n"
-                + "<id notafter=\"1446372000000\">America/Metlakatla</id>\n"
+                + "<id notafter=\"1547978400000\">America/Metlakatla</id>\n"
                 + "<id notafter=\"341402400000\">America/Sitka</id>\n"
                 + "<id>Pacific/Honolulu</id>\n"
                 + "<id>America/Adak</id>\n";
diff --git a/input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/ZoneTabFileTest.java b/input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/ZoneTabFileTest.java
index f9414d9..b581ffd 100644
--- a/input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/ZoneTabFileTest.java
+++ b/input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/ZoneTabFileTest.java
@@ -16,6 +16,8 @@
 
 package com.android.libcore.timezone.tzlookup;
 
+import com.android.libcore.timezone.testing.TestUtils;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;