diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/android/aar_embedded_jars_extractor.py | 9 | ||||
-rw-r--r-- | tools/android/aar_embedded_jars_extractor_test.py | 46 | ||||
-rw-r--r-- | tools/android/aar_native_libs_zip_creator.py | 6 | ||||
-rw-r--r-- | tools/android/aar_native_libs_zip_creator_test.py | 14 | ||||
-rw-r--r-- | tools/android/aar_resources_extractor.py | 4 | ||||
-rw-r--r-- | tools/android/aar_resources_extractor_test.py | 14 | ||||
-rw-r--r-- | tools/android/build_incremental_dexmanifest.py | 2 | ||||
-rw-r--r-- | tools/android/incremental_install.py | 18 | ||||
-rw-r--r-- | tools/android/incremental_install_test.py | 45 | ||||
-rw-r--r-- | tools/android/merge_manifests.py | 2 | ||||
-rw-r--r-- | tools/android/resource_extractor_test.py | 18 |
11 files changed, 100 insertions, 78 deletions
diff --git a/tools/android/aar_embedded_jars_extractor.py b/tools/android/aar_embedded_jars_extractor.py index 393d3f4c5c..2fa85b63a8 100644 --- a/tools/android/aar_embedded_jars_extractor.py +++ b/tools/android/aar_embedded_jars_extractor.py @@ -45,13 +45,14 @@ def ExtractEmbeddedJars(aar, if not output_dir_orig: output_dir_orig = output_dir jar_pattern = re.compile("^(classes|libs/.+)\\.jar$") - singlejar_param_file.write("--exclude_build_data\n") + singlejar_param_file.write(b"--exclude_build_data\n") for name in aar.namelist(): if jar_pattern.match(name): - singlejar_param_file.write("--sources\n") + singlejar_param_file.write(b"--sources\n") # output_dir may be a temporary junction, so write the original # (unshortened) path to the params file - singlejar_param_file.write(output_dir_orig + "/" + name + "\n") + singlejar_param_file.write( + (output_dir_orig + "/" + name + "\n").encode("utf-8")) aar.extract(name, output_dir) @@ -62,7 +63,7 @@ def _Main(input_aar, if not output_dir_orig: output_dir_orig = output_dir with zipfile.ZipFile(input_aar, "r") as aar: - with open(output_singlejar_param_file, "w") as singlejar_param_file: + with open(output_singlejar_param_file, "wb") as singlejar_param_file: ExtractEmbeddedJars(aar, singlejar_param_file, output_dir, output_dir_orig) diff --git a/tools/android/aar_embedded_jars_extractor_test.py b/tools/android/aar_embedded_jars_extractor_test.py index 30f150e850..6b63520d67 100644 --- a/tools/android/aar_embedded_jars_extractor_test.py +++ b/tools/android/aar_embedded_jars_extractor_test.py @@ -14,9 +14,9 @@ """Tests for aar_embedded_jars_extractor.""" +import io import os import shutil -import StringIO import unittest import zipfile @@ -26,6 +26,12 @@ from tools.android import aar_embedded_jars_extractor class AarEmbeddedJarsExtractor(unittest.TestCase): """Unit tests for aar_embedded_jars_extractor.py.""" + # Python 2 alias + if not hasattr(unittest.TestCase, "assertCountEqual"): + + def assertCountEqual(self, *args): + return self.assertItemsEqual(*args) + def setUp(self): os.chdir(os.environ["TEST_TMPDIR"]) @@ -33,47 +39,47 @@ class AarEmbeddedJarsExtractor(unittest.TestCase): shutil.rmtree("out_dir") def testNoJars(self): - aar = zipfile.ZipFile(StringIO.StringIO(), "w") - param_file = StringIO.StringIO() + aar = zipfile.ZipFile(io.BytesIO(), "w") + param_file = io.BytesIO() os.makedirs("out_dir") aar_embedded_jars_extractor.ExtractEmbeddedJars(aar, param_file, "out_dir") self.assertEqual([], os.listdir("out_dir")) param_file.seek(0) - self.assertEqual("--exclude_build_data\n", param_file.read()) + self.assertEqual(b"--exclude_build_data\n", param_file.read()) def testClassesJarAndLibsJars(self): - aar = zipfile.ZipFile(StringIO.StringIO(), "w") + aar = zipfile.ZipFile(io.BytesIO(), "w") aar.writestr("classes.jar", "") aar.writestr("libs/a.jar", "") aar.writestr("libs/b.jar", "") - param_file = StringIO.StringIO() + param_file = io.BytesIO() os.makedirs("out_dir") aar_embedded_jars_extractor.ExtractEmbeddedJars(aar, param_file, "out_dir") - self.assertItemsEqual(["classes.jar", "libs"], os.listdir("out_dir")) - self.assertItemsEqual(["a.jar", "b.jar"], os.listdir("out_dir/libs")) + self.assertCountEqual(["classes.jar", "libs"], os.listdir("out_dir")) + self.assertCountEqual(["a.jar", "b.jar"], os.listdir("out_dir/libs")) param_file.seek(0) self.assertEqual( - ["--exclude_build_data\n", - "--sources\n", - "out_dir/classes.jar\n", - "--sources\n", - "out_dir/libs/a.jar\n", - "--sources\n", - "out_dir/libs/b.jar\n"], + [b"--exclude_build_data\n", + b"--sources\n", + b"out_dir/classes.jar\n", + b"--sources\n", + b"out_dir/libs/a.jar\n", + b"--sources\n", + b"out_dir/libs/b.jar\n"], param_file.readlines()) def testOnlyClassesJar(self): - aar = zipfile.ZipFile(StringIO.StringIO(), "w") + aar = zipfile.ZipFile(io.BytesIO(), "w") aar.writestr("classes.jar", "") - param_file = StringIO.StringIO() + param_file = io.BytesIO() os.makedirs("out_dir") aar_embedded_jars_extractor.ExtractEmbeddedJars(aar, param_file, "out_dir") self.assertEqual(["classes.jar"], os.listdir("out_dir")) param_file.seek(0) self.assertEqual( - ["--exclude_build_data\n", - "--sources\n", - "out_dir/classes.jar\n"], + [b"--exclude_build_data\n", + b"--sources\n", + b"out_dir/classes.jar\n"], param_file.readlines()) diff --git a/tools/android/aar_native_libs_zip_creator.py b/tools/android/aar_native_libs_zip_creator.py index 88b9db3216..0348418fb5 100644 --- a/tools/android/aar_native_libs_zip_creator.py +++ b/tools/android/aar_native_libs_zip_creator.py @@ -20,6 +20,8 @@ are converted from the AAR directory structure of /jni/<cpu>/foo.so to the APK directory structure of /lib/<cpu>/foo.so. """ +from __future__ import print_function + import os import re import sys @@ -63,8 +65,8 @@ def Main(input_aar_path, output_zip_path, cpu, input_aar_path_for_error_msg): try: CreateNativeLibsZip(input_aar, cpu, native_libs_zip) except UnsupportedArchitectureException: - print(("AAR " + input_aar_path_for_error_msg + - " missing native libs for requested architecture: " + cpu)) + print("AAR " + input_aar_path_for_error_msg + + " missing native libs for requested architecture: " + cpu) sys.exit(1) diff --git a/tools/android/aar_native_libs_zip_creator_test.py b/tools/android/aar_native_libs_zip_creator_test.py index 0e0210e448..3ec71a617a 100644 --- a/tools/android/aar_native_libs_zip_creator_test.py +++ b/tools/android/aar_native_libs_zip_creator_test.py @@ -14,7 +14,7 @@ """Tests for aar_native_libs_zip_creator.""" -import StringIO +import io import unittest import zipfile @@ -25,25 +25,25 @@ class AarNativeLibsZipCreatorTest(unittest.TestCase): """Unit tests for aar_native_libs_zip_creator.py.""" def testAarWithNoLibs(self): - aar = zipfile.ZipFile(StringIO.StringIO(), "w") - outzip = zipfile.ZipFile(StringIO.StringIO(), "w") + aar = zipfile.ZipFile(io.BytesIO(), "w") + outzip = zipfile.ZipFile(io.BytesIO(), "w") aar_native_libs_zip_creator.CreateNativeLibsZip(aar, "x86", outzip) self.assertEquals([], outzip.namelist()) def testAarWithMissingLibs(self): - aar = zipfile.ZipFile(StringIO.StringIO(), "w") + aar = zipfile.ZipFile(io.BytesIO(), "w") aar.writestr("jni/armeabi/foo.so", "") - outzip = zipfile.ZipFile(StringIO.StringIO(), "w") + outzip = zipfile.ZipFile(io.BytesIO(), "w") self.assertRaises( aar_native_libs_zip_creator.UnsupportedArchitectureException, aar_native_libs_zip_creator.CreateNativeLibsZip, aar, "x86", outzip) def testAarWithAllLibs(self): - aar = zipfile.ZipFile(StringIO.StringIO(), "w") + aar = zipfile.ZipFile(io.BytesIO(), "w") aar.writestr("jni/x86/foo.so", "") aar.writestr("jni/armeabi/foo.so", "") - outzip = zipfile.ZipFile(StringIO.StringIO(), "w") + outzip = zipfile.ZipFile(io.BytesIO(), "w") aar_native_libs_zip_creator.CreateNativeLibsZip(aar, "x86", outzip) self.assertIn("lib/x86/foo.so", outzip.namelist()) self.assertNotIn("lib/armeabi/foo.so", outzip.namelist()) diff --git a/tools/android/aar_resources_extractor.py b/tools/android/aar_resources_extractor.py index 61f9f4d397..5d875fbe12 100644 --- a/tools/android/aar_resources_extractor.py +++ b/tools/android/aar_resources_extractor.py @@ -78,11 +78,11 @@ def ExtractResources(aar, output_res_dir): with junction.TempJunction(os.path.dirname(empty_xml_filename)) as junc: xmlpath = os.path.join(junc, os.path.basename(empty_xml_filename)) with open(xmlpath, "wb") as empty_xml: - empty_xml.write("<resources/>") + empty_xml.write(b"<resources/>") else: os.makedirs(os.path.dirname(empty_xml_filename)) with open(empty_xml_filename, "wb") as empty_xml: - empty_xml.write("<resources/>") + empty_xml.write(b"<resources/>") def main(): diff --git a/tools/android/aar_resources_extractor_test.py b/tools/android/aar_resources_extractor_test.py index d5f630b352..ba93c320b9 100644 --- a/tools/android/aar_resources_extractor_test.py +++ b/tools/android/aar_resources_extractor_test.py @@ -14,9 +14,9 @@ """Tests for aar_resources_extractor.""" +import io import os import shutil -import StringIO import unittest import zipfile @@ -30,6 +30,12 @@ def _HostPath(path): class AarResourcesExtractorTest(unittest.TestCase): """Unit tests for aar_resources_extractor.py.""" + # Python 2 alias + if not hasattr(unittest.TestCase, "assertCountEqual"): + + def assertCountEqual(self, *args): + return self.assertItemsEqual(*args) + def setUp(self): os.chdir(os.environ["TEST_TMPDIR"]) @@ -43,7 +49,7 @@ class AarResourcesExtractorTest(unittest.TestCase): ] def testNoResources(self): - aar = zipfile.ZipFile(StringIO.StringIO(), "w") + aar = zipfile.ZipFile(io.BytesIO(), "w") os.makedirs("out_dir") aar_resources_extractor.ExtractResources(aar, "out_dir") self.assertEqual([_HostPath("out_dir/res/values/empty.xml")], @@ -52,7 +58,7 @@ class AarResourcesExtractorTest(unittest.TestCase): self.assertEqual("<resources/>", empty_xml.read()) def testContainsResources(self): - aar = zipfile.ZipFile(StringIO.StringIO(), "w") + aar = zipfile.ZipFile(io.BytesIO(), "w") aar.writestr("res/values/values.xml", "some values") aar.writestr("res/layouts/layout.xml", "some layout") os.makedirs("out_dir") @@ -61,7 +67,7 @@ class AarResourcesExtractorTest(unittest.TestCase): _HostPath("out_dir/res/values/values.xml"), _HostPath("out_dir/res/layouts/layout.xml") ] - self.assertItemsEqual(expected_resources, self.DirContents("out_dir")) + self.assertCountEqual(expected_resources, self.DirContents("out_dir")) with open("out_dir/res/values/values.xml", "r") as values_xml: self.assertEqual("some values", values_xml.read()) with open("out_dir/res/layouts/layout.xml", "r") as layout_xml: diff --git a/tools/android/build_incremental_dexmanifest.py b/tools/android/build_incremental_dexmanifest.py index 6c372656ec..e912d62a93 100644 --- a/tools/android/build_incremental_dexmanifest.py +++ b/tools/android/build_incremental_dexmanifest.py @@ -121,7 +121,7 @@ class DexmanifestBuilder(object): self.AddDex(input_filename, None, input_filename) with open(argv[0], "wb") as manifest: - manifest.write("\n".join(self.manifest_lines)) + manifest.write(("\n".join(self.manifest_lines)).encode("utf-8")) def main(argv): diff --git a/tools/android/incremental_install.py b/tools/android/incremental_install.py index bad2e29c88..254db274fc 100644 --- a/tools/android/incremental_install.py +++ b/tools/android/incremental_install.py @@ -221,7 +221,7 @@ class Adb(object): """Push a given string to a given path on the device in parallel.""" local = self._CreateLocalFile() with open(local, "wb") as f: - f.write(contents) + f.write(contents.encode("utf-8")) return self.Push(local, remote) def Pull(self, remote): @@ -237,7 +237,7 @@ class Adb(object): try: self._Exec(["pull", remote, local]) with open(local, "rb") as f: - return f.read() + return f.read().decode("utf-8") except (AdbError, IOError): return None @@ -339,7 +339,7 @@ def ParseManifest(contents): def GetAppPackage(stub_datafile): """Returns the app package specified in a stub data file.""" with open(stub_datafile, "rb") as f: - return f.readlines()[1].strip() + return f.readlines()[1].decode("utf-8").strip() def UploadDexes(adb, execroot, app_dir, temp_dir, dexmanifest, full_install): @@ -605,7 +605,7 @@ def UploadNativeLibs(adb, native_lib_args, app_dir, full_install): f.result() install_manifest = [ - name + " " + checksum for name, checksum in install_checksums.iteritems()] + name + " " + checksum for name, checksum in install_checksums.items()] adb.PushString("\n".join(install_manifest), targetpath.join(app_dir, "native", "native_manifest")).result() @@ -693,7 +693,7 @@ def SplitIncrementalInstall(adb, app_package, execroot, split_main_apk, adb.InstallMultiple(targetpath.join(execroot, apk), app_package) install_manifest = [ - name + " " + checksum for name, checksum in install_checksums.iteritems()] + name + " " + checksum for name, checksum in install_checksums.items()] adb.PushString("\n".join(install_manifest), targetpath.join(app_dir, "split_manifest")).result() @@ -744,7 +744,7 @@ def IncrementalInstall(adb_path, VerifyInstallTimestamp(adb, app_package) with open(hostpath.join(execroot, dexmanifest), "rb") as f: - dexmanifest = f.read() + dexmanifest = f.read().decode("utf-8") UploadDexes(adb, execroot, app_dir, temp_dir, dexmanifest, bool(apk)) # TODO(ahumesky): UploadDexes waits for all the dexes to be uploaded, and # then UploadResources is called. We could instead enqueue everything @@ -776,16 +776,16 @@ def IncrementalInstall(adb_path, sys.exit("Error: Device unauthorized. Please check the confirmation " "dialog on your device.") except MultipleDevicesError as e: - sys.exit("Error: " + e.message + "\nTry specifying a device serial with " + sys.exit("Error: " + str(e) + "\nTry specifying a device serial with " "\"blaze mobile-install --adb_arg=-s --adb_arg=$ANDROID_SERIAL\"") except OldSdkException as e: sys.exit("Error: The device does not support the API level specified in " "the application's manifest. Check minSdkVersion in " "AndroidManifest.xml") except TimestampException as e: - sys.exit("Error:\n%s" % e.message) + sys.exit("Error:\n%s" % str(e)) except AdbError as e: - sys.exit("Error:\n%s" % e.message) + sys.exit("Error:\n%s" % str(e)) finally: shutil.rmtree(temp_dir, True) diff --git a/tools/android/incremental_install_test.py b/tools/android/incremental_install_test.py index 1181a591ef..5eee83fcad 100644 --- a/tools/android/incremental_install_test.py +++ b/tools/android/incremental_install_test.py @@ -49,7 +49,7 @@ class MockAdb(object): if cmd == "push": # "/test/adb push local remote" with open(args[2], "rb") as f: - content = f.read() + content = f.read().decode("utf-8") self.files[args[3]] = content elif cmd == "pull": # "/test/adb pull remote local" @@ -58,7 +58,7 @@ class MockAdb(object): content = self.files.get(remote) if content is not None: with open(local, "wb") as f: - f.write(content) + f.write(content.encode("utf-8")) else: returncode = 1 stderr = "remote object '%s' does not exist\n" % remote @@ -69,7 +69,7 @@ class MockAdb(object): elif cmd == "install-multiple": if args[3] == "-p": with open(args[5], "rb") as f: - content = f.read() + content = f.read().decode("utf-8") self.split_apks.add(content) else: self.package_timestamp = self._last_package_timestamp @@ -133,11 +133,12 @@ class IncrementalInstallTest(unittest.TestCase): # Write the stub datafile which contains the package name of the app. with open(self._STUB_DATAFILE, "wb") as f: - f.write("\n".join([self._OLD_APP_PACKGE, self._APP_PACKAGE])) + f.write(("\n".join([self._OLD_APP_PACKGE, self._APP_PACKAGE])) + .encode("utf-8")) # Write the local resource apk file. with open(self._RESOURCE_APK, "wb") as f: - f.write("resource apk") + f.write(b"resource apk") # Mock out subprocess.Popen to use our mock adb. self._popen_patch = mock.patch.object(incremental_install, "subprocess") @@ -157,7 +158,7 @@ class IncrementalInstallTest(unittest.TestCase): def _CreateLocalManifest(self, *lines): content = "\n".join(lines) with open(self._DEXMANIFEST, "wb") as f: - f.write(content) + f.write(content.encode("utf-8")) return content def _CreateRemoteManifest(self, *lines): @@ -205,7 +206,7 @@ class IncrementalInstallTest(unittest.TestCase): self._CreateZip() with open("dex1", "wb") as f: - f.write("content3") + f.write(b"content3") manifest = self._CreateLocalManifest( "zip1 zp1 ip1 0", @@ -224,10 +225,10 @@ class IncrementalInstallTest(unittest.TestCase): def testSplitInstallToPristineDevice(self): with open("split1", "wb") as f: - f.write("split_content1") + f.write(b"split_content1") with open("main", "wb") as f: - f.write("main_Content") + f.write(b"main_Content") self._CallIncrementalInstall( incremental=False, split_main_apk="main", split_apks=["split1"]) @@ -235,10 +236,10 @@ class IncrementalInstallTest(unittest.TestCase): def testSplitInstallUnchanged(self): with open("split1", "wb") as f: - f.write("split_content1") + f.write(b"split_content1") with open("main", "wb") as f: - f.write("main_Content") + f.write(b"main_Content") self._CallIncrementalInstall( incremental=False, split_main_apk="main", split_apks=["split1"]) @@ -250,17 +251,17 @@ class IncrementalInstallTest(unittest.TestCase): def testSplitInstallChanges(self): with open("split1", "wb") as f: - f.write("split_content1") + f.write(b"split_content1") with open("main", "wb") as f: - f.write("main_Content") + f.write(b"main_Content") self._CallIncrementalInstall( incremental=False, split_main_apk="main", split_apks=["split1"]) self.assertEqual(set(["split_content1"]), self._mock_adb.split_apks) with open("split1", "wb") as f: - f.write("split_content2") + f.write(b"split_content2") self._mock_adb.split_apks = set() self._CallIncrementalInstall( incremental=False, split_main_apk="main", split_apks=["split1"]) @@ -269,7 +270,7 @@ class IncrementalInstallTest(unittest.TestCase): def testMissingNativeManifestWithIncrementalInstall(self): self._CreateZip() with open("liba.so", "wb") as f: - f.write("liba_1") + f.write(b"liba_1") # Upload a library to the device. native_libs = ["armeabi-v7a:liba.so"] @@ -285,7 +286,7 @@ class IncrementalInstallTest(unittest.TestCase): def testNonIncrementalInstallOverwritesNativeLibs(self): self._CreateZip() with open("liba.so", "wb") as f: - f.write("liba_1") + f.write(b"liba_1") # Upload a library to the device. native_libs = ["armeabi-v7a:liba.so"] @@ -305,7 +306,7 @@ class IncrementalInstallTest(unittest.TestCase): def testNativeAbiCompatibility(self): self._CreateZip() with open("liba.so", "wb") as f: - f.write("liba") + f.write(b"liba") native_libs = ["armeabi:liba.so"] self._mock_adb.SetAbi("arm64-v8a") @@ -315,9 +316,9 @@ class IncrementalInstallTest(unittest.TestCase): def testUploadNativeLibs(self): self._CreateZip() with open("liba.so", "wb") as f: - f.write("liba_1") + f.write(b"liba_1") with open("libb.so", "wb") as f: - f.write("libb_1") + f.write(b"libb_1") native_libs = ["armeabi-v7a:liba.so", "armeabi-v7a:libb.so"] self._CallIncrementalInstall(incremental=False, native_libs=native_libs) @@ -326,7 +327,7 @@ class IncrementalInstallTest(unittest.TestCase): # Change a library with open("libb.so", "wb") as f: - f.write("libb_2") + f.write(b"libb_2") self._CallIncrementalInstall(incremental=True, native_libs=native_libs) self.assertEqual("libb_2", self._GetDeviceFile("native/libb.so")) @@ -520,7 +521,7 @@ class IncrementalInstallTest(unittest.TestCase): self._CreateZip() with open("dex1", "wb") as f: - f.write("content3") + f.write(b"content3") self._CreateLocalManifest( "zip1 zp1 ip1 0", @@ -536,7 +537,7 @@ class IncrementalInstallTest(unittest.TestCase): self._CreateZip() with open("dex1", "wb") as f: - f.write("content3") + f.write(b"content3") self._CreateLocalManifest( "zip1 zp1 ip1 0", diff --git a/tools/android/merge_manifests.py b/tools/android/merge_manifests.py index a12e53836c..520b03219c 100644 --- a/tools/android/merge_manifests.py +++ b/tools/android/merge_manifests.py @@ -379,7 +379,7 @@ class MergeManifests(object): self._MergeTopLevelNamespaces(mergee_dom) for destination, values in sorted( - self._NODES_TO_COPY_FROM_MERGEE.iteritems()): + self._NODES_TO_COPY_FROM_MERGEE.items()): for node_to_copy in values: for node in mergee_dom.getElementsByTagName(node_to_copy): if self._IsDuplicate(node_to_copy, node): diff --git a/tools/android/resource_extractor_test.py b/tools/android/resource_extractor_test.py index de5b6a8b87..ae7a5a629f 100644 --- a/tools/android/resource_extractor_test.py +++ b/tools/android/resource_extractor_test.py @@ -14,7 +14,7 @@ """Tests for resource_extractor.""" -import StringIO +import io import unittest import zipfile @@ -24,8 +24,14 @@ from tools.android import resource_extractor class ResourceExtractorTest(unittest.TestCase): """Unit tests for resource_extractor.py.""" + # Python 2 alias + if not hasattr(unittest.TestCase, "assertCountEqual"): + + def assertCountEqual(self, *args): + return self.assertItemsEqual(*args) + def testJarWithEverything(self): - input_jar = zipfile.ZipFile(StringIO.StringIO(), "w") + input_jar = zipfile.ZipFile(io.BytesIO(), "w") for path in ( # Should not be included @@ -56,17 +62,17 @@ class ResourceExtractorTest(unittest.TestCase): "not_CVS/include", "META-INF/services/foo"): input_jar.writestr(path, "") - output_zip = zipfile.ZipFile(StringIO.StringIO(), "w") + output_zip = zipfile.ZipFile(io.BytesIO(), "w") resource_extractor.ExtractResources(input_jar, output_zip) - self.assertItemsEqual(("c", "a/b", "bar/a", "a/not_package.html", + self.assertCountEqual(("c", "a/b", "bar/a", "a/not_package.html", "not_CVS/include", "META-INF/services/foo"), output_zip.namelist()) def testTimestampsAreTheSame(self): - input_jar = zipfile.ZipFile(StringIO.StringIO(), "w") + input_jar = zipfile.ZipFile(io.BytesIO(), "w") entry_info = zipfile.ZipInfo("a", (1982, 1, 1, 0, 0, 0)) input_jar.writestr(entry_info, "") - output_zip = zipfile.ZipFile(StringIO.StringIO(), "w") + output_zip = zipfile.ZipFile(io.BytesIO(), "w") resource_extractor.ExtractResources(input_jar, output_zip) self.assertEqual((1982, 1, 1, 0, 0, 0), output_zip.getinfo("a").date_time) |