#!/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/build_event.py."""
import datetime, logging, mox, unittest
# driver must be imported first due to circular imports in base_event and task
import driver # pylint: disable-msg=W0611
import base_event, build_event, forgiving_config_parser, manifest_versions, task
class BuildEventTestBase(mox.MoxTestBase):
"""Base class for BuildEvent unit test classes.
@var BOARD: faux board.
"""
BOARD = 'faux_board'
def setUp(self):
super(BuildEventTestBase, self).setUp()
self.mv = self.mox.CreateMock(manifest_versions.ManifestVersions)
def CreateEvent(self):
"""Return an instance of the BuildEvent subclass being tested."""
raise NotImplementedError()
def VetBranchBuilds(self, board, branch_manifests, branch_builds):
"""Assert that branch_builds is derived from branch_manifests.
@param board: the board to get builds for.
@param branch_manifests: {(type, milestone): [manifests]}
@param branch_builds: {type-or-milestone: [build-names]}
"""
for (type, milestone), manifests in branch_manifests.iteritems():
builds = []
if type in task.BARE_BRANCHES:
builds = branch_builds[type]
for build in builds:
self.assertTrue(build.startswith('%s-%s' % (board, type)))
else:
builds = branch_builds[milestone]
for build in builds:
self.assertTrue(build.startswith('%s-release' % board))
for build, manifest in zip(builds, manifests):
self.assertTrue('R%s-%s' % (milestone, manifest) in build)
def doTestGetBranchBuilds(self, board, branch_manifests):
"""Set expectations for and run BuildEvent.GetBranchBuildsForBoard().
@param board: the board to get builds for.
@param branch_manifests: {(type, milestone): [manifests]}
@return per-branch builds; {type-or-milestone: [build-names]}
"""
head = '1cedcafe'
self.mv.GetCheckpoint().AndReturn(head)
self.mv.ManifestsSinceRev(head, board).AndReturn(branch_manifests)
self.mox.ReplayAll()
event = self.CreateEvent()
event.Prepare()
return event.GetBranchBuildsForBoard(board)
class NewBuildTest(BuildEventTestBase):
"""Unit tests for build_event.NewBuild."""
def CreateEvent(self):
return build_event.NewBuild(self.mv, False)
def testMerge(self):
initial_hash = '1cedcafe'
self.mv.GetCheckpoint().AndReturn(initial_hash)
self.mox.ReplayAll()
event1 = self.CreateEvent()
event1.Prepare()
event1.Merge(self.CreateEvent())
self.assertEquals(event1._revision, initial_hash)
def testCreateFromAlwaysHandleConfig(self):
"""Test that creating with always_handle works as intended."""
config = forgiving_config_parser.ForgivingConfigParser()
section = base_event.SectionName(build_event.NewBuild.KEYWORD)
config.add_section(section)
config.set(section, 'always_handle', 'True')
self.mox.ReplayAll()
event = build_event.NewBuild.CreateFromConfig(config, self.mv)
self.assertTrue(event.ShouldHandle())
def testGetBranchBuilds(self):
"""Ensure that we handle the appearance of new branch builds."""
branch_manifests = {('factory','16'): ['last16'],
('release','17'): ['first17', 'last17']}
branch_builds = self.doTestGetBranchBuilds(self.BOARD, branch_manifests)
self.VetBranchBuilds(self.BOARD, branch_manifests, branch_builds)
def testGetNoBranchBuilds(self):
"""Ensure that we tolerate the appearance of no new branch builds."""
branch_builds = self.doTestGetBranchBuilds(self.BOARD, {})
self.assertEquals(branch_builds, {})
def testShouldHandle(self):
"""Ensure that we suggest Handle() iff new successful builds exist."""
initial_hash = '1cedcafe'
expected_hash = 'deadbeef'
self.mv.GetCheckpoint().AndReturn(initial_hash)
self.mv.AnyManifestsSinceRev(initial_hash).AndReturn(False)
self.mv.GetCheckpoint().AndReturn(expected_hash)
self.mv.AnyManifestsSinceRev(expected_hash).AndReturn(True)
self.mox.ReplayAll()
new_build = self.CreateEvent()
new_build.Prepare()
self.assertFalse(new_build.ShouldHandle())
new_build.UpdateCriteria()
self.assertTrue(new_build.ShouldHandle())
def testRunThrough(self):
"""Ensure we can run through a couple passes of expected workflow."""
initial_hash = '1cedcafe'
expected_hash = 'deadbeef'
branch_manifests = {('factory','16'): ['last16'],
('release','17'): ['first17', 'last17']}
# Expect Prepare()
self.mv.GetCheckpoint().AndReturn(initial_hash)
# Expect one run through.
self.mv.AnyManifestsSinceRev(initial_hash).AndReturn(True)
self.mv.ManifestsSinceRev(initial_hash,
self.BOARD).AndReturn(branch_manifests)
self.mv.GetCheckpoint().AndReturn(expected_hash)
# Expect a second run through.
self.mv.AnyManifestsSinceRev(expected_hash).AndReturn(True)
self.mv.ManifestsSinceRev(expected_hash,
self.BOARD).AndReturn(branch_manifests)
self.mox.ReplayAll()
new_build = self.CreateEvent()
new_build.Prepare()
self.assertTrue(new_build.ShouldHandle())
self.assertTrue(new_build.GetBranchBuildsForBoard(self.BOARD))
new_build.Handle(None, {}, self.BOARD)
new_build.UpdateCriteria()
self.assertTrue(new_build.ShouldHandle())
self.assertTrue(new_build.GetBranchBuildsForBoard(self.BOARD))
new_build.Handle(None, {}, self.BOARD)
if __name__ == '__main__':
unittest.main()