@@ -3,40 +3,81 @@ CLASS y_check_db_access_in_ut DEFINITION PUBLIC INHERITING FROM y_check_base CRE
3
3
METHODS constructor.
4
4
5
5
PROTECTED SECTION .
6
- METHODS inspect_statements REDEFINITION .
6
+ METHODS inspect_structures REDEFINITION .
7
7
METHODS inspect_tokens REDEFINITION .
8
8
9
9
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 .
19
63
20
64
METHODS is_persistent_object IMPORTING obj_name TYPE string
21
65
RETURNING VALUE (result ) TYPE abap_bool .
22
66
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
-
29
67
METHODS is_internal_table IMPORTING statement TYPE sstmnt
30
68
RETURNING VALUE (result ) TYPE abap_bool .
31
69
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 .
34
75
35
76
ENDCLASS .
36
77
37
78
38
79
39
- CLASS y_check_db_access_in_ut IMPLEMENTATION .
80
+ CLASS Y_CHECK_DB_ACCESS_IN_UT IMPLEMENTATION .
40
81
41
82
42
83
METHOD constructor .
@@ -51,131 +92,184 @@ CLASS y_check_db_access_in_ut IMPLEMENTATION.
51
92
settings-apply_on_test_code = abap_true .
52
93
settings-documentation = | { c_docs_path-checks } db-access-in-ut.md| .
53
94
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 ) ).
55
97
relevant_structure_types = VALUE #( ).
56
98
57
99
set_check_message( 'Database access(es) within a Unit-Test should be removed!' ).
58
100
ENDMETHOD .
59
101
60
102
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 ).
63
133
64
- IF has_framework = abap_true .
134
+ IF second_token = keys-into .
65
135
RETURN .
66
136
ENDIF .
67
137
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 ).
69
142
ENDMETHOD .
70
143
71
144
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 ) ).
74
147
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 .
79
151
80
- IF is_an_attribution( statement ) = abap_true .
81
- CONTINUE .
82
- ENDIF .
152
+ class_config-risk_level = get_risk_level( statement ).
83
153
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 .
88
158
89
- DATA (check_configuration ) = detect_check_configuration( statement ).
90
159
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 .
94
165
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 ).
99
167
100
- ENDLOOP .
101
- ENDMETHOD .
168
+ DATA (token ) = ref_scan_manager->tokens[ statement-from ].
102
169
170
+ IF NOT line_exists ( forbidden_tokens[ table_line = token-str ] ).
171
+ RETURN .
172
+ ENDIF .
103
173
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 .
109
182
183
+ DATA (check_configuration ) = detect_check_configuration( statement ).
110
184
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 .
113
194
195
+
196
+ METHOD get_forbidden_tokens .
197
+ DATA risk_lvl TYPE properties-risk_level.
114
198
TRY .
115
- DATA ( class_definition ) = ref_scan_manager->structures[ class_implementation-back ] .
199
+ risk_lvl = defined_classes[ name = class_name ]-risk_level .
116
200
CATCH cx_sy_itab_line_not_found.
117
- RETURN .
201
+ risk_lvl = space .
118
202
ENDTRY .
119
203
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
+
121
222
223
+ METHOD is_part_of_framework .
122
224
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
+
136
237
ENDLOOP .
238
+ ENDMETHOD .
137
239
138
- test_risk_level = COND #( WHEN test_risk_level IS INITIAL THEN risk_level_not_set
139
- ELSE test_risk_level ).
140
240
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 .
145
246
ENDMETHOD .
146
247
147
248
148
- METHOD consolidade_tokens .
249
+ METHOD get_risk_level .
149
250
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.
153
256
ENDLOOP .
154
257
ENDMETHOD .
155
258
156
259
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( ).
163
263
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( ).
172
266
ENDMETHOD .
173
267
174
268
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 ).
178
274
ENDMETHOD .
179
-
180
-
181
275
ENDCLASS .
0 commit comments