Merge remote branch 'autotest-upstream/master' into autotest-merge

Merged to autotest upstream @5317.

BUG=none
TEST=
1. utils/unittest_suite.py
2. utils/packager.py --all upload -r /tmp/pkgs
3. utils/compile_gwt_clients.py

enter_chroot
emerge-x86-generic autotest-*
emerge-arm-generic autotest-*

run_remote_test suite_Smoke
run_remote_test bvt

Review URL: http://codereview.chromium.org/6883035

Change-Id: I03240d8652ffdfde4d6c8fbf474e2fad7f3cda10
diff --git a/scheduler/drones_unittest.py b/scheduler/drones_unittest.py
new file mode 100755
index 0000000..0713d52
--- /dev/null
+++ b/scheduler/drones_unittest.py
@@ -0,0 +1,54 @@
+#!/usr/bin/python2.4
+
+"""Tests for autotest_lib.scheduler.drones."""
+
+import cPickle
+
+import common
+from autotest_lib.client.common_lib import utils
+from autotest_lib.client.common_lib.test_utils import mock, unittest
+from autotest_lib.scheduler import drones
+from autotest_lib.server.hosts import ssh_host
+
+
+class RemoteDroneTest(unittest.TestCase):
+    def setUp(self):
+        self.god = mock.mock_god()
+        self._mock_host = self.god.create_mock_class(ssh_host.SSHHost,
+                                                     'mock SSHHost')
+        self.god.stub_function(drones.drone_utility, 'create_host')
+
+
+    def tearDown(self):
+        self.god.unstub_all()
+
+
+    def test_unreachable(self):
+        drones.drone_utility.create_host.expect_call('fakehost').and_return(
+                self._mock_host)
+        self._mock_host.is_up.expect_call().and_return(False)
+        self.assertRaises(drones.DroneUnreachable,
+                          drones._RemoteDrone, 'fakehost')
+
+
+    def test_execute_calls_impl(self):
+        self.god.stub_with(drones._RemoteDrone, '_drone_utility_path',
+                           'mock-drone-utility-path')
+        drones.drone_utility.create_host.expect_call('fakehost').and_return(
+                self._mock_host)
+        self._mock_host.is_up.expect_call().and_return(True)
+        mock_calls = ('foo',)
+        mock_result = utils.CmdResult(stdout=cPickle.dumps('mock return'))
+        self._mock_host.run.expect_call(
+                'python mock-drone-utility-path',
+                stdin=cPickle.dumps(mock_calls), stdout_tee=None,
+                connect_timeout=mock.is_instance_comparator(int)).and_return(
+                        mock_result)
+
+        drone = drones._RemoteDrone('fakehost')
+        self.assertEqual('mock return', drone._execute_calls_impl(mock_calls))
+        self.god.check_playback()
+
+
+if __name__ == '__main__':
+    unittest.main()