Python 3 fixes for tools/build_defs, jdk, objc

RELNOTES: None
PiperOrigin-RevId: 179596587
diff --git a/tools/build_defs/docker/create_image_config.py b/tools/build_defs/docker/create_image_config.py
index 05ce4a6..30eef39 100644
--- a/tools/build_defs/docker/create_image_config.py
+++ b/tools/build_defs/docker/create_image_config.py
@@ -100,7 +100,7 @@
   """Do a deep copy, skipping null entry."""
   if isinstance(data, dict):
     return dict((DeepCopySkipNull(k), DeepCopySkipNull(v))
-                for k, v in data.iteritems() if v is not None)
+                for k, v in data.items() if v is not None)
   return copy.deepcopy(data)
 
 
@@ -149,7 +149,7 @@
     # Build a dictionary of existing environment variables (used by Resolve).
     environ_dict = KeyValueToDict(output['config'].get('Env', []))
     # Merge in new environment variables, resolving references.
-    for k, v in options.env.iteritems():
+    for k, v in options.env.items():
       # Resolve handles scenarios like "PATH=$PATH:...".
       environ_dict[k] = Resolve(v, environ_dict)
     output['config']['Env'] = Dict2ConfigValue(environ_dict)
@@ -157,7 +157,7 @@
   # TODO(babel-team) Label is currently docker specific
   if options.labels:
     label_dict = KeyValueToDict(output['config'].get('Label', []))
-    for k, v in options.labels.iteritems():
+    for k, v in options.labels.items():
       label_dict[k] = v
     output['config']['Label'] = Dict2ConfigValue(label_dict)
 
@@ -216,7 +216,7 @@
     layers.append(utils.ExtractValue(layer))
 
   labels = KeyValueToDict(FLAGS.labels)
-  for label, value in labels.iteritems():
+  for label, value in labels.items():
     if value.startswith('@'):
       with open(value[1:], 'r') as f:
         labels[label] = f.read()
diff --git a/tools/build_defs/docker/join_layers.py b/tools/build_defs/docker/join_layers.py
index 97e4793..0928aef 100644
--- a/tools/build_defs/docker/join_layers.py
+++ b/tools/build_defs/docker/join_layers.py
@@ -53,10 +53,10 @@
   # Walk the single-item dictionary, and if there is a single tag
   # for the single repository, then emit a 'top' file pointing to
   # the single image in this bundle.
-  for (unused_x, tags) in repositories.iteritems():
+  for (unused_x, tags) in repositories.items():
     if len(tags) != 1:
       continue
-    for (unused_y, layer_id) in tags.iteritems():
+    for (unused_y, layer_id) in tags.items():
       tar.add_file('top', content=layer_id)
 
 
diff --git a/tools/build_defs/docker/rewrite_json.py b/tools/build_defs/docker/rewrite_json.py
index 38fd01d..c06bf45 100644
--- a/tools/build_defs/docker/rewrite_json.py
+++ b/tools/build_defs/docker/rewrite_json.py
@@ -122,7 +122,7 @@
   """Do a deep copy, skipping null entry."""
   if type(data) == type(dict()):
     return dict((DeepCopySkipNull(k), DeepCopySkipNull(v))
-                for k, v in data.iteritems() if v is not None)
+                for k, v in data.items() if v is not None)
   return copy.deepcopy(data)
 
 
@@ -187,14 +187,14 @@
     # Build a dictionary of existing environment variables (used by Resolve).
     environ_dict = KeyValueToDict(output['config'].get('Env', []))
     # Merge in new environment variables, resolving references.
-    for k, v in options.env.iteritems():
+    for k, v in options.env.items():
       # Resolve handles scenarios like "PATH=$PATH:...".
       environ_dict[k] = Resolve(v, environ_dict)
     output['config']['Env'] = Dict2ConfigValue(environ_dict)
 
   if options.labels:
     label_dict = KeyValueToDict(output['config'].get('Label', []))
