#!/usr/bin/env python # Copyright 2020 The Pigweed Authors # # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. """Tests for pw_watch.minimal_watch_directories.""" import unittest import tempfile from pathlib import Path from pw_watch import watch class TestMinimalWatchDirectories(unittest.TestCase): """Tests for pw_watch.watch.minimal_watch_directories.""" def setUp(self): self._tempdir = tempfile.TemporaryDirectory() self._root = Path(self._tempdir.name) def tearDown(self): self._tempdir.cleanup() def make_tree(self, *directories: str) -> None: for directory in directories: self._root.joinpath(directory).mkdir(parents=True) def test_empty_directory(self): subdirectories_to_watch = [] ans_subdirectories_to_watch = [(self._root, False)] subdirectories_to_watch = watch.minimal_watch_directories( self._root, 'f1') self.assertEqual(set(subdirectories_to_watch), set(ans_subdirectories_to_watch)) def test_non_exist_directories_to_exclude(self): subdirectories_to_watch = [] exclude_list = ['f3'] self.make_tree('f1', 'f2') ans_subdirectories_to_watch = [ (self._root / 'f1', True), (self._root / 'f2', True), (self._root, False), ] subdirectories_to_watch = watch.minimal_watch_directories( self._root, exclude_list) self.assertEqual(set(subdirectories_to_watch), set(ans_subdirectories_to_watch)) def test_one_layer_directories(self): subdirectories_to_watch = [] exclude_list = ['f1'] self.make_tree( 'f1/f1', 'f1/f2', 'f2/f1', ) ans_subdirectories_to_watch = [ (self._root / 'f2', True), (self._root, False), ] subdirectories_to_watch = watch.minimal_watch_directories( self._root, exclude_list) self.assertEqual(set(subdirectories_to_watch), set(ans_subdirectories_to_watch)) def test_two_layers_direcories(self): subdirectories_to_watch = [] exclude_list = ['f1/f2'] self.make_tree( 'f1/f1', 'f1/f2', 'f2/f1', ) ans_subdirectories_to_watch = [ (self._root / 'f2', True), (self._root / 'f1/f1', True), (self._root, False), (self._root / 'f1', False), ] subdirectories_to_watch = watch.minimal_watch_directories( self._root, exclude_list) self.assertEqual(set(subdirectories_to_watch), set(ans_subdirectories_to_watch)) def test_empty_exclude_list(self): subdirectories_to_watch = [] exclude_list = [] self.make_tree( 'f1/f1', 'f1/f2', 'f2/f1', ) ans_subdirectories_to_watch = [ (self._root / 'f2', True), (self._root / 'f1', True), (self._root, False), ] subdirectories_to_watch = watch.minimal_watch_directories( self._root, exclude_list) self.assertEqual(set(subdirectories_to_watch), set(ans_subdirectories_to_watch)) def test_multiple_directories_in_exclude_list(self): """test case for multiple directories to exclude""" subdirectories_to_watch = [] exclude_list = [ 'f1/f2', 'f3/f1', 'f3/f3', ] self.make_tree( 'f1/f1', 'f1/f2', 'f2/f1', 'f3/f1', 'f3/f2', 'f3/f3', ) ans_subdirectories_to_watch = [ (self._root / 'f2', True), (self._root / 'f1/f1', True), (self._root / 'f3/f2', True), (self._root, False), (self._root / 'f1', False), (self._root / 'f3', False), ] subdirectories_to_watch = watch.minimal_watch_directories( self._root, exclude_list) self.assertEqual(set(subdirectories_to_watch), set(ans_subdirectories_to_watch)) def test_nested_sibling_exclusion(self): subdirectories_to_watch = [] exclude_list = [ 'f1/f1/f1/f1/f1', 'f1/f1/f1/f2', ] self.make_tree( 'f1/f1/f1/f1/f1', 'f1/f1/f1/f1/f2', 'f1/f1/f1/f1/f3', 'f1/f1/f1/f2', ) ans_subdirectories_to_watch = [ (self._root / 'f1/f1/f1/f1/f2', True), (self._root / 'f1/f1/f1/f1/f3', True), (self._root, False), (self._root / 'f1', False), (self._root / 'f1/f1', False), (self._root / 'f1/f1/f1', False), (self._root / 'f1/f1/f1/f1', False), ] subdirectories_to_watch = watch.minimal_watch_directories( self._root, exclude_list) self.assertEqual(set(subdirectories_to_watch), set(ans_subdirectories_to_watch)) if __name__ == '__main__': unittest.main()