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