blob: ca81eef6cc2d46eb2d903b17823c8207143596e3 [file] [log] [blame]
# -*- coding: utf-8 -*-
# Copyright 2017 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.
"""This module tests the cros bisect command."""
from __future__ import print_function
import argparse
from chromite.cros_bisect import autotest_evaluator
from chromite.cros_bisect import git_bisector
from chromite.cros_bisect import simple_chrome_builder
from chromite.cli.cros import cros_bisect
from chromite.lib import commandline
from chromite.lib import cros_test_lib
from chromite.lib import remote_access
class CrosBisectTest(cros_test_lib.MockTestCase):
"""Test BisectCommand."""
DEFAULT_ARGS = ['--good', '900d900d', '--bad', 'badbad', '--remote',
'192.168.0.11', '--base-dir', '/tmp/bisect']
def setUp(self):
self.parser = commandline.ArgumentParser()
cros_bisect.BisectCommand.AddParser(self.parser)
def testAddParser(self):
# Use commandline.ArgumentParser to get 'path' type support.
options = self.parser.parse_args(self.DEFAULT_ARGS)
self.assertTrue(
simple_chrome_builder.SimpleChromeBuilder.SanityCheckOptions(options))
self.assertTrue(
autotest_evaluator.AutotestEvaluator.SanityCheckOptions(options))
self.assertTrue(
git_bisector.GitBisector.SanityCheckOptions(options))
def testRun(self):
options = self.parser.parse_args(self.DEFAULT_ARGS + ['--board', 'test'])
self.PatchObject(simple_chrome_builder.SimpleChromeBuilder, '__init__',
return_value=None)
self.PatchObject(autotest_evaluator.AutotestEvaluator, '__init__',
return_value=None)
self.PatchObject(git_bisector.GitBisector, '__init__',
return_value=None)
self.PatchObject(git_bisector.GitBisector, 'SetUp')
self.PatchObject(git_bisector.GitBisector, 'Run')
bisector = cros_bisect.BisectCommand(options)
bisector.Run()
def testProcessOptionsReuseFlag(self):
args_with_board = self.DEFAULT_ARGS + ['--board', 'test']
options = self.parser.parse_args(self.DEFAULT_ARGS)
options = self.parser.parse_args(args_with_board)
bisector = cros_bisect.BisectCommand(options)
bisector.ProcessOptions()
self.assertFalse(bisector.options.reuse_repo)
self.assertFalse(bisector.options.reuse_build)
self.assertFalse(bisector.options.reuse_eval)
# Flip --reuse.
options = self.parser.parse_args(args_with_board + ['--reuse'])
bisector = cros_bisect.BisectCommand(options)
bisector.ProcessOptions()
self.assertTrue(bisector.options.reuse_repo)
self.assertTrue(bisector.options.reuse_build)
self.assertTrue(bisector.options.reuse_eval)
def testProcessOptionsResolveBoard(self):
# No --board specified.
options = self.parser.parse_args(self.DEFAULT_ARGS)
self.PatchObject(remote_access, 'ChromiumOSDevice',
return_value=cros_test_lib.EasyAttr(board='test_board'))
bisector = cros_bisect.BisectCommand(options)
bisector.ProcessOptions()
self.assertEqual('test_board', bisector.options.board)
def testProcessOptionsResolveBoardFailed(self):
# No --board specified.
options = self.parser.parse_args(self.DEFAULT_ARGS)
self.PatchObject(remote_access, 'ChromiumOSDevice',
return_value=cros_test_lib.EasyAttr(board=''))
bisector = cros_bisect.BisectCommand(options)
self.assertRaisesRegexp(Exception, 'Unable to obtain board name from DUT',
bisector.ProcessOptions)
def testGoodBadCommitType(self):
"""Tests GoodBadCommitType."""
sha1 = '900d900d'
self.assertEqual(sha1, cros_bisect.GoodBadCommitType(sha1))
not_sha1 = 'bad_sha1'
self.assertRaises(argparse.ArgumentTypeError,
cros_bisect.GoodBadCommitType,
not_sha1)
cros_version = 'R60-9531.0.0'
self.assertEqual(cros_version, cros_bisect.GoodBadCommitType(cros_version))
cros_version_variant = '60.9531.0.0'
self.assertEqual(cros_version,
cros_bisect.GoodBadCommitType(cros_version_variant))
not_cros_version = '91.3.3'
self.assertRaises(argparse.ArgumentTypeError,
cros_bisect.GoodBadCommitType,
not_cros_version)