schedv2_unittest.py revision 624bae7781fe3fc8ecbf2e314b1b637ea808d74f
1#!/usr/bin/python
2
3# Copyright 2015 Google Inc. All Rights Reserved.
4
5import mock
6import unittest
7import StringIO
8
9import machine_manager
10import test_flag
11from experiment_factory import ExperimentFactory
12from experiment_file import ExperimentFile
13from experiment_runner import ExperimentRunner
14from machine_manager import MockCrosMachine
15from utils import command_executer
16from utils.command_executer import CommandExecuter
17from experiment_runner_unittest import FakeLogger
18from schedv2 import Schedv2
19
20
21EXPERIMENT_FILE_1 = """
22  board: daisy
23  remote: chromeos-daisy1.cros chromeos-daisy2.cros
24
25  benchmark: kraken {
26    suite: telemetry_Crosperf
27    iterations: 3
28  }
29
30  image1 {
31    chromeos_image: /chromeos/src/build/images/daisy/latest/cros_image1.bin
32    remote: chromeos-daisy3.cros
33  }
34
35  image2 {
36    chromeos_image: /chromeos/src/build/imaages/daisy/latest/cros_image2.bin
37    remote: chromeos-daisy4.cros chromeos-daisy5.cros
38  }
39  """
40
41
42class Schedv2Test(unittest.TestCase):
43
44    mock_logger = FakeLogger()
45    mock_cmd_exec = mock.Mock(spec=CommandExecuter)
46
47    def _make_fake_experiment(self, expstr):
48        experiment_file = ExperimentFile(StringIO.StringIO(expstr))
49        experiment = ExperimentFactory().GetExperiment(
50            experiment_file, working_directory="", log_dir="")
51        return experiment
52
53    def test_remote(self):
54        """Test that remotes in labels are aggregated into experiment.remote."""
55
56        self.exp = self._make_fake_experiment(EXPERIMENT_FILE_1)
57        self.exp.log_level = 'verbose'
58        schedv2 = Schedv2(self.exp)
59        self.assertIn('chromeos-daisy1.cros', self.exp.remote)
60        self.assertIn('chromeos-daisy2.cros', self.exp.remote)
61        self.assertIn('chromeos-daisy3.cros', self.exp.remote)
62        self.assertIn('chromeos-daisy4.cros', self.exp.remote)
63        self.assertIn('chromeos-daisy5.cros', self.exp.remote)
64
65    def test_unreachable_remote(self):
66        """Test unreachable remotes are removed from experiment remote and
67        label.remote."""
68
69        def MockIsReachable(cm):
70            return (cm.name != 'chromeos-daisy3.cros' and
71                    cm.name != 'chromeos-daisy5.cros')
72
73        originalIsReachable = MockCrosMachine.IsReachable
74
75        try:
76            MockCrosMachine.IsReachable = MockIsReachable
77            self.exp = self._make_fake_experiment(EXPERIMENT_FILE_1)
78            self.assertIn('chromeos-daisy1.cros', self.exp.remote)
79            self.assertIn('chromeos-daisy2.cros', self.exp.remote)
80            self.assertNotIn('chromeos-daisy3.cros', self.exp.remote)
81            self.assertIn('chromeos-daisy4.cros', self.exp.remote)
82            self.assertNotIn('chromeos-daisy5.cros', self.exp.remote)
83
84            for l in self.exp.labels:
85                if l.name == 'image2':
86                    self.assertNotIn('chromeos-daisy5.cros', l.remote)
87                    self.assertIn('chromeos-daisy4.cros', l.remote)
88                elif l.name == 'image1':
89                    self.assertNotIn('chromeos-daisy3.cros', l.remote)
90        finally:
91            MockCrosMachine.IsReachable = originalIsReachable
92
93
94if __name__ == '__main__':
95    test_flag.SetTestMode(True)
96    unittest.main()
97
98