| # Copyright (C) 2022 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 unittest |
| import os |
| import sys |
| |
| ROOT_DIR = os.path.dirname( |
| os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
| sys.path.append(os.path.join(ROOT_DIR)) |
| |
| from generators.stdlib_docs.stdlib import FunctionDocs, ViewFunctionDocs, TableViewDocs |
| |
| DESC = """-- |
| -- First line. |
| -- Second line.""" |
| |
| COLS_STR = """-- |
| -- @column slice_id Id of slice. |
| -- @column slice_name Name of slice.""" |
| |
| COLS_SQL_STR = "slice_id INT, slice_name STRING" |
| |
| ARGS_STR = """-- |
| -- @arg utid INT Utid of thread. |
| -- @arg name STRING String name. |
| """ |
| |
| ARGS_SQL_STR = "utid INT, name STRING" |
| |
| RET_STR = """-- |
| -- @ret BOOL Exists. |
| """ |
| |
| RET_SQL_STR = "BOOL" |
| |
| SQL_STR = "SELECT * FROM slice" |
| |
| |
| class TestStdlib(unittest.TestCase): |
| |
| # Valid schemas |
| |
| def test_valid_table(self): |
| valid_table_comment = f"{DESC}\n{COLS_STR}".split('\n') |
| |
| docs, create_errors = TableViewDocs.create_from_comment( |
| "", valid_table_comment, 'common', ('table', 'tab_name', 'to_ignore')) |
| self.assertFalse(create_errors) |
| |
| validation_errors = docs.check_comment() |
| self.assertFalse(validation_errors) |
| |
| def test_valid_function(self): |
| valid_function = f"{DESC}\n{ARGS_STR}\n{RET_STR}".split('\n') |
| valid_regex_matches = ('fun_name', ARGS_SQL_STR, RET_SQL_STR, SQL_STR) |
| docs, create_errors = FunctionDocs.create_from_comment( |
| "", valid_function, 'common', valid_regex_matches) |
| self.assertFalse(create_errors) |
| |
| validation_errors = docs.check_comment() |
| self.assertFalse(validation_errors) |
| |
| def test_valid_view_function(self): |
| valid_view_function = f"{DESC}\n{ARGS_STR}\n{COLS_STR}".split('\n') |
| valid_regex_matches = ('fun_name', ARGS_SQL_STR, COLS_SQL_STR, SQL_STR) |
| docs, create_errors = ViewFunctionDocs.create_from_comment( |
| "", valid_view_function, 'common', valid_regex_matches) |
| self.assertFalse(create_errors) |
| |
| validation_errors = docs.check_comment() |
| self.assertFalse(validation_errors) |
| |
| # Missing modules in names |
| |
| def test_missing_module_in_table_name(self): |
| valid_table_comment = f"{DESC}\n{COLS_STR}".split('\n') |
| |
| _, create_errors = TableViewDocs.create_from_comment( |
| "", valid_table_comment, 'android', ('table', 'tab_name', 'to_ignore')) |
| self.assertTrue(create_errors) |
| |
| def test_missing_module_in_function_name(self): |
| valid_function = f"{DESC}\n{ARGS_STR}\n{RET_STR}".split('\n') |
| valid_regex_matches = ('fun_name', ARGS_SQL_STR, RET_SQL_STR, SQL_STR) |
| _, create_errors = FunctionDocs.create_from_comment("", valid_function, |
| 'android', |
| valid_regex_matches) |
| self.assertTrue(create_errors) |
| |
| def test_missing_module_in_view_function_name(self): |
| valid_view_function = f"{DESC}\n{ARGS_STR}\n{COLS_STR}".split('\n') |
| valid_regex_matches = ('fun_name', ARGS_SQL_STR, COLS_SQL_STR, SQL_STR) |
| _, create_errors = ViewFunctionDocs.create_from_comment( |
| "", valid_view_function, 'android', valid_regex_matches) |
| self.assertTrue(create_errors) |
| |
| # Missing part of schemas |
| |
| def test_missing_desc_in_table_name(self): |
| comment = f"{COLS_STR}".split('\n') |
| |
| _, create_errors = TableViewDocs.create_from_comment( |
| "", comment, 'common', ('table', 'tab_name', 'to_ignore')) |
| self.assertTrue(create_errors) |
| |
| def test_missing_cols_in_table(self): |
| comment = f"{DESC}".split('\n') |
| |
| _, create_errors = TableViewDocs.create_from_comment( |
| "", comment, 'common', ('table', 'tab_name', 'to_ignore')) |
| self.assertTrue(create_errors) |
| |
| def test_missing_desc_in_function(self): |
| comment = f"{ARGS_STR}\n{RET_STR}".split('\n') |
| valid_regex_matches = ('fun_name', ARGS_SQL_STR, RET_SQL_STR, SQL_STR) |
| _, create_errors = FunctionDocs.create_from_comment("", comment, 'common', |
| valid_regex_matches) |
| self.assertTrue(create_errors) |
| |
| def test_missing_args_in_function(self): |
| comment = f"{DESC}\n{RET_STR}".split('\n') |
| valid_regex_matches = ('fun_name', ARGS_SQL_STR, RET_SQL_STR, SQL_STR) |
| _, create_errors = FunctionDocs.create_from_comment("", comment, 'common', |
| valid_regex_matches) |
| self.assertTrue(create_errors) |
| |
| def test_missing_ret_in_function(self): |
| comment = f"{DESC}\n{ARGS_STR}".split('\n') |
| valid_regex_matches = ('fun_name', ARGS_SQL_STR, RET_SQL_STR, SQL_STR) |
| _, create_errors = FunctionDocs.create_from_comment("", comment, 'common', |
| valid_regex_matches) |
| self.assertTrue(create_errors) |
| |
| def test_missing_desc_in_view_function(self): |
| comment = f"{ARGS_STR}\n{COLS_STR}".split('\n') |
| valid_regex_matches = ('fun_name', ARGS_SQL_STR, COLS_SQL_STR, SQL_STR) |
| _, create_errors = ViewFunctionDocs.create_from_comment( |
| "", comment, 'common', valid_regex_matches) |
| self.assertTrue(create_errors) |
| |
| def test_missing_args_in_view_function(self): |
| comment = f"{DESC}\n{COLS_STR}".split('\n') |
| valid_regex_matches = ('fun_name', ARGS_SQL_STR, COLS_SQL_STR, SQL_STR) |
| _, create_errors = ViewFunctionDocs.create_from_comment( |
| "", comment, 'common', valid_regex_matches) |
| self.assertTrue(create_errors) |
| |
| def test_missing_cols_in_view_function(self): |
| comment = f"{DESC}\n{ARGS_STR}".split('\n') |
| valid_regex_matches = ('fun_name', ARGS_SQL_STR, COLS_SQL_STR, SQL_STR) |
| _, create_errors = ViewFunctionDocs.create_from_comment( |
| "", comment, 'common', valid_regex_matches) |
| self.assertTrue(create_errors) |
| |
| # Validate elements |
| |
| def test_invalid_table_columns(self): |
| invalid_cols = "-- @column slice_id" |
| comment = f"{DESC}\n{invalid_cols}".split('\n') |
| |
| docs, create_errors = TableViewDocs.create_from_comment( |
| "", comment, 'common', ('table', 'tab_name', 'to_ignore')) |
| self.assertFalse(create_errors) |
| |
| validation_errors = docs.check_comment() |
| self.assertTrue(validation_errors) |
| |
| def test_invalid_view_function_columns(self): |
| comment = f"{DESC}\n{ARGS_STR}\n{COLS_STR}".split('\n') |
| cols_sql_str = "slice_id INT" |
| valid_regex_matches = ('fun_name', ARGS_SQL_STR, cols_sql_str, SQL_STR) |
| docs, create_errors = ViewFunctionDocs.create_from_comment( |
| "", comment, 'common', valid_regex_matches) |
| self.assertFalse(create_errors) |
| |
| validation_errors = docs.check_comment() |
| self.assertTrue(validation_errors) |
| |
| def test_invalid_arguments(self): |
| valid_function = f"{DESC}\n{ARGS_STR}\n{RET_STR}".split('\n') |
| args_sql_str = "utid BOOL" |
| valid_regex_matches = ('fun_name', args_sql_str, RET_SQL_STR, SQL_STR) |
| docs, create_errors = FunctionDocs.create_from_comment( |
| "", valid_function, 'common', valid_regex_matches) |
| self.assertFalse(create_errors) |
| |
| validation_errors = docs.check_comment() |
| self.assertTrue(validation_errors) |
| |
| def test_invalid_ret(self): |
| valid_function = f"{DESC}\n{ARGS_STR}\n{RET_STR}".split('\n') |
| ret_sql_str = "utid BOOL" |
| valid_regex_matches = ('fun_name', ARGS_SQL_STR, ret_sql_str, SQL_STR) |
| docs, create_errors = FunctionDocs.create_from_comment( |
| "", valid_function, 'common', valid_regex_matches) |
| self.assertFalse(create_errors) |
| |
| validation_errors = docs.check_comment() |
| self.assertTrue(validation_errors) |