-    for k, v in options.labels.iteritems():
+    for k, v in options.labels.items():
       label_dict[k] = v
     output['config']['Label'] = Dict2ConfigValue(label_dict)
 
@@ -279,7 +279,7 @@
       name = f.read()
 
   labels = KeyValueToDict(FLAGS.labels)
-  for label, value in labels.iteritems():
+  for label, value in labels.items():
     if value.startswith('@'):
       with open(value[1:], 'r') as f:
         labels[label] = f.read()
diff --git a/tools/build_defs/pkg/archive.py b/tools/build_defs/pkg/archive.py
index 59728e0..1669523 100644
--- a/tools/build_defs/pkg/archive.py
+++ b/tools/build_defs/pkg/archive.py
@@ -15,11 +15,8 @@
 
 # pylint: disable=g-import-not-at-top
 import gzip
+import io
 import os
-try:
-  from StringIO import StringIO
-except ImportError:
-  from io import StringIO
 import subprocess
 import tarfile
 
@@ -60,7 +57,7 @@
     """
 
     def __init__(self, f):
-      self.filename = f.read(16).strip()
+      self.filename = f.read(16).decode('utf-8').strip()
       if self.filename.endswith('/'):  # SysV variant
         self.filename = self.filename[:-1]
       self.timestamp = int(f.read(12).strip())
@@ -69,11 +66,11 @@
       self.mode = int(f.read(8).strip(), 8)
       self.size = int(f.read(10).strip())
       pad = f.read(2)
-      if pad != '\x60\x0a':
+      if pad != b'\x60\x0a':
         raise SimpleArFile.ArError('Invalid AR file header')
       self.data = f.read(self.size)
 
-  MAGIC_STRING = '!<arch>\n'
+  MAGIC_STRING = b'!<arch>\n'
 
   def __init__(self, filename):
     self.filename = filename
@@ -273,8 +270,9 @@
     if link:
       tarinfo.linkname = link
     if content:
-      tarinfo.size = len(content)
-      self._addfile(tarinfo, StringIO(content))
+      content_bytes = content.encode('utf-8')
+      tarinfo.size = len(content_bytes)
+      self._addfile(tarinfo, io.BytesIO(content_bytes))
     elif file_content:
       with open(file_content, 'rb') as f:
         tarinfo.size = os.fstat(f.fileno()).st_size
@@ -334,7 +332,7 @@
       p = subprocess.Popen('cat %s | xzcat' % tar,
                            shell=True,
                            stdout=subprocess.PIPE)
-      f = StringIO(p.stdout.read())
+      f = io.BytesIO(p.stdout.read())
       p.wait()
       intar = tarfile.open(fileobj=f, mode='r:')
     else:
diff --git a/tools/build_defs/pkg/archive_test.py b/tools/build_defs/pkg/archive_test.py
index 729e533..5aa6407 100644
--- a/tools/build_defs/pkg/archive_test.py
+++ b/tools/build_defs/pkg/archive_test.py
@@ -64,7 +64,10 @@
 
   def assertSimpleFileContent(self, names):
     datafile = os.path.join(testenv.TESTDATA_PATH, "_".join(names) + ".ar")
-    content = [{"filename": n, "size": len(n), "data": n} for n in names]
+    content = [{"filename": n,
+                "size": len(n.encode("utf-8")),
+                "data": n.encode("utf-8")}
+               for n in names]
     self.assertArFileContent(datafile, content)
 
   def testAFile(self):
@@ -140,9 +143,11 @@
     with archive.TarFileWriter(self.tempfile) as f:
       for n in names:
         f.add_file(n, content=n)
-    content = ([{"name": "."}] + [{"name": n,
-                                    "size": len(n),
-                                    "data": n} for n in names])
+    content = ([{"name": "."}] +
+               [{"name": n,
+                 "size": len(n.encode("utf-8")),
+                 "data": n.encode("utf-8")}
+                for n in names])
     self.assertTarFileContent(self.tempfile, content)
 
   def testAddFile(self):
@@ -172,9 +177,9 @@
     content = [
         {"name": ".", "mode": 0o755},
         {"name": "./a", "mode": 0o755},
-        {"name": "./a/b", "data": "ab", "mode": 0o644},
+        {"name": "./a/b", "data": b"ab", "mode": 0o644},
         {"name": "./a/c", "mode": 0o755},
-        {"name": "./a/c/d", "data": "acd", "mode": 0o644},
+        {"name": "./a/c/d", "data": b"acd", "mode": 0o644},
         ]
     tempdir = os.path.join(os.environ["TEST_TMPDIR"], "test_dir")
     # Iterate over the `content` array to create the directory
@@ -183,7 +188,7 @@
       if "data" in c:
         p = os.path.join(tempdir, c["name"][2:])
         os.makedirs(os.path.dirname(p))
-        with open(p, "w") as f:
+        with open(p, "wb") as f:
           f.write(c["data"])
     with archive.TarFileWriter(self.tempfile) as f:
       f.add_dir("./", tempdir, mode=0o644)
@@ -191,8 +196,8 @@
 
   def testMergeTar(self):
     content = [
-        {"name": "./a", "data": "a"},
-        {"name": "./ab", "data": "ab"},
+        {"name": "./a", "data": b"a"},
+        {"name": "./ab", "data": b"ab"},
         ]
     for ext in ["", ".gz", ".bz2", ".xz"]:
       with archive.TarFileWriter(self.tempfile) as f:
@@ -204,8 +209,8 @@
     content = [
         {"name": ".", "mode": 0o755},
         {"name": "./foo", "mode": 0o755},
-        {"name": "./foo/a", "data": "a"},
-        {"name": "./foo/ab", "data": "ab"},
+        {"name": "./foo/a", "data": b"a"},
+        {"name": "./foo/ab", "data": b"ab"},
         ]
     with archive.TarFileWriter(self.tempfile) as f:
       f.add_tar(os.path.join(testenv.TESTDATA_PATH, "tar_test.tar"),
diff --git a/tools/build_defs/pkg/make_deb.py b/tools/build_defs/pkg/make_deb.py
index 8e81a6f..c734536 100644
--- a/tools/build_defs/pkg/make_deb.py
+++ b/tools/build_defs/pkg/make_deb.py
@@ -137,7 +137,7 @@
       tarinfo.size = len(controlfile)
       f.addfile(tarinfo, fileobj=StringIO(controlfile))
       if extrafiles:
-        for name, (data, mode) in extrafiles.iteritems():
+        for name, (data, mode) in extrafiles.items():
           tarinfo = tarfile.TarInfo(name)
           tarinfo.size = len(data)
           tarinfo.mode = mode
diff --git a/tools/build_defs/pkg/make_rpm.py b/tools/build_defs/pkg/make_rpm.py
index 9f0f40a..108bd9d 100644
--- a/tools/build_defs/pkg/make_rpm.py
+++ b/tools/build_defs/pkg/make_rpm.py
@@ -119,7 +119,7 @@
   with open(output_file, 'w') as output:
     for line in fileinput.input(input_file):
       if replacements:
-        for prefix, text in replacements.iteritems():
+        for prefix, text in replacements.items():
           if line.startswith(prefix):
             line = prefix + ' ' + text + '\n'
             break
@@ -151,7 +151,7 @@
     # Create directory structure.
     for name in RpmBuilder.DIRS:
       if not os.path.exists(name):
-        os.makedirs(name, 0777)
+        os.makedirs(name, 0o777)
 
     shutil.copy(os.path.join(original_dir, spec_file), os.getcwd())
 
diff --git a/tools/build_defs/pkg/make_rpm_test.py b/tools/build_defs/pkg/make_rpm_test.py
index f8f7710..8c87172 100644
--- a/tools/build_defs/pkg/make_rpm_test.py
+++ b/tools/build_defs/pkg/make_rpm_test.py
@@ -43,6 +43,12 @@
 
 class MakeRpmTest(unittest.TestCase):
 
+  # Python 2 alias
+  if not hasattr(unittest.TestCase, 'assertCountEqual'):
+
+    def assertCountEqual(self, *args):
+      return self.assertItemsEqual(*args)
+
   def testFindOutputFile(self):
     log = """
     Lots of data.
