#!/usr/bin/python
#
# Copyright 2015 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Tests for the drone task queue."""
import cPickle
import logging
import Queue
import unittest
import common
from autotest_lib.client.common_lib import utils
from autotest_lib.client.common_lib.test_utils import mock
from autotest_lib.scheduler import drone_task_queue
from autotest_lib.scheduler import drones
from autotest_lib.server.hosts import ssh_host
class DroneTaskQueueTest(unittest.TestCase):
"""Drone task queue tests."""
def create_remote_drone(self, hostname):
"""Create and initialize a Remote Drone.
@param hostname: The name of the host for the remote drone.
@return: A remote drone instance.
"""
drones.drone_utility.create_host.expect_call(hostname).and_return(
self._mock_host)
self._mock_host.is_up.expect_call().and_return(True)
return drones._RemoteDrone(hostname, timestamp_remote_calls=False)
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')
self.drone_utility_path = 'mock-drone-utility-path'
self.mock_return = {'results': ['mock results'],
'warnings': []}
self.god.stub_with(drones._RemoteDrone, '_drone_utility_path',
self.drone_utility_path)
def tearDown(self):
self.god.unstub_all()
def test_execute(self):
"""Test execute method."""
drone1 = self.create_remote_drone('fakehostname1')
drone2 = self.create_remote_drone('fakehostname2')
drone3 = self.create_remote_drone('fakehostname3')
# Check task queue exception conditions.
task_queue = drone_task_queue.DroneTaskQueue()
task_queue.results[drone1] = None
self.assertRaises(drone_task_queue.DroneTaskQueueException,
task_queue.execute, [])
task_queue.results.clear()
# Queue 2 calls against each drone, and confirm that the host's
# run method is called 3 times. Then compare results returned by
# the task queue against the mock results.
drones = [drone1, drone2, drone3]
for drone in drones:
drone.queue_call('foo')
drone.queue_call('bar')
mock_result = utils.CmdResult(
stdout=cPickle.dumps(self.mock_return))
self._mock_host.run.expect_call(
'python %s' % self.drone_utility_path,
stdin=cPickle.dumps(drone.get_calls()), stdout_tee=None,
connect_timeout=mock.is_instance_comparator(int)
).and_return(mock_result)
task_queue.execute(drones, wait=False)
self.assertTrue(set(task_queue.results.keys()) == set(drones))
results = task_queue.get_results()
self.assertTrue(len(task_queue.results) == 0)
for drone, result in results.iteritems():
self.assertTrue(result == self.mock_return['results'])
# Test execute and get_results
drone1.queue_call('foo')
mock_result = utils.CmdResult(stdout=cPickle.dumps(self.mock_return))
self._mock_host.run.expect_call(
'python %s' % self.drone_utility_path,
stdin=cPickle.dumps(drone1.get_calls()), stdout_tee=None,
connect_timeout=mock.is_instance_comparator(int)).and_return(
mock_result)
self.assertTrue(task_queue.execute(drones, wait=True)[drone1] ==
self.mock_return['results'])
self.assertTrue(len(task_queue.results) == 0)
self.assertTrue(len(task_queue.get_results()) == 0)
self.god.check_playback()
if __name__ == '__main__':
unittest.main()