cros_sdk: fix download under Python 3

The curl run returns bytes but we process it like strings.  Change
the parsing logic so it works on bytes so we don't require specific
encoding on the HTTP headers.

While we're here, clean up unused |allow_none| setting, and add a
little unittest coverage to catch these issues.

BUG=chromium:997354
TEST=`./run_tests` passes

Change-Id: Iee8c82a72578e3bafbc8490ad4fae543d6a74215
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/1932719
Commit-Queue: Mike Frysinger <vapier@chromium.org>
Tested-by: Mike Frysinger <vapier@chromium.org>
Reviewed-by: Jack Rosenthal <jrosenth@chromium.org>
diff --git a/scripts/cros_sdk_unittest.py b/scripts/cros_sdk_unittest.py
index ad4a82e..3185ec9 100644
--- a/scripts/cros_sdk_unittest.py
+++ b/scripts/cros_sdk_unittest.py
@@ -15,7 +15,9 @@
 from chromite.lib import cros_sdk_lib
 from chromite.lib import cros_test_lib
 from chromite.lib import osutils
+from chromite.lib import retry_util
 from chromite.lib import sudo
+from chromite.scripts import cros_sdk
 
 
 # This long decorator triggers a false positive in the docstring test.
@@ -53,6 +55,38 @@
       self.assertEqual(result.returncode, 0)
 
 
+class CrosSdkUtilsTest(cros_test_lib.MockTempDirTestCase):
+  """Tests for misc util funcs."""
+
+  def testGetArchStageTarballs(self):
+    """Basic test of GetArchStageTarballs."""
+    self.assertCountEqual([
+        'https://storage.googleapis.com/chromiumos-sdk/cros-sdk-123.tar.xz',
+        'https://storage.googleapis.com/chromiumos-sdk/cros-sdk-123.tbz2',
+    ], cros_sdk.GetArchStageTarballs('123'))
+
+  def testFetchRemoteTarballsEmpty(self):
+    """Test FetchRemoteTarballs with no results."""
+    m = self.PatchObject(retry_util, 'RunCurl')
+    with self.assertRaises(ValueError):
+      cros_sdk.FetchRemoteTarballs(self.tempdir, [], 'tarball')
+    m.return_value = cros_build_lib.CommandResult(stdout=b'Foo: bar\n')
+    with self.assertRaises(ValueError):
+      cros_sdk.FetchRemoteTarballs(self.tempdir, ['gs://x.tar'], 'tarball')
+
+  def testFetchRemoteTarballsSuccess(self):
+    """Test FetchRemoteTarballs with a successful download."""
+    curl = cros_build_lib.CommandResult(stdout=(
+        b'HTTP/1.0 200\n'
+        b'Foo: bar\n'
+        b'Content-Length: 100\n'
+    ))
+    self.PatchObject(retry_util, 'RunCurl', return_value=curl)
+    self.assertEqual(
+        os.path.join(self.tempdir, 'tar'),
+        cros_sdk.FetchRemoteTarballs(self.tempdir, ['gs://x/tar'], 'tarball'))
+
+
 @unittest.skipIf(cros_build_lib.IsInsideChroot(),
                  'Tests only make sense outside the chroot')
 @unittest.skip(