#!/usr/bin/python # -*- coding:utf-8 -*- # Copyright 2018 The Android Open Source Project # # 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 # # http://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. import os import shutil import tempfile import unittest import android_test_mapping_format VALID_TEST_MAPPING = r""" { "presubmit": [ { "name": "CtsWindowManagerDeviceTestCases", "options": [ { "include-annotation": "android.platform.test.annotations.Presubmit" } ] } ], "postsubmit": [ { "name": "CtsWindowManagerDeviceTestCases", "host": true, "preferred_targets": ["a", "b"], "file_patterns": [".*\\.java"] } ], "imports": [ { "path": "frameworks/base/services/core/java/com/android/server/am" }, { "path": "frameworks/base/services/core/java/com/android/server/wm" } ] } """ BAD_JSON = """ {wrong format} """ BAD_TEST_WRONG_KEY = """ { "presubmit": [ { "bad_name": "CtsWindowManagerDeviceTestCases" } ] } """ BAD_TEST_WRONG_HOST_VALUE = """ { "presubmit": [ { "name": "CtsWindowManagerDeviceTestCases", "host": "bad_value" } ] } """ BAD_TEST_WRONG_PREFERRED_TARGETS_VALUE_NONE_LIST = """ { "presubmit": [ { "name": "CtsWindowManagerDeviceTestCases", "preferred_targets": "bad_value" } ] } """ BAD_TEST_WRONG_PREFERRED_TARGETS_VALUE_WRONG_TYPE = """ { "presubmit": [ { "name": "CtsWindowManagerDeviceTestCases", "preferred_targets": ["bad_value", 123] } ] } """ BAD_TEST_WRONG_OPTION = """ { "presubmit": [ { "name": "CtsWindowManagerDeviceTestCases", "options": [ { "include-annotation": "android.platform.test.annotations.Presubmit", "bad_option": "some_name" } ] } ] } """ BAD_IMPORT_WRONG_KEY = """ { "imports": [ { "name": "frameworks/base/services/core/java/com/android/server/am" } ] } """ BAD_IMPORT_WRONG_IMPORT_VALUE = """ { "imports": [ { "path": "frameworks/base/services/core/java/com/android/server/am", "option": "something" } ] } """ BAD_FILE_PATTERNS = """ { "presubmit": [ { "name": "CtsWindowManagerDeviceTestCases", "file_patterns": ["pattern", 123] } ] } """ class AndroidTestMappingFormatTests(unittest.TestCase): """Unittest for android_test_mapping_format module.""" def setUp(self): self.tempdir = tempfile.mkdtemp() self.test_mapping_file = os.path.join(self.tempdir, 'TEST_MAPPING') def tearDown(self): shutil.rmtree(self.tempdir) def test_valid_test_mapping(self): """Verify that the check doesn't raise any error for valid test mapping. """ with open(self.test_mapping_file, 'w') as f: f.write(VALID_TEST_MAPPING) android_test_mapping_format.process_file(self.test_mapping_file) def test_invalid_test_mapping_bad_json(self): """Verify that TEST_MAPPING file with bad json can be detected.""" with open(self.test_mapping_file, 'w') as f: f.write(BAD_JSON) self.assertRaises( ValueError, android_test_mapping_format.process_file, self.test_mapping_file) def test_invalid_test_mapping_wrong_test_key(self): """Verify that test config using wrong key can be detected.""" with open(self.test_mapping_file, 'w') as f: f.write(BAD_TEST_WRONG_KEY) self.assertRaises( android_test_mapping_format.InvalidTestMappingError, android_test_mapping_format.process_file, self.test_mapping_file) def test_invalid_test_mapping_wrong_test_value(self): """Verify that test config using wrong host value can be detected.""" with open(self.test_mapping_file, 'w') as f: f.write(BAD_TEST_WRONG_HOST_VALUE) self.assertRaises( android_test_mapping_format.InvalidTestMappingError, android_test_mapping_format.process_file, self.test_mapping_file) def test_invalid_test_mapping_wrong_preferred_targets_value(self): """Verify invalid preferred_targets are rejected.""" with open(self.test_mapping_file, 'w') as f: f.write(BAD_TEST_WRONG_PREFERRED_TARGETS_VALUE_NONE_LIST) self.assertRaises( android_test_mapping_format.InvalidTestMappingError, android_test_mapping_format.process_file, self.test_mapping_file) with open(self.test_mapping_file, 'w') as f: f.write(BAD_TEST_WRONG_PREFERRED_TARGETS_VALUE_WRONG_TYPE) self.assertRaises( android_test_mapping_format.InvalidTestMappingError, android_test_mapping_format.process_file, self.test_mapping_file) def test_invalid_test_mapping_wrong_test_option(self): """Verify that test config using wrong option can be detected.""" with open(self.test_mapping_file, 'w') as f: f.write(BAD_TEST_WRONG_OPTION) self.assertRaises( android_test_mapping_format.InvalidTestMappingError, android_test_mapping_format.process_file, self.test_mapping_file) def test_invalid_test_mapping_wrong_import_key(self): """Verify that import setting using wrong key can be detected.""" with open(self.test_mapping_file, 'w') as f: f.write(BAD_IMPORT_WRONG_KEY) self.assertRaises( android_test_mapping_format.InvalidTestMappingError, android_test_mapping_format.process_file, self.test_mapping_file) def test_invalid_test_mapping_wrong_import_value(self): """Verify that import setting using wrong value can be detected.""" with open(self.test_mapping_file, 'w') as f: f.write(BAD_IMPORT_WRONG_IMPORT_VALUE) self.assertRaises( android_test_mapping_format.InvalidTestMappingError, android_test_mapping_format.process_file, self.test_mapping_file) def test_invalid_test_mapping_file_patterns_value(self): """Verify that file_patterns using wrong value can be detected.""" with open(self.test_mapping_file, 'w') as f: f.write(BAD_FILE_PATTERNS) self.assertRaises( android_test_mapping_format.InvalidTestMappingError, android_test_mapping_format.process_file, self.test_mapping_file) if __name__ == '__main__': unittest.main()