| Index: build/android/pylib/base/test_dispatcher_unittest.py
 | 
| diff --git a/build/android/pylib/base/test_dispatcher_unittest.py b/build/android/pylib/base/test_dispatcher_unittest.py
 | 
| old mode 100644
 | 
| new mode 100755
 | 
| index b57cca9c9d685e9c460fd68e2635798978900db1..cace9a627a28985350d69a6729e5f0e2a2994690
 | 
| --- a/build/android/pylib/base/test_dispatcher_unittest.py
 | 
| +++ b/build/android/pylib/base/test_dispatcher_unittest.py
 | 
| @@ -1,3 +1,4 @@
 | 
| +#!/usr/bin/env python
 | 
|  # Copyright 2013 The Chromium Authors. All rights reserved.
 | 
|  # Use of this source code is governed by a BSD-style license that can be
 | 
|  # found in the LICENSE file.
 | 
| @@ -10,27 +11,38 @@ import os
 | 
|  import sys
 | 
|  import unittest
 | 
|  
 | 
| -sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)),
 | 
| -                os.pardir, os.pardir))
 | 
|  
 | 
| -# Mock out android_commands.GetAttachedDevices().
 | 
| -from pylib import android_commands
 | 
| -android_commands.GetAttachedDevices = lambda: ['0', '1']
 | 
|  from pylib import constants
 | 
|  from pylib.base import base_test_result
 | 
|  from pylib.base import test_collection
 | 
|  from pylib.base import test_dispatcher
 | 
| +from pylib.device import adb_wrapper
 | 
| +from pylib.device import device_utils
 | 
|  from pylib.utils import watchdog_timer
 | 
|  
 | 
| +sys.path.append(
 | 
| +    os.path.join(constants.DIR_SOURCE_ROOT, 'third_party', 'pymock'))
 | 
| +import mock
 | 
| +
 | 
|  
 | 
|  class TestException(Exception):
 | 
|    pass
 | 
|  
 | 
|  
 | 
| +def _MockDevice(serial):
 | 
| +  d = mock.MagicMock(spec=device_utils.DeviceUtils)
 | 
| +  d.__str__.return_value = serial
 | 
| +  d.adb = mock.MagicMock(spec=adb_wrapper.AdbWrapper)
 | 
| +  d.adb.GetDeviceSerial = mock.MagicMock(return_value=serial)
 | 
| +  d.IsOnline = mock.MagicMock(return_value=True)
 | 
| +  return d
 | 
| +
 | 
| +
 | 
|  class MockRunner(object):
 | 
|    """A mock TestRunner."""
 | 
| -  def __init__(self, device='0', shard_index=0):
 | 
| -    self.device_serial = device
 | 
| +  def __init__(self, device=None, shard_index=0):
 | 
| +    self.device = device or _MockDevice('0')
 | 
| +    self.device_serial = self.device.adb.GetDeviceSerial()
 | 
|      self.shard_index = shard_index
 | 
|      self.setups = 0
 | 
|      self.teardowns = 0
 | 
| @@ -57,7 +69,7 @@ class MockRunnerFail(MockRunner):
 | 
|  
 | 
|  
 | 
|  class MockRunnerFailTwice(MockRunner):
 | 
| -  def __init__(self, device='0', shard_index=0):
 | 
| +  def __init__(self, device=None, shard_index=0):
 | 
|      super(MockRunnerFailTwice, self).__init__(device, shard_index)
 | 
|      self._fails = 0
 | 
|  
 | 
| @@ -111,7 +123,7 @@ class TestFunctions(unittest.TestCase):
 | 
|    def testSetUp(self):
 | 
|      runners = []
 | 
|      counter = test_dispatcher._ThreadSafeCounter()
 | 
| -    test_dispatcher._SetUp(MockRunner, '0', runners, counter)
 | 
| +    test_dispatcher._SetUp(MockRunner, _MockDevice('0'), runners, counter)
 | 
|      self.assertEqual(len(runners), 1)
 | 
|      self.assertEqual(runners[0].setups, 1)
 | 
|  
 | 
| @@ -135,7 +147,8 @@ class TestThreadGroupFunctions(unittest.TestCase):
 | 
|      self.test_collection_factory = lambda: shared_test_collection
 | 
|  
 | 
|    def testCreate(self):
 | 
| -    runners = test_dispatcher._CreateRunners(MockRunner, ['0', '1'])
 | 
| +    runners = test_dispatcher._CreateRunners(
 | 
| +        MockRunner, [_MockDevice('0'), _MockDevice('1')])
 | 
|      for runner in runners:
 | 
|        self.assertEqual(runner.setups, 1)
 | 
