blob: 09df6813a0697a68e2b5c44217776a6f604e0f58 [file] [log] [blame]
Anna Mayzner412e0562022-11-25 09:55:51 +00001#!/usr/bin/env python3
2# Copyright (C) 2022 The Android Open Source Project
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
Anna Mayznera6cdc362022-12-15 03:08:46 +000016# This tool checks that every SQL object created without prefix
Anna Mayzner412e0562022-11-25 09:55:51 +000017# 'internal_' is documented with proper schema.
18
Rasika Navarange1615f9d2023-06-15 12:57:40 +000019import argparse
Alexander Timin1948c312023-07-28 21:41:08 +010020from typing import List, Tuple
Anna Mayzner412e0562022-11-25 09:55:51 +000021import os
Anna Mayzner412e0562022-11-25 09:55:51 +000022import sys
Alexander Timin1948c312023-07-28 21:41:08 +010023import re
Anna Mayzner412e0562022-11-25 09:55:51 +000024
25ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
Anna Mayznerb2153902023-01-06 16:32:49 +000026sys.path.append(os.path.join(ROOT_DIR))
Anna Mayzner412e0562022-11-25 09:55:51 +000027
Anna Mayzner1a84bf02023-08-16 09:56:21 +000028from python.generators.sql_processing.docs_parse import ParsedFile, parse_file
29from python.generators.sql_processing.utils import check_banned_words
Anna Mayzner78a41c02023-08-16 14:30:33 +000030from python.generators.sql_processing.utils import check_banned_create_table_as
31
32CREATE_TABLE_ALLOWLIST = {
33 '/src/trace_processor/perfetto_sql/stdlib/android/binder.sql': [
34 'internal_oom_score', 'internal_async_binder_reply',
35 'internal_binder_async_txn_raw'
36 ],
37 '/src/trace_processor/perfetto_sql/stdlib/android/monitor_contention.sql': [
38 'internal_isolated', 'android_monitor_contention_chain',
39 'android_monitor_contention'
40 ],
41 '/src/trace_processor/perfetto_sql/stdlib/chrome/tasks.sql': [
42 'internal_chrome_mojo_slices', 'internal_chrome_java_views',
43 'internal_chrome_scheduler_tasks', 'internal_chrome_tasks'
44 ],
45 ('/src/trace_processor/perfetto_sql/stdlib/experimental/'
46 'thread_executing_span.sql'): [
Zim56f67dc2023-08-27 01:50:30 +010047 'internal_wakeup', 'experimental_thread_executing_span_graph',
48 'internal_critical_path', 'internal_wakeup_graph', 'experimental_thread_executing_span_graph'
Anna Mayzner78a41c02023-08-16 14:30:33 +000049 ],
50 '/src/trace_processor/perfetto_sql/stdlib/experimental/flat_slices.sql': [
51 'experimental_slice_flattened'
52 ]
53}
Anna Mayzner896ce6d2022-12-12 13:03:43 +000054
55
Anna Mayzner412e0562022-11-25 09:55:51 +000056def main():
Rasika Navarange1615f9d2023-06-15 12:57:40 +000057 parser = argparse.ArgumentParser()
58 parser.add_argument(
59 '--stdlib-sources',
Alexander Timin1948c312023-07-28 21:41:08 +010060 default=os.path.join(ROOT_DIR, "src", "trace_processor", "perfetto_sql",
61 "stdlib"))
Rasika Navarange1615f9d2023-06-15 12:57:40 +000062 args = parser.parse_args()
Anna Mayznera6cdc362022-12-15 03:08:46 +000063 errors = []
Alexander Timin1948c312023-07-28 21:41:08 +010064 modules: List[Tuple[str, str, ParsedFile]] = []
Rasika Navarange1615f9d2023-06-15 12:57:40 +000065 for root, _, files in os.walk(args.stdlib_sources, topdown=True):
Anna Mayzner412e0562022-11-25 09:55:51 +000066 for f in files:
67 path = os.path.join(root, f)
Lalit Maganti6b2ac692023-05-23 01:24:29 +010068 if not path.endswith(".sql"):
69 continue
70 with open(path, 'r') as f:
71 sql = f.read()
72
Alexander Timin1948c312023-07-28 21:41:08 +010073 parsed = parse_file(path, sql)
74 modules.append((path, sql, parsed))
75
Alexander Timin1948c312023-07-28 21:41:08 +010076 for path, sql, parsed in modules:
Anna Mayznerfdaee3f2023-08-23 09:56:28 +000077 lines = [l.strip() for l in sql.split('\n')]
78 for line in lines:
79 if line.startswith('--'):
80 continue
81 if 'RUN_METRIC' in line:
82 errors.append(f"RUN_METRIC is banned in standard library.\n"
83 f"Offending file: {path}\n")
84
Alexander Timin1948c312023-07-28 21:41:08 +010085 errors += parsed.errors
Anna Mayzner1a84bf02023-08-16 09:56:21 +000086 errors += check_banned_words(sql, path)
Anna Mayzner78a41c02023-08-16 14:30:33 +000087 errors += check_banned_create_table_as(sql,
88 path.split(ROOT_DIR)[1],
89 CREATE_TABLE_ALLOWLIST)
Lalit Magantic5b13b32023-06-30 19:34:30 +010090
Anna Mayzner78a41c02023-08-16 14:30:33 +000091 if errors:
92 sys.stderr.write("\n".join(errors))
93 sys.stderr.write("\n")
Anna Mayznera6cdc362022-12-15 03:08:46 +000094 return 0 if not errors else 1
Anna Mayzner412e0562022-11-25 09:55:51 +000095
96
Anna Mayznera6cdc362022-12-15 03:08:46 +000097if __name__ == "__main__":
Anna Mayzner412e0562022-11-25 09:55:51 +000098 sys.exit(main())