downloader: Fix lint errors.

Also get rid of mox.

BUG=chromium:403086
TEST=unittests, cros flash

Change-Id: I39072ebfae90f16894701303cc6ba132428ddc1b
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/dev-util/+/1827369
Commit-Queue: Achuith Bhandarkar <achuith@chromium.org>
Tested-by: Achuith Bhandarkar <achuith@chromium.org>
Reviewed-by: Amin Hassani <ahassani@chromium.org>
Reviewed-by: Mike Frysinger <vapier@chromium.org>
diff --git a/downloader.py b/downloader.py
old mode 100755
new mode 100644
index 8afdda9..4138b09
--- a/downloader.py
+++ b/downloader.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python2
 # -*- coding: utf-8 -*-
 # Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
@@ -18,6 +17,15 @@
 import threading
 from datetime import datetime
 
+try:
+  import android_build
+except ImportError:
+  # Ignore android_build import failure. This is to support devserver running
+  # inside a ChromeOS device triggered by cros flash. Most ChromeOS test images
+  # do not have google-api-python-client module and they don't need to support
+  # Android updating, therefore, ignore the import failure here.
+  android_build = None
+
 import build_artifact
 import common_util
 import log_util
@@ -27,19 +35,9 @@
 
 try:
   from chromite.lib import gs
-except ImportError as e:
+except ImportError:
   gs = None
 
-try:
-  import android_build
-except ImportError as e:
-  # Ignore android_build import failure. This is to support devserver running
-  # inside a ChromeOS device triggered by cros flash. Most ChromeOS test images
-  # do not have google-api-python-client module and they don't need to support
-  # Android updating, therefore, ignore the import failure here.
-  android_build = None
-
-
 class DownloaderException(Exception):
   """Exception that aggregates all exceptions raised during async download.
 
@@ -107,7 +105,7 @@
   def TouchTimestampForStaged(directory_path):
     file_name = os.path.join(directory_path, Downloader._TIMESTAMP_FILENAME)
     # Easiest python version of |touch file_name|
-    with file(file_name, 'a'):
+    with open(file_name, 'a'):
       os.utime(file_name, None)
 
   @staticmethod
diff --git a/downloader_unittest.py b/downloader_unittest.py
index 0082f75..f6dbe98 100755
--- a/downloader_unittest.py
+++ b/downloader_unittest.py
@@ -8,22 +8,22 @@
 
 from __future__ import print_function
 
-import mox
 import os
 import shutil
 import tempfile
 import unittest
 
+import mock
+
 import build_artifact
 import downloader
 
 
-# pylint: disable=W0212,E1120
-class DownloaderTestBase(mox.MoxTestBase):
+# pylint: disable=protected-access,no-value-for-parameter
+class DownloaderTestBase(unittest.TestCase):
   """Downloader Unittests."""
 
   def setUp(self):
-    mox.MoxTestBase.setUp(self)
     self._work_dir = tempfile.mkdtemp('downloader-test')
     self.board = 'x86-mario-release'
     self.build = 'R17-1413.0.0-a1-b1346'
@@ -34,31 +34,28 @@
   def tearDown(self):
     shutil.rmtree(self._work_dir, ignore_errors=True)
 
-  def _SimpleDownloadOfTestSuites(self, downloader_instance):
+  @mock.patch('downloader.Downloader._DownloadArtifactsSerially')
+  @mock.patch('downloader.Downloader._DownloadArtifactsInBackground')
+  def _SimpleDownloadOfTestSuites(self, downloader_instance, bg_mock,
+                                  serial_mock):
     """Helper to verify test_suites are downloaded correctly.
 
     Args:
       downloader_instance: Downloader object to test with.
