@@ -3,40 +3,81 @@ CLASS y_check_db_access_in_ut DEFINITION PUBLIC INHERITING FROM y_check_base CRE
33 METHODS constructor.
44
55 PROTECTED SECTION .
6- METHODS inspect_statements REDEFINITION .
6+ METHODS inspect_structures REDEFINITION .
77 METHODS inspect_tokens REDEFINITION .
88
99 PRIVATE SECTION .
10- CONSTANTS risk_level_harmless TYPE string VALUE 'HARMLESS' .
11- CONSTANTS risk_level_dangerous TYPE string VALUE 'DANGEROUS' .
12- CONSTANTS risk_level_critical TYPE string VALUE 'CRITICAL' .
13- CONSTANTS risk_level_not_set TYPE string VALUE 'NOT_SET' .
14-
15- DATA tokens_not_allowed TYPE y_char255_tab.
16- DATA has_framework TYPE abap_bool .
17-
18- METHODS inspect_class_definition IMPORTING class_implementation TYPE sstruc.
10+ CONSTANTS : BEGIN OF risk_level,
11+ harmless TYPE string VALUE 'HARMLESS' ,
12+ dangerous TYPE string VALUE 'DANGEROUS' ,
13+ critical TYPE string VALUE 'CRITICAL' ,
14+ END OF risk_level.
15+
16+ CONSTANTS : BEGIN OF check_for,
17+ alter TYPE char40 VALUE 'ALTER' ,
18+ delete TYPE char40 VALUE 'DELETE' ,
19+ update TYPE char40 VALUE 'UPDATE' ,
20+ modify TYPE char40 VALUE 'MODIFY' ,
21+ insert TYPE char40 VALUE 'INSERT' ,
22+ select TYPE char40 VALUE 'SELECT' ,
23+ commit TYPE char40 VALUE 'COMMIT' ,
24+ rollback TYPE char40 VALUE 'ROLLBACK' ,
25+ END OF check_for.
26+
27+ CONSTANTS : BEGIN OF framework,
28+ qsql_if TYPE char40 VALUE 'IF_OSQL_TEST_ENVIRONMENT' ,
29+ qsql_cl TYPE char40 VALUE 'CL_OSQL_TEST_ENVIRONMENT' ,
30+ cds_if TYPE char40 VALUE 'IF_CDS_TEST_ENVIRONMENT' ,
31+ cds_cl TYPE char40 VALUE 'CL_CDS_TEST_ENVIRONMENT' ,
32+ END OF framework.
33+
34+ CONSTANTS : BEGIN OF keys ,
35+ from TYPE char40 VALUE 'FROM' ,
36+ into TYPE char40 VALUE 'INTO' ,
37+ class TYPE char40 VALUE 'CLASS ',
38+ table TYPE char4 VALUE 'TABL ',
39+ END OF keys .
40+
41+ TYPES : BEGIN OF properties,
42+ name TYPE string ,
43+ risk_level TYPE string ,
44+ END OF properties.
45+
46+ DATA defined_classes TYPE STANDARD TABLE OF properties.
47+
48+ METHODS get_class_name IMPORTING structure TYPE sstruc
49+ RETURNING VALUE (result ) TYPE string
50+ RAISING cx_sy_itab_line_not_found.
51+
52+ METHODS get_risk_level IMPORTING statement TYPE sstmnt
53+ RETURNING VALUE (result ) TYPE string .
54+
55+ METHODS add_line_to_defined_classes IMPORTING statement TYPE sstmnt
56+ structure TYPE sstruc.
57+ METHODS check_class IMPORTING index TYPE i
58+ statement TYPE sstmnt
59+ structure TYPE sstruc.
60+
61+ METHODS is_part_of_framework IMPORTING structure TYPE sstruc
62+ RETURNING VALUE (result ) TYPE abap_bool .
1963
2064 METHODS is_persistent_object IMPORTING obj_name TYPE string
2165 RETURNING VALUE (result ) TYPE abap_bool .
2266
23- METHODS consolidade_tokens IMPORTING statement TYPE sstmnt
24- RETURNING VALUE (result ) TYPE string .
25-
26- METHODS has_ddic_itab_same_syntax IMPORTING token TYPE char255
27- RETURNING VALUE (result ) TYPE abap_bool .
28-
2967 METHODS is_internal_table IMPORTING statement TYPE sstmnt
3068 RETURNING VALUE (result ) TYPE abap_bool .
3169
32- METHODS is_an_attribution IMPORTING statement TYPE sstmnt
33- RETURNING VALUE (result ) TYPE abap_bool .
70+ METHODS get_forbidden_tokens IMPORTING class_name TYPE string
71+ RETURNING VALUE (result ) TYPE y_char255_tab.
72+
73+ METHODS has_ddic_itab_same_syntax IMPORTING token TYPE stokesx
74+ RETURNING VALUE (result ) TYPE abap_bool .
3475
3576ENDCLASS .
3677
3778
3879
39- CLASS y_check_db_access_in_ut IMPLEMENTATION .
80+ CLASS Y_CHECK_DB_ACCESS_IN_UT IMPLEMENTATION .
4081
4182
4283 METHOD constructor .
@@ -51,131 +92,184 @@ CLASS y_check_db_access_in_ut IMPLEMENTATION.
5192 settings-apply_on_test_code = abap_true .
5293 settings-documentation = | { c_docs_path-checks } db-access-in-ut.md| .
5394
54- relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-class_implementation ) ).
95+ relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-class_definition )
96+ ( scan_struc_stmnt_type-class_implementation ) ).
5597 relevant_structure_types = VALUE #( ).
5698
5799 set_check_message( 'Database access(es) within a Unit-Test should be removed!' ).
58100 ENDMETHOD .
59101
60102
61- METHOD inspect_statements .
62- inspect_class_definition( structure ).
103+ METHOD inspect_tokens .
104+ CASE structure-stmnt_type.
105+ WHEN scan_struc_stmnt_type-class_definition.
106+ add_line_to_defined_classes( statement = statement
107+ structure = structure ).
108+
109+ WHEN scan_struc_stmnt_type-class_implementation.
110+ check_class( index = index
111+ statement = statement
112+ structure = structure ).
113+
114+ ENDCASE .
115+ ENDMETHOD .
116+
117+
118+ METHOD is_persistent_object .
119+ DATA (upper_name ) = to_upper ( obj_name ).
120+ SELECT * FROM tadir
121+ WHERE obj_name = @upper_name
122+ AND object = @keys-table
123+ AND delflag = @space
124+ INTO TABLE @DATA (tmp ).
125+
126+ result = xsdbool ( sy -subrc = 0 ).
127+ ENDMETHOD .
128+
129+
130+ METHOD is_internal_table .
131+ DATA (second_token ) = get_token_abs( statement-from + 1 ).
132+ DATA (third_token ) = get_token_abs( statement-from + 2 ).
63133
64- IF has_framework = abap_true .
134+ IF second_token = keys-into .
65135 RETURN .
66136 ENDIF .
67137
68- super ->inspect_statements( structure ).
138+ DATA (table_name ) = COND #( WHEN second_token = keys-from THEN third_token
139+ ELSE second_token ).
140+
141+ result = xsdbool ( is_persistent_object( table_name ) = abap_false ).
69142 ENDMETHOD .
70143
71144
72- METHOD inspect_tokens .
73- DATA (tokens ) = consolidade_tokens( statement ).
145+ METHOD add_line_to_defined_classes .
146+ DATA (class_config ) = VALUE properties( name = get_class_name( structure ) ).
74147
75- LOOP AT tokens_not_allowed ASSIGNING FIELD-SYMBOL (<token_not_allowed> ).
76- IF tokens NP <token_not_allowed> .
77- CONTINUE .
78- ENDIF .
148+ IF line_exists ( defined_classes[ name = class_config-name ] ).
149+ RETURN .
150+ ENDIF .
79151
80- IF is_an_attribution( statement ) = abap_true .
81- CONTINUE .
82- ENDIF .
152+ class_config-risk_level = get_risk_level( statement ).
83153
84- IF has_ddic_itab_same_syntax( <token_not_allowed> ) = abap_true
85- AND is_internal_table( statement ) = abap_true .
86- CONTINUE .
87- ENDIF .
154+ IF is_part_of_framework( structure ) = abap_false .
155+ APPEND class_config TO defined_classes .
156+ ENDIF .
157+ ENDMETHOD .
88158
89- DATA (check_configuration ) = detect_check_configuration( statement ).
90159
91- IF check_configuration IS INITIAL .
92- RETURN .
93- ENDIF .
160+ METHOD check_class .
161+ DATA (class_name ) = get_class_name( structure ).
162+ IF NOT line_exists ( defined_classes[ name = class_name ] ).
163+ RETURN .
164+ ENDIF .
94165
95- raise_error( statement_level = statement-level
96- statement_index = index
97- statement_from = statement-from
98- error_priority = check_configuration-prio ).
166+ DATA (forbidden_tokens ) = get_forbidden_tokens( class_name ).
99167
100- ENDLOOP .
101- ENDMETHOD .
168+ DATA (token ) = ref_scan_manager->tokens[ statement-from ].
102169
170+ IF NOT line_exists ( forbidden_tokens[ table_line = token-str ] ).
171+ RETURN .
172+ ENDIF .
103173
104- METHOD is_persistent_object .
105- cl_abap_structdescr=>describe_by_name( EXPORTING p_name = obj_name
106- EXCEPTIONS OTHERS = 1 ).
107- result = xsdbool ( sy -subrc = 0 ).
108- ENDMETHOD .
174+ IF has_ddic_itab_same_syntax( token ) = abap_true
175+ AND is_internal_table( statement ) = abap_true .
176+ RETURN .
177+ ENDIF .
178+
179+ IF ref_scan_manager->tokens[ statement-from + 1 ]-str = '=' .
180+ RETURN .
181+ ENDIF .
109182
183+ DATA (check_configuration ) = detect_check_configuration( statement ).
110184
111- METHOD inspect_class_definition .
112- DATA test_risk_level TYPE string .
185+ IF check_configuration IS INITIAL .
186+ RETURN .
187+ ENDIF .
188+
189+ raise_error( statement_level = statement-level
190+ statement_index = index
191+ statement_from = statement-from
192+ error_priority = check_configuration-prio ).
193+ ENDMETHOD .
113194
195+
196+ METHOD get_forbidden_tokens .
197+ DATA risk_lvl TYPE properties-risk_level.
114198 TRY .
115- DATA ( class_definition ) = ref_scan_manager->structures[ class_implementation-back ] .
199+ risk_lvl = defined_classes[ name = class_name ]-risk_level .
116200 CATCH cx_sy_itab_line_not_found.
117- RETURN .
201+ risk_lvl = space .
118202 ENDTRY .
119203
120- has_framework = abap_false .
204+ CASE risk_lvl.
205+ WHEN risk_level-dangerous OR risk_level-critical.
206+ result = VALUE #( ( check_for-alter )
207+ ( check_for-delete )
208+ ( check_for-update )
209+ ( check_for-modify ) ).
210+ WHEN OTHERS .
211+ result = VALUE #( ( check_for-alter )
212+ ( check_for-delete )
213+ ( check_for-update )
214+ ( check_for-modify )
215+ ( check_for-insert )
216+ ( check_for-select )
217+ ( check_for-commit )
218+ ( check_for-rollback ) ).
219+ ENDCASE .
220+ ENDMETHOD .
221+
121222
223+ METHOD is_part_of_framework .
122224 LOOP AT ref_scan_manager->statements ASSIGNING FIELD-SYMBOL (<statement> )
123- FROM class_definition-stmnt_from TO class_definition-stmnt_to.
124- DATA (tokens ) = consolidade_tokens( <statement> ).
125-
126- test_risk_level = COND #( WHEN tokens CS 'RISK LEVEL HARMLESS' THEN risk_level_harmless
127- WHEN tokens CS 'RISK LEVEL DANGEROUS' THEN risk_level_dangerous
128- WHEN tokens CS 'RISK LEVEL CRITICAL' THEN risk_level_critical
129- ELSE test_risk_level ).
130-
131- has_framework = COND #( WHEN tokens CS 'IF_OSQL_TEST_ENVIRONMENT' THEN abap_true
132- WHEN tokens CS 'CL_OSQL_TEST_ENVIRONMENT' THEN abap_true
133- WHEN tokens CS 'IF_CDS_TEST_ENVIRONMENT' THEN abap_true
134- WHEN tokens CS 'CL_CDS_TEST_ENVIRONMENT' THEN abap_true
135- ELSE has_framework ).
225+ FROM structure-stmnt_from TO structure-stmnt_to.
226+
227+ LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL (<token> )
228+ FROM <statement> -from TO <statement> -to
229+ WHERE str = framework-qsql_if OR
230+ str = framework-qsql_cl OR
231+ str = framework-cds_if OR
232+ str = framework-cds_cl.
233+ result = abap_true .
234+ RETURN .
235+ ENDLOOP .
236+
136237 ENDLOOP .
238+ ENDMETHOD .
137239
138- test_risk_level = COND #( WHEN test_risk_level IS INITIAL THEN risk_level_not_set
139- ELSE test_risk_level ).
140240
141- tokens_not_allowed = COND #( WHEN test_risk_level = risk_level_harmless THEN VALUE #( ( 'ALTER *' ) ( 'DELETE *' ) ( 'UPDATE *' ) ( 'MODIFY *' ) ( 'INSERT INTO *' ) ( 'SELECT *' ) ( 'COMMIT*' ) ( 'ROLLBACK*' ) )
142- WHEN test_risk_level = risk_level_not_set THEN VALUE #( ( 'ALTER *' ) ( 'DELETE *' ) ( 'UPDATE *' ) ( 'MODIFY *' ) ( 'INSERT INTO *' ) ( 'SELECT *' ) ( 'COMMIT*' ) ( 'ROLLBACK*' ) )
143- WHEN test_risk_level = risk_level_dangerous THEN VALUE #( ( 'ALTER *' ) ( 'DELETE *' ) ( 'UPDATE *' ) ( 'MODIFY *' ) )
144- WHEN test_risk_level = risk_level_critical THEN VALUE #( ( 'ALTER *' ) ( 'DELETE *' ) ( 'UPDATE *' ) ( 'MODIFY *' ) ) ).
241+ METHOD get_class_name .
242+ DATA (index ) = ref_scan_manager->statements[ structure-stmnt_from ]-from.
243+ IF get_token_abs( index ) = keys-class.
244+ result = get_token_abs( index + 1 ).
245+ ENDIF .
145246 ENDMETHOD .
146247
147248
148- METHOD consolidade_tokens .
249+ METHOD get_risk_level .
149250 LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL (<token> )
150- FROM statement-from TO statement-to.
151- result = COND #( WHEN result IS INITIAL THEN condense ( <token> -str )
152- ELSE | { result } { condense( <token>-str ) } | ).
251+ FROM statement-from TO statement-to
252+ WHERE str = risk_level-harmless
253+ OR str = risk_level-dangerous
254+ OR str = risk_level-critical.
255+ result = <token> -str.
153256 ENDLOOP .
154257 ENDMETHOD .
155258
156259
157- METHOD has_ddic_itab_same_syntax .
158- result = xsdbool ( token CS 'MODIFY'
159- OR token CS 'UPDATE'
160- OR token CS 'DELETE' ).
161- ENDMETHOD .
162-
260+ METHOD inspect_structures .
261+ relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-class_definition ) ).
262+ super ->inspect_structures( ).
163263
164- METHOD is_internal_table .
165- DATA (second_token ) = get_token_abs( statement-from + 1 ).
166- DATA (third_token ) = get_token_abs( statement-from + 2 ).
167-
168- DATA (table ) = COND #( WHEN second_token = 'FROM' THEN third_token
169- ELSE second_token ).
170-
171- result = xsdbool ( is_persistent_object( table ) = abap_false ).
264+ relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-class_implementation ) ).
265+ super ->inspect_structures( ).
172266 ENDMETHOD .
173267
174268
175- METHOD is_an_attribution .
176- DATA (second_token ) = get_token_abs( statement-from + 1 ).
177- result = xsdbool ( second_token = '=' ).
269+ METHOD has_ddic_itab_same_syntax .
270+ result = xsdbool ( token-str = check_for-modify
271+ OR token-str = check_for-update
272+ OR token-str = check_for-delete
273+ OR token-str = check_for-insert ).
178274 ENDMETHOD .
179-
180-
181275ENDCLASS .
0 commit comments