blob: 2b2d2ad5963b44be449ed57c4fac2f9b07379971 [file] [log] [blame]
Greg Edelston64fdc2e2020-11-19 15:04:18 -07001#!/usr/bin/env python3
2# Copyright 2020 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"""
7Unit tests for query_by_field.py
8
9"""
10
11import io
12import sys
13import unittest
14
15import platform_json_unittest
16import query_by_field
17
18
19def _run_main(argv):
20 """Run platform_json.main(argv), capturing and returning stdout."""
21 original_stdout = sys.stdout
22 capture_io = io.StringIO()
23 sys.stdout = capture_io
24 try:
25 query_by_field.main(argv)
26 return capture_io.getvalue()
27 finally:
28 capture_io.close()
29 sys.stdout = original_stdout
30
31
32class SingleOperatorTestCase(platform_json_unittest.AbstractMockConfigTestCase,
33 unittest.TestCase):
34 """Test-case for using a single operator of each type."""
35 def runTest(self): # pylint: disable=invalid-name
36 """Test each operator in isolation."""
37 # Equality operator ('=')
38 argv = ['field1=5', '-c', self.mock_filepath]
39 expected = 'DEFAULTS\n'
40 self.assertEqual(_run_main(argv), expected)
41
42 # Inequality operator ('!=')
43 argv = ['field1!=5', '-c', self.mock_filepath]
44 expected = 'my_platform\nmy_parent\nmy_grandparent\n'
45 self.assertEqual(_run_main(argv), expected)
46
47
48class MultipleOperatorsTestCase(platform_json_unittest.AbstractMockConfigTestCase,
49 unittest.TestCase):
50 """Test-case for using multiple operators."""
51 def runTest(self): # pylint: disable=invalid-name
52 """Test using multiple operators."""
53 argv = ['field1!=1', 'field1!=4', '-c', self.mock_filepath]
54 expected = 'DEFAULTS\nmy_parent\nmy_grandparent\n'
55 self.assertEqual(_run_main(argv), expected)
56
57
58class ModelExceptionsTestCase(platform_json_unittest.AbstractMockConfigTestCase,
59 unittest.TestCase):
60 """Test-case for when model overrides change whether a platform matches."""
61 def runTest(self): # pylint: disable=invalid-name
62 """Test all variants of model exceptions."""
63 # Check for when a platform does not match, except for one model
64 argv = ['field1=4', '-c', self.mock_filepath]
65 expected = 'my_platform (only my_model)\n'
66 self.assertEqual(_run_main(argv), expected)
67
68 # Check for when a platform matches, except for one model
69 argv = ['field1=1', '-c', self.mock_filepath]
70 expected = 'my_platform (except my_model)\n'
71 self.assertEqual(_run_main(argv), expected)
72
73 # Check for multiple model exceptions
74 argv = ['field1=1', 'field2=2', '-c', self.mock_filepath]
75 expected = 'my_platform (except my_model, my_model2)\n'
76 self.assertEqual(_run_main(argv), expected)
77
78
79class NoMatchesTestCase(platform_json_unittest.AbstractMockConfigTestCase,
80 unittest.TestCase):
81 """Test-case for when no platforms match the query."""
82 def runTest(self): #pylint: disable=invalid-name
83 """Run script with a bogus query."""
84 argv = ['field1=1337', '-c', self.mock_filepath]
85 expected = 'No platforms matched.\n'
86 self.assertEqual(_run_main(argv), expected)
87
88
89if __name__ == '__main__':
90 unittest.main()