+      bg_mock: background download method mock.
+      serial_mock: serial download method mock.
     """
     factory = build_artifact.ChromeOSArtifactFactory(
         downloader_instance.GetBuildDir(), ['test_suites'],
         None, downloader_instance.GetBuild())
-    self.mox.StubOutWithMock(downloader.Downloader,
-                             '_DownloadArtifactsSerially')
-    self.mox.StubOutWithMock(downloader.Downloader,
-                             '_DownloadArtifactsInBackground')
 
-    downloader.Downloader._DownloadArtifactsInBackground(mox.In(mox.IsA(
-        build_artifact.AutotestTarball)))
-    downloader.Downloader._DownloadArtifactsSerially(
-        [mox.IsA(build_artifact.BundledArtifact)], no_wait=True)
-    self.mox.ReplayAll()
     downloader_instance.Download(factory)
     # Sanity check the timestamp file exists.
+    install_dir = os.path.join(self._work_dir, self.board, self.build)
     self.assertTrue(os.path.exists(
-        os.path.join(self._work_dir, self.board, self.build,
-                     downloader.Downloader._TIMESTAMP_FILENAME)))
-    self.mox.VerifyAll()
+        os.path.join(install_dir, downloader.Downloader._TIMESTAMP_FILENAME)))
+    serial_mock.assert_called()
+    bg_mock.assert_called()
 
   def testSimpleDownloadOfTestSuitesFromGS(self):
     """Basic test_suites test.
@@ -81,22 +78,18 @@
     self._SimpleDownloadOfTestSuites(
         downloader.LocalDownloader(self._work_dir, self.local_path))
 
-  def _DownloadSymbolsHelper(self, downloader_instance):
+  @mock.patch('downloader.Downloader._DownloadArtifactsSerially')
+  @mock.patch('downloader.Downloader._DownloadArtifactsInBackground')
+  def _DownloadSymbolsHelper(self, downloader_instance, bg_mock, serial_mock):
     """Basic symbols download."""
     factory = build_artifact.ChromeOSArtifactFactory(
         downloader_instance.GetBuildDir(), ['symbols'],
         None, downloader_instance.GetBuild())
 
-    self.mox.StubOutWithMock(downloader.Downloader,
-                             '_DownloadArtifactsSerially')
     # Should not get called but mocking so that we know it wasn't called.
-    self.mox.StubOutWithMock(downloader.Downloader,
-                             '_DownloadArtifactsInBackground')
-    downloader.Downloader._DownloadArtifactsSerially(
-        [mox.IsA(build_artifact.BundledArtifact)], no_wait=True)
-    self.mox.ReplayAll()
     downloader_instance.Download(factory)
-    self.mox.VerifyAll()
+    serial_mock.assert_called()
+    bg_mock.assert_not_called()
 
   def testDownloadSymbolsFromGS(self):
     """Basic symbols download from Google Storage."""
@@ -112,11 +105,10 @@
         downloader.LocalDownloader(self._work_dir, self.local_path))
 
 
-class AndroidDownloaderTestBase(mox.MoxTestBase):
+class AndroidDownloaderTestBase(unittest.TestCase):
   """Android Downloader Unittests."""
 
   def setUp(self):
-    mox.MoxTestBase.setUp(self)
     self._work_dir = tempfile.mkdtemp('downloader-test')
     self.branch = 'release'
     self.target = 'shamu-userdebug'
@@ -125,27 +117,23 @@
   def tearDown(self):
     shutil.rmtree(self._work_dir, ignore_errors=True)
 
-  def testDownloadFromAndroidBuildServer(self):
+  @mock.patch('downloader.Downloader._DownloadArtifactsSerially')
+  @mock.patch('downloader.Downloader._DownloadArtifactsInBackground')
+  def testDownloadFromAndroidBuildServer(self, bg_mock, serial_mock):
     """Basic test to check download from Android's build server works."""
     downloader_instance = downloader.AndroidBuildDownloader(
         self._work_dir, self.branch, self.build_id, self.target)
     factory = build_artifact.AndroidArtifactFactory(
         downloader_instance.GetBuildDir(), ['fastboot'],
         None, downloader_instance.GetBuild())
-    self.mox.StubOutWithMock(downloader.Downloader,
-                             '_DownloadArtifactsSerially')
-    self.mox.StubOutWithMock(downloader.Downloader,
-                             '_DownloadArtifactsInBackground')
 
-    downloader.Downloader._DownloadArtifactsSerially(
-        [mox.IsA(build_artifact.Artifact)], no_wait=True)
-    self.mox.ReplayAll()
     downloader_instance.Download(factory)
     # Sanity check the timestamp file exists.
     self.assertTrue(os.path.exists(
         os.path.join(self._work_dir, self.branch, self.target, self.build_id,
                      downloader.Downloader._TIMESTAMP_FILENAME)))
-    self.mox.VerifyAll()
+    serial_mock.assert_called()
+    bg_mock.assert_not_called()
 
 
 if __name__ == '__main__':