xref: /aosp_15_r20/external/toolchain-utils/crosperf/settings_unittest.py (revision 760c253c1ed00ce9abd48f8546f08516e57485fe)
1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3# Copyright 2019 The ChromiumOS Authors
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7"""unittest for settings."""
8
9
10import unittest
11import unittest.mock as mock
12
13from cros_utils import logger
14import download_images
15from field import IntegerField
16from field import ListField
17import settings
18import settings_factory
19
20
21class TestSettings(unittest.TestCase):
22    """setting test class."""
23
24    def setUp(self):
25        self.settings = settings.Settings("global_name", "global")
26
27    def test_init(self):
28        self.assertEqual(self.settings.name, "global_name")
29        self.assertEqual(self.settings.settings_type, "global")
30        self.assertIsNone(self.settings.parent)
31
32    def test_set_parent_settings(self):
33        self.assertIsNone(self.settings.parent)
34        settings_parent = {"fake_parent_entry": 0}
35        self.settings.SetParentSettings(settings_parent)
36        self.assertIsNotNone(self.settings.parent)
37        self.assertTrue(isinstance(self.settings.parent, dict))
38        self.assertEqual(self.settings.parent, settings_parent)
39
40    def test_add_field(self):
41        self.assertEqual(self.settings.fields, {})
42        self.settings.AddField(
43            IntegerField(
44                "iterations",
45                default=1,
46                required=False,
47                description="Number of iterations to " "run the test.",
48            )
49        )
50        self.assertEqual(len(self.settings.fields), 1)
51        # Adding the same field twice raises an exception.
52        self.assertRaises(
53            Exception,
54            self.settings.AddField,
55            (
56                IntegerField(
57                    "iterations",
58                    default=1,
59                    required=False,
60                    description="Number of iterations to run " "the test.",
61                )
62            ),
63        )
64        res = self.settings.fields["iterations"]
65        self.assertIsInstance(res, IntegerField)
66        self.assertEqual(res.Get(), 1)
67
68    def test_set_field(self):
69        self.assertEqual(self.settings.fields, {})
70        self.settings.AddField(
71            IntegerField(
72                "iterations",
73                default=1,
74                required=False,
75                description="Number of iterations to run the " "test.",
76            )
77        )
78        res = self.settings.fields["iterations"]
79        self.assertEqual(res.Get(), 1)
80
81        self.settings.SetField("iterations", 10)
82        res = self.settings.fields["iterations"]
83        self.assertEqual(res.Get(), 10)
84
85        # Setting a field that's not there raises an exception.
86        self.assertRaises(
87            Exception, self.settings.SetField, "remote", "lumpy1.cros"
88        )
89
90        self.settings.AddField(
91            ListField(
92                "remote",
93                default=[],
94                description="A comma-separated list of ip's of "
95                "chromeos devices to run "
96                "experiments on.",
97            )
98        )
99        self.assertTrue(isinstance(self.settings.fields, dict))
100        self.assertEqual(len(self.settings.fields), 2)
101        res = self.settings.fields["remote"]
102        self.assertEqual(res.Get(), [])
103        self.settings.SetField("remote", "lumpy1.cros", append=True)
104        self.settings.SetField("remote", "lumpy2.cros", append=True)
105        res = self.settings.fields["remote"]
106        self.assertEqual(res.Get(), ["lumpy1.cros", "lumpy2.cros"])
107
108    def test_get_field(self):
109        # Getting a field that's not there raises an exception.
110        self.assertRaises(Exception, self.settings.GetField, "iterations")
111
112        # Getting a required field that hasn't been assigned raises an exception.
113        self.settings.AddField(
114            IntegerField(
115                "iterations",
116                required=True,
117                description="Number of iterations to " "run the test.",
118            )
119        )
120        self.assertIsNotNone(self.settings.fields["iterations"])
121        self.assertRaises(Exception, self.settings.GetField, "iterations")
122
123        # Set the value, then get it.
124        self.settings.SetField("iterations", 5)
125        res = self.settings.GetField("iterations")
126        self.assertEqual(res, 5)
127
128    def test_inherit(self):
129        parent_settings = settings_factory.SettingsFactory().GetSettings(
130            "global", "global"
131        )
132        label_settings = settings_factory.SettingsFactory().GetSettings(
133            "label", "label"
134        )
135        self.assertEqual(parent_settings.GetField("chromeos_root"), "")
136        self.assertEqual(label_settings.GetField("chromeos_root"), "")
137        self.assertIsNone(label_settings.parent)
138
139        parent_settings.SetField("chromeos_root", "/tmp/chromeos")
140        label_settings.SetParentSettings(parent_settings)
141        self.assertEqual(
142            parent_settings.GetField("chromeos_root"), "/tmp/chromeos"
143        )
144        self.assertEqual(label_settings.GetField("chromeos_root"), "")
145        label_settings.Inherit()
146        self.assertEqual(
147            label_settings.GetField("chromeos_root"), "/tmp/chromeos"
148        )
149
150    def test_override(self):
151        self.settings.AddField(
152            ListField(
153                "email",
154                default=[],
155                description="Space-seperated"
156                "list of email addresses to send "
157                "email to.",
158            )
159        )
160
161        global_settings = settings_factory.SettingsFactory().GetSettings(
162            "global", "global"
163        )
164
165        global_settings.SetField("email", "[email protected]", append=True)
166        global_settings.SetField("email", "[email protected]", append=True)
167
168        res = self.settings.GetField("email")
169        self.assertEqual(res, [])
170
171        self.settings.Override(global_settings)
172        res = self.settings.GetField("email")
173        self.assertEqual(res, ["[email protected]", "[email protected]"])
174
175    def test_validate(self):
176
177        self.settings.AddField(
178            IntegerField(
179                "iterations",
180                required=True,
181                description="Number of iterations " "to run the test.",
182            )
183        )
184        self.settings.AddField(
185            ListField(
186                "remote",
187                default=[],
188                required=True,
189                description="A comma-separated list "
190                "of ip's of chromeos "
191                "devices to run experiments on.",
192            )
193        )
194        self.settings.AddField(
195            ListField(
196                "email",
197                default=[],
198                description="Space-seperated"
199                "list of email addresses to "
200                "send email to.",
201            )
202        )
203
204        # 'required' fields have not been assigned; should raise an exception.
205        self.assertRaises(Exception, self.settings.Validate)
206        self.settings.SetField("iterations", 2)
207        self.settings.SetField("remote", "x86-alex.cros", append=True)
208        # Should run without exception now.
209        self.settings.Validate()
210
211    @mock.patch.object(logger, "GetLogger")
212    @mock.patch.object(download_images.ImageDownloader, "Run")
213    @mock.patch.object(download_images, "ImageDownloader")
214    def test_get_xbuddy_path(self, mock_downloader, mock_run, mock_logger):
215
216        mock_run.return_value = "fake_xbuddy_translation"
217        mock_downloader.Run = mock_run
218        board = "lumpy"
219        chromeos_root = "/tmp/chromeos"
220        log_level = "average"
221
222        trybot_str = "trybot-lumpy-paladin/R34-5417.0.0-b1506"
223        official_str = "lumpy-release/R34-5417.0.0"
224        xbuddy_str = "latest-dev"
225        autotest_path = ""
226        debug_path = ""
227        download_debug = False
228
229        self.settings.GetXbuddyPath(
230            trybot_str,
231            autotest_path,
232            debug_path,
233            board,
234            chromeos_root,
235            log_level,
236            download_debug,
237        )
238        self.assertEqual(mock_run.call_count, 1)
239        self.assertEqual(
240            mock_run.call_args_list[0][0],
241            (
242                "/tmp/chromeos",
243                "remote/trybot-lumpy-paladin/R34-5417.0.0-b1506",
244                "",
245                "",
246                False,
247            ),
248        )
249
250        mock_run.reset_mock()
251        self.settings.GetXbuddyPath(
252            official_str,
253            autotest_path,
254            debug_path,
255            board,
256            chromeos_root,
257            log_level,
258            download_debug,
259        )
260        self.assertEqual(mock_run.call_count, 1)
261        self.assertEqual(
262            mock_run.call_args_list[0][0],
263            (
264                "/tmp/chromeos",
265                "remote/lumpy-release/R34-5417.0.0",
266                "",
267                "",
268                False,
269            ),
270        )
271
272        mock_run.reset_mock()
273        self.settings.GetXbuddyPath(
274            xbuddy_str,
275            autotest_path,
276            debug_path,
277            board,
278            chromeos_root,
279            log_level,
280            download_debug,
281        )
282        self.assertEqual(mock_run.call_count, 1)
283        self.assertEqual(
284            mock_run.call_args_list[0][0],
285            ("/tmp/chromeos", "remote/lumpy/latest-dev", "", "", False),
286        )
287
288        if mock_logger:
289            return
290
291
292if __name__ == "__main__":
293    unittest.main()
294