|      self.assertEqual(set([r.device_serial for r in runners]),
 | 
| @@ -144,27 +157,29 @@ class TestThreadGroupFunctions(unittest.TestCase):
 | 
|                       set([0, 1]))
 | 
|  
 | 
|    def testRun(self):
 | 
| -    runners = [MockRunner('0'), MockRunner('1')]
 | 
| +    runners = [MockRunner(_MockDevice('0')), MockRunner(_MockDevice('1'))]
 | 
|      results, exit_code = test_dispatcher._RunAllTests(
 | 
|          runners, self.test_collection_factory, 0)
 | 
|      self.assertEqual(len(results.GetPass()), len(self.tests))
 | 
|      self.assertEqual(exit_code, 0)
 | 
|  
 | 
|    def testTearDown(self):
 | 
| -    runners = [MockRunner('0'), MockRunner('1')]
 | 
| +    runners = [MockRunner(_MockDevice('0')), MockRunner(_MockDevice('1'))]
 | 
|      test_dispatcher._TearDownRunners(runners)
 | 
|      for runner in runners:
 | 
|        self.assertEqual(runner.teardowns, 1)
 | 
|  
 | 
|    def testRetry(self):
 | 
| -    runners = test_dispatcher._CreateRunners(MockRunnerFail, ['0', '1'])
 | 
| +    runners = test_dispatcher._CreateRunners(
 | 
| +        MockRunnerFail, [_MockDevice('0'), _MockDevice('1')])
 | 
|      results, exit_code = test_dispatcher._RunAllTests(
 | 
|          runners, self.test_collection_factory, 0)
 | 
|      self.assertEqual(len(results.GetFail()), len(self.tests))
 | 
|      self.assertEqual(exit_code, constants.ERROR_EXIT_CODE)
 | 
|  
 | 
|    def testReraise(self):
 | 
| -    runners = test_dispatcher._CreateRunners(MockRunnerException, ['0', '1'])
 | 
| +    runners = test_dispatcher._CreateRunners(
 | 
| +        MockRunnerException, [_MockDevice('0'), _MockDevice('1')])
 | 
|      with self.assertRaises(TestException):
 | 
|        test_dispatcher._RunAllTests(runners, self.test_collection_factory, 0)
 | 
|  
 | 
| @@ -174,7 +189,8 @@ class TestShard(unittest.TestCase):
 | 
|    @staticmethod
 | 
|    def _RunShard(runner_factory):
 | 
|      return test_dispatcher.RunTests(
 | 
| -        ['a', 'b', 'c'], runner_factory, ['0', '1'], shard=True)
 | 
| +        ['a', 'b', 'c'], runner_factory, [_MockDevice('0'), _MockDevice('1')],
 | 
| +        shard=True)
 | 
|  
 | 
|    def testShard(self):
 | 
|      results, exit_code = TestShard._RunShard(MockRunner)
 | 
| @@ -189,7 +205,7 @@ class TestShard(unittest.TestCase):
 | 
|  
 | 
|    def testNoTests(self):
 | 
|      results, exit_code = test_dispatcher.RunTests(
 | 
| -        [], MockRunner, ['0', '1'], shard=True)
 | 
| +        [], MockRunner, [_MockDevice('0'), _MockDevice('1')], shard=True)
 | 
|      self.assertEqual(len(results.GetAll()), 0)
 | 
|      self.assertEqual(exit_code, constants.ERROR_EXIT_CODE)
 | 
|  
 | 
| @@ -199,7 +215,8 @@ class TestReplicate(unittest.TestCase):
 | 
|    @staticmethod
 | 
|    def _RunReplicate(runner_factory):
 | 
|      return test_dispatcher.RunTests(
 | 
| -        ['a', 'b', 'c'], runner_factory, ['0', '1'], shard=False)
 | 
| +        ['a', 'b', 'c'], runner_factory, [_MockDevice('0'), _MockDevice('1')],
 | 
| +        shard=False)
 | 
|  
 | 
|    def testReplicate(self):
 | 
|      results, exit_code = TestReplicate._RunReplicate(MockRunner)
 | 
| @@ -215,7 +232,7 @@ class TestReplicate(unittest.TestCase):
 | 
|  
 | 
|    def testNoTests(self):
 | 
|      results, exit_code = test_dispatcher.RunTests(
 | 
| -        [], MockRunner, ['0', '1'], shard=False)
 | 
| +        [], MockRunner, [_MockDevice('0'), _MockDevice('1')], shard=False)
 | 
|      self.assertEqual(len(results.GetAll()), 0)
 | 
|      self.assertEqual(exit_code, constants.ERROR_EXIT_CODE)
 | 
|  
 | 
| 
 |