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