xref: /aosp_15_r20/external/pigweed/pw_watch/py/watch_test.py (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker#!/usr/bin/env python
2*61c4878aSAndroid Build Coastguard Worker# Copyright 2020 The Pigweed Authors
3*61c4878aSAndroid Build Coastguard Worker#
4*61c4878aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); you may not
5*61c4878aSAndroid Build Coastguard Worker# use this file except in compliance with the License. You may obtain a copy of
6*61c4878aSAndroid Build Coastguard Worker# the License at
7*61c4878aSAndroid Build Coastguard Worker#
8*61c4878aSAndroid Build Coastguard Worker#     https://www.apache.org/licenses/LICENSE-2.0
9*61c4878aSAndroid Build Coastguard Worker#
10*61c4878aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
11*61c4878aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12*61c4878aSAndroid Build Coastguard Worker# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13*61c4878aSAndroid Build Coastguard Worker# License for the specific language governing permissions and limitations under
14*61c4878aSAndroid Build Coastguard Worker# the License.
15*61c4878aSAndroid Build Coastguard Worker"""Tests for pw_watch.minimal_watch_directories."""
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Workerimport unittest
18*61c4878aSAndroid Build Coastguard Workerimport tempfile
19*61c4878aSAndroid Build Coastguard Workerfrom pathlib import Path
20*61c4878aSAndroid Build Coastguard Worker
21*61c4878aSAndroid Build Coastguard Workerfrom pw_watch import watch
22*61c4878aSAndroid Build Coastguard Worker
23*61c4878aSAndroid Build Coastguard Worker
24*61c4878aSAndroid Build Coastguard Workerclass TestMinimalWatchDirectories(unittest.TestCase):
25*61c4878aSAndroid Build Coastguard Worker    """Tests for pw_watch.watch.minimal_watch_directories."""
26*61c4878aSAndroid Build Coastguard Worker
27*61c4878aSAndroid Build Coastguard Worker    def setUp(self):
28*61c4878aSAndroid Build Coastguard Worker        self._tempdir = tempfile.TemporaryDirectory()
29*61c4878aSAndroid Build Coastguard Worker        self._root = Path(self._tempdir.name)
30*61c4878aSAndroid Build Coastguard Worker
31*61c4878aSAndroid Build Coastguard Worker    def tearDown(self):
32*61c4878aSAndroid Build Coastguard Worker        self._tempdir.cleanup()
33*61c4878aSAndroid Build Coastguard Worker
34*61c4878aSAndroid Build Coastguard Worker    def make_tree(self, *directories: str) -> None:
35*61c4878aSAndroid Build Coastguard Worker        for directory in directories:
36*61c4878aSAndroid Build Coastguard Worker            self._root.joinpath(directory).mkdir(parents=True)
37*61c4878aSAndroid Build Coastguard Worker
38*61c4878aSAndroid Build Coastguard Worker    def test_empty_directory(self):
39*61c4878aSAndroid Build Coastguard Worker        subdirectories_to_watch = []
40*61c4878aSAndroid Build Coastguard Worker        ans_subdirectories_to_watch = [(self._root, False)]
41*61c4878aSAndroid Build Coastguard Worker        subdirectories_to_watch = watch.minimal_watch_directories(
42*61c4878aSAndroid Build Coastguard Worker            self._root, 'f1'
43*61c4878aSAndroid Build Coastguard Worker        )
44*61c4878aSAndroid Build Coastguard Worker
45*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
46*61c4878aSAndroid Build Coastguard Worker            set(subdirectories_to_watch), set(ans_subdirectories_to_watch)
47*61c4878aSAndroid Build Coastguard Worker        )
48*61c4878aSAndroid Build Coastguard Worker
49*61c4878aSAndroid Build Coastguard Worker    def test_non_exist_directories_to_exclude(self):
50*61c4878aSAndroid Build Coastguard Worker        subdirectories_to_watch = []
51*61c4878aSAndroid Build Coastguard Worker        exclude_list = ['f3']
52*61c4878aSAndroid Build Coastguard Worker        self.make_tree('f1', 'f2')
53*61c4878aSAndroid Build Coastguard Worker        ans_subdirectories_to_watch = [
54*61c4878aSAndroid Build Coastguard Worker            (self._root / 'f1', True),
55*61c4878aSAndroid Build Coastguard Worker            (self._root / 'f2', True),
56*61c4878aSAndroid Build Coastguard Worker            (self._root, False),
57*61c4878aSAndroid Build Coastguard Worker        ]
58*61c4878aSAndroid Build Coastguard Worker        subdirectories_to_watch = watch.minimal_watch_directories(
59*61c4878aSAndroid Build Coastguard Worker            self._root, exclude_list
60*61c4878aSAndroid Build Coastguard Worker        )
61*61c4878aSAndroid Build Coastguard Worker
62*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
63*61c4878aSAndroid Build Coastguard Worker            set(subdirectories_to_watch), set(ans_subdirectories_to_watch)
64*61c4878aSAndroid Build Coastguard Worker        )
65*61c4878aSAndroid Build Coastguard Worker
66*61c4878aSAndroid Build Coastguard Worker    def test_one_layer_directories(self):
67*61c4878aSAndroid Build Coastguard Worker        subdirectories_to_watch = []
68*61c4878aSAndroid Build Coastguard Worker        exclude_list = ['f1']
69*61c4878aSAndroid Build Coastguard Worker        self.make_tree(
70*61c4878aSAndroid Build Coastguard Worker            'f1/f1',
71*61c4878aSAndroid Build Coastguard Worker            'f1/f2',
72*61c4878aSAndroid Build Coastguard Worker            'f2/f1',
73*61c4878aSAndroid Build Coastguard Worker        )
74*61c4878aSAndroid Build Coastguard Worker        ans_subdirectories_to_watch = [
75*61c4878aSAndroid Build Coastguard Worker            (self._root / 'f2', True),
76*61c4878aSAndroid Build Coastguard Worker            (self._root, False),
77*61c4878aSAndroid Build Coastguard Worker        ]
78*61c4878aSAndroid Build Coastguard Worker        subdirectories_to_watch = watch.minimal_watch_directories(
79*61c4878aSAndroid Build Coastguard Worker            self._root, exclude_list
80*61c4878aSAndroid Build Coastguard Worker        )
81*61c4878aSAndroid Build Coastguard Worker
82*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
83*61c4878aSAndroid Build Coastguard Worker            set(subdirectories_to_watch), set(ans_subdirectories_to_watch)
84*61c4878aSAndroid Build Coastguard Worker        )
85*61c4878aSAndroid Build Coastguard Worker
86*61c4878aSAndroid Build Coastguard Worker    def test_two_layers_direcories(self):
87*61c4878aSAndroid Build Coastguard Worker        subdirectories_to_watch = []
88*61c4878aSAndroid Build Coastguard Worker        exclude_list = ['f1/f2']
89*61c4878aSAndroid Build Coastguard Worker        self.make_tree(
90*61c4878aSAndroid Build Coastguard Worker            'f1/f1',
91*61c4878aSAndroid Build Coastguard Worker            'f1/f2',
92*61c4878aSAndroid Build Coastguard Worker            'f2/f1',
93*61c4878aSAndroid Build Coastguard Worker        )
94*61c4878aSAndroid Build Coastguard Worker        ans_subdirectories_to_watch = [
95*61c4878aSAndroid Build Coastguard Worker            (self._root / 'f2', True),
96*61c4878aSAndroid Build Coastguard Worker            (self._root / 'f1/f1', True),
97*61c4878aSAndroid Build Coastguard Worker            (self._root, False),
98*61c4878aSAndroid Build Coastguard Worker            (self._root / 'f1', False),
99*61c4878aSAndroid Build Coastguard Worker        ]
100*61c4878aSAndroid Build Coastguard Worker        subdirectories_to_watch = watch.minimal_watch_directories(
101*61c4878aSAndroid Build Coastguard Worker            self._root, exclude_list
102*61c4878aSAndroid Build Coastguard Worker        )
103*61c4878aSAndroid Build Coastguard Worker
104*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
105*61c4878aSAndroid Build Coastguard Worker            set(subdirectories_to_watch), set(ans_subdirectories_to_watch)
106*61c4878aSAndroid Build Coastguard Worker        )
107*61c4878aSAndroid Build Coastguard Worker
108*61c4878aSAndroid Build Coastguard Worker    def test_empty_exclude_list(self):
109*61c4878aSAndroid Build Coastguard Worker        subdirectories_to_watch = []
110*61c4878aSAndroid Build Coastguard Worker        exclude_list = []
111*61c4878aSAndroid Build Coastguard Worker        self.make_tree(
112*61c4878aSAndroid Build Coastguard Worker            'f1/f1',
113*61c4878aSAndroid Build Coastguard Worker            'f1/f2',
114*61c4878aSAndroid Build Coastguard Worker            'f2/f1',
115*61c4878aSAndroid Build Coastguard Worker        )
116*61c4878aSAndroid Build Coastguard Worker        ans_subdirectories_to_watch = [
117*61c4878aSAndroid Build Coastguard Worker            (self._root / 'f2', True),
118*61c4878aSAndroid Build Coastguard Worker            (self._root / 'f1', True),
119*61c4878aSAndroid Build Coastguard Worker            (self._root, False),
120*61c4878aSAndroid Build Coastguard Worker        ]
121*61c4878aSAndroid Build Coastguard Worker        subdirectories_to_watch = watch.minimal_watch_directories(
122*61c4878aSAndroid Build Coastguard Worker            self._root, exclude_list
123*61c4878aSAndroid Build Coastguard Worker        )
124*61c4878aSAndroid Build Coastguard Worker
125*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
126*61c4878aSAndroid Build Coastguard Worker            set(subdirectories_to_watch), set(ans_subdirectories_to_watch)
127*61c4878aSAndroid Build Coastguard Worker        )
128*61c4878aSAndroid Build Coastguard Worker
129*61c4878aSAndroid Build Coastguard Worker    def test_multiple_directories_in_exclude_list(self):
130*61c4878aSAndroid Build Coastguard Worker        """test case for multiple directories to exclude"""
131*61c4878aSAndroid Build Coastguard Worker        subdirectories_to_watch = []
132*61c4878aSAndroid Build Coastguard Worker        exclude_list = [
133*61c4878aSAndroid Build Coastguard Worker            'f1/f2',
134*61c4878aSAndroid Build Coastguard Worker            'f3/f1',
135*61c4878aSAndroid Build Coastguard Worker            'f3/f3',
136*61c4878aSAndroid Build Coastguard Worker        ]
137*61c4878aSAndroid Build Coastguard Worker        self.make_tree(
138*61c4878aSAndroid Build Coastguard Worker            'f1/f1',
139*61c4878aSAndroid Build Coastguard Worker            'f1/f2',
140*61c4878aSAndroid Build Coastguard Worker            'f2/f1',
141*61c4878aSAndroid Build Coastguard Worker            'f3/f1',
142*61c4878aSAndroid Build Coastguard Worker            'f3/f2',
143*61c4878aSAndroid Build Coastguard Worker            'f3/f3',
144*61c4878aSAndroid Build Coastguard Worker        )
145*61c4878aSAndroid Build Coastguard Worker        ans_subdirectories_to_watch = [
146*61c4878aSAndroid Build Coastguard Worker            (self._root / 'f2', True),
147*61c4878aSAndroid Build Coastguard Worker            (self._root / 'f1/f1', True),
148*61c4878aSAndroid Build Coastguard Worker            (self._root / 'f3/f2', True),
149*61c4878aSAndroid Build Coastguard Worker            (self._root, False),
150*61c4878aSAndroid Build Coastguard Worker            (self._root / 'f1', False),
151*61c4878aSAndroid Build Coastguard Worker            (self._root / 'f3', False),
152*61c4878aSAndroid Build Coastguard Worker        ]
153*61c4878aSAndroid Build Coastguard Worker        subdirectories_to_watch = watch.minimal_watch_directories(
154*61c4878aSAndroid Build Coastguard Worker            self._root, exclude_list
155*61c4878aSAndroid Build Coastguard Worker        )
156*61c4878aSAndroid Build Coastguard Worker
157*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
158*61c4878aSAndroid Build Coastguard Worker            set(subdirectories_to_watch), set(ans_subdirectories_to_watch)
159*61c4878aSAndroid Build Coastguard Worker        )
160*61c4878aSAndroid Build Coastguard Worker
161*61c4878aSAndroid Build Coastguard Worker    def test_nested_sibling_exclusion(self):
162*61c4878aSAndroid Build Coastguard Worker        subdirectories_to_watch = []
163*61c4878aSAndroid Build Coastguard Worker        exclude_list = [
164*61c4878aSAndroid Build Coastguard Worker            'f1/f1/f1/f1/f1',
165*61c4878aSAndroid Build Coastguard Worker            'f1/f1/f1/f2',
166*61c4878aSAndroid Build Coastguard Worker        ]
167*61c4878aSAndroid Build Coastguard Worker        self.make_tree(
168*61c4878aSAndroid Build Coastguard Worker            'f1/f1/f1/f1/f1',
169*61c4878aSAndroid Build Coastguard Worker            'f1/f1/f1/f1/f2',
170*61c4878aSAndroid Build Coastguard Worker            'f1/f1/f1/f1/f3',
171*61c4878aSAndroid Build Coastguard Worker            'f1/f1/f1/f2',
172*61c4878aSAndroid Build Coastguard Worker        )
173*61c4878aSAndroid Build Coastguard Worker        ans_subdirectories_to_watch = [
174*61c4878aSAndroid Build Coastguard Worker            (self._root / 'f1/f1/f1/f1/f2', True),
175*61c4878aSAndroid Build Coastguard Worker            (self._root / 'f1/f1/f1/f1/f3', True),
176*61c4878aSAndroid Build Coastguard Worker            (self._root, False),
177*61c4878aSAndroid Build Coastguard Worker            (self._root / 'f1', False),
178*61c4878aSAndroid Build Coastguard Worker            (self._root / 'f1/f1', False),
179*61c4878aSAndroid Build Coastguard Worker            (self._root / 'f1/f1/f1', False),
180*61c4878aSAndroid Build Coastguard Worker            (self._root / 'f1/f1/f1/f1', False),
181*61c4878aSAndroid Build Coastguard Worker        ]
182*61c4878aSAndroid Build Coastguard Worker        subdirectories_to_watch = watch.minimal_watch_directories(
183*61c4878aSAndroid Build Coastguard Worker            self._root, exclude_list
184*61c4878aSAndroid Build Coastguard Worker        )
185*61c4878aSAndroid Build Coastguard Worker
186*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
187*61c4878aSAndroid Build Coastguard Worker            set(subdirectories_to_watch), set(ans_subdirectories_to_watch)
188*61c4878aSAndroid Build Coastguard Worker        )
189*61c4878aSAndroid Build Coastguard Worker
190*61c4878aSAndroid Build Coastguard Worker
191*61c4878aSAndroid Build Coastguard Workerif __name__ == '__main__':
192*61c4878aSAndroid Build Coastguard Worker    unittest.main()
193