@@ -51,7 +57,7 @@
     """
 
     result = make_rpm.FindOutputFile(log)
-    self.assertEquals('/path/to/file/here.rpm', result)
+    self.assertEqual('/path/to/file/here.rpm', result)
 
   def testFindOutputFile_missing(self):
     log = """
@@ -60,7 +66,7 @@
     """
 
     result = make_rpm.FindOutputFile(log)
-    self.assertEquals(None, result)
+    self.assertEqual(None, result)
 
   def testCopyAndRewrite(self):
     with make_rpm.Tempdir():
@@ -71,7 +77,7 @@
       })
 
       self.assertTrue(FileExists('out.txt'))
-      self.assertItemsEqual(['Some: data1a', 'Other: data2', 'More: data3a'],
+      self.assertCountEqual(['Some: data1a', 'Other: data2', 'More: data3a'],
                             FileContents('out.txt'))
 
   def testSetupWorkdir(self):
@@ -92,13 +98,13 @@
         self.assertTrue(DirExists('BUILD'))
         self.assertTrue(DirExists('TMP'))
         self.assertTrue(FileExists('test.spec'))
-        self.assertItemsEqual(
+        self.assertCountEqual(
             ['Name: test', 'Version: 1.0', 'Summary: test data'],
             FileContents('test.spec'))
         self.assertTrue(FileExists('BUILD/file1.txt'))
-        self.assertItemsEqual(['Hello'], FileContents('BUILD/file1.txt'))
+        self.assertCountEqual(['Hello'], FileContents('BUILD/file1.txt'))
         self.assertTrue(FileExists('BUILD/file2.txt'))
-        self.assertItemsEqual(['Goodbye'], FileContents('BUILD/file2.txt'))
+        self.assertCountEqual(['Goodbye'], FileContents('BUILD/file2.txt'))
 
 
 if __name__ == '__main__':
diff --git a/tools/jdk/proguard_whitelister_test.py b/tools/jdk/proguard_whitelister_test.py
index 6a24501..a7754c7 100644
--- a/tools/jdk/proguard_whitelister_test.py
+++ b/tools/jdk/proguard_whitelister_test.py
@@ -30,7 +30,7 @@
     output_path = os.path.join(tmpdir, "proguard_whitelister_test_output.cfg")
     # This will raise an exception if the config is invalid.
     self._CreateValidator(input_path, output_path).ValidateAndWriteOutput()
-    with file(output_path) as output:
+    with open(output_path) as output:
       self.assertTrue(("# Merged from %s" % input_path) in output.read())
 
   def _TestInvalidConfig(self, invalid_args, config):
diff --git a/tools/objc/j2objc_dead_code_pruner.py b/tools/objc/j2objc_dead_code_pruner.py
index 3377fc9..218a8d4 100755
--- a/tools/objc/j2objc_dead_code_pruner.py
+++ b/tools/objc/j2objc_dead_code_pruner.py
@@ -219,7 +219,7 @@
   duplicated_files = []
   dict_with_duplicates = dict()
 
-  for archive, source_files in archive_source_file_mapping.iteritems():
+  for source_files in archive_source_file_mapping.values():
     for source_file in source_files:
       file_basename = os.path.basename(source_file)
       file_without_ext = os.path.splitext(source_file)[0]