blob: 2f23c0a7a4e47eb029d1eafbad8a3d3a543e6d12 [file] [log] [blame]
Alex Kleina2e42c42019-04-17 16:13:19 -06001# -*- coding: utf-8 -*-
2# Copyright 2019 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""The test controller tests."""
7
8from __future__ import print_function
9
10from chromite.api.controller import test as test_controller
11from chromite.api.gen.chromite.api import test_pb2
12from chromite.cbuildbot import commands
13from chromite.lib import cros_build_lib
14from chromite.lib import cros_test_lib
15from chromite.lib import failures_lib
16from chromite.lib import osutils
17from chromite.lib import portage_util
18
19
20class UnitTestTest(cros_test_lib.MockTempDirTestCase):
21 """Tests for the UnitTest function."""
22
23 def _GetInput(self, board=None, result_path=None, chroot_path=None,
24 cache_dir=None):
25 """Helper to build an input message instance."""
26 return test_pb2.BuildTargetUnitTestRequest(
27 build_target={'name': board}, result_path=result_path,
28 chroot={'path': chroot_path, 'cache_dir': cache_dir}
29 )
30
31 def _GetOutput(self):
32 """Helper to get an empty output message instance."""
33 return test_pb2.BuildTargetUnitTestResponse()
34
35 def testNoArgumentFails(self):
36 """Test no arguments fails."""
37 input_msg = self._GetInput()
38 output_msg = self._GetOutput()
39 with self.assertRaises(cros_build_lib.DieSystemExit):
40 test_controller.BuildTargetUnitTest(input_msg, output_msg)
41
42 def testNoBuildTargetFails(self):
43 """Test missing build target name fails."""
44 input_msg = self._GetInput(result_path=self.tempdir)
45 output_msg = self._GetOutput()
46 with self.assertRaises(cros_build_lib.DieSystemExit):
47 test_controller.BuildTargetUnitTest(input_msg, output_msg)
48
49 def testNoResultPathFails(self):
50 """Test missing result path fails."""
51 # Missing result_path.
52 input_msg = self._GetInput(board='board')
53 output_msg = self._GetOutput()
54 with self.assertRaises(cros_build_lib.DieSystemExit):
55 test_controller.BuildTargetUnitTest(input_msg, output_msg)
56
57 def testPackageBuildFailure(self):
58 """Test handling of raised BuildPackageFailure."""
59 tempdir = osutils.TempDir(base_dir=self.tempdir)
60 self.PatchObject(osutils, 'TempDir', return_value=tempdir)
61
62 pkgs = ['cat/pkg', 'foo/bar']
63 expected = [('cat', 'pkg'), ('foo', 'bar')]
64 rce = cros_build_lib.RunCommandError('error',
65 cros_build_lib.CommandResult())
66 error = failures_lib.PackageBuildFailure(rce, 'shortname', pkgs)
67 self.PatchObject(commands, 'RunUnitTests', side_effect=error)
68
69 input_msg = self._GetInput(board='board', result_path=self.tempdir)
70 output_msg = self._GetOutput()
71
72 rc = test_controller.BuildTargetUnitTest(input_msg, output_msg)
73
74 self.assertNotEqual(0, rc)
75 self.assertTrue(output_msg.failed_packages)
76 failed = []
77 for pi in output_msg.failed_packages:
78 failed.append((pi.category, pi.package_name))
79 self.assertItemsEqual(expected, failed)
80
81 def testPopulatedEmergeFile(self):
82 """Test build script failure due to using outside emerge status file."""
83 tempdir = osutils.TempDir(base_dir=self.tempdir)
84 self.PatchObject(osutils, 'TempDir', return_value=tempdir)
85
86 pkgs = ['cat/pkg', 'foo/bar']
87 cpvs = [portage_util.SplitCPV(pkg, strict=False) for pkg in pkgs]
88 expected = [('cat', 'pkg'), ('foo', 'bar')]
89 rce = cros_build_lib.RunCommandError('error',
90 cros_build_lib.CommandResult())
91 error = failures_lib.BuildScriptFailure(rce, 'shortname')
92 self.PatchObject(commands, 'RunUnitTests', side_effect=error)
93 self.PatchObject(portage_util, 'ParseParallelEmergeStatusFile',
94 return_value=cpvs)
95
96 input_msg = self._GetInput(board='board', result_path=self.tempdir)
97 output_msg = self._GetOutput()
98
99 rc = test_controller.BuildTargetUnitTest(input_msg, output_msg)
100
101 self.assertNotEqual(0, rc)
102 self.assertTrue(output_msg.failed_packages)
103 failed = []
104 for pi in output_msg.failed_packages:
105 failed.append((pi.category, pi.package_name))
106 self.assertItemsEqual(expected, failed)
107
108 def testOtherBuildScriptFailure(self):
109 """Test build script failure due to non-package emerge error."""
110 tempdir = osutils.TempDir(base_dir=self.tempdir)
111 self.PatchObject(osutils, 'TempDir', return_value=tempdir)
112
113 rce = cros_build_lib.RunCommandError('error',
114 cros_build_lib.CommandResult())
115 error = failures_lib.BuildScriptFailure(rce, 'shortname')
116 self.PatchObject(commands, 'RunUnitTests', side_effect=error)
117 self.PatchObject(portage_util, 'ParseParallelEmergeStatusFile',
118 return_value=[])
119
120 input_msg = self._GetInput(board='board', result_path=self.tempdir)
121 output_msg = self._GetOutput()
122
123 rc = test_controller.BuildTargetUnitTest(input_msg, output_msg)
124
125 self.assertNotEqual(0, rc)
126 self.assertFalse(output_msg.failed_packages)