Support importing other TEST_MAPPING files

This change allows atest to handle TEST_MAPPING files containing imports,
for example:
  "imports": [
    {
      "path": "../folder2"
    }
  ]
atest shall search for TEST_MAPPING files in the imported path and its
parent directories and include all tests found for the given test group.

Bug: 110166535
Test: unittest
Change-Id: I73bd80534bceefb5c9c688369306f85156e2de8e
diff --git a/atest/cli_translator_unittest.py b/atest/cli_translator_unittest.py
index fa99be2..893afe6 100755
--- a/atest/cli_translator_unittest.py
+++ b/atest/cli_translator_unittest.py
@@ -37,6 +37,12 @@
 TEST_2 = test_mapping.TestDetail({'name': 'test2'})
 TEST_3 = test_mapping.TestDetail({'name': 'test3'})
 TEST_4 = test_mapping.TestDetail({'name': 'test4'})
+TEST_5 = test_mapping.TestDetail({'name': 'test5'})
+TEST_6 = test_mapping.TestDetail({'name': 'test6'})
+TEST_7 = test_mapping.TestDetail({'name': 'test7'})
+TEST_8 = test_mapping.TestDetail({'name': 'test8'})
+TEST_9 = test_mapping.TestDetail({'name': 'test9'})
+TEST_10 = test_mapping.TestDetail({'name': 'test10'})
 
 SEARCH_DIR_RE = re.compile(r'^find ([^ ]*).*$')
 
@@ -180,49 +186,69 @@
 
     def test_find_tests_by_test_mapping_presubmit(self):
         """Test _find_tests_by_test_mapping method to locate presubmit tests."""
-        tests, all_tests = self.ctr._find_tests_by_test_mapping(
-            path=TEST_MAPPING_DIR, file_name='test_mapping_sample')
-        expected = set([TEST_1, TEST_2])
+        os_environ_mock = {constants.ANDROID_BUILD_TOP: uc.TEST_DATA_DIR}
+        with mock.patch.dict('os.environ', os_environ_mock, clear=True):
+            tests, all_tests = self.ctr._find_tests_by_test_mapping(
+                path=TEST_MAPPING_DIR, file_name='test_mapping_sample',
+                checked_files=set())
+        expected = set([TEST_1, TEST_2, TEST_5, TEST_7, TEST_9])
         expected_all_tests = {'presubmit': expected,
-                              'postsubmit': set([TEST_3]),
+                              'postsubmit': set(
+                                  [TEST_3, TEST_6, TEST_8, TEST_10]),
                               'other_group': set([TEST_4])}
         self.assertEqual(expected, tests)
         self.assertEqual(expected_all_tests, all_tests)
 
     def test_find_tests_by_test_mapping_postsubmit(self):
-        """Test _find_tests_by_test_mapping method to locate postsubmit tests."""
-        tests, all_tests = self.ctr._find_tests_by_test_mapping(
-            path=TEST_MAPPING_DIR, test_group=constants.TEST_GROUP_POSTSUBMIT,
-            file_name='test_mapping_sample')
-        expected_presubmit = set([TEST_1, TEST_2])
-        expected = set([TEST_1, TEST_2, TEST_3])
+        """Test _find_tests_by_test_mapping method to locate postsubmit tests.
+        """
+        os_environ_mock = {constants.ANDROID_BUILD_TOP: uc.TEST_DATA_DIR}
+        with mock.patch.dict('os.environ', os_environ_mock, clear=True):
+            tests, all_tests = self.ctr._find_tests_by_test_mapping(
+                path=TEST_MAPPING_DIR,
+                test_group=constants.TEST_GROUP_POSTSUBMIT,
+                file_name='test_mapping_sample', checked_files=set())
+        expected_presubmit = set([TEST_1, TEST_2, TEST_5, TEST_7, TEST_9])
+        expected = set(
+            [TEST_1, TEST_2, TEST_3, TEST_5, TEST_6, TEST_7, TEST_8, TEST_9,
+             TEST_10])
         expected_all_tests = {'presubmit': expected_presubmit,
-                              'postsubmit': set([TEST_3]),
+                              'postsubmit': set(
+                                  [TEST_3, TEST_6, TEST_8, TEST_10]),
                               'other_group': set([TEST_4])}
         self.assertEqual(expected, tests)
         self.assertEqual(expected_all_tests, all_tests)
 
     def test_find_tests_by_test_mapping_all_group(self):
-        """Test _find_tests_by_test_mapping method to locate postsubmit tests."""
-        tests, all_tests = self.ctr._find_tests_by_test_mapping(
-            path=TEST_MAPPING_DIR, test_group=constants.TEST_GROUP_ALL,
-            file_name='test_mapping_sample')
-        expected_presubmit = set([TEST_1, TEST_2])
-        expected = set([TEST_1, TEST_2, TEST_3, TEST_4])
+        """Test _find_tests_by_test_mapping method to locate postsubmit tests.
+        """
+        os_environ_mock = {constants.ANDROID_BUILD_TOP: uc.TEST_DATA_DIR}
+        with mock.patch.dict('os.environ', os_environ_mock, clear=True):
+            tests, all_tests = self.ctr._find_tests_by_test_mapping(
+                path=TEST_MAPPING_DIR, test_group=constants.TEST_GROUP_ALL,
+                file_name='test_mapping_sample', checked_files=set())
+        expected_presubmit = set([TEST_1, TEST_2, TEST_5, TEST_7, TEST_9])
+        expected = set([
+            TEST_1, TEST_2, TEST_3, TEST_4, TEST_5, TEST_6, TEST_7, TEST_8,
+            TEST_9, TEST_10])
         expected_all_tests = {'presubmit': expected_presubmit,
-                              'postsubmit': set([TEST_3]),
+                              'postsubmit': set(
+                                  [TEST_3, TEST_6, TEST_8, TEST_10]),
                               'other_group': set([TEST_4])}
         self.assertEqual(expected, tests)
         self.assertEqual(expected_all_tests, all_tests)
 
     def test_find_tests_by_test_mapping_include_subdir(self):
         """Test _find_tests_by_test_mapping method to include sub directory."""
-        tests, all_tests = self.ctr._find_tests_by_test_mapping(
-            path=TEST_MAPPING_TOP_DIR, file_name='test_mapping_sample',
-            include_subdirs=True)
-        expected = set([TEST_1, TEST_2])
+        os_environ_mock = {constants.ANDROID_BUILD_TOP: uc.TEST_DATA_DIR}
+        with mock.patch.dict('os.environ', os_environ_mock, clear=True):
+            tests, all_tests = self.ctr._find_tests_by_test_mapping(
+                path=TEST_MAPPING_TOP_DIR, file_name='test_mapping_sample',
+                include_subdirs=True, checked_files=set())
+        expected = set([TEST_1, TEST_2, TEST_5, TEST_7, TEST_9])
         expected_all_tests = {'presubmit': expected,
-                              'postsubmit': set([TEST_3]),
+                              'postsubmit': set([
+                                  TEST_3, TEST_6, TEST_8, TEST_10]),
                               'other_group': set([TEST_4])}
         self.assertEqual(expected, tests)
         self.assertEqual(expected_all_tests, all_tests)