Skip to content

Commit 702c43b

Browse files
lucasborinEugen GüntherEugen Guenther
authored
1.13.0 (#323)
* versioning * Performance of DB Access in UT Check (#320) * Update README.md * disabling rfc * Update changelog.txt * Update changelog.txt * 1.12.0 * Profile Tool - UX Refinement (#313) Minor UX Changes * Update changelog.txt * Update changelog.txt * Performance (#317) * buffer size * fixing dump when object is not supported by sci * solving dump when ref scan is not set * Update y_ref_scan_manager.clas.abap * Update changelog.txt * removing shared memory (#319) * Update changelog.txt * Performance Improvements (#318) * moving application component valid. to ref_scan * wip * changing validation sequence * fixing minor bug * fixing bug * refactoring former buffer * syntax error * fixing ut * fixing unit test base * abaplint hint * Update changelog.txt * wip * minor update * minor change * Code review (#322) * removing unused exception * solving empty catch * moving buffer cleanup * pretty printer * Update y_code_pal_version.intf.abap * commented changes Co-authored-by: Eugen Günther <[email protected]> Co-authored-by: Eugen Guenther <[email protected]> * minor change * Update changelog.txt Co-authored-by: Eugen Günther <[email protected]> Co-authored-by: Eugen Guenther <[email protected]>
1 parent 73579ed commit 702c43b

File tree

5 files changed

+201
-104
lines changed

5 files changed

+201
-104
lines changed

changelog.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ Upgrade Note
1212
------------------
1313
Whenever you upgrade code pal for ABAP, it is highly recommended to execute the Y_CI_CHECK_REGISTRATION report to activate/reactivate the Checks (SE38 transaction) and regenerate the respective code inspector variant (SCI transaction)
1414

15+
2021-03-24 v.1.13.0
16+
------------------
17+
* y_ref_scan_manager_double
18+
* y_check_db_access_in_ut
19+
1520
2021-02-24 v1.12.3
1621
------------------
1722
* Object Creation Date from TRDIR table

src/checks/y_check_db_access_in_ut.clas.abap

Lines changed: 193 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3576
ENDCLASS.
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-
181275
ENDCLASS.

src/checks/y_check_db_access_in_ut.clas.testclasses.abap

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,6 @@ CLASS ltc_exec_sql IMPLEMENTATION.
440440
ENDCLASS.
441441

442442

443-
444443
CLASS ltc_attribution DEFINITION INHERITING FROM ltc_risk_harmless FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
445444
PROTECTED SECTION.
446445
METHODS get_code_without_issue REDEFINITION.

0 commit comments

Comments
 (0)