#!/usr/bin/python
#
# Copyright (c) 2012 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.
"""Unit tests for site_utils/base_event.py."""
import logging
import mox
import unittest
# driver must be imported first due to circular imports in base_event and task
import driver # pylint: disable-msg=W0611
import base_event
import deduping_scheduler
import task
class FakeTask(task.Task):
"""A mock Task that can optionally expect triggering."""
def __init__(self, suite, build, pool, pymox):
super(FakeTask, self).__init__('Fake', suite, build, pool)
pymox.StubOutWithMock(self, 'Run')
def CanArm(self, scheduler):
scheduler.CheckHostsExist(
multiple_labels=mox.IgnoreArg()).AndReturn(['host1'])
def Arm(self):
"""Expect to be triggered along with any other FakeTasks."""
self.Run(mox.IgnoreArg(),
mox.IgnoreArg(),
mox.IgnoreArg(),
mox.IgnoreArg(),
mox.IgnoreArg()).InAnyOrder('tasks').AndReturn(True)
class FakeOneShot(FakeTask):
"""A mock OneShotEvent that can be optionally set to expect triggering."""
def __init__(self, suite, build, pool, pymox):
super(FakeOneShot, self).__init__(suite, build, pool, pymox)
def Arm(self):
"""Expect to be triggered once, and to ask for self-destruction."""
self.Run(mox.IgnoreArg(),
mox.IgnoreArg(),
mox.IgnoreArg(),
mox.IgnoreArg(),
mox.IgnoreArg()).AndReturn(False)
class BaseEventTest(mox.MoxTestBase):
"""Unit tests for BaseEvent.
@var _TASKS: Specs for several tasks to run.
"""
_TASKS = [('suite1', 'build1', 'pool'),
('suite2', 'build2', None),
('suite2', 'build3', None),
('suite3', 'build2', None)]
def setUp(self):
super(BaseEventTest, self).setUp()
self.sched = self.mox.CreateMock(deduping_scheduler.DedupingScheduler)
def CreateEvent(self):
"""Return an instance of base_event.BaseEvent."""
return base_event.BaseEvent('event', None, False)
def testEventDeduping(self):
"""Tests that tasks are de-duped at BaseEvent creation."""
tasks = [FakeTask(*task, pymox=self.mox) for task in self._TASKS]
tasks.append(FakeTask(*self._TASKS[0], pymox=self.mox))
self.mox.ReplayAll()
event = self.CreateEvent()
event.tasks = tasks
self.assertEquals(len(event.tasks), len(self._TASKS))
def testRecurringTasks(self):
"""Tests that tasks are all run on Handle()."""
tasks = [FakeTask(*task, pymox=self.mox) for task in self._TASKS]
for task in tasks:
task.CanArm(self.sched)
task.Arm()
event = self.CreateEvent()
self.mox.ReplayAll()
event.tasks = tasks
event.Handle(self.sched, {}, "board1")
self.mox.VerifyAll()
# Ensure that all tasks are still around and can be Handle()'d again.
self.mox.ResetAll()
for task in tasks:
task.CanArm(self.sched)
task.Arm()
self.mox.ReplayAll()
event.Handle(self.sched, {}, "board1")
def testOneShotWithRecurringTasks(self):
"""Tests that one-shot tasks are destroyed correctly."""
tasks = [FakeTask(*task, pymox=self.mox) for task in self._TASKS]
all_tasks = tasks + [FakeOneShot(*self._TASKS[0], pymox=self.mox)]
for task in all_tasks:
task.CanArm(self.sched)
task.Arm()
event = self.CreateEvent()
self.mox.ReplayAll()
event.tasks = all_tasks
event.Handle(self.sched, {}, "board1")
self.mox.VerifyAll()
# Ensure that only recurring tasks can get Handle()'d again.
self.mox.ResetAll()
for task in tasks:
task.CanArm(self.sched)
task.Arm()
self.mox.ReplayAll()
event.Handle(self.sched, {}, "board1")
if __name__ == '__main__':
unittest.main()