├── .abapgit.xml
├── LICENSE
├── README.md
├── docs
└── README_legacy_v0.md
├── img
├── copy_globals_after.png
├── copy_globals_before.png
├── load_script.png
├── load_script1.png
├── script_prompt_tdc.png
├── script_prompt_testcase.png
├── tdc_permit_api_access.png
├── tdc_with_values.png
└── update_snap.png
└── src
├── package.devc.xml
├── zcx_dbgl_copy_error.clas.abap
├── zcx_dbgl_copy_error.clas.xml
├── zcx_dbgl_dictionary_access.clas.abap
├── zcx_dbgl_dictionary_access.clas.xml
├── zcx_dbgl_snapshot.clas.abap
├── zcx_dbgl_snapshot.clas.xml
├── zcx_dbgl_snapshot_tdc.clas.abap
├── zcx_dbgl_snapshot_tdc.clas.xml
├── zcx_dbgl_testcase.clas.abap
├── zcx_dbgl_testcase.clas.xml
├── zcx_dbgl_type_not_supported.clas.abap
├── zcx_dbgl_type_not_supported.clas.xml
├── zdbgl.msag.xml
├── zdbgl_abstract_storage.clas.abap
├── zdbgl_abstract_storage.clas.locals_imp.abap
├── zdbgl_abstract_storage.clas.xml
├── zdbgl_copy_globals_to_tdc.prog.abap
├── zdbgl_copy_globals_to_tdc.prog.xml
├── zdbgl_copy_locals_to_tdc.prog.abap
├── zdbgl_copy_locals_to_tdc.prog.xml
├── zdbgl_copy_to_tdc.clas.abap
├── zdbgl_copy_to_tdc.clas.testclasses.abap
├── zdbgl_copy_to_tdc.clas.xml
├── zdbgl_demo_group.fugr.lzdbgl_demo_grouptop.abap
├── zdbgl_demo_group.fugr.lzdbgl_demo_grouptop.xml
├── zdbgl_demo_group.fugr.saplzdbgl_demo_group.abap
├── zdbgl_demo_group.fugr.saplzdbgl_demo_group.xml
├── zdbgl_demo_group.fugr.xml
├── zdbgl_demo_group.fugr.zdbgl_demo_module.abap
├── zdbgl_demo_regression_test.prog.abap
├── zdbgl_demo_regression_test.prog.xml
├── zdbgl_display_app_log.dtel.xml
├── zdbgl_export_path.tabl.xml
├── zdbgl_get_globals.clas.abap
├── zdbgl_get_globals.clas.xml
├── zdbgl_get_locals.clas.abap
├── zdbgl_get_locals.clas.xml
├── zdbgl_getter.clas.abap
├── zdbgl_getter.clas.locals_imp.abap
├── zdbgl_getter.clas.testclasses.abap
├── zdbgl_getter.clas.xml
├── zdbgl_increment_version_no.dtel.xml
├── zdbgl_key_testcases.dtel.xml
├── zdbgl_locals.tabl.xml
├── zdbgl_sample.ectd.xml
├── zdbgl_script_rec_signature.prog.abap
├── zdbgl_script_rec_signature.prog.xml
├── zdbgl_script_store_globals.prog.abap
├── zdbgl_script_store_globals.prog.xml
├── zdbgl_script_store_in_tdc.prog.abap
├── zdbgl_script_store_in_tdc.prog.xml
├── zdbgl_script_store_locals.prog.abap
├── zdbgl_script_store_locals.prog.xml
├── zdbgl_signature_record.clas.abap
├── zdbgl_signature_record.clas.testclasses.abap
├── zdbgl_signature_record.clas.xml
├── zdbgl_snap_record.para.xml
├── zdbgl_snapshots.prog.abap
├── zdbgl_snapshots.prog.xml
├── zdbgl_snapshots_tdc.clas.abap
├── zdbgl_snapshots_tdc.clas.testclasses.abap
├── zdbgl_snapshots_tdc.clas.xml
├── zdbgl_store_globals.acid.xml
├── zdbgl_store_globals.clas.abap
├── zdbgl_store_globals.clas.testclasses.abap
├── zdbgl_store_globals.clas.xml
├── zdbgl_store_locals.acid.xml
├── zdbgl_store_locals.clas.abap
├── zdbgl_store_locals.clas.xml
├── zdbgl_tdc_parameter.tabl.xml
├── zdbgl_tdc_variant_key.tabl.xml
├── zdbgl_tdc_variant_key1.tabl.xml
├── zdbgl_unit_test.prog.abap
├── zdbgl_unit_test.prog.xml
├── zdbgl_unit_test_container.ectd.xml
├── zdbgl_use_latest_version.dtel.xml
├── zdbgl_utils.clas.abap
├── zdbgl_utils.clas.xml
├── zdbgl_variables.tabl.xml
├── zif_dbgl_snapshots.intf.abap
└── zif_dbgl_snapshots.intf.xml
/.abapgit.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | E
6 | /src/
7 | PREFIX
8 |
9 | - /.gitignore
10 | - /LICENSE
11 | - /README.md
12 | - /package.json
13 | - /.travis.yml
14 | - /.gitlab-ci.yml
15 | - /abaplint.json
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 germanysources
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Snapshots in ABAP #
2 |
3 | ## Snapshots ##
4 | Create snapshots either in the debugger or directly in your unit-tests.
5 | Snapshots are stored in ECATT test data containers (TDC).
6 |
7 | ## Unit-Test ##
8 | Snapshots can be created with class ```zdbgl_snapshots_tdc```.
9 | The following listing shows a sample unit-test using snapshots.
10 | ```ABAP
11 | CLASS test_snapshot DEFINITION FOR TESTING
12 | DURATION SHORT RISK LEVEL HARMLESS.
13 |
14 | PRIVATE SECTION.
15 |
16 | METHODS flight_test FOR TESTING
17 | RAISING zcx_dbgl_snapshot.
18 |
19 | ENDCLASS.
20 |
21 | CLASS test_snapshot IMPLEMENTATION.
22 |
23 | METHOD flight_test.
24 |
25 | DATA(snapshot_manager) = zdbgl_snapshots_tdc=>create_default(
26 | tdc_name = 'ZDBGL_SNAPSHOT_SAMPLE'
27 | ).
28 |
29 | DATA(carrier) = VALUE scarr_tab(
30 | ( carrid = 'SAP' carrname = 'SAP Flights' )
31 | ( carrid = 'IN' carrname = 'Internat. Airways' )
32 | ).
33 | DATA(flight) = VALUE sflight( carrid = 'SAP' connid = 700 fldate = '20201231' ).
34 |
35 | snapshot_manager->compare_or_record( name = 'CARRIER' actual = carrier ).
36 | snapshot_manager->compare_or_record( name = 'FLIGHT' actual = flight ).
37 |
38 | " can be omitted, when autosave = abap_true in factory method or constructor
39 | snapshot_manager->commit_changes( ).
40 |
41 | ENDMETHOD.
42 |
43 | ENDCLASS.
44 | ```
45 | The method ```snapshot_manager->compare_or_record``` compares the given value with the recorded value or records the value. We need to give every value a unique name in the parameter ```name```.
46 | The behavior (recording or comparing) is controlled with the SET/GET-parameter ```ZDBGL_SNAP_RECORD```.
47 | A value of 'X' means 'create/update the snapshot'.
48 | 
49 |
50 | ### Comparison ###
51 | The standard implementation uses the method ```cl_abap_unit_assert=>assert_equals``` for comparison.
52 | Override the method ```zdbgl_snapshots_tdc=>compare``` to specify another comparison method.
53 |
54 | ### Restrictions ###
55 | * Structures must be defined in the ABAP dictionary. Structures defined outside of the ABAP dictionary can't be stored in test data containers.
56 | * Any kind of references (pointing to classes, interfaces or data objects) are not supported
57 | * Updating a snapshot closes the SAP-LUW with ```COMMIT WORK```. To avoid this, use debugger snapshots as described in the next section.
58 |
59 | ## Debugger ##
60 | ### Create snapshots ###
61 | Another option to create snapshots is the debugger script ```zdbgl_script_store_in_tdc```.
62 | Prerequisite is an existing TDC.
63 |
64 | #### Prerequisite step: create ECATT test data container ####
65 | Go the transaction ```secatt``` and create a test data container. Add a parameter for every variable you want to record. The parameter should have the same name and type as the variable.
66 | Last but not least give the test data container API access as shown in the picture below.
67 | 
68 |
69 | #### Before the modification ####
70 | Set an appropriate breakpoint and create the snapshot with the debugger-script ```zdbgl_script_store_in_tdc```.
71 | 
72 | This script asks you for the name, the version and the variant of the test data container as shown in the picture below.
73 | 
74 |
75 | ### Writing unit-tests ###
76 | With the API in the class ```cl_apl_ecatt_tdc_api``` we can access the snapshot.
77 |
78 | ### Example ###
79 | The example can be found in the program ```zdbgl_demo_regression_test```.
80 |
81 | The procedure ```to_verify``` is the procedure under test.
82 | ```ABAP
83 | FORM to_verify.
84 | FIELD-SYMBOLS: TYPE sflight.
85 |
86 | APPEND INITIAL LINE TO demo_itab ASSIGNING .
87 | -carrid = 'LH'.
88 | -connid = '3444'.
89 | -price = 400.
90 |
91 | ENDFORM.
92 | ```
93 |
94 | In the first step we create a snapshot before and after this procedure is executed.
95 |
96 | In the second step we use the snapshot (test data container "ZDBGL_SAMPLE") to write unit-tests:
97 | ```ABAP
98 | REPORT ZDBGL_DEMO_REGRESSION_TEST.
99 | DATA: demo_itab TYPE STANDARD TABLE OF sflight.
100 |
101 | START-OF-SELECTION.
102 | FIELD-SYMBOLS: TYPE sflight.
103 |
104 | APPEND INITIAL LINE TO demo_itab ASSIGNING .
105 | -carrid = 'LH'.
106 | -connid = '3445'.
107 | -price = 500.
108 | BREAK-POINT. "snapshot is created
109 | PERFORM to_verify.
110 | BREAK-POINT. "snapshot is created
111 |
112 |
113 | " subprogram should be verified.
114 | " It changes the global variable demo_itab.
115 | FORM to_verify.
116 | FIELD-SYMBOLS: TYPE sflight.
117 |
118 | APPEND INITIAL LINE TO demo_itab ASSIGNING .
119 | -carrid = 'LH'.
120 | -connid = '3444'.
121 | -price = 400.
122 |
123 | ENDFORM.
124 |
125 | CLASS regression_test DEFINITION FOR TESTING
126 | DURATION SHORT RISK LEVEL HARMLESS.
127 |
128 | PRIVATE SECTION.
129 | DATA: tdc_accessor TYPE REF TO cl_apl_ecatt_tdc_api.
130 |
131 | METHODS setup
132 | RAISING cx_static_check.
133 |
134 | METHODS verify_changed_itab FOR TESTING
135 | RAISING cx_static_check.
136 |
137 | ENDCLASS.
138 |
139 | CLASS regression_test IMPLEMENTATION.
140 |
141 | METHOD setup.
142 |
143 | tdc_accessor = cl_apl_ecatt_tdc_api=>get_instance( EXPORTING
144 | i_testdatacontainer = 'ZDBGL_SAMPLE' i_testdatacontainer_version = 1 ).
145 |
146 | ENDMETHOD.
147 |
148 | METHOD verify_changed_itab.
149 | DATA: exp_demo_itab LIKE demo_itab.
150 |
151 | " given: use the snapshot before procedure under test was executed
152 | tdc_accessor->get_value( EXPORTING i_param_name = 'DEMO_ITAB' i_variant_name = 'BEFORE'
153 | CHANGING e_param_value = demo_itab ).
154 |
155 | " when: execute procedure under test
156 | PERFORM to_verify.
157 |
158 | " then: use the snapshot after the procedure under test was executed
159 | tdc_accessor->get_value( EXPORTING i_param_name = 'DEMO_ITAB' i_variant_name = 'AFTER'
160 | CHANGING e_param_value = exp_demo_itab ).
161 | cl_abap_unit_assert=>assert_equals( exp = exp_demo_itab
162 | act = demo_itab msg = 'Regression test not passed' ).
163 |
164 | ENDMETHOD.
165 |
166 | ENDCLASS.
167 | ```
168 |
169 | ### Restrictions ###
170 | These types are currently supported:
171 | * simple types (like characters, strings, integer)
172 | * flat structures (complex structures containing components with tables or structures are not supported)
173 | * tables with a flat structure or a simple type as the table line type
174 |
175 | These types are not supported:
176 | * all form of references
177 | * complex structures
178 | * tables with complex structures as the table line type or with tables as the table line type
179 |
180 | ### Legacy API ###
181 | There is a legacy API to create snapshots in the debugger, which uses the database tables ```zdbgl_variables``` and ```zdbgl_locals``` as a temporary storage and which is bit more difficult to use. This API is documented in the [docs-folder](docs/README_legacy_v0.md).
182 |
183 | ## Installation ##
184 | Installation is done with [abapGit](https://github.com/larshp/abapgit). ABAP 7.40 or higher is needed.
185 | All ABAP-objects have the prefix ```zdbgl```.
186 |
187 | ## Logs ##
188 | Exceptions are logged in the checkpoint-groups "zdbgl_store_globals" and "zdbgl_store_locals" (see transaction ```saab```).
189 | Logging is only active, if the checkpoint-groups is activated.
190 |
191 | ## Dependencies ##
192 | - [ABAP-Logger](https://github.com/ABAP-Logger/ABAP-Logger) is used for display interactive messages
193 |
--------------------------------------------------------------------------------
/docs/README_legacy_v0.md:
--------------------------------------------------------------------------------
1 | # Regression tests in ABAP #
2 |
3 | ## Idea ##
4 | Regression tests are usable for comparing the results of a algorithm before and after a source-code modification.
5 | Unit-tests are one way to execute regression tests.
6 | A single unit-test-method can be splitted in the above sections:
7 | ```ABAP
8 | CLASS unit_test DEFINITION DEFINITION FOR TESTING
9 | DURATION SHORT RISK LEVEL HARMLESS.
10 |
11 | PRIVATE SECTION.
12 |
13 | METHODS should_return_some_result FOR TESTING.
14 |
15 | ENDCLASS.
16 |
17 | CLASS unit_test IMPLEMENTATION.
18 |
19 | METHOD should_return_some_result.
20 |
21 | " given: prepare the input parameters
22 |
23 | " when: execute the procedure under test
24 |
25 | " then: verify the results
26 |
27 | ENDMETHOD.
28 |
29 | ENDCLASS.
30 |
31 | ```
32 | In legacy codes the ```given``` and the ```then``` sections contain assignments of huge structures or huge internal tables.
33 | Adding unit-tests for legacy code can be time consuming, because we must determine values for huge structures and for huge internal tables.
34 | The debugger-scripts in this repository can help you to determine these values more quickly, because they record values of global and local variables and store them permanent in the database.
35 |
36 | ## How to use it ##
37 | ### Regression test of a procedure ###
38 | #### Before the modification ####
39 | Set a breakpoint before the procedure is executed. Set a breakpoint after the procedure is finished.
40 | Record the global or local variables at both breakpoints with the debugger script ```zdbgl_script_store_globals``` or the debugger script ```zdbgl_script_store_locals```.
41 |
42 | Go to "Script" Tab in the debugger and load the script ```zdbgl_script_store_globals``` or the script ```zdbgl_script_store_locals``` from the database.
43 | 
44 |
45 | The script will prompt you to enter an Key for the testcase. For each record you should choose an unique id.
46 | 
47 |
48 | ### Storage ###
49 | The global variables are temporary stored in the table ```zdbgl_variables```. The column "globals"
50 | contains the hexadecimal values of the global variables in an json format.
51 | The hexadecimal values are encoded in base 64. The locals are temporary stored in the table ```zdbgl_locals``` also encoded in base 64.
52 |
53 | #### Copy to test data containers (ECATT) ####
54 | The recorded values are temporary stored in base64-encoding (tables ```zdbgl_variables``` and ```zdbgl_locals```).
55 | The temporary storage has same disadvantages:
56 | 1. If the system encoding is changed, the records are unuseable.
57 | 2. hexadecimal values aren't human-friendly.
58 | 3. The tables aren't connected to the transport-system. With the next system-copy, they get lost.
59 |
60 | Test data containers (Transaction ```secatt```) don't come with these disadvantages. The idea was to copy the contents from the tables ```zdbgl_variables``` and ```zdbgl_locals``` to test data containers.
61 | With the debugger API we don't have access to the technical type of the variables. Because of this reason the test data container needs to be created with the necessary variables, before we can copy the contents from the tables ```zdbgl_variables``` and ```zdbgl_locals``` to it.
62 | As shown in the picture below, API access should be permitted for the test data container.
63 | 
64 |
65 | The rule for copying is name equivalence.
66 | The copy-API is located in class ```zdbgl_copy_to_tdc```. The report ```zdbgl_copy_globals_to_tdc``` copies global variables from table ```zdbgl_variables``` to the test data container (report ```zdbgl_copy_locals_to_tdc``` is for local variables).
67 |
68 | ### Writing unit-tests ###
69 | With the API in class ```cl_apl_ecatt_tdc_api``` we can access the recorded values, which we copied in the step above to the test data container. The recorded values before the procedure is executed
70 | can be used in the ```given``` section, the recorded values after the procedure is executed as expected results.
71 |
72 | ### Modification ###
73 | Now we can modify the source-code and use the unit-tests from the last step as regression tests.
74 |
75 | ## Example ##
76 | The example can be found in the program ```zdbgl_demo_regression_test```.
77 |
78 | The procedure ```to_verify```, which can be found in its original form in the following listing is the procedure under regression test.
79 | ```ABAP
80 | FORM to_verify.
81 | FIELD-SYMBOLS: TYPE sflight.
82 |
83 | APPEND INITIAL LINE TO demo_itab ASSIGNING .
84 | -carrid = 'LH'.
85 | -connid = '3444'.
86 | -price = 400.
87 |
88 | ENDFORM.
89 | ```
90 |
91 | The regression test should verify, that the above implementation is equal to the following implementation:
92 | ```ABAP
93 | FORM to_verify.
94 |
95 | INSERT VALUE #( carrid = 'LH' connid = '3444' price = 400 ) INTO TABLE demo_itab.
96 |
97 | ENDFORM.
98 | ```
99 |
100 | In the first step we record the globals (```demo_itab``` is a global variable) before the procedure ```to_verify``` is executed and after this procedure is executed with
101 | the debugger-script ```zdbgl_script_store_globals``` from this repository.
102 | The record before the procedure is executed get's the key "BEFORE" and the record after the procedure is executed get's the key "AFTER".
103 |
104 | In the second step we copy the recorded values to the test data container "ZDBGL_SAMPLE" with the report ```zdbgl_copy_globals_to_tdc``` as it can be seen in the pictures below.
105 | 
106 | 
107 | 
108 |
109 | In the third step we use the test data container "ZDBGL_SAMPLE" to write unit-tests:
110 | ```ABAP
111 | REPORT ZDBGL_DEMO_REGRESSION_TEST.
112 | DATA: demo_itab TYPE STANDARD TABLE OF sflight.
113 |
114 | START-OF-SELECTION.
115 | FIELD-SYMBOLS: TYPE sflight.
116 |
117 | APPEND INITIAL LINE TO demo_itab ASSIGNING .
118 | -carrid = 'LH'.
119 | -connid = '3445'.
120 | -price = 500.
121 | BREAK-POINT.
122 | PERFORM to_verify.
123 | BREAK-POINT.
124 |
125 |
126 | " subprogram should be verified.
127 | " It changes the global variable demo_itab.
128 | FORM to_verify.
129 | FIELD-SYMBOLS: TYPE sflight.
130 |
131 | APPEND INITIAL LINE TO demo_itab ASSIGNING .
132 | -carrid = 'LH'.
133 | -connid = '3444'.
134 | -price = 400.
135 |
136 | ENDFORM.
137 |
138 | CLASS regression_test DEFINITION FOR TESTING
139 | DURATION SHORT RISK LEVEL HARMLESS.
140 |
141 | PRIVATE SECTION.
142 | DATA: tdc_accessor TYPE REF TO cl_apl_ecatt_tdc_api.
143 |
144 | METHODS setup
145 | RAISING cx_static_check.
146 |
147 | METHODS verify_changed_itab FOR TESTING
148 | RAISING cx_static_check.
149 |
150 | ENDCLASS.
151 |
152 | CLASS regression_test IMPLEMENTATION.
153 |
154 | METHOD setup.
155 |
156 | tdc_accessor = cl_apl_ecatt_tdc_api=>get_instance( EXPORTING
157 | i_testdatacontainer = 'ZDBGL_SAMPLE' i_testdatacontainer_version = 1 ).
158 |
159 | ENDMETHOD.
160 |
161 | METHOD verify_changed_itab.
162 | DATA: exp_demo_itab LIKE demo_itab.
163 |
164 | " given: use the recorded values before the procedure under test was executed
165 | tdc_accessor->get_value( EXPORTING i_param_name = 'DEMO_ITAB' i_variant_name = 'BEFORE'
166 | CHANGING e_param_value = demo_itab ).
167 |
168 | " when: execute procedure under test
169 | PERFORM to_verify.
170 |
171 | " then: use the recorded values after the procedure under test was executed
172 | tdc_accessor->get_value( EXPORTING i_param_name = 'DEMO_ITAB' i_variant_name = 'AFTER'
173 | CHANGING e_param_value = exp_demo_itab ).
174 | cl_abap_unit_assert=>assert_equals( exp = exp_demo_itab
175 | act = demo_itab msg = 'Regression test not passed' ).
176 |
177 | ENDMETHOD.
178 |
179 | ENDCLASS.
180 | ```
181 |
182 | In the last step, we can modify the procedure ```to_verify``` and use the unit-test from above as verification.
183 |
184 | ### Recording locals ###
185 | Local variables are recorded with the debugger script ```zdbgl_script_store_locals```.
186 | It works the same way as recording globals.
187 | The API for locals is located in the class ```zdbgl_get_locals``` and the values are stored in table ```zdbgl_locals```.
188 |
189 | ## Restrictions ##
190 | These types are currently supported:
191 | * simple types (like characters, strings, integer)
192 | * flat structures (complex structures containing components with tables or structures are not supported)
193 | * tables with a flat structure or a simple type as the table line type
194 |
195 | These types are not supported:
196 | * all form of references
197 | * complex structures
198 | * tables with complex structures as the table line type or with tables as the table line type
199 |
200 |
201 | ## Installation ##
202 | Installation is done with [abapGit](https://github.com/larshp/abapgit). ABAP 7.40 or higher is needed.
203 | All ABAP-objects have the prefix ```zdbgl```.
204 |
205 | ## Logs ##
206 | Exceptions are logged in the checkpoint-groups "zdbgl_store_globals" and "zdbgl_store_locals" (see transaction ```saab```).
207 | Logging is only active, if the checkpoint-groups is activated.
208 |
--------------------------------------------------------------------------------
/img/copy_globals_after.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/germanysources/regression_test/52d55155714de45decba729ca270975af121471c/img/copy_globals_after.png
--------------------------------------------------------------------------------
/img/copy_globals_before.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/germanysources/regression_test/52d55155714de45decba729ca270975af121471c/img/copy_globals_before.png
--------------------------------------------------------------------------------
/img/load_script.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/germanysources/regression_test/52d55155714de45decba729ca270975af121471c/img/load_script.png
--------------------------------------------------------------------------------
/img/load_script1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/germanysources/regression_test/52d55155714de45decba729ca270975af121471c/img/load_script1.png
--------------------------------------------------------------------------------
/img/script_prompt_tdc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/germanysources/regression_test/52d55155714de45decba729ca270975af121471c/img/script_prompt_tdc.png
--------------------------------------------------------------------------------
/img/script_prompt_testcase.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/germanysources/regression_test/52d55155714de45decba729ca270975af121471c/img/script_prompt_testcase.png
--------------------------------------------------------------------------------
/img/tdc_permit_api_access.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/germanysources/regression_test/52d55155714de45decba729ca270975af121471c/img/tdc_permit_api_access.png
--------------------------------------------------------------------------------
/img/tdc_with_values.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/germanysources/regression_test/52d55155714de45decba729ca270975af121471c/img/tdc_with_values.png
--------------------------------------------------------------------------------
/img/update_snap.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/germanysources/regression_test/52d55155714de45decba729ca270975af121471c/img/update_snap.png
--------------------------------------------------------------------------------
/src/package.devc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Debugger Scripting
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/zcx_dbgl_copy_error.clas.abap:
--------------------------------------------------------------------------------
1 | class ZCX_DBGL_COPY_ERROR definition
2 | public
3 | inheriting from CX_STATIC_CHECK
4 | final
5 | create private .
6 |
7 | public section.
8 |
9 | methods CONSTRUCTOR
10 | importing
11 | !TEXTID like TEXTID optional
12 | !PREVIOUS like PREVIOUS optional .
13 | class-methods WRAP_FAILURE
14 | importing
15 | !FAILURE type ref to CX_STATIC_CHECK
16 | raising
17 | ZCX_DBGL_COPY_ERROR .
18 |
19 | methods IF_MESSAGE~GET_LONGTEXT
20 | redefinition .
21 | methods IF_MESSAGE~GET_TEXT
22 | redefinition .
23 | protected section.
24 | private section.
25 | ENDCLASS.
26 |
27 |
28 |
29 | CLASS ZCX_DBGL_COPY_ERROR IMPLEMENTATION.
30 |
31 |
32 | method CONSTRUCTOR.
33 | CALL METHOD SUPER->CONSTRUCTOR
34 | EXPORTING
35 | TEXTID = TEXTID
36 | PREVIOUS = PREVIOUS
37 | .
38 | endmethod.
39 |
40 |
41 | method IF_MESSAGE~GET_LONGTEXT.
42 |
43 | IF previous IS BOUND.
44 | result = previous->if_message~get_longtext( preserve_newlines ).
45 | ELSE.
46 | result = me->if_message~get_longtext( preserve_newlines ).
47 | ENDIF.
48 |
49 | endmethod.
50 |
51 |
52 | method IF_MESSAGE~GET_TEXT.
53 |
54 | IF previous IS BOUND.
55 | result = previous->if_message~get_text( ).
56 | ELSE.
57 | result = me->if_message~get_text( ).
58 | ENDIF.
59 |
60 | endmethod.
61 |
62 |
63 | method WRAP_FAILURE.
64 |
65 | RAISE EXCEPTION TYPE zcx_dbgl_copy_error
66 | EXPORTING
67 | previous = failure.
68 |
69 | endmethod.
70 | ENDCLASS.
71 |
--------------------------------------------------------------------------------
/src/zcx_dbgl_copy_error.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCX_DBGL_COPY_ERROR
7 | E
8 | Exceptions copy json-values to TDC
9 | 40
10 | 1
11 | X
12 | X
13 | X
14 |
15 |
16 |
17 | CONSTRUCTOR
18 | C
19 | CONSTRUCTOR
20 |
21 |
22 | CONSTRUCTOR
23 | E
24 | CONSTRUCTOR
25 |
26 |
27 | WRAP_FAILURE
28 | C
29 | wrapper for exceptions
30 |
31 |
32 | WRAP_FAILURE
33 | E
34 | wrapper for exceptions
35 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/src/zcx_dbgl_dictionary_access.clas.abap:
--------------------------------------------------------------------------------
1 | class ZCX_DBGL_DICTIONARY_ACCESS definition
2 | public
3 | inheriting from CX_STATIC_CHECK
4 | create public .
5 |
6 | public section.
7 |
8 | constants CLASS_INTF type SOTR_CONC value '0050569AC5931EDB92B727A8E6BD20DA' ##NO_TEXT.
9 |
10 | methods CONSTRUCTOR
11 | importing
12 | !TEXTID like TEXTID optional
13 | !PREVIOUS like PREVIOUS optional .
14 | protected section.
15 | private section.
16 | ENDCLASS.
17 |
18 |
19 |
20 | CLASS ZCX_DBGL_DICTIONARY_ACCESS IMPLEMENTATION.
21 |
22 |
23 | method CONSTRUCTOR.
24 | CALL METHOD SUPER->CONSTRUCTOR
25 | EXPORTING
26 | TEXTID = TEXTID
27 | PREVIOUS = PREVIOUS
28 | .
29 | endmethod.
30 | ENDCLASS.
31 |
--------------------------------------------------------------------------------
/src/zcx_dbgl_dictionary_access.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCX_DBGL_DICTIONARY_ACCESS
7 | E
8 | Exceptions Dictionary access
9 | 40
10 | 1
11 | X
12 | X
13 | X
14 |
15 |
16 | -
17 |
18 | 0050569AC5931EDB92B727A8E6BD20DA
19 | E
20 | 1
21 | CA==
22 |
23 |
24 |
25 | 0050569AC5931EDB92B727A8E6BD20DA
26 | E
27 | 0001
28 | X
29 | R
30 | 255
31 | References on classes, interfaces and data-objects are not supported.
32 |
33 |
34 |
35 |
36 |
37 |
38 | LIMU
39 |
40 | ZCX_DBGL_DICTIONARY_ACCESS
41 | 0050569AC5931EDB92B727A8E6BD20DA
42 | 0001
43 |
44 |
45 |
46 |
47 | CONSTRUCTOR
48 | C
49 | constructor
50 |
51 |
52 | CONSTRUCTOR
53 | E
54 | constructor
55 |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/src/zcx_dbgl_snapshot.clas.abap:
--------------------------------------------------------------------------------
1 | class ZCX_DBGL_SNAPSHOT definition
2 | public
3 | inheriting from CX_STATIC_CHECK
4 | create public .
5 |
6 | public section.
7 |
8 | interfaces IF_T100_MESSAGE .
9 |
10 | methods CONSTRUCTOR
11 | importing
12 | !TEXTID like IF_T100_MESSAGE=>T100KEY optional
13 | !PREVIOUS like PREVIOUS optional .
14 | protected section.
15 | private section.
16 | ENDCLASS.
17 |
18 |
19 |
20 | CLASS ZCX_DBGL_SNAPSHOT IMPLEMENTATION.
21 |
22 |
23 | method CONSTRUCTOR.
24 | CALL METHOD SUPER->CONSTRUCTOR
25 | EXPORTING
26 | PREVIOUS = PREVIOUS
27 | .
28 | clear me->textid.
29 | if textid is initial.
30 | IF_T100_MESSAGE~T100KEY = IF_T100_MESSAGE=>DEFAULT_TEXTID.
31 | else.
32 | IF_T100_MESSAGE~T100KEY = TEXTID.
33 | endif.
34 | endmethod.
35 | ENDCLASS.
36 |
--------------------------------------------------------------------------------
/src/zcx_dbgl_snapshot.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCX_DBGL_SNAPSHOT
7 | E
8 | Snapshots
9 | 40
10 | 1
11 | X
12 | X
13 | X
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/zcx_dbgl_snapshot_tdc.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcx_dbgl_snapshot_tdc DEFINITION
2 | PUBLIC
3 | INHERITING FROM zcx_dbgl_snapshot
4 | FINAL
5 | CREATE PUBLIC .
6 |
7 | PUBLIC SECTION.
8 |
9 | METHODS constructor
10 | IMPORTING
11 | !textid LIKE if_t100_message=>t100key OPTIONAL
12 | !previous LIKE previous OPTIONAL .
13 | METHODS if_message~get_longtext
14 | REDEFINITION .
15 | METHODS if_message~get_text
16 | REDEFINITION .
17 | CLASS-METHODS wrap
18 | IMPORTING
19 | previous TYPE REF TO cx_static_check
20 | RAISING
21 | zcx_dbgl_snapshot_tdc.
22 | protected section.
23 | private section.
24 | ENDCLASS.
25 |
26 |
27 |
28 | CLASS ZCX_DBGL_SNAPSHOT_TDC IMPLEMENTATION.
29 |
30 |
31 | method CONSTRUCTOR.
32 | CALL METHOD SUPER->CONSTRUCTOR
33 | EXPORTING
34 | PREVIOUS = PREVIOUS
35 | .
36 | clear me->textid.
37 | if textid is initial.
38 | IF_T100_MESSAGE~T100KEY = IF_T100_MESSAGE=>DEFAULT_TEXTID.
39 | else.
40 | IF_T100_MESSAGE~T100KEY = TEXTID.
41 | endif.
42 | endmethod.
43 |
44 |
45 | METHOD if_message~get_longtext.
46 |
47 | IF previous IS BOUND.
48 | result = previous->if_message~get_longtext( preserve_newlines ).
49 | ELSE.
50 | result = super->if_message~get_longtext( preserve_newlines ).
51 | ENDIF.
52 |
53 | ENDMETHOD.
54 |
55 |
56 | METHOD if_message~get_text.
57 |
58 | IF previous IS BOUND.
59 | result = previous->if_message~get_text( ).
60 | ELSE.
61 | result = super->if_message~get_text( ).
62 | ENDIF.
63 |
64 | ENDMETHOD.
65 |
66 |
67 | METHOD wrap.
68 |
69 | RAISE EXCEPTION TYPE zcx_dbgl_snapshot_tdc
70 | EXPORTING
71 | previous = previous.
72 |
73 | ENDMETHOD.
74 | ENDCLASS.
75 |
--------------------------------------------------------------------------------
/src/zcx_dbgl_snapshot_tdc.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCX_DBGL_SNAPSHOT_TDC
7 | E
8 | Snapshots TDC
9 | 40
10 | 1
11 | X
12 | X
13 | X
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/zcx_dbgl_testcase.clas.abap:
--------------------------------------------------------------------------------
1 | class ZCX_DBGL_TESTCASE definition
2 | public
3 | inheriting from CX_STATIC_CHECK
4 | create public .
5 |
6 | public section.
7 |
8 | constants DUPLICATE_TESTCASE type SOTR_CONC value '005056914D751EE99886C50523FD3A6D' ##NO_TEXT.
9 | constants VARIABLE_NOT_FOUND type SOTR_CONC value '005056914D751EE99887164588613A6D' ##NO_TEXT.
10 | constants TESTCASE_NOT_FOUND type SOTR_CONC value '005056914D751EE99887164588615A6D' ##NO_TEXT.
11 | constants TABLE_LINE_TYPE_NOT_SUPPORTED type SOTR_CONC value '005056914D751EE99887164588617A6D' ##NO_TEXT.
12 | constants NO_FUNCTION_MODULE type SOTR_CONC value '0050569AC5931EDA90D4F3A3D7E900D9' ##NO_TEXT.
13 | data KEY_TESTCASE type ZDBGL_KEY_TESTCASES .
14 | data PROGRAM type PROGRAM .
15 | data VARIABLE type STRING .
16 | data LINETYPE type ABAP_TYPEKIND .
17 |
18 | methods CONSTRUCTOR
19 | importing
20 | !TEXTID like TEXTID optional
21 | !PREVIOUS like PREVIOUS optional
22 | !KEY_TESTCASE type ZDBGL_KEY_TESTCASES optional
23 | !PROGRAM type PROGRAM optional
24 | !VARIABLE type STRING optional
25 | !LINETYPE type ABAP_TYPEKIND optional .
26 | protected section.
27 | private section.
28 | ENDCLASS.
29 |
30 |
31 |
32 | CLASS ZCX_DBGL_TESTCASE IMPLEMENTATION.
33 |
34 |
35 | method CONSTRUCTOR.
36 | CALL METHOD SUPER->CONSTRUCTOR
37 | EXPORTING
38 | TEXTID = TEXTID
39 | PREVIOUS = PREVIOUS
40 | .
41 | me->KEY_TESTCASE = KEY_TESTCASE .
42 | me->PROGRAM = PROGRAM .
43 | me->VARIABLE = VARIABLE .
44 | me->LINETYPE = LINETYPE .
45 | endmethod.
46 | ENDCLASS.
47 |
--------------------------------------------------------------------------------
/src/zcx_dbgl_testcase.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCX_DBGL_TESTCASE
7 | E
8 | Testcase Failures
9 | 40
10 | 1
11 | X
12 | X
13 | X
14 |
15 |
16 | -
17 |
18 | 005056914D751EE99886C50523FD3A6D
19 | E
20 | 1
21 | CA==
22 |
23 |
24 |
25 | 005056914D751EE99886C50523FD3A6D
26 | E
27 | 0001
28 | X
29 | R
30 | 255
31 | Testcase &KEY_TESTCASE& already exists. To overwrite use force option.
32 |
33 |
34 |
35 | -
36 |
37 | 005056914D751EE99887164588613A6D
38 | E
39 | 1
40 | CA==
41 |
42 |
43 |
44 | 005056914D751EE99887164588613A6D
45 | E
46 | 0001
47 | X
48 | R
49 | 255
50 | Variable &VARIABLE& in program &PROGRAM& not found.
51 |
52 |
53 |
54 | -
55 |
56 | 005056914D751EE99887164588615A6D
57 | E
58 | 1
59 | CA==
60 |
61 |
62 |
63 | 005056914D751EE99887164588615A6D
64 | E
65 | 0001
66 | X
67 | R
68 | 255
69 | Testcase &KEY_TESTCASE& for program &PROGRAM& doesn't exists.
70 |
71 |
72 |
73 | -
74 |
75 | 005056914D751EE99887164588617A6D
76 | E
77 | 1
78 | CA==
79 |
80 |
81 |
82 | 005056914D751EE99887164588617A6D
83 | E
84 | 0001
85 | X
86 | R
87 | 255
88 | Linetype &LINETYPE& isn't supported.
89 |
90 |
91 |
92 | -
93 |
94 | 0050569AC5931EDA90D4F3A3D7E900D9
95 | E
96 | 1
97 | CA==
98 |
99 |
100 |
101 | 0050569AC5931EDA90D4F3A3D7E900D9
102 | E
103 | 0001
104 | X
105 | R
106 | 255
107 | Signature values can only be recorded for function modules.
108 |
109 |
110 |
111 |
112 |
113 |
114 | LIMU
115 |
116 | ZCX_DBGL_TESTCASE
117 | 005056914D751EE99886C50523FD3A6D
118 | 0001
119 |
120 |
121 | LIMU
122 |
123 | ZCX_DBGL_TESTCASE
124 | 005056914D751EE99887164588613A6D
125 | 0001
126 |
127 |
128 | LIMU
129 |
130 | ZCX_DBGL_TESTCASE
131 | 005056914D751EE99887164588615A6D
132 | 0001
133 |
134 |
135 | LIMU
136 |
137 | ZCX_DBGL_TESTCASE
138 | 005056914D751EE99887164588617A6D
139 | 0001
140 |
141 |
142 | LIMU
143 |
144 | ZCX_DBGL_TESTCASE
145 | 0050569AC5931EDA90D4F3A3D7E900D9
146 | 0001
147 |
148 |
149 |
150 |
151 | CONSTRUCTOR
152 | C
153 | constructor
154 |
155 |
156 | CONSTRUCTOR
157 | E
158 | constructor
159 |
160 |
161 |
162 |
163 |
164 |
--------------------------------------------------------------------------------
/src/zcx_dbgl_type_not_supported.clas.abap:
--------------------------------------------------------------------------------
1 | class ZCX_DBGL_TYPE_NOT_SUPPORTED definition
2 | public
3 | inheriting from CX_STATIC_CHECK
4 | final
5 | create public .
6 |
7 | public section.
8 |
9 | constants ZCX_DBGL_TYPE_NOT_SUPPORTED type SOTR_CONC value '005056914D751EE9B7D4371EF906A7FD' ##NO_TEXT.
10 | data TYPE type STRING .
11 |
12 | methods CONSTRUCTOR
13 | importing
14 | !TEXTID like TEXTID optional
15 | !PREVIOUS like PREVIOUS optional
16 | !TYPE type STRING .
17 | protected section.
18 | private section.
19 | ENDCLASS.
20 |
21 |
22 |
23 | CLASS ZCX_DBGL_TYPE_NOT_SUPPORTED IMPLEMENTATION.
24 |
25 |
26 | method CONSTRUCTOR.
27 | CALL METHOD SUPER->CONSTRUCTOR
28 | EXPORTING
29 | TEXTID = TEXTID
30 | PREVIOUS = PREVIOUS
31 | .
32 | IF textid IS INITIAL.
33 | me->textid = ZCX_DBGL_TYPE_NOT_SUPPORTED .
34 | ENDIF.
35 | me->TYPE = TYPE .
36 | endmethod.
37 | ENDCLASS.
38 |
--------------------------------------------------------------------------------
/src/zcx_dbgl_type_not_supported.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCX_DBGL_TYPE_NOT_SUPPORTED
7 | E
8 | Type of variable not supported
9 | 40
10 | 1
11 | X
12 | X
13 | X
14 |
15 |
16 | -
17 |
18 | 005056914D751EE9B7D4371EF906A7FD
19 | E
20 | 1
21 | CA==
22 |
23 |
24 |
25 | 005056914D751EE9B7D4371EF906A7FD
26 | E
27 | 0001
28 | X
29 | R
30 | 255
31 | The type &TYPE& is not supported.
32 |
33 |
34 |
35 |
36 |
37 |
38 | LIMU
39 |
40 | ZCX_DBGL_TYPE_NOT_SUPPORTED
41 | 005056914D751EE9B7D4371EF906A7FD
42 | 0001
43 |
44 |
45 |
46 |
47 | CONSTRUCTOR
48 | C
49 | CONSTRUCTOR
50 |
51 |
52 | CONSTRUCTOR
53 | E
54 | CONSTRUCTOR
55 |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/src/zdbgl.msag.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL
7 | E
8 | Regression tests
9 |
10 |
11 |
12 | E
13 | ZDBGL
14 | 000
15 | Recorded variables:
16 |
17 |
18 | E
19 | ZDBGL
20 | 001
21 | Testdatacontainer doesn't contains any variable used in this program.
22 |
23 |
24 |
25 | C
26 |
27 |
28 |
29 | C
30 | ZDBGL
31 | Regression tests
32 |
33 |
34 |
35 | -
36 | C
37 | 000
38 | Recorded variables:
39 |
40 | -
41 | C
42 | 001
43 | Testdatacontainer doesn't contains any variable used in this program.
44 |
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/src/zdbgl_abstract_storage.clas.abap:
--------------------------------------------------------------------------------
1 | class ZDBGL_ABSTRACT_STORAGE definition
2 | public
3 | abstract
4 | create public .
5 |
6 | public section.
7 |
8 | methods CONCAT_JSON_FRAGMENTS_STRING
9 | returning
10 | value(JSON_AS_STRING) type STRING .
11 | methods HANDLE
12 | abstract
13 | raising
14 | CX_TPDA .
15 | methods LOG_RECORD
16 | importing
17 | program type progname.
18 | protected section.
19 |
20 | constants:
21 | QUOTE(1) value '"' ##NO_TEXT.
22 | constants:
23 | COLON(1) value ':' ##NO_TEXT.
24 | constants:
25 | COMMA(1) value ',' ##NO_TEXT.
26 | data:
27 | JSON_FRAGMENTS type standard table of STRING .
28 |
29 | methods HANDLE_TAB
30 | importing
31 | !IS_OBJECT type ABAP_BOOL
32 | !NAME type STRING
33 | !DESCR type ref to CL_TPDA_SCRIPT_DATA_DESCR
34 | returning
35 | value(FRAGMENT) type STRING
36 | raising
37 | CX_TPDA
38 | ZCX_DBGL_TYPE_NOT_SUPPORTED .
39 | methods HANDLE_OBJECT
40 | importing
41 | !NAME type STRING
42 | !DESCR type ref to CL_TPDA_SCRIPT_DATA_DESCR
43 | raising
44 | CX_TPDA
45 | ZCX_DBGL_TYPE_NOT_SUPPORTED .
46 | methods HANDLE_OBJREF
47 | importing
48 | !NAME type STRING
49 | raising
50 | CX_TPDA
51 | ZCX_DBGL_TYPE_NOT_SUPPORTED .
52 | methods HANDLE_STRING
53 | importing
54 | !IS_OBJECT type ABAP_BOOL
55 | !NAME type STRING
56 | !DESCR type ref to CL_TPDA_SCRIPT_DATA_DESCR
57 | returning
58 | value(FRAGMENT) type STRING
59 | raising
60 | CX_TPDA .
61 | methods HANDLE_SIMPLE
62 | importing
63 | !IS_OBJECT type ABAP_BOOL
64 | !NAME type STRING
65 | !DESCR type ref to CL_TPDA_SCRIPT_DATA_DESCR
66 | returning
67 | value(FRAGMENT) type STRING
68 | raising
69 | CX_TPDA .
70 | methods HANDLE_STRUCT
71 | importing
72 | !IS_OBJECT type ABAP_BOOL
73 | !NAME type STRING
74 | !DESCR type ref to CL_TPDA_SCRIPT_DATA_DESCR
75 | returning
76 | value(FRAGMENT) type STRING
77 | raising
78 | CX_TPDA
79 | ZCX_DBGL_TYPE_NOT_SUPPORTED .
80 | methods HANDLE_DATAREF
81 | importing
82 | !NAME type STRING
83 | !DESCR type ref to CL_TPDA_SCRIPT_DATA_DESCR
84 | raising
85 | CX_TPDA
86 | ZCX_DBGL_TYPE_NOT_SUPPORTED .
87 | methods _HANDLE
88 | importing
89 | !NAME type STRING
90 | !IS_OBJECT type ABAP_BOOL
91 | returning
92 | value(FRAGMENT) type STRING
93 | raising
94 | CX_TPDA
95 | ZCX_DBGL_TYPE_NOT_SUPPORTED .
96 | private section.
97 | ENDCLASS.
98 |
99 |
100 |
101 | CLASS ZDBGL_ABSTRACT_STORAGE IMPLEMENTATION.
102 |
103 |
104 | METHOD concat_json_fragments_string.
105 |
106 | json_as_string = '{'.
107 | LOOP AT json_fragments ASSIGNING FIELD-SYMBOL().
108 |
109 | IF sy-tabix = 1.
110 | json_as_string = json_as_string && .
111 | ELSE.
112 | json_as_string = json_as_string && comma
113 | && .
114 | ENDIF.
115 |
116 | ENDLOOP.
117 | json_as_string = json_as_string && '}'.
118 |
119 | ENDMETHOD.
120 |
121 |
122 | method HANDLE_DATAREF.
123 |
124 | RAISE EXCEPTION TYPE zcx_dbgl_type_not_supported
125 | EXPORTING
126 | type = 'DATAREF'.
127 |
128 | endmethod.
129 |
130 |
131 | method HANDLE_OBJECT.
132 |
133 | RAISE EXCEPTION TYPE zcx_dbgl_type_not_supported
134 | EXPORTING
135 | type = 'OBJECT'.
136 |
137 | endmethod.
138 |
139 |
140 | method HANDLE_OBJREF.
141 |
142 | RAISE EXCEPTION TYPE zcx_dbgl_type_not_supported
143 | EXPORTING
144 | type = 'OBJECTREF'.
145 |
146 | endmethod.
147 |
148 |
149 | method HANDLE_SIMPLE.
150 | data_serialize_hex_format cl_tpda_script_elemdescr.
151 | serialize_hex_format.
152 | endmethod.
153 |
154 |
155 | method HANDLE_STRING.
156 | data_serialize_hex_format cl_tpda_script_stringdescr.
157 | serialize_hex_format.
158 | endmethod.
159 |
160 |
161 | method HANDLE_STRUCT.
162 |
163 | DATA(struct_descr) = CAST cl_tpda_script_structdescr( descr ).
164 | struct_descr->components( IMPORTING p_components_it = DATA(components) ).
165 |
166 | IF is_object = abap_true.
167 | fragment = quote && name && quote && colon.
168 | ENDIF.
169 | fragment = fragment && '{'.
170 | LOOP AT components REFERENCE INTO DATA(component).
171 |
172 | DATA(tabix) = sy-tabix.
173 | fragment = fragment && quote && component->*-compname && quote && colon &&
174 | _handle( name = |{ name }-{ component->*-compname }| is_object = abap_false ).
175 | IF tabix < lines( components ).
176 | fragment = fragment && comma.
177 | ENDIF.
178 |
179 | ENDLOOP.
180 | fragment = fragment && '}'.
181 |
182 | endmethod.
183 |
184 |
185 | method HANDLE_TAB.
186 | DATA: tab_fragments TYPE STANDARD TABLE OF string,
187 | table TYPE REF TO cl_tpda_script_tabledescr,
188 | name_line TYPE string,
189 | len TYPE i.
190 | FIELD-SYMBOLS: TYPE string.
191 |
192 | table ?= descr.
193 | DO table->linecnt( ) TIMES.
194 | name_line = |{ name }[{ sy-index }]|.
195 | " if _handle( name_line ) is an json object or an json table
196 | " it is enclosed in brackets
197 | APPEND _handle( name = name_line is_object = abap_false )
198 | TO tab_fragments.
199 | ENDDO.
200 |
201 | fragment = '['.
202 | LOOP AT tab_fragments ASSIGNING .
203 | fragment = fragment && .
204 | IF sy-tabix < lines( tab_fragments ).
205 | fragment = fragment && comma.
206 | ENDIF.
207 | ENDLOOP.
208 | fragment = fragment && ']'.
209 |
210 | IF is_object = abap_true.
211 | fragment = quote && name && quote && colon && fragment.
212 | ENDIF.
213 |
214 | endmethod.
215 |
216 |
217 | method LOG_RECORD.
218 |
219 | LOG-POINT ID zdbgl_store_globals SUBKEY program
220 | FIELDS json_fragments.
221 |
222 | endmethod.
223 |
224 |
225 | method _HANDLE.
226 | DATA: descr TYPE REF TO cl_tpda_script_data_descr,
227 | info TYPE tpda_scr_quick_info.
228 |
229 | descr = cl_tpda_script_data_descr=>factory( name ).
230 | info = cl_tpda_script_data_descr=>get_quick_info( name ).
231 |
232 | CASE info-metatype.
233 | WHEN cl_tpda_script_data_descr=>mt_simple.
234 | fragment = handle_simple( name = name is_object = is_object
235 | descr = descr ).
236 | WHEN cl_tpda_script_data_descr=>mt_struct.
237 | fragment = handle_struct( name = name is_object = is_object
238 | descr = descr ).
239 | WHEN cl_tpda_script_data_descr=>mt_string.
240 | fragment = handle_string( name = name is_object = is_object
241 | descr = descr ).
242 | WHEN cl_tpda_script_data_descr=>mt_tab.
243 | fragment = handle_tab( name = name is_object = is_object
244 | descr = descr ).
245 | WHEN cl_tpda_script_data_descr=>mt_datref.
246 | handle_dataref( name = name
247 | descr = descr ).
248 | WHEN cl_tpda_script_data_descr=>mt_object.
249 | handle_object( name = name
250 | descr = descr ).
251 | WHEN cl_tpda_script_data_descr=>mt_objref.
252 | handle_objref( name ).
253 | WHEN OTHERS.
254 | ASSERT FIELDS 'unknown type' CONDITION 1 = 0.
255 | ENDCASE.
256 |
257 | endmethod.
258 | ENDCLASS.
259 |
--------------------------------------------------------------------------------
/src/zdbgl_abstract_storage.clas.locals_imp.abap:
--------------------------------------------------------------------------------
1 | DEFINE data_serialize_hex_format.
2 | * Data definition for serialize in hex format.
3 | * &1 class CL_TPDA_SCRIPT_STRINGDESCR, CL_TPDA_SCRIPT_ELEMDESCR, CL_TPDA_SCRIPT_STRUCTDESCR
4 |
5 | DATA: value TYPE string,
6 | element TYPE REF TO &1.
7 |
8 | END-OF-DEFINITION.
9 |
10 | DEFINE serialize_hex_format.
11 |
12 | element ?= descr.
13 | value = cl_http_utility=>encode_x_base64( element->hexvalue( ) ).
14 | " Add only the hexadecimal value to the json string
15 | IF is_object = abap_true.
16 | fragment = quote && name && quote && colon && quote && value
17 | && quote.
18 | ELSE.
19 | fragment = quote && value && quote.
20 | ENDIF.
21 |
22 | END-OF-DEFINITION.
23 |
--------------------------------------------------------------------------------
/src/zdbgl_abstract_storage.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_ABSTRACT_STORAGE
7 | E
8 | Storage for Local and global variables
9 | 1
10 | X
11 | X
12 | X
13 |
14 |
15 |
16 | CONCAT_JSON_FRAGMENTS_STRING
17 | C
18 | concatenate json fragments to a single string
19 |
20 |
21 | CONCAT_JSON_FRAGMENTS_STRING
22 | E
23 | concatenate json fragments to a single string
24 |
25 |
26 | HANDLE
27 | C
28 | handle debugger values
29 |
30 |
31 | HANDLE
32 | E
33 | handle debugger values
34 |
35 |
36 | HANDLE_DATAREF
37 | C
38 | parse data reference
39 |
40 |
41 | HANDLE_DATAREF
42 | E
43 | parse data reference
44 |
45 |
46 | HANDLE_OBJECT
47 | C
48 | parse object
49 |
50 |
51 | HANDLE_OBJECT
52 | E
53 | parse object
54 |
55 |
56 | HANDLE_OBJREF
57 | C
58 | parse object reference
59 |
60 |
61 | HANDLE_OBJREF
62 | E
63 | parse object reference
64 |
65 |
66 | HANDLE_SIMPLE
67 | C
68 | parse simple type(character, numeric value)
69 |
70 |
71 | HANDLE_SIMPLE
72 | E
73 | parse simple type(character, numeric value)
74 |
75 |
76 | HANDLE_STRING
77 | C
78 | parse string
79 |
80 |
81 | HANDLE_STRING
82 | E
83 | parse string
84 |
85 |
86 | HANDLE_STRUCT
87 | C
88 | parse structure
89 |
90 |
91 | HANDLE_STRUCT
92 | E
93 | parse structure
94 |
95 |
96 | HANDLE_TAB
97 | C
98 | parse internal table
99 |
100 |
101 | HANDLE_TAB
102 | E
103 | parse internal table
104 |
105 |
106 | LOG_RECORD
107 | C
108 | logs the recorded values
109 |
110 |
111 | LOG_RECORD
112 | E
113 | logs the recorded values
114 |
115 |
116 | _HANDLE
117 | C
118 | parse values
119 |
120 |
121 | _HANDLE
122 | E
123 | parse values
124 |
125 |
126 |
127 |
128 |
129 |
--------------------------------------------------------------------------------
/src/zdbgl_copy_globals_to_tdc.prog.abap:
--------------------------------------------------------------------------------
1 | *&---------------------------------------------------------------------*
2 | *& Report ZDBGL_COPY_GLOBALS_TO_TDC
3 | *&
4 | *&---------------------------------------------------------------------*
5 | *&
6 | *&
7 | *&---------------------------------------------------------------------*
8 | REPORT ZDBGL_COPY_GLOBALS_TO_TDC.
9 |
10 | PARAMETERS: program TYPE progname,
11 | key_tc TYPE zdbgl_key_testcases,
12 | tdc TYPE etobj_name,
13 | version TYPE etobj_ver,
14 | variant TYPE etvar_id.
15 |
16 | START-OF-SELECTION.
17 |
18 | TRY.
19 | DATA(base64_storage) = zdbgl_get_globals=>factory(
20 | key_testcase = key_tc program = program
21 | ).
22 | DATA(tdc_manager) = NEW zdbgl_copy_to_tdc( tdc = tdc
23 | tdc_version = version ).
24 | tdc_manager->copy_all_parameter( variant = variant
25 | recorded_variables = base64_storage ).
26 | tdc_manager->save( ).
27 | MESSAGE text-sav TYPE 'S'.
28 |
29 | CATCH zcx_dbgl_testcase INTO DATA(failure).
30 | MESSAGE failure TYPE 'S' DISPLAY LIKE 'E'.
31 | CATCH zcx_dbgl_copy_error INTO DATA(copy_failure).
32 | MESSAGE copy_failure TYPE 'S' DISPLAY LIKE 'E'.
33 | ENDTRY.
34 |
--------------------------------------------------------------------------------
/src/zdbgl_copy_globals_to_tdc.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_COPY_GLOBALS_TO_TDC
7 | 1
8 | E
9 | X
10 | X
11 |
12 |
13 | -
14 | R
15 | Copy globals to test data container
16 | 35
17 |
18 |
19 |
20 | -
21 | C
22 |
23 |
-
24 | R
25 | Copy globals to test data container
26 | 35
27 |
28 |
29 |
30 | -
31 | D
32 |
33 |
-
34 | R
35 | Kopie Globale Variablen in Testdatencontainer
36 | 45
37 |
38 | -
39 | S
40 | KEY_TC
41 | .
42 | 21
43 | D
44 |
45 | -
46 | S
47 | PROGRAM
48 | .
49 | 20
50 | D
51 |
52 | -
53 | S
54 | TDC
55 | Testdatencontainer (TDC)
56 | 32
57 |
58 | -
59 | S
60 | VARIANT
61 | Variante (TDC)
62 | 22
63 |
64 | -
65 | S
66 | VERSION
67 | Version (TDC)
68 | 21
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/src/zdbgl_copy_locals_to_tdc.prog.abap:
--------------------------------------------------------------------------------
1 | *&---------------------------------------------------------------------*
2 | *& Report ZDBGL_COPY_TO_TDC
3 | *&
4 | *&---------------------------------------------------------------------*
5 | REPORT ZDBGL_COPY_LOCALS_TO_TDC.
6 |
7 | PARAMETERS: program TYPE tpda_program,
8 | include TYPE tpda_include,
9 | line TYPE tpda_sc_line,
10 | key_tc TYPE zdbgl_key_testcases,
11 | tdc TYPE etobj_name,
12 | version TYPE etobj_ver,
13 | variant TYPE etvar_id.
14 |
15 | START-OF-SELECTION.
16 |
17 | TRY.
18 | DATA(base64_storage) = zdbgl_get_locals=>factory(
19 | key_testcase = key_tc source_position = VALUE #(
20 | abap_program = program include = include line = line
21 | ) ).
22 | DATA(tdc_manager) = NEW zdbgl_copy_to_tdc( tdc = tdc
23 | tdc_version = version ).
24 | tdc_manager->copy_all_parameter( variant = variant
25 | recorded_variables = base64_storage ).
26 | MESSAGE text-sav TYPE 'S'.
27 |
28 | CATCH zcx_dbgl_testcase INTO DATA(failure).
29 | MESSAGE failure TYPE 'S' DISPLAY LIKE 'E'.
30 | CATCH zcx_dbgl_copy_error INTO DATA(copy_failure).
31 | MESSAGE copy_failure TYPE 'S' DISPLAY LIKE 'E'.
32 | ENDTRY.
33 |
--------------------------------------------------------------------------------
/src/zdbgl_copy_locals_to_tdc.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_COPY_LOCALS_TO_TDC
7 | 1
8 | E
9 | X
10 | X
11 |
12 |
13 | -
14 | R
15 | Copy locals to test data container
16 | 34
17 |
18 |
19 |
20 | -
21 | C
22 |
23 |
-
24 | R
25 | Copy locals to test data container
26 | 34
27 |
28 |
29 |
30 | -
31 | D
32 |
33 |
-
34 | I
35 | SAV
36 | Kopie durchgeführt
37 | 28
38 |
39 | -
40 | R
41 | Kopie aufgezeichnete Variablen in Testdatencontainer
42 | 52
43 |
44 | -
45 | S
46 | INCLUDE
47 | .
48 | 15
49 | D
50 |
51 | -
52 | S
53 | KEY_TC
54 | .
55 | 21
56 | D
57 |
58 | -
59 | S
60 | LINE
61 | .
62 | 20
63 | D
64 |
65 | -
66 | S
67 | PROGRAM
68 | .
69 | 16
70 | D
71 |
72 | -
73 | S
74 | TDC
75 | Testdatencontainer (TDC)
76 | 32
77 |
78 | -
79 | S
80 | VARIANT
81 | .
82 | 16
83 | D
84 |
85 | -
86 | S
87 | VERSION
88 | Version TDC
89 | 19
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
--------------------------------------------------------------------------------
/src/zdbgl_copy_to_tdc.clas.abap:
--------------------------------------------------------------------------------
1 | class ZDBGL_COPY_TO_TDC definition
2 | public
3 | final
4 | create public .
5 |
6 | public section.
7 |
8 | methods CONSTRUCTOR
9 | importing
10 | !TDC type ETOBJ_NAME
11 | !TDC_VERSION type ETOBJ_VER
12 | raising
13 | ZCX_DBGL_COPY_ERROR .
14 | methods COPY_ALL_PARAMETER
15 | importing
16 | !VARIANT type ETVAR_ID
17 | !RECORDED_VARIABLES type ref to ZDBGL_GETTER
18 | raising
19 | ZCX_DBGL_COPY_ERROR
20 | ZCX_DBGL_TYPE_NOT_SUPPORTED .
21 | methods SAVE
22 | importing
23 | !TRANSPORT_ORDER type E070-TRKORR optional
24 | !EXECUTE_COMMIT type ABAP_BOOL default ABAP_TRUE
25 | raising
26 | ZCX_DBGL_COPY_ERROR .
27 | class-methods COPY_FROM_DEBUGGER
28 | importing
29 | !TDC_VARIANT_KEY type ZDBGL_TDC_VARIANT_KEY
30 | !PROGRAM type PROGNAME
31 | !DEBUGGER_PARSER type ref to ZDBGL_ABSTRACT_STORAGE
32 | appl_log TYPE REF TO zif_logger
33 | raising
34 | CX_STATIC_CHECK .
35 | protected section.
36 | private section.
37 |
38 | constants TABLE_PATTERN type STRING value 'STANDARD TABLE OF *' ##NO_TEXT.
39 | data TDC type ref to CL_APL_ECATT_TDC_API .
40 |
41 | methods COPY_ALL_PARAMETER_SKIP_UN
42 | importing
43 | !VARIANT type ETVAR_ID
44 | !RECORDED_VARIABLES type ref to ZDBGL_GETTER
45 | appl_log TYPE REF TO zif_logger
46 | raising
47 | ZCX_DBGL_COPY_ERROR
48 | ZCX_DBGL_TYPE_NOT_SUPPORTED .
49 | methods CREATE_PARAMETER_INSTANCE
50 | importing
51 | !NAME type ETP_NAME
52 | returning
53 | value(RESULT) type ref to DATA
54 | raising
55 | CX_ECATT_TDC_ACCESS .
56 | methods TYPEOF_PARAMETER
57 | importing
58 | !PARAM_VALUE type ref to DATA
59 | returning
60 | value(CATEGORY) type ABAP_TYPECATEGORY
61 | raising
62 | CX_ECATT_TDC_ACCESS .
63 | methods CREATE_VARIANT_IF_NOT_EXISTS
64 | importing
65 | !VARIANT type ETVAR_ID
66 | raising
67 | CX_ECATT_TDC_ACCESS .
68 | ENDCLASS.
69 |
70 |
71 |
72 | CLASS ZDBGL_COPY_TO_TDC IMPLEMENTATION.
73 |
74 |
75 | METHOD constructor.
76 |
77 | TRY.
78 | me->tdc = cl_apl_ecatt_tdc_api=>get_instance( i_testdatacontainer = tdc
79 | i_write_access = abap_true i_testdatacontainer_version = tdc_version ).
80 |
81 | CATCH cx_ecatt_tdc_access INTO DATA(ecatt_failure).
82 | zcx_dbgl_copy_error=>wrap_failure( ecatt_failure ).
83 | ENDTRY.
84 |
85 | ENDMETHOD.
86 |
87 |
88 | method COPY_ALL_PARAMETER.
89 | DATA: param_value TYPE REF TO data.
90 | FIELD-SYMBOLS: TYPE any.
91 |
92 | TRY.
93 | create_variant_if_not_exists( variant ).
94 |
95 | LOOP AT tdc->get_param_list( ) REFERENCE INTO DATA(parameter).
96 |
97 | param_value = create_parameter_instance( parameter->* ).
98 | ASSIGN param_value->* TO .
99 | CASE typeof_parameter( param_value ).
100 | WHEN cl_abap_datadescr=>kind_elem.
101 | recorded_variables->get_simple(
102 | EXPORTING name = conv string( parameter->* )
103 | IMPORTING value = ).
104 | WHEN cl_abap_datadescr=>kind_struct.
105 | recorded_variables->get_structur(
106 | EXPORTING name = conv string( parameter->* )
107 | IMPORTING value = ).
108 | WHEN cl_abap_datadescr=>kind_table.
109 | recorded_variables->get_table(
110 | EXPORTING name = conv string( parameter->* )
111 | IMPORTING value = ).
112 | ENDCASE.
113 | tdc->set_value_ref( EXPORTING i_param_name = parameter->*
114 | i_variant_name = variant i_param_ref = param_value ).
115 |
116 | ENDLOOP.
117 |
118 | CATCH cx_ecatt_tdc_access INTO DATA(ecatt_failure).
119 | zcx_dbgl_copy_error=>wrap_failure( ecatt_failure ).
120 | CATCH zcx_dbgl_testcase INTO DATA(recording_failure).
121 | zcx_dbgl_copy_error=>wrap_failure( recording_failure ).
122 | ENDTRY.
123 |
124 | endmethod.
125 |
126 |
127 | METHOD copy_all_parameter_skip_un.
128 | DATA: param_value TYPE REF TO data.
129 | FIELD-SYMBOLS: TYPE any.
130 |
131 | TRY.
132 | create_variant_if_not_exists( variant ).
133 |
134 | LOOP AT tdc->get_param_list( ) REFERENCE INTO DATA(parameter).
135 |
136 | TRY.
137 | param_value = create_parameter_instance( parameter->* ).
138 | ASSIGN param_value->* TO .
139 |
140 | CASE typeof_parameter( param_value ).
141 | WHEN cl_abap_datadescr=>kind_elem.
142 | recorded_variables->get_simple(
143 | EXPORTING name = CONV string( parameter->* )
144 | IMPORTING value = ).
145 | WHEN cl_abap_datadescr=>kind_struct.
146 | recorded_variables->get_structur(
147 | EXPORTING name = CONV string( parameter->* )
148 | IMPORTING value = ).
149 | WHEN cl_abap_datadescr=>kind_table.
150 | recorded_variables->get_table(
151 | EXPORTING name = CONV string( parameter->* )
152 | IMPORTING value = ).
153 | ENDCASE.
154 |
155 | tdc->set_value_ref( EXPORTING i_param_name = parameter->*
156 | i_variant_name = variant i_param_ref = param_value ).
157 | appl_log->s( |{ parameter->* }| ).
158 |
159 | CATCH zcx_dbgl_testcase INTO DATA(recording_failure).
160 | IF recording_failure->textid = zcx_dbgl_testcase=>variable_not_found.
161 | CONTINUE.
162 | ENDIF.
163 | zcx_dbgl_copy_error=>wrap_failure( recording_failure ).
164 | ENDTRY.
165 |
166 | ENDLOOP.
167 |
168 | CATCH cx_ecatt_tdc_access INTO DATA(ecatt_failure).
169 | zcx_dbgl_copy_error=>wrap_failure( ecatt_failure ).
170 | ENDTRY.
171 |
172 | ENDMETHOD.
173 |
174 |
175 | method COPY_FROM_DEBUGGER.
176 | DATA: json_parser TYPE REF TO zdbgl_getter,
177 | tdc_copier TYPE REF TO zdbgl_copy_to_tdc,
178 | exception TYPE REF TO cx_root,
179 | exc_program TYPE syrepid,
180 | exc_include TYPE syrepid,
181 | exc_source_line TYPE i.
182 |
183 | TRY.
184 |
185 | CREATE OBJECT tdc_copier
186 | EXPORTING
187 | tdc = tdc_variant_key-name
188 | tdc_version = tdc_variant_key-version.
189 |
190 | debugger_parser->handle( ).
191 | debugger_parser->log_record( program ).
192 |
193 | CREATE OBJECT json_parser
194 | EXPORTING
195 | values = debugger_parser->concat_json_fragments_string( )
196 | program = program.
197 | tdc_copier->copy_all_parameter_skip_un( variant = tdc_variant_key-variant_name
198 | recorded_variables = json_parser appl_log = appl_log ).
199 | tdc_copier->save( transport_order = tdc_variant_key-transport_request
200 | execute_commit = abap_false ).
201 |
202 | ##CATCH_ALL
203 | CATCH cx_root INTO exception.
204 | " log exception and raise again
205 | exception->get_source_position(
206 | IMPORTING program_name = exc_program include_name = exc_include
207 | source_line = exc_source_line ).
208 | LOG-POINT ID zdbgl_store_globals FIELDS program
209 | exception->get_text( ) exc_program exc_include exc_source_line.
210 | RAISE EXCEPTION exception.
211 | ENDTRY.
212 |
213 | endmethod.
214 |
215 |
216 | method CREATE_PARAMETER_INSTANCE.
217 | DATA: table_type(30).
218 |
219 | DATA(param_def) = tdc->get_param_definition( name ).
220 |
221 | IF param_def CP table_pattern.
222 | DATA(offset) = strlen( table_pattern ) - 1.
223 | table_type = param_def+offset.
224 | CONDENSE table_type NO-GAPS.
225 | CREATE DATA result TYPE STANDARD TABLE OF (table_type).
226 | RETURN.
227 | ENDIF.
228 |
229 | " structured and elementary types can be created directly
230 | CREATE DATA result TYPE (param_def).
231 |
232 | endmethod.
233 |
234 |
235 | method CREATE_VARIANT_IF_NOT_EXISTS.
236 |
237 | DATA(existing_variants) = tdc->get_variant_list( ).
238 | IF line_exists( existing_variants[ table_line = variant ] ).
239 | RETURN.
240 | ENDIF.
241 |
242 | tdc->create_variant( i_variant_name = variant ).
243 |
244 | endmethod.
245 |
246 |
247 | METHOD save.
248 |
249 | TRY.
250 | tdc->commit_changes( i_tr_order = transport_order
251 | i_release_lock = abap_true i_commit_mode = execute_commit ).
252 |
253 | CATCH cx_ecatt_tdc_access INTO DATA(ecatt_failure).
254 | zcx_dbgl_copy_error=>wrap_failure( ecatt_failure ).
255 | ENDTRY.
256 |
257 | ENDMETHOD.
258 |
259 |
260 | method TYPEOF_PARAMETER.
261 |
262 | category = cl_abap_datadescr=>describe_by_data_ref( param_value )->kind.
263 |
264 | endmethod.
265 | ENDCLASS.
266 |
--------------------------------------------------------------------------------
/src/zdbgl_copy_to_tdc.clas.testclasses.abap:
--------------------------------------------------------------------------------
1 | DEFINE assert_equals.
2 |
3 | tdc_accessor->get_value( EXPORTING i_param_name = &4
4 | i_variant_name = 'COPY_TO_TDC'
5 | CHANGING e_param_value = &2 ).
6 | cl_abap_unit_assert=>assert_equals( exp = &1 act = &2
7 | msg = &3 ).
8 |
9 | END-OF-DEFINITION.
10 |
11 | DEFINE create_tdc_accessor.
12 |
13 | DATA(tdc_accessor) = cl_apl_ecatt_tdc_api=>get_instance( i_testdatacontainer = 'ZDBGL_UNIT_TEST_CONTAINER'
14 | i_write_access = abap_true i_testdatacontainer_version = 1 ).
15 |
16 | END-OF-DEFINITION.
17 |
18 | CLASS test_copy DEFINITION FOR TESTING
19 | DURATION SHORT RISK LEVEL HARMLESS.
20 |
21 | PRIVATE SECTION.
22 | DATA: cut TYPE REF TO zdbgl_copy_to_tdc.
23 |
24 | METHODS setup
25 | RAISING cx_static_check.
26 |
27 | METHODS copy_all_parameters FOR TESTING
28 | RAISING cx_static_check.
29 |
30 | METHODS assert_tdc_variables
31 | RAISING cx_ecatt_tdc_access.
32 |
33 | ENDCLASS.
34 |
35 | CLASS test_copy IMPLEMENTATION.
36 |
37 | METHOD setup.
38 |
39 | create_tdc_accessor.
40 |
41 | TRY.
42 | tdc_accessor->delete_variant( 'COPY_TO_TDC' ).
43 | tdc_accessor->commit_changes( ).
44 | COMMIT WORK AND WAIT.
45 | ##NO_HANDLER
46 | CATCH cx_ecatt_tdc_access.
47 | ENDTRY.
48 |
49 | ENDMETHOD.
50 |
51 | METHOD copy_all_parameters.
52 | DATA recorded_values TYPE string.
53 |
54 | " given
55 | recorded_values = '{"VAR_I":"BQAAAA==","VAR_STRING":"YSBzYW1wbGUgc3RyaW5n","VAR_CHARACTER":"Q0hBUkFDVCAgIA==","FLDATE":"MjAxOTExMTU=","STRUCT":' &&
56 | '{"KEY":"AgAAAA==","CH":"Y2hhcmEgICAgIA=="},"TABLE_STRUC_TYPE":[{"MANDT":"ICAg","CARRID":"TEgg","CONNID":"MDMwMA==","FLDATE":"MDAwMDAwMDA=","PRICE":"AAAAAAAAAAw=","CURRENCY":"ICAgICA=","PLANETYPE":"ICAgICAgICAgIA==","SEATSMAX":"AAAAAA==",' &&
57 | '"SEATSOCC":"AAAAAA==","PAYMENTSUM":"AAAAAAAAAAAM","SEATSMAX_B":"AAAAAA==","SEATSOCC_B":"AAAAAA==","SEATSMAX_F":"AAAAAA==","SEATSOCC_F":"AAAAAA=="},{"MANDT":"ICAg","CARRID":"TEgg","CONNID":"MDM1MA==","FLDATE":"MDAwMDAwMDA=","PRICE":' &&
58 | '"AAAAAAAAAAw=",' &&
59 | '"CURRENCY":"ICAgICA=","PLANETYPE":"ICAgICAgICAgIA==","SEATSMAX":"AAAAAA==","SEATSOCC":"AAAAAA==","PAYMENTSUM":"AAAAAAAAAAAM","SEATSMAX_B":"AAAAAA==","SEATSOCC_B":"AAAAAA==","SEATSMAX_F":"AAAAAA==","SEATSOCC_F":"AAAAAA=="}],' &&
60 | '"HASHED_TABLE":[{"MANDT":"ICAg","CARRID":"TEgg","CONNID":"MDMwMA==","FLDATE":"MDAwMDAwMDA=","PRICE":"AAAAAAAAAAw=","CURRENCY":"ICAgICA=","PLANETYPE":"ICAgICAgICAgIA==","SEATSMAX":"AAAAAA==","SEATSOCC":"AAAAAA==","PAYMENTSUM":"AAAAAAAAAAAM",' &&
61 | '"SEATSMAX_B":"AAAAAA==","SEATSOCC_B":"AAAAAA==","SEATSMAX_F":"AAAAAA==","SEATSOCC_F":"AAAAAA=="},{"MANDT":"ICAg","CARRID":"TEgg","CONNID":"MDM1MA==","FLDATE":"MDAwMDAwMDA=","PRICE":"AAAAAAAAAAw=","CURRENCY":"ICAgICA=","PLANETYPE":' &&
62 | '"ICAgICAgICAgIA==",' &&
63 | '"SEATSMAX":"AAAAAA==","SEATSOCC":"AAAAAA==","PAYMENTSUM":"AAAAAAAAAAAM","SEATSMAX_B":"AAAAAA==","SEATSOCC_B":"AAAAAA==","SEATSMAX_F":"AAAAAA==","SEATSOCC_F":"AAAAAA=="}],"COM_STRUCT":{"KEY":"AwAAAA==","TABLE":[{"MANDT":"ICAg","CARRID":"TEgg",' &&
64 | '"CONNID":"MDMwMA==","FLDATE":"MDAwMDAwMDA=","PRICE":"AAAAAAAAAAw=","CURRENCY":"ICAgICA=","PLANETYPE":"ICAgICAgICAgIA==","SEATSMAX":"AAAAAA==","SEATSOCC":"AAAAAA==","PAYMENTSUM":"AAAAAAAAAAAM","SEATSMAX_B":"AAAAAA==","SEATSOCC_B":"AAAAAA==",' &&
65 | '"SEATSMAX_F":"AAAAAA==","SEATSOCC_F":"AAAAAA=="},{"MANDT":"ICAg","CARRID":"TEgg","CONNID":"MDM1MA==","FLDATE":"MDAwMDAwMDA=","PRICE":"AAAAAAAAAAw=","CURRENCY":"ICAgICA=","PLANETYPE":"ICAgICAgICAgIA==","SEATSMAX":"AAAAAA==","SEATSOCC":"AAAAAA==",' &&
66 | '"PAYMENTSUM":"AAAAAAAAAAAM","SEATSMAX_B":"AAAAAA==","SEATSOCC_B":"AAAAAA==","SEATSMAX_F":"AAAAAA==","SEATSOCC_F":"AAAAAA=="}]},"TABLE_SIMPLE_TYPE":["AQAAAA==","AgAAAA=="],"TABLE_COM_TYPE":[[{"MANDT":"ICAg","CARRID":"TEgg","CONNID":"MDMwMA==",' &&
67 | '"FLDATE":"MDAwMDAwMDA=","PRICE":"AAAAAAAAAAw=","CURRENCY":"ICAgICA=","PLANETYPE":"ICAgICAgICAgIA==","SEATSMAX":"AAAAAA==","SEATSOCC":"AAAAAA==","PAYMENTSUM":"AAAAAAAAAAAM","SEATSMAX_B":"AAAAAA==","SEATSOCC_B":"AAAAAA==","SEATSMAX_F":"AAAAAA==",' &&
68 |
69 | '"SEATSOCC_F":"AAAAAA=="},{"MANDT":"ICAg","CARRID":"TEgg","CONNID":"MDM1MA==","FLDATE":"MDAwMDAwMDA=","PRICE":"AAAAAAAAAAw=","CURRENCY":"ICAgICA=","PLANETYPE":"ICAgICAgICAgIA==","SEATSMAX":"AAAAAA==","SEATSOCC":"AAAAAA==","PAYMENTSUM":' &&
70 | '"AAAAAAAAAAAM",' &&
71 | '"SEATSMAX_B":"AAAAAA==","SEATSOCC_B":"AAAAAA==","SEATSMAX_F":"AAAAAA==","SEATSOCC_F":"AAAAAA=="}],[{"MANDT":"ICAg","CARRID":"TEgg","CONNID":"MDMwMA==","FLDATE":"MDAwMDAwMDA=","PRICE":"AAAAAAAAAAw=","CURRENCY":"ICAgICA=",' &&
72 | '"PLANETYPE":"ICAgICAgICAgIA==",' &&
73 | '"SEATSMAX":"AAAAAA==","SEATSOCC":"AAAAAA==","PAYMENTSUM":"AAAAAAAAAAAM","SEATSMAX_B":"AAAAAA==","SEATSOCC_B":"AAAAAA==","SEATSMAX_F":"AAAAAA==","SEATSOCC_F":"AAAAAA=="},{"MANDT":"ICAg","CARRID":"TEgg","CONNID":"MDM1MA==","FLDATE":"MDAwMDAwMDA=",' &&
74 | '"PRICE":"AAAAAAAAAAw=","CURRENCY":"ICAgICA=","PLANETYPE":"ICAgICAgICAgIA==","SEATSMAX":"AAAAAA==","SEATSOCC":"AAAAAA==","PAYMENTSUM":"AAAAAAAAAAAM","SEATSMAX_B":"AAAAAA==","SEATSOCC_B":"AAAAAA==","SEATSMAX_F":"AAAAAA==","SEATSOCC_F":"AAAAAA=="}]]}'.
75 |
76 | DATA(recorder) = NEW zdbgl_getter( values = recorded_values
77 | program = 'ZDBGL_UNIT_TEST' ).
78 |
79 | " when
80 | DATA(cut) = NEW zdbgl_copy_to_tdc( tdc = 'ZDBGL_UNIT_TEST_CONTAINER'
81 | tdc_version = 1 ).
82 |
83 | cut->copy_all_parameter( variant = 'COPY_TO_TDC'
84 | recorded_variables = recorder ).
85 | cut->save( execute_commit = abap_false ).
86 | COMMIT WORK AND WAIT.
87 |
88 | " then
89 | assert_tdc_variables( ).
90 |
91 | ENDMETHOD.
92 |
93 | METHOD assert_tdc_variables.
94 | DATA: saved_string TYPE string,
95 | saved_character_seq TYPE char10,
96 | saved_table_with_struc_type TYPE STANDARD TABLE OF sflight,
97 | saved_table_with_simple_type TYPE STANDARD TABLE OF i,
98 | exp_string TYPE string VALUE 'a sample string',
99 | exp_character_seq TYPE char10 VALUE 'CHARACT',
100 | exp_table_with_struc_type TYPE STANDARD TABLE OF sflight,
101 | exp_table_with_simple_type TYPE STANDARD TABLE OF i.
102 |
103 | create_tdc_accessor.
104 |
105 | exp_table_with_struc_type = VALUE #(
106 | ( carrid = 'LH' connid = '300' )
107 | ( carrid = 'LH' connid = '350' ) ).
108 | APPEND: 1 TO exp_table_with_simple_type,
109 | 2 TO exp_table_with_simple_type.
110 |
111 | assert_equals exp_string saved_string 'Variable of type string' 'VAR_STRING'.
112 | assert_equals exp_character_seq saved_character_seq 'Variable of type character sequence' 'VAR_CHARACTER'.
113 | assert_equals exp_table_with_struc_type saved_table_with_struc_type
114 | 'Internal type with structured type' 'TABLE_STRUC_TYPE'.
115 | assert_equals exp_table_with_simple_type saved_table_with_simple_type
116 | 'Internal type with simple type' 'TABLE_SIMPLE_TYPE'.
117 |
118 | ENDMETHOD.
119 |
120 | ENDCLASS.
121 |
--------------------------------------------------------------------------------
/src/zdbgl_copy_to_tdc.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_COPY_TO_TDC
7 | E
8 | Copy values from table zdbgl_variables to testdatacontainer
9 | 1
10 | X
11 | X
12 | X
13 | X
14 |
15 |
16 |
17 | CONSTRUCTOR
18 | C
19 | read the testdatacontainer in the constructor
20 |
21 |
22 | CONSTRUCTOR
23 | E
24 | read the testdatacontainer in the constructor
25 |
26 |
27 | COPY_ALL_PARAMETER
28 | C
29 | copy the values for all parameters of the testdatacontainer
30 |
31 |
32 | COPY_ALL_PARAMETER
33 | E
34 | copy the values for all parameters of the testdatacontainer
35 |
36 |
37 | COPY_ALL_PARAMETER_SKIP_UN
38 | C
39 | copy the values for all parameters of the tdc (skip unknown)
40 |
41 |
42 | COPY_ALL_PARAMETER_SKIP_UN
43 | E
44 | copy the values for all parameters of the tdc (skip unknown)
45 |
46 |
47 | COPY_FROM_DEBUGGER
48 | C
49 | copy values directly from abap debugger
50 |
51 |
52 | COPY_FROM_DEBUGGER
53 | E
54 | copy values directly from abap debugger
55 |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/src/zdbgl_demo_group.fugr.lzdbgl_demo_grouptop.abap:
--------------------------------------------------------------------------------
1 | FUNCTION-POOL ZDBGL_DEMO_GROUP. "MESSAGE-ID ..
2 |
3 | * INCLUDE LZDBGL_DEMO_GROUPD... " Local class definition
4 |
--------------------------------------------------------------------------------
/src/zdbgl_demo_group.fugr.lzdbgl_demo_grouptop.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | LZDBGL_DEMO_GROUPTOP
7 | S
8 | D$
9 | I
10 | S
11 | E
12 | X
13 | D$S
14 | X
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/zdbgl_demo_group.fugr.saplzdbgl_demo_group.abap:
--------------------------------------------------------------------------------
1 | *******************************************************************
2 | * System-defined Include-files. *
3 | *******************************************************************
4 | INCLUDE LZDBGL_DEMO_GROUPTOP. " Global Data
5 | INCLUDE LZDBGL_DEMO_GROUPUXX. " Function Modules
6 |
7 | *******************************************************************
8 | * User-defined Include-files (if necessary). *
9 | *******************************************************************
10 | * INCLUDE LZDBGL_DEMO_GROUPF... " Subroutines
11 | * INCLUDE LZDBGL_DEMO_GROUPO... " PBO-Modules
12 | * INCLUDE LZDBGL_DEMO_GROUPI... " PAI-Modules
13 | * INCLUDE LZDBGL_DEMO_GROUPE... " Events
14 | * INCLUDE LZDBGL_DEMO_GROUPP... " Local class implement.
15 | * INCLUDE LZDBGL_DEMO_GROUPT99. " ABAP Unit tests
16 |
--------------------------------------------------------------------------------
/src/zdbgl_demo_group.fugr.saplzdbgl_demo_group.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | SAPLZDBGL_DEMO_GROUP
7 | S
8 | D$
9 | F
10 | S
11 | E
12 | X
13 | D$S
14 | X
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/zdbgl_demo_group.fugr.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Demo function grop for testing
6 |
7 | LZDBGL_DEMO_GROUPTOP
8 | SAPLZDBGL_DEMO_GROUP
9 |
10 |
11 | -
12 | ZDBGL_DEMO_MODULE
13 | Demo function module for unit testing
14 |
15 |
16 | I_ABAP_BUILT_IN
17 | X
18 | INT4
19 |
20 |
21 | I_DICTIONARY_TYPE
22 | X
23 | SCARR
24 |
25 |
26 |
27 |
28 | C_PARAMETER
29 | X
30 | SFLIGHT
31 |
32 |
33 |
34 |
35 | E_MESSAGE
36 | X
37 | STRING
38 |
39 |
40 |
41 |
42 | TABLE
43 | SFLIGHT
44 |
45 |
46 |
47 |
48 | EXCEPTION
49 |
50 |
51 |
52 |
53 | I_ABAP_BUILT_IN
54 | P
55 | Natural Number
56 |
57 |
58 | I_DICTIONARY_TYPE
59 | P
60 | Airline
61 |
62 |
63 | E_MESSAGE
64 | P
65 |
66 |
67 | TABLE
68 | P
69 | Flight
70 |
71 |
72 | C_PARAMETER
73 | P
74 | Flight
75 |
76 |
77 | EXCEPTION
78 | X
79 | Exception
80 |
81 |
82 |
83 |
84 |
85 | -
86 | C
87 |
88 |
-
89 | R
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
--------------------------------------------------------------------------------
/src/zdbgl_demo_group.fugr.zdbgl_demo_module.abap:
--------------------------------------------------------------------------------
1 | FUNCTION ZDBGL_DEMO_MODULE.
2 | *"----------------------------------------------------------------------
3 | *"*"Local Interface:
4 | *" IMPORTING
5 | *" REFERENCE(I_ABAP_BUILT_IN) TYPE INT4
6 | *" REFERENCE(I_DICTIONARY_TYPE) TYPE SCARR
7 | *" EXPORTING
8 | *" REFERENCE(E_MESSAGE) TYPE STRING
9 | *" TABLES
10 | *" TABLE STRUCTURE SFLIGHT
11 | *" CHANGING
12 | *" REFERENCE(C_PARAMETER) TYPE SFLIGHT
13 | *" EXCEPTIONS
14 | *" EXCEPTION
15 | *"----------------------------------------------------------------------
16 |
17 |
18 |
19 |
20 |
21 | ENDFUNCTION.
22 |
--------------------------------------------------------------------------------
/src/zdbgl_demo_regression_test.prog.abap:
--------------------------------------------------------------------------------
1 | *&---------------------------------------------------------------------*
2 | *& Report ZDBGL_DEMO_REGRESSION_TEST
3 | *&
4 | *&---------------------------------------------------------------------*
5 | *&
6 | *&
7 | *&---------------------------------------------------------------------*
8 | REPORT zdbgl_demo_regression_test.
9 | DATA: demo_itab TYPE STANDARD TABLE OF sflight.
10 |
11 | START-OF-SELECTION.
12 | FIELD-SYMBOLS: TYPE sflight.
13 |
14 | APPEND INITIAL LINE TO demo_itab ASSIGNING .
15 | -carrid = 'LH'.
16 | -connid = '3445'.
17 | -price = 500.
18 | " create a snapshot with debugger script "ZDBGL_SCRIPT_STORE_IN_TDC"
19 | BREAK-POINT.
20 | PERFORM to_verify.
21 | " create a snapshot with debugger script "ZDBGL_SCRIPT_STORE_IN_TDC"
22 | BREAK-POINT.
23 |
24 |
25 | FORM to_verify.
26 | FIELD-SYMBOLS: TYPE sflight.
27 |
28 | APPEND INITIAL LINE TO demo_itab ASSIGNING .
29 | -carrid = 'LH'.
30 | -connid = '3444'.
31 | -price = 400.
32 |
33 | ENDFORM.
34 |
35 | CLASS regression_test DEFINITION FOR TESTING
36 | DURATION SHORT RISK LEVEL HARMLESS.
37 |
38 | PRIVATE SECTION.
39 | DATA: tdc_accessor TYPE REF TO cl_apl_ecatt_tdc_api.
40 |
41 | METHODS setup
42 | RAISING cx_static_check.
43 |
44 | METHODS verify_changed_itab FOR TESTING
45 | RAISING cx_static_check.
46 |
47 | ENDCLASS.
48 |
49 | CLASS regression_test IMPLEMENTATION.
50 |
51 | METHOD setup.
52 |
53 | tdc_accessor = cl_apl_ecatt_tdc_api=>get_instance( EXPORTING
54 | i_testdatacontainer = 'ZDBGL_SAMPLE' i_testdatacontainer_version = 1 ).
55 |
56 | ENDMETHOD.
57 |
58 | METHOD verify_changed_itab.
59 | DATA: exp_demo_itab LIKE demo_itab.
60 |
61 | " given: use the snapshot before the procedure under test was executed
62 | tdc_accessor->get_value( EXPORTING i_param_name = 'DEMO_ITAB' i_variant_name = 'BEFORE'
63 | CHANGING e_param_value = demo_itab ).
64 |
65 | " when: execute procedure under test
66 | PERFORM to_verify.
67 |
68 | " then: use the snapshot after the procedure under test was executed
69 | tdc_accessor->get_value( EXPORTING i_param_name = 'DEMO_ITAB' i_variant_name = 'AFTER'
70 | CHANGING e_param_value = exp_demo_itab ).
71 | cl_abap_unit_assert=>assert_equals( exp = exp_demo_itab
72 | act = demo_itab msg = 'Regression test not passed' ).
73 |
74 | ENDMETHOD.
75 |
76 | ENDCLASS.
77 |
--------------------------------------------------------------------------------
/src/zdbgl_demo_regression_test.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_DEMO_REGRESSION_TEST
7 | 1
8 | E
9 | X
10 | X
11 |
12 |
13 | -
14 | R
15 | Demo regression test
16 | 70
17 |
18 |
19 |
20 | -
21 | C
22 |
23 |
-
24 | R
25 | Demo regression test
26 | 70
27 |
28 |
29 |
30 | -
31 | D
32 |
33 |
-
34 | R
35 | Demo Regressionstest
36 | 20
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/src/zdbgl_display_app_log.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_DISPLAY_APP_LOG
7 | E
8 | SAP_BOOL
9 | 55
10 | 10
11 | 20
12 | 40
13 | Display application log
14 | Display application log
15 | Display lo
16 | Display app. log
17 | Display application log
18 | E
19 | D
20 |
21 |
22 | C
23 |
24 |
25 | -
26 | C
27 | Display application log
28 | Display application log
29 | Display lo
30 | Display app. log
31 | Display application log
32 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/src/zdbgl_export_path.tabl.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_EXPORT_PATH
7 | E
8 | INTTAB
9 | Export path for function signature record
10 | 4
11 |
12 |
13 |
14 | DIRECTORY_PATH
15 | 0
16 | C
17 | 000400
18 | CHAR
19 | 000200
20 | CHAR
21 | Directory path
22 |
23 |
24 | FILENAME
25 | 0
26 | C
27 | 000080
28 | CHAR
29 | 000040
30 | CHAR
31 | File name
32 |
33 |
34 |
35 | C
36 |
37 |
38 | -
39 | C
40 | Export path for function signature record
41 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/src/zdbgl_get_globals.clas.abap:
--------------------------------------------------------------------------------
1 | class ZDBGL_GET_GLOBALS definition
2 | public
3 | final
4 | create public
5 | inheriting from zdbgl_getter.
6 |
7 | public section.
8 |
9 | class-methods FACTORY
10 | IMPORTING
11 | key_testcase TYPE zdbgl_key_testcases
12 | program TYPE progname
13 | RETURNING VALUE(instance) TYPE REF TO zdbgl_get_globals
14 | RAISING
15 | zcx_dbgl_testcase.
16 | protected section.
17 | private section.
18 | ENDCLASS.
19 |
20 |
21 |
22 | CLASS ZDBGL_GET_GLOBALS IMPLEMENTATION.
23 |
24 |
25 | method FACTORY.
26 | TYPES: BEGIN OF record,
27 | globals TYPE zdbgl_variables-globals,
28 | END OF record.
29 | DATA: full_record TYPE STANDARD TABLE OF record,
30 | globals_json_string TYPE string.
31 | FIELD-SYMBOLS: TYPE record.
32 |
33 | SELECT globals FROM zdbgl_variables
34 | INTO CORRESPONDING FIELDS OF TABLE @full_record
35 | WHERE abap_program = @program AND key_testcase = @key_testcase.
36 | IF sy-subrc <> 0.
37 | RAISE EXCEPTION TYPE zcx_dbgl_testcase
38 | EXPORTING
39 | textid = zcx_dbgl_testcase=>testcase_not_found
40 | key_testcase = key_testcase
41 | program = program.
42 | ENDIF.
43 |
44 | LOOP AT full_record ASSIGNING .
45 | globals_json_string = globals_json_string &&
46 | -globals.
47 | ENDLOOP.
48 |
49 | CREATE OBJECT instance
50 | EXPORTING
51 | values = globals_json_string
52 | program = program.
53 |
54 | endmethod.
55 | ENDCLASS.
56 |
--------------------------------------------------------------------------------
/src/zdbgl_get_globals.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_GET_GLOBALS
7 | E
8 | Get global variables
9 | 1
10 | X
11 | X
12 | X
13 |
14 |
15 |
16 | FACTORY
17 | C
18 | create instance
19 |
20 |
21 | FACTORY
22 | E
23 | create instance
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/src/zdbgl_get_locals.clas.abap:
--------------------------------------------------------------------------------
1 | class ZDBGL_GET_LOCALS definition
2 | public
3 | INHERITING FROM zdbgl_getter
4 | final
5 | create public .
6 |
7 | public section.
8 | TYPES: BEGIN OF _source_position,
9 | abap_program TYPE tpda_program,
10 | include TYPE tpda_include,
11 | line TYPE tpda_sc_line,
12 | END OF _source_position.
13 |
14 | class-methods FACTORY
15 | IMPORTING
16 | key_testcase TYPE zdbgl_key_testcases
17 | source_position TYPE _source_position
18 | RETURNING VALUE(instance) TYPE REF TO zdbgl_get_locals
19 | RAISING
20 | zcx_dbgl_testcase.
21 | protected section.
22 | private section.
23 | ENDCLASS.
24 |
25 |
26 |
27 | CLASS ZDBGL_GET_LOCALS IMPLEMENTATION.
28 |
29 |
30 | method FACTORY.
31 | TYPES: BEGIN OF _record,
32 | locals TYPE zdbgl_locals-locals,
33 | END OF _record.
34 | DATA: full_record TYPE STANDARD TABLE OF _record,
35 | locals_json_string TYPE string,
36 | record TYPE REF TO _record.
37 |
38 | SELECT locals FROM zdbgl_locals
39 | INTO CORRESPONDING FIELDS OF TABLE @full_record
40 | WHERE abap_program = @source_position-abap_program
41 | AND include = @source_position-include AND line = @source_position-line
42 | AND key_testcase = @key_testcase.
43 | IF sy-subrc <> 0.
44 | RAISE EXCEPTION TYPE zcx_dbgl_testcase
45 | EXPORTING
46 | textid = zcx_dbgl_testcase=>testcase_not_found
47 | key_testcase = key_testcase
48 | program = source_position-abap_program.
49 | ENDIF.
50 |
51 | LOOP AT full_record REFERENCE INTO record.
52 | locals_json_string = locals_json_string &&
53 | record->*-locals.
54 | ENDLOOP.
55 |
56 | CREATE OBJECT instance
57 | EXPORTING
58 | values = locals_json_string
59 | program = source_position-abap_program.
60 |
61 | endmethod.
62 | ENDCLASS.
63 |
--------------------------------------------------------------------------------
/src/zdbgl_get_locals.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_GET_LOCALS
7 | E
8 | Get local variables
9 | 1
10 | X
11 | X
12 | X
13 |
14 |
15 |
16 | FACTORY
17 | C
18 | read variables from the testcase
19 |
20 |
21 | FACTORY
22 | E
23 | read variables from the testcase
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/src/zdbgl_getter.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zdbgl_getter DEFINITION
2 | PUBLIC
3 | CREATE PUBLIC .
4 |
5 | PUBLIC SECTION.
6 |
7 | METHODS constructor
8 | IMPORTING
9 | !values TYPE string
10 | !program TYPE program .
11 | METHODS get_simple
12 | IMPORTING
13 | !name TYPE string
14 | EXPORTING
15 | !value TYPE simple
16 | RAISING
17 | zcx_dbgl_testcase .
18 | METHODS get_structur
19 | IMPORTING
20 | !name TYPE string
21 | EXPORTING
22 | !value TYPE any
23 | RAISING
24 | zcx_dbgl_testcase
25 | zcx_dbgl_type_not_supported.
26 | METHODS get_table
27 | IMPORTING
28 | !name TYPE string
29 | EXPORTING
30 | !value TYPE ANY TABLE
31 | RAISING
32 | zcx_dbgl_testcase .
33 | PROTECTED SECTION.
34 |
35 | DATA program TYPE program .
36 | PRIVATE SECTION.
37 |
38 | TYPES:
39 | xstring_tab TYPE STANDARD TABLE OF xstring .
40 |
41 | DATA json_xtext TYPE xstring .
42 | DATA abap_conversion TYPE REF TO cl_abap_conv_in_ce .
43 |
44 | METHODS get_hex_value
45 | IMPORTING
46 | !name TYPE string
47 | RETURNING
48 | VALUE(value) TYPE string
49 | RAISING
50 | zcx_dbgl_testcase .
51 | METHODS _get_simple
52 | IMPORTING
53 | !base64_value TYPE string
54 | EXPORTING
55 | !value TYPE simple .
56 | METHODS line_has_simple_type
57 | IMPORTING
58 | line TYPE any
59 | RETURNING VALUE(is_simple) TYPE sap_bool.
60 | ENDCLASS.
61 |
62 |
63 |
64 | CLASS ZDBGL_GETTER IMPLEMENTATION.
65 |
66 |
67 | METHOD constructor.
68 | DATA:
69 | system_info TYPE rfcsi.
70 |
71 | me->program = program.
72 |
73 | CALL FUNCTION 'RFC_SYSTEM_INFO'
74 | IMPORTING
75 | rfcsi_export = system_info.
76 |
77 | json_xtext = cl_abap_codepage=>convert_to( values ).
78 | abap_conversion = cl_abap_conv_in_ce=>create(
79 | encoding = CONV abap_encoding( system_info-rfcchartyp ) ).
80 |
81 | ENDMETHOD.
82 |
83 |
84 | METHOD get_hex_value.
85 | DATA: node TYPE REF TO if_sxml_node,
86 | node_open_element TYPE REF TO if_sxml_open_element,
87 | node_found TYPE sap_bool,
88 | reader TYPE REF TO if_sxml_reader,
89 | attribute TYPE REF TO if_sxml_attribute,
90 | object_level TYPE i.
91 |
92 | " create reader in every call, loop through nodes is statefull
93 | reader = cl_sxml_string_reader=>create( json_xtext ).
94 | DO.
95 | node = reader->read_next_node( ).
96 | IF node IS INITIAL.
97 | EXIT.
98 | ENDIF.
99 |
100 | IF node->type = if_sxml_node=>co_nt_element_open.
101 |
102 | node_open_element = CAST if_sxml_open_element( node ).
103 | LOOP AT node_open_element->get_attributes( ) INTO attribute.
104 | IF attribute->qname-name = 'name' AND attribute->get_value( ) = name
105 | AND node_open_element->if_sxml_named~qname-name = 'str'
106 | AND object_level = 1.
107 | node_found = abap_true.
108 | ENDIF.
109 | ENDLOOP.
110 |
111 | IF node_open_element->if_sxml_named~qname-name = 'object'.
112 | ADD 1 TO object_level.
113 | ENDIF.
114 |
115 | ELSEIF node->type = if_sxml_node=>co_nt_value
116 | AND node_found = abap_true.
117 |
118 | value = CAST if_sxml_value_node( node )->get_value( ).
119 | RETURN.
120 |
121 | ELSEIF node->type = if_sxml_node=>co_nt_element_close.
122 |
123 | IF CAST if_sxml_close_element( node )->if_sxml_named~qname-name = 'object'.
124 | object_level = object_level - 1.
125 | ENDIF.
126 |
127 | ENDIF.
128 |
129 | ENDDO.
130 |
131 | RAISE EXCEPTION TYPE zcx_dbgl_testcase
132 | EXPORTING
133 | textid = zcx_dbgl_testcase=>variable_not_found
134 | program = program
135 | variable = name.
136 |
137 | ENDMETHOD.
138 |
139 |
140 | METHOD get_simple.
141 |
142 | _get_simple( EXPORTING base64_value = get_hex_value( name )
143 | IMPORTING value = value ).
144 |
145 | ENDMETHOD.
146 |
147 |
148 | METHOD get_structur.
149 | DATA: node TYPE REF TO if_sxml_node,
150 | node_open_element TYPE REF TO if_sxml_open_element,
151 | node_for_structure_pending TYPE sap_bool,
152 | reader TYPE REF TO if_sxml_reader,
153 | attribute TYPE REF TO if_sxml_attribute,
154 | object_level TYPE i.
155 | FIELD-SYMBOLS: TYPE any.
156 |
157 | " create reader in every call, loop through nodes is statefull
158 | reader = cl_sxml_string_reader=>create( json_xtext ).
159 | DO.
160 | node = reader->read_next_node( ).
161 | IF node IS INITIAL.
162 | EXIT.
163 | ENDIF.
164 |
165 | IF node->type = if_sxml_node=>co_nt_element_open.
166 |
167 | node_open_element = CAST if_sxml_open_element( node ).
168 |
169 | IF ( node_open_element->if_sxml_named~qname-name = 'array'
170 | OR node_open_element->if_sxml_named~qname-name = 'object' )
171 | AND node_for_structure_pending = abap_true.
172 |
173 | RAISE EXCEPTION TYPE zcx_dbgl_type_not_supported
174 | EXPORTING
175 | type = |deep structure with name { name }|.
176 |
177 | ENDIF.
178 |
179 | LOOP AT node_open_element->get_attributes( ) INTO attribute.
180 |
181 | IF attribute->qname-name = 'name'.
182 | IF node_open_element->if_sxml_named~qname-name = 'object'
183 | AND attribute->get_value( ) = name AND object_level = 1.
184 | node_for_structure_pending = abap_true.
185 | ELSEIF node_open_element->if_sxml_named~qname-name = 'str'
186 | AND node_for_structure_pending = abap_true.
187 | ASSIGN COMPONENT attribute->get_value( ) OF STRUCTURE value
188 | TO .
189 | ENDIF.
190 | ENDIF.
191 |
192 | ENDLOOP.
193 |
194 | IF node_open_element->if_sxml_named~qname-name = 'object'.
195 | ADD 1 TO object_level.
196 | ENDIF.
197 |
198 | ELSEIF node->type = if_sxml_node=>co_nt_value
199 | AND node_for_structure_pending = abap_true.
200 |
201 | _get_simple( EXPORTING base64_value = CAST if_sxml_value_node( node )->get_value( )
202 | IMPORTING value = ).
203 |
204 | ELSEIF node->type = if_sxml_node=>co_nt_element_close.
205 |
206 | IF CAST if_sxml_close_element( node )->if_sxml_named~qname-name = 'object'.
207 | IF node_for_structure_pending = abap_true.
208 | " object finished
209 | RETURN.
210 | ENDIF.
211 | object_level = object_level - 1.
212 | ENDIF.
213 |
214 | ENDIF.
215 |
216 | ENDDO.
217 |
218 | " value for variable not found
219 | RAISE EXCEPTION TYPE zcx_dbgl_testcase
220 | EXPORTING
221 | textid = zcx_dbgl_testcase=>variable_not_found
222 | program = program
223 | variable = name.
224 |
225 | ENDMETHOD.
226 |
227 |
228 | METHOD get_table.
229 | DATA: node TYPE REF TO if_sxml_node,
230 | node_for_table_pending TYPE sap_bool,
231 | reader TYPE REF TO if_sxml_reader,
232 | line TYPE REF TO data,
233 | node_open_element TYPE REF TO if_sxml_open_element,
234 | object_element_name TYPE string,
235 | attribute TYPE REF TO if_sxml_attribute,
236 | object_level TYPE i.
237 | FIELD-SYMBOLS: TYPE any,
238 | TYPE any.
239 |
240 | CREATE DATA line LIKE LINE OF value.
241 | ASSIGN line->* TO .
242 |
243 | " create reader in every call, loop through nodes is statefull
244 | reader = cl_sxml_string_reader=>create( json_xtext ).
245 | DO.
246 | node = reader->read_next_node( ).
247 | IF node IS INITIAL.
248 | EXIT.
249 | ENDIF.
250 |
251 | IF node->type = if_sxml_node=>co_nt_element_open.
252 |
253 | node_open_element = CAST if_sxml_open_element( node ).
254 | attribute_handler.
255 | prepare_table_line.
256 |
257 | ELSEIF node->type = if_sxml_node=>co_nt_value
258 | AND node_for_table_pending = abap_true.
259 |
260 | _get_simple( EXPORTING base64_value = CAST if_sxml_value_node( node )->get_value( )
261 | IMPORTING value = ).
262 |
263 | ELSEIF node->type = if_sxml_node=>co_nt_element_close.
264 |
265 | close_element_handler.
266 |
267 | ENDIF.
268 |
269 | ENDDO.
270 |
271 | RAISE EXCEPTION TYPE zcx_dbgl_testcase
272 | EXPORTING
273 | textid = zcx_dbgl_testcase=>variable_not_found
274 | program = program
275 | variable = name.
276 |
277 | ENDMETHOD.
278 |
279 |
280 | METHOD line_has_simple_type.
281 |
282 | IF cl_abap_typedescr=>describe_by_data( line )->kind =
283 | cl_abap_typedescr=>kind_elem.
284 | is_simple = abap_true.
285 | ENDIF.
286 |
287 | ENDMETHOD.
288 |
289 |
290 | METHOD _get_simple.
291 | DATA: hex_value TYPE xstring.
292 |
293 | hex_value = cl_http_utility=>decode_x_base64( base64_value ).
294 |
295 | abap_conversion->convert( EXPORTING input = hex_value
296 | IMPORTING data = value ).
297 |
298 | ENDMETHOD.
299 | ENDCLASS.
300 |
--------------------------------------------------------------------------------
/src/zdbgl_getter.clas.locals_imp.abap:
--------------------------------------------------------------------------------
1 | DEFINE attribute_handler.
2 |
3 | IF node_open_element->if_sxml_named~qname-name = 'array'
4 | AND node_for_table_pending = abap_true.
5 |
6 | RAISE EXCEPTION TYPE zcx_dbgl_testcase
7 | EXPORTING
8 | textid = zcx_dbgl_testcase=>table_line_type_not_supported
9 | program = program
10 | linetype = cl_abap_typedescr=>typekind_struct2.
11 |
12 | ENDIF.
13 |
14 | LOOP AT node_open_element->get_attributes( ) INTO attribute.
15 | IF attribute->qname-name = 'name' AND attribute->get_value( ) = name
16 | AND node_open_element->if_sxml_named~qname-name = 'array'
17 | AND object_level = 1.
18 | node_for_table_pending = abap_true.
19 | ELSEIF attribute->qname-name = 'name'.
20 | object_element_name = attribute->get_value( ).
21 | ENDIF.
22 | ENDLOOP.
23 |
24 | IF node_open_element->if_sxml_named~qname-name = 'object'.
25 | ADD 1 TO object_level.
26 | ENDIF.
27 |
28 | END-OF-DEFINITION.
29 |
30 | DEFINE prepare_table_line.
31 |
32 | IF node_for_table_pending = abap_true.
33 |
34 | IF node_open_element->if_sxml_named~qname-name = 'object'
35 | AND line_has_simple_type( ) = abap_false.
36 | " new line starts
37 | CLEAR: .
38 | ENDIF.
39 | IF node_open_element->if_sxml_named~qname-name = 'str'
40 | AND line_has_simple_type( ) = abap_false.
41 | " structured component
42 | ASSIGN COMPONENT object_element_name OF STRUCTURE TO .
43 | ELSEIF node_open_element->if_sxml_named~qname-name = 'str'.
44 | ASSIGN line->* TO .
45 | ENDIF.
46 |
47 | ENDIF.
48 |
49 | END-OF-DEFINITION.
50 |
51 | DEFINE close_element_handler.
52 |
53 | CASE CAST if_sxml_close_element( node )->if_sxml_named~qname-name.
54 | WHEN 'array'.
55 | IF node_for_table_pending = abap_true.
56 | " parsing finished
57 | RETURN.
58 | ENDIF.
59 | WHEN 'object'.
60 | IF node_for_table_pending = abap_true.
61 | " line parsing finished for structured type
62 | INSERT INTO TABLE value.
63 | ENDIF.
64 | object_level = object_level - 1.
65 | WHEN 'str'.
66 | IF line_has_simple_type( ) = abap_true
67 | AND node_for_table_pending = abap_true.
68 | " line parsing finished for simple type
69 | INSERT INTO TABLE value.
70 | ENDIF.
71 | ENDCASE.
72 |
73 | END-OF-DEFINITION.
74 |
--------------------------------------------------------------------------------
/src/zdbgl_getter.clas.testclasses.abap:
--------------------------------------------------------------------------------
1 | CLASS test_getter DEFINITION FOR TESTING
2 | DURATION SHORT RISK LEVEL HARMLESS FINAL.
3 |
4 | PRIVATE SECTION.
5 |
6 | METHODS get_hex_value FOR TESTING
7 | RAISING
8 | cx_static_check.
9 |
10 | ENDCLASS.
11 |
12 | CLASS zdbgl_getter DEFINITION LOCAL FRIENDS test_getter.
13 |
14 | CLASS test_getter IMPLEMENTATION.
15 |
16 | METHOD get_hex_value.
17 | DATA: _cut TYPE REF TO zdbgl_getter,
18 | values TYPE string,
19 | exp_base64_value TYPE string,
20 | act_base64_value TYPE string.
21 |
22 | exp_base64_value = 'IJ'.
23 | values = '{"before":"ABC","var":"IJ","after":"DD"}'.
24 | CREATE OBJECT _cut
25 | EXPORTING
26 | values = values
27 | program = 'test'.
28 |
29 | act_base64_value = _cut->get_hex_value( 'var' ).
30 | cl_abap_unit_assert=>assert_equals( exp = exp_base64_value
31 | act = act_base64_value msg = 'value not determined correctly' ).
32 |
33 | ENDMETHOD.
34 |
35 | ENDCLASS.
36 |
--------------------------------------------------------------------------------
/src/zdbgl_getter.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_GETTER
7 | E
8 | read global variables from a testcase.
9 | 1
10 | X
11 | X
12 | X
13 | X
14 |
15 |
16 |
17 | CONSTRUCTOR
18 | C
19 | read variables from the testcase
20 |
21 |
22 | CONSTRUCTOR
23 | E
24 | read variables from the testcase
25 |
26 |
27 | GET_HEX_VALUE
28 | C
29 | read hexadecimal value for scalar value
30 |
31 |
32 | GET_HEX_VALUE
33 | E
34 | read hexadecimal value for scalar value
35 |
36 |
37 | GET_SIMPLE
38 | C
39 | read value for variable
40 |
41 |
42 | GET_SIMPLE
43 | E
44 | read value for variable
45 |
46 |
47 | GET_STRUCTUR
48 | C
49 | read value for a structure
50 |
51 |
52 | GET_STRUCTUR
53 | E
54 | read value for a structure
55 |
56 |
57 | GET_TABLE
58 | C
59 | read value for a table
60 |
61 |
62 | GET_TABLE
63 | E
64 | read value for a table
65 |
66 |
67 | LINE_HAS_SIMPLE_TYPE
68 | C
69 | line has simple type
70 |
71 |
72 | LINE_HAS_SIMPLE_TYPE
73 | E
74 | line has simple type
75 |
76 |
77 |
78 |
79 |
80 |
--------------------------------------------------------------------------------
/src/zdbgl_increment_version_no.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_INCREMENT_VERSION_NO
7 | E
8 | SAP_BOOL
9 | 55
10 | 10
11 | 20
12 | 40
13 | Increment version no of snapshot
14 | Increment version no
15 | Inc. vers
16 | Inc. version-no
17 | Increment version no
18 | E
19 | D
20 |
21 |
22 | C
23 |
24 |
25 | -
26 | C
27 | Increment version no of snapshot
28 | Increment version no
29 | Inc. vers
30 | Inc. version-no
31 | Increment version no
32 |
33 |
34 |
35 | -
36 |
37 | DE
38 |
39 | E
40 | E
41 | 0001
42 | X
43 | 00002
44 | R
45 |
46 |
47 | DOKU
48 | ZDBGL_INCREMENT_VERSION_NO
49 | DE
50 | E
51 | S_DOCU_SHOW
52 | S_DOCUS1
53 | 00001
54 | 072
55 |
56 |
57 |
58 | U1
59 | &DEFINITION&
60 |
61 |
62 | AS
63 | Increment version no before test data container is added to
64 |
65 |
66 | =
67 | transport request.
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
--------------------------------------------------------------------------------
/src/zdbgl_key_testcases.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_KEY_TESTCASES
7 | E
8 | 55
9 | 10
10 | 20
11 | 40
12 | Debugging Legacy Code name testcase
13 | name testcase
14 | name
15 | name testcase
16 | name testcase
17 | E
18 | CHAR
19 | 000010
20 | 000010
21 |
22 |
23 | C
24 | D
25 |
26 |
27 | -
28 | C
29 | Debugging Legacy Code name testcase
30 | name testcase
31 | name
32 | name testcase
33 | name testcase
34 |
35 | -
36 | D
37 | Debugging Legacy Code Name Testfall
38 | Name Testfall
39 | Name
40 | Name Testfall
41 | Name Testfall
42 |
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/src/zdbgl_locals.tabl.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_LOCALS
7 | E
8 | TRANSP
9 | X
10 | X
11 | Debugging Legacy Code locals
12 | A
13 | 4
14 |
15 |
16 | ZDBGL_LOCALS
17 | A
18 | 2
19 | APPL1
20 | X
21 | X
22 |
23 |
24 |
25 | MANDT
26 | X
27 | MANDT
28 | 0
29 | X
30 | E
31 |
32 |
33 | ABAP_PROGRAM
34 | X
35 | PROGNAME
36 | 0
37 | X
38 | E
39 |
40 |
41 | INCLUDE
42 | X
43 | TPDA_INCLUDE
44 | 0
45 | X
46 | E
47 |
48 |
49 | LINE
50 | X
51 | TPDA_SC_LINE
52 | 0
53 | X
54 | E
55 |
56 |
57 | KEY_TESTCASE
58 | X
59 | ZDBGL_KEY_TESTCASES
60 | 0
61 | X
62 | E
63 |
64 |
65 | KEY_DATA
66 | X
67 | 0
68 | X
69 | 000002
70 | X
71 | INT2
72 | 000005
73 | INT2
74 | continuous key
75 |
76 |
77 | .INCLUDE
78 | 0
79 | TPDA_SYS_EVENTINFO
80 | S
81 | TPDA: Event Information
82 | S
83 |
84 |
85 | LOCALS
86 | 0
87 | g
88 | 000008
89 | SSTR
90 | 001200
91 | SSTR
92 |
93 |
94 |
95 | C
96 |
97 |
98 | -
99 | C
100 | Debugging Legacy Code locals
101 |
102 |
103 |
104 |
105 |
106 |
--------------------------------------------------------------------------------
/src/zdbgl_script_rec_signature.prog.abap:
--------------------------------------------------------------------------------
1 | *
2 | REPORT rstpda_script_template.
3 |
4 | *
5 | *ZDBGL_SCRIPT_STORE_GLOBALS
6 | *LCL_DEBUGGER_SCRIPT
7 | *Debugger Skript: Default Template
8 | *X
9 |
10 | *
11 |
12 | *
13 |
14 | *
15 |
16 | *
17 | *---------------------------------------------------------------------*
18 | * CLASS lcl_debugger_script DEFINITION
19 | *---------------------------------------------------------------------*
20 | *
21 | *---------------------------------------------------------------------*
22 | CLASS lcl_debugger_script DEFINITION INHERITING FROM cl_tpda_script_class_super .
23 |
24 | PUBLIC SECTION.
25 | METHODS: prologue REDEFINITION,
26 | init REDEFINITION,
27 | script REDEFINITION,
28 | end REDEFINITION.
29 |
30 | PRIVATE SECTION.
31 |
32 | METHODS:
33 | get_locals
34 | IMPORTING
35 | source_info TYPE tpda_curr_source_pos
36 | RETURNING VALUE(result) TYPE REF TO zdbgl_getter
37 | RAISING zcx_dbgl_testcase cx_tpda,
38 | create_file_name
39 | IMPORTING
40 | source_info TYPE tpda_curr_source_pos
41 | RETURNING VALUE(result) TYPE string,
42 | get_file_system_path
43 | IMPORTING
44 | file_name TYPE string
45 | RETURNING VALUE(path) TYPE string,
46 | create_file
47 | IMPORTING
48 | path TYPE string
49 | signature_record TYPE REF TO zdbgl_signature_record.
50 |
51 | ENDCLASS. "lcl_debugger_script DEFINITION
52 | *---------------------------------------------------------------------*
53 | * CLASS lcl_debugger_script IMPLEMENTATION
54 | *---------------------------------------------------------------------*
55 | *
56 | *---------------------------------------------------------------------*
57 | CLASS lcl_debugger_script IMPLEMENTATION.
58 | METHOD prologue.
59 | *** generate abap_source (source handler for ABAP)
60 | super->prologue( ).
61 | ENDMETHOD. "prolog
62 |
63 | METHOD init.
64 | *** insert your initialization code here
65 | ENDMETHOD. "init
66 |
67 | METHOD script.
68 | DATA: source_info TYPE REF TO data,
69 | signature_record TYPE REF TO zdbgl_signature_record.
70 | FIELD-SYMBOLS: TYPE tpda_curr_source_pos.
71 |
72 | TRY.
73 | source_info = cl_tpda_ctrl_handler=>get_srcinfo( ).
74 | ASSIGN source_info->* TO .
75 |
76 | CREATE OBJECT signature_record.
77 |
78 | signature_record->record_function_mod_signature( EXPORTING
79 | recorded_locals = get_locals( )
80 | source_position = ).
81 |
82 | create_file( path = get_file_system_path( create_file_name( ) )
83 | signature_record = signature_record ).
84 |
85 | CATCH cx_static_check INTO DATA(fault).
86 | MESSAGE fault TYPE 'S' DISPLAY LIKE 'E'.
87 | ENDTRY.
88 | me->break( ).
89 |
90 | ENDMETHOD. "script
91 |
92 | METHOD end.
93 | *** insert your code which shall be executed at the end of the scripting (before trace is saved)
94 | *** here
95 |
96 | ENDMETHOD. "end
97 |
98 | METHOD get_locals.
99 | DATA: parser TYPE REF TO zdbgl_abstract_storage,
100 | function_module TYPE program.
101 |
102 | CREATE OBJECT parser TYPE zdbgl_store_locals.
103 | parser->handle( ).
104 |
105 | function_module = source_info-eventname.
106 | CREATE OBJECT result
107 | EXPORTING
108 | values = parser->concat_json_fragments_string( )
109 | program = function_module.
110 |
111 | ENDMETHOD.
112 |
113 | METHOD create_file_name.
114 | DATA: suffix TYPE char10.
115 |
116 | IF source_info-flag_eoev = abap_true.
117 | suffix = 'end.json'.
118 | ELSE.
119 | suffix = 'begin.json'.
120 | ENDIF.
121 | result = |{ source_info-eventname }_{ suffix }|.
122 |
123 | ENDMETHOD.
124 |
125 | METHOD get_file_system_path.
126 | DATA: fields TYPE STANDARD TABLE OF sval
127 | INITIAL SIZE 1,
128 | returncode(1),
129 | file_separator(1).
130 | FIELD-SYMBOLS: TYPE sval.
131 |
132 | cl_gui_frontend_services=>get_file_separator(
133 | CHANGING file_separator = file_separator ).
134 |
135 | APPEND INITIAL LINE TO fields ASSIGNING .
136 | -tabname = 'ZDBGL_EXPORT_PATH'.
137 | -fieldname = 'DIRECTORY_PATH'.
138 | -fieldtext = text-dir.
139 | -field_obl = abap_true.
140 | APPEND INITIAL LINE TO fields ASSIGNING .
141 | -tabname = 'ZDBGL_EXPORT_PATH'.
142 | -fieldname = 'FILENAME'.
143 | -fieldtext = text-fil.
144 | -field_obl = abap_true.
145 | -value = file_name.
146 |
147 | CALL FUNCTION 'POPUP_GET_VALUES'
148 | EXPORTING
149 | popup_title = text-tca
150 | IMPORTING
151 | returncode = returncode
152 | TABLES
153 | fields = fields.
154 | IF returncode = 'A'.
155 | RETURN.
156 | ENDIF.
157 |
158 | READ TABLE fields ASSIGNING INDEX 1.
159 | path = -value.
160 | READ TABLE fields ASSIGNING INDEX 2.
161 | CONCATENATE path file_separator -value INTO path.
162 |
163 | ENDMETHOD.
164 |
165 | METHOD create_file.
166 | TYPES line_type(200).
167 | DATA: file_content TYPE STANDARD TABLE OF line_type,
168 | _file_content TYPE string,
169 | offset TYPE i.
170 |
171 | signature_record->get_parameter_values( IMPORTING
172 | signature = _file_content ).
173 |
174 | WHILE offset <= strlen( _file_content ).
175 | APPEND _file_content+offset TO file_content.
176 | offset = offset + 200.
177 | ENDWHILE.
178 |
179 | cl_gui_frontend_services=>gui_download( EXPORTING
180 | filename = path filetype = 'ASC' codepage = '4110'
181 | write_lf = abap_false
182 | CHANGING data_tab = file_content ).
183 |
184 | ENDMETHOD.
185 |
186 | ENDCLASS. "lcl_debugger_script IMPLEMENTATION
187 | *
188 |
189 | *
190 |
--------------------------------------------------------------------------------
/src/zdbgl_script_rec_signature.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_SCRIPT_REC_SIGNATURE
7 | S
8 | E
9 | X
10 | X
11 |
12 |
13 | -
14 | R
15 | Record function module signatures
16 | 33
17 |
18 |
19 |
20 | -
21 | C
22 |
23 |
-
24 | R
25 | Record function module signatures
26 | 33
27 |
28 |
29 |
30 | -
31 | D
32 |
33 |
-
34 | I
35 | TCA
36 | Schlüssel Testfall
37 | 28
38 |
39 | -
40 | R
41 | Debugger Skript: Default Template
42 | 33
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/src/zdbgl_script_store_globals.prog.abap:
--------------------------------------------------------------------------------
1 | *
2 | REPORT rstpda_script_template.
3 |
4 | *
5 | *ZDBGL_SCRIPT_STORE_GLOBALS
6 | *LCL_DEBUGGER_SCRIPT
7 | *Debugger Skript: Default Template
8 | *X
9 |
10 | *
11 |
12 | *
13 |
14 | *
15 |
16 | *
17 | *---------------------------------------------------------------------*
18 | * CLASS lcl_debugger_script DEFINITION
19 | *---------------------------------------------------------------------*
20 | *
21 | *---------------------------------------------------------------------*
22 | CLASS lcl_debugger_script DEFINITION INHERITING FROM cl_tpda_script_class_super .
23 |
24 | PUBLIC SECTION.
25 | METHODS: prologue REDEFINITION,
26 | init REDEFINITION,
27 | script REDEFINITION,
28 | end REDEFINITION.
29 |
30 | PRIVATE SECTION.
31 |
32 | METHODS: get_key_testcase
33 | RETURNING VALUE(testcase) TYPE zdbgl_key_testcases.
34 |
35 | ENDCLASS. "lcl_debugger_script DEFINITION
36 | *---------------------------------------------------------------------*
37 | * CLASS lcl_debugger_script IMPLEMENTATION
38 | *---------------------------------------------------------------------*
39 | *
40 | *---------------------------------------------------------------------*
41 | CLASS lcl_debugger_script IMPLEMENTATION.
42 | METHOD prologue.
43 | *** generate abap_source (source handler for ABAP)
44 | super->prologue( ).
45 | ENDMETHOD. "prolog
46 |
47 | METHOD init.
48 | *** insert your initialization code here
49 | ENDMETHOD. "init
50 |
51 | METHOD script.
52 | DATA: key_testcase TYPE zdbgl_key_testcases,
53 | source_info TYPE REF TO data.
54 | FIELD-SYMBOLS: TYPE tpda_curr_source_pos.
55 |
56 | source_info = cl_tpda_ctrl_handler=>get_srcinfo( ).
57 | ASSIGN source_info->* TO .
58 | key_testcase = get_key_testcase( ).
59 | IF key_testcase IS INITIAL.
60 | RETURN.
61 | ENDIF.
62 | zdbgl_store_globals=>store(
63 | program = -program
64 | key_testcase = key_testcase
65 | force = abap_true ).
66 | me->break( ).
67 |
68 | ENDMETHOD. "script
69 |
70 | METHOD end.
71 | *** insert your code which shall be executed at the end of the scripting (before trace is saved)
72 | *** here
73 |
74 | ENDMETHOD. "end
75 |
76 | METHOD get_key_testcase.
77 | DATA: fields TYPE STANDARD TABLE OF sval
78 | INITIAL SIZE 1,
79 | returncode(1).
80 | FIELD-SYMBOLS: TYPE sval.
81 |
82 | APPEND INITIAL LINE TO fields ASSIGNING .
83 | -tabname = 'ZDBGL_VARIABLES'.
84 | -fieldname = 'KEY_TESTCASE'.
85 | -fieldtext = text-tca.
86 | -field_obl = abap_true.
87 |
88 | CALL FUNCTION 'POPUP_GET_VALUES'
89 | EXPORTING
90 | popup_title = text-tca
91 | IMPORTING
92 | returncode = returncode
93 | TABLES
94 | fields = fields.
95 | IF returncode = 'A'.
96 | RETURN.
97 | ENDIF.
98 |
99 | READ TABLE fields ASSIGNING INDEX 1.
100 | testcase = -value.
101 |
102 | ENDMETHOD.
103 |
104 | ENDCLASS. "lcl_debugger_script IMPLEMENTATION
105 | *
106 |
107 | *
108 |
--------------------------------------------------------------------------------
/src/zdbgl_script_store_globals.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_SCRIPT_STORE_GLOBALS
7 | S
8 | S
9 | X
10 | E
11 | X
12 | D$S
13 | X
14 |
15 |
16 | -
17 | R
18 | Debugger Script: default template
19 | 33
20 |
21 |
22 |
23 | -
24 | C
25 |
26 |
-
27 | R
28 | Debugger Script: default template
29 | 33
30 |
31 |
32 |
33 | -
34 | D
35 |
36 |
-
37 | I
38 | TCA
39 | Schlüssel Testfall
40 | 28
41 |
42 | -
43 | R
44 | Debugger Skript: Default Template
45 | 33
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/src/zdbgl_script_store_in_tdc.prog.abap:
--------------------------------------------------------------------------------
1 | *
2 | REPORT rstpda_script_template.
3 |
4 | *
5 | *ZDBGL_SCRIPT_STORE_GLOBALS
6 | *LCL_DEBUGGER_SCRIPT
7 | *Debugger Skript: Default Template
8 | *X
9 |
10 | *
11 |
12 | *
13 |
14 | *
15 |
16 | *
17 | *---------------------------------------------------------------------*
18 | * CLASS lcl_debugger_script DEFINITION
19 | *---------------------------------------------------------------------*
20 | *
21 | *---------------------------------------------------------------------*
22 | CLASS lcl_debugger_script DEFINITION INHERITING FROM cl_tpda_script_class_super .
23 |
24 | PUBLIC SECTION.
25 | METHODS: prologue REDEFINITION,
26 | init REDEFINITION,
27 | script REDEFINITION,
28 | end REDEFINITION.
29 |
30 | PRIVATE SECTION.
31 | METHODS get_key_tdc_variant
32 | RETURNING VALUE(result) TYPE zdbgl_tdc_variant_key1.
33 |
34 | METHODS dequeue
35 | IMPORTING
36 | key_tdc_variant TYPE zdbgl_tdc_variant_key1.
37 |
38 | ENDCLASS. "lcl_debugger_script DEFINITION
39 | *---------------------------------------------------------------------*
40 | * CLASS lcl_debugger_script IMPLEMENTATION
41 | *---------------------------------------------------------------------*
42 | *
43 | *---------------------------------------------------------------------*
44 | CLASS lcl_debugger_script IMPLEMENTATION.
45 | METHOD prologue.
46 | *** generate abap_source (source handler for ABAP)
47 | super->prologue( ).
48 | ENDMETHOD. "prolog
49 |
50 | METHOD init.
51 | *** insert your initialization code here
52 | ENDMETHOD. "init
53 |
54 | METHOD script.
55 | DATA: key_tdc_variant TYPE zdbgl_tdc_variant_key1,
56 | globals_parser TYPE REF TO zdbgl_store_globals,
57 | locals_parser TYPE REF TO zdbgl_store_locals,
58 | source_info TYPE REF TO data,
59 | exception TYPE REF TO cx_static_check,
60 | appl_log TYPE REF TO zif_logger,
61 | ##NEEDED
62 | mtext TYPE string.
63 | FIELD-SYMBOLS: TYPE tpda_curr_source_pos.
64 |
65 | appl_log = zcl_logger_factory=>create_log( ).
66 | TRY.
67 |
68 | source_info = cl_tpda_ctrl_handler=>get_srcinfo( ).
69 | ASSIGN source_info->* TO .
70 |
71 | key_tdc_variant = get_key_tdc_variant( ).
72 | IF key_tdc_variant IS INITIAL.
73 | RETURN.
74 | ENDIF.
75 | zdbgl_utils=>ask_for_transport_request( CHANGING
76 | key_tdc_variant = key_tdc_variant-a ).
77 |
78 | MESSAGE s000(zdbgl) INTO mtext.
79 | appl_log->add( ).
80 | CREATE OBJECT globals_parser
81 | EXPORTING
82 | program = -program.
83 | CREATE OBJECT locals_parser.
84 |
85 | zdbgl_copy_to_tdc=>copy_from_debugger(
86 | tdc_variant_key = key_tdc_variant-a program = -program
87 | debugger_parser = globals_parser appl_log = appl_log ).
88 | zdbgl_copy_to_tdc=>copy_from_debugger(
89 | tdc_variant_key = key_tdc_variant-a program = -program
90 | debugger_parser = locals_parser appl_log = appl_log ).
91 | IF lines( appl_log->export_to_table( ) ) = 1.
92 | dequeue( key_tdc_variant ).
93 | MESSAGE s001(zdbgl) DISPLAY LIKE 'E'.
94 | RETURN.
95 | ENDIF.
96 | COMMIT WORK.
97 |
98 | IF key_tdc_variant-display_app_log = abap_true.
99 | appl_log->popup( ).
100 | ENDIF.
101 |
102 | CATCH cx_static_check INTO exception.
103 | dequeue( key_tdc_variant ).
104 | MESSAGE exception TYPE 'S' DISPLAY LIKE 'E'.
105 | ENDTRY.
106 |
107 | me->break( ).
108 |
109 | ENDMETHOD. "script
110 |
111 | METHOD dequeue.
112 |
113 | DO 2 TIMES.
114 | CALL FUNCTION 'DEQUEUE_E_ECATT_TD'
115 | EXPORTING
116 | name = key_tdc_variant-name
117 | _scope = 1.
118 | ENDDO.
119 |
120 | ENDMETHOD.
121 |
122 | METHOD end.
123 | *** insert your code which shall be executed at the end of the scripting (before trace is saved)
124 | *** here
125 |
126 | ENDMETHOD. "end
127 |
128 | METHOD get_key_tdc_variant.
129 | DATA: fields TYPE STANDARD TABLE OF sval
130 | INITIAL SIZE 3,
131 | returncode(1).
132 | FIELD-SYMBOLS: TYPE sval.
133 |
134 | APPEND INITIAL LINE TO fields ASSIGNING .
135 | -tabname = 'ZDBGL_TDC_VARIANT_KEY1'.
136 | -fieldname = 'NAME'.
137 | -fieldtext = text-nam.
138 | -field_obl = abap_true.
139 | APPEND INITIAL LINE TO fields ASSIGNING .
140 | -tabname = 'ZDBGL_TDC_VARIANT_KEY1'.
141 | -fieldname = 'VERSION'.
142 | -fieldtext = text-ver.
143 | -field_obl = abap_true.
144 | APPEND INITIAL LINE TO fields ASSIGNING .
145 | -tabname = 'ZDBGL_TDC_VARIANT_KEY1'.
146 | -fieldname = 'VARIANT_NAME'.
147 | -fieldtext = text-var.
148 | -field_obl = abap_true.
149 | APPEND INITIAL LINE TO fields ASSIGNING .
150 | -tabname = 'ZDBGL_TDC_VARIANT_KEY1'.
151 | -fieldname = 'DISPLAY_APP_LOG'.
152 | -fieldtext = text-dis.
153 |
154 | CALL FUNCTION 'POPUP_GET_VALUES'
155 | EXPORTING
156 | popup_title = text-tdc
157 | IMPORTING
158 | returncode = returncode
159 | TABLES
160 | fields = fields.
161 | IF returncode = 'A'.
162 | RETURN.
163 | ENDIF.
164 |
165 | READ TABLE fields ASSIGNING INDEX 1.
166 | result-name = -value.
167 | READ TABLE fields ASSIGNING INDEX 2.
168 | result-version = -value.
169 | READ TABLE fields ASSIGNING INDEX 3.
170 | result-variant_name = -value.
171 | READ TABLE fields ASSIGNING INDEX 4.
172 | result-display_app_log = -value.
173 |
174 | ENDMETHOD.
175 |
176 | ENDCLASS. "lcl_debugger_script IMPLEMENTATION
177 | *
178 |
179 | *
180 |
--------------------------------------------------------------------------------
/src/zdbgl_script_store_in_tdc.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_SCRIPT_STORE_IN_TDC
7 | S
8 | S
9 | X
10 | E
11 | X
12 | D$S
13 | X
14 |
15 |
16 | -
17 | R
18 | Debugger Script: default template
19 | 33
20 |
21 |
22 |
23 | -
24 | C
25 |
26 |
-
27 | R
28 | Debugger Script: default template
29 | 33
30 |
31 |
32 |
33 | -
34 | D
35 |
36 |
-
37 | I
38 | TCA
39 | Schlüssel Testfall
40 | 28
41 |
42 | -
43 | R
44 | Debugger Skript: Default Template
45 | 33
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/src/zdbgl_script_store_locals.prog.abap:
--------------------------------------------------------------------------------
1 | *
2 | REPORT rstpda_script_template.
3 |
4 | *
5 | *ZDBGL_SCRIPT_STORE_GLOBALS
6 | *LCL_DEBUGGER_SCRIPT
7 | *Debugger Skript: Default Template
8 | *X
9 |
10 | *
11 |
12 | *
13 |
14 | *
15 |
16 | *
17 | *---------------------------------------------------------------------*
18 | * CLASS lcl_debugger_script DEFINITION
19 | *---------------------------------------------------------------------*
20 | *
21 | *---------------------------------------------------------------------*
22 | CLASS lcl_debugger_script DEFINITION INHERITING FROM cl_tpda_script_class_super .
23 |
24 | PUBLIC SECTION.
25 | METHODS: prologue REDEFINITION,
26 | init REDEFINITION,
27 | script REDEFINITION,
28 | end REDEFINITION.
29 |
30 | PRIVATE SECTION.
31 |
32 | METHODS: get_key_testcase
33 | RETURNING VALUE(testcase) TYPE zdbgl_key_testcases.
34 |
35 | ENDCLASS. "lcl_debugger_script DEFINITION
36 | *---------------------------------------------------------------------*
37 | * CLASS lcl_debugger_script IMPLEMENTATION
38 | *---------------------------------------------------------------------*
39 | *
40 | *---------------------------------------------------------------------*
41 | CLASS lcl_debugger_script IMPLEMENTATION.
42 | METHOD prologue.
43 | *** generate abap_source (source handler for ABAP)
44 | super->prologue( ).
45 | ENDMETHOD. "prolog
46 |
47 | METHOD init.
48 | *** insert your initialization code here
49 | ENDMETHOD. "init
50 |
51 | METHOD script.
52 | DATA: key_testcase TYPE zdbgl_key_testcases,
53 | source_info TYPE REF TO data.
54 | FIELD-SYMBOLS: TYPE tpda_curr_source_pos.
55 |
56 | source_info = cl_tpda_ctrl_handler=>get_srcinfo( ).
57 | ASSIGN source_info->* TO .
58 | key_testcase = get_key_testcase( ).
59 | IF key_testcase IS INITIAL.
60 | RETURN.
61 | ENDIF.
62 | zdbgl_store_locals=>store(
63 | source_position =
64 | key_testcase = key_testcase
65 | force = abap_true ).
66 | me->break( ).
67 |
68 | ENDMETHOD. "script
69 |
70 | METHOD end.
71 | *** insert your code which shall be executed at the end of the scripting (before trace is saved)
72 | *** here
73 |
74 | ENDMETHOD. "end
75 |
76 | METHOD get_key_testcase.
77 | DATA: fields TYPE STANDARD TABLE OF sval
78 | INITIAL SIZE 1,
79 | returncode(1).
80 | FIELD-SYMBOLS: TYPE sval.
81 |
82 | APPEND INITIAL LINE TO fields ASSIGNING .
83 | -tabname = 'ZDBGL_LOCALS'.
84 | -fieldname = 'KEY_TESTCASE'.
85 | -fieldtext = text-tca.
86 | -field_obl = abap_true.
87 |
88 | CALL FUNCTION 'POPUP_GET_VALUES'
89 | EXPORTING
90 | popup_title = text-tca
91 | IMPORTING
92 | returncode = returncode
93 | TABLES
94 | fields = fields.
95 | IF returncode = 'A'.
96 | RETURN.
97 | ENDIF.
98 |
99 | READ TABLE fields ASSIGNING INDEX 1.
100 | testcase = -value.
101 |
102 | ENDMETHOD.
103 |
104 | ENDCLASS. "lcl_debugger_script IMPLEMENTATION
105 | *
106 |
107 | *
108 |
--------------------------------------------------------------------------------
/src/zdbgl_script_store_locals.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_SCRIPT_STORE_LOCALS
7 | S
8 | S
9 | X
10 | E
11 | X
12 | D$S
13 | X
14 |
15 |
16 | -
17 | R
18 | Debugger Script: default template
19 | 33
20 |
21 |
22 |
23 | -
24 | C
25 |
26 |
-
27 | R
28 | Debugger Script: default template
29 | 33
30 |
31 |
32 |
33 | -
34 | D
35 |
36 |
-
37 | I
38 | TCA
39 | Schlüssel Testfall
40 | 28
41 |
42 | -
43 | R
44 | Debugger Skript: Default Template
45 | 33
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/src/zdbgl_signature_record.clas.abap:
--------------------------------------------------------------------------------
1 | class ZDBGL_SIGNATURE_RECORD definition
2 | public
3 | final
4 | create public .
5 |
6 | public section.
7 |
8 | methods RECORD_FUNCTION_MOD_SIGNATURE
9 | importing
10 | !RECORDED_LOCALS type ref to ZDBGL_GETTER
11 | !SOURCE_POSITION type TPDA_CURR_SOURCE_POS
12 | returning
13 | value(INSTANCE) type ref to ZDBGL_SIGNATURE_RECORD
14 | raising
15 | ZCX_DBGL_TESTCASE
16 | ZCX_DBGL_TYPE_NOT_SUPPORTED .
17 | methods GET_PARAMETER_VALUES
18 | exporting
19 | values_as_json type ref to cl_sxml_string_writer
20 | declaration_as_json type ref to cl_sxml_string_writer
21 | signature type string.
22 | protected section.
23 | private section.
24 |
25 | types:
26 | begin of parameter_type,
27 | is_optional TYPE xsdboolean,
28 | is_import TYPE xsdboolean,
29 | is_export TYPE xsdboolean,
30 | is_changing TYPE xsdboolean,
31 | is_table TYPE xsdboolean,
32 | dictionary_type TYPE likefield,
33 | kind TYPE abap_typecategory,
34 | END OF parameter_type.
35 | types:
36 | BEGIN OF _parameter_declaration,
37 | name TYPE string,
38 | type TYPE parameter_type,
39 | value_ref TYPE REF TO data,
40 | END OF _parameter_declaration .
41 |
42 | data PARAMETER_VALUES type ABAP_TRANS_SRCBIND_TAB .
43 | DATA parameter_declaration TYPE ABAP_TRANS_SRCBIND_TAB .
44 | DATA signature TYPE STANDARD TABLE OF _parameter_declaration.
45 | DATA function_module TYPE rs38l_fnam.
46 | DATA end_reached TYPE abap_bool.
47 |
48 | methods GET_FUNCTION_MOD_SIGNATURE
49 | importing
50 | !NAME type RS38L_FNAM.
51 | ENDCLASS.
52 |
53 |
54 |
55 | CLASS ZDBGL_SIGNATURE_RECORD IMPLEMENTATION.
56 |
57 |
58 | method GET_FUNCTION_MOD_SIGNATURE.
59 | DATA: parameter_declaration TYPE STANDARD TABLE OF rfc_fint_p,
60 | parameter TYPE _parameter_declaration.
61 |
62 | CALL FUNCTION 'RFC_GET_FUNCTION_INTERFACE_P'
63 | EXPORTING
64 | funcname = name
65 | TABLES
66 | params_p = parameter_declaration.
67 |
68 | LOOP AT parameter_declaration REFERENCE INTO DATA(_parameter).
69 |
70 | CLEAR parameter.
71 | parameter-name = _parameter->*-parameter.
72 | parameter-type-is_optional = _parameter->*-optional.
73 | CASE _parameter->*-paramclass.
74 | WHEN 'I'.
75 | parameter-type-is_import = abap_true.
76 | WHEN 'E'.
77 | parameter-type-is_export = abap_true.
78 | WHEN 'C'.
79 | parameter-type-is_changing = abap_true.
80 | WHEN 'T'.
81 | parameter-type-is_table = abap_true.
82 | WHEN OTHERS.
83 | " Don't consider exceptions
84 | CONTINUE.
85 | ENDCASE.
86 | IF _parameter->*-fieldname IS INITIAL.
87 | parameter-type-dictionary_type = _parameter->*-tabname.
88 | ELSE.
89 | parameter-type-dictionary_type = |{ _parameter->*-tabname }-{ _parameter->*-fieldname }|.
90 | ENDIF.
91 |
92 | DATA(data_descr) = cl_abap_typedescr=>describe_by_name( parameter-type-dictionary_type ).
93 | IF data_descr->kind <> data_descr->kind_table AND parameter-type-is_table = abap_true.
94 | " Tables can be referenced with a flat structure
95 | CREATE DATA parameter-value_ref TYPE STANDARD TABLE OF (parameter-type-dictionary_type).
96 | parameter-type-kind = data_descr->kind_table.
97 | ELSE.
98 | parameter-type-kind = data_descr->kind.
99 | CREATE DATA parameter-value_ref TYPE (parameter-type-dictionary_type).
100 | ENDIF.
101 |
102 | INSERT parameter INTO TABLE signature.
103 |
104 | ENDLOOP.
105 |
106 | endmethod.
107 |
108 |
109 | method GET_PARAMETER_VALUES.
110 | DATA: values_decoded TYPE string,
111 | declaration_decoded TYPE string,
112 | decoder TYPE REF TO cl_abap_conv_in_ce,
113 | signature_decoded TYPE string,
114 | header TYPE string.
115 |
116 | decoder = cl_abap_conv_in_ce=>create( encoding = 'UTF-8' ).
117 |
118 | values_as_json = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
119 | declaration_as_json = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
120 |
121 | CALL TRANSFORMATION id
122 | SOURCE (parameter_values)
123 | RESULT XML values_as_json.
124 |
125 | CALL TRANSFORMATION id
126 | SOURCE (parameter_declaration)
127 | RESULT XML declaration_as_json.
128 |
129 | decoder->convert( EXPORTING input = values_as_json->get_output( )
130 | IMPORTING data = values_decoded ).
131 | decoder->convert( EXPORTING input = declaration_as_json->get_output( )
132 | IMPORTING data = declaration_decoded ).
133 |
134 | IF end_reached = abap_true.
135 | header = |"function_module":"{ function_module }","end_reached":true|.
136 | ELSE.
137 | header = |"function_module":"{ function_module }"|.
138 | ENDIF.
139 | signature = |\{{ header },"declaration":{ declaration_decoded },"values":{ values_decoded }\}|.
140 |
141 | endmethod.
142 |
143 |
144 | METHOD record_function_mod_signature.
145 | DATA: parameter_value TYPE ABAP_TRANS_SRCBIND.
146 |
147 | IF source_position-eventtype <> 'FUNCTION'.
148 | RAISE EXCEPTION TYPE zcx_dbgl_testcase
149 | EXPORTING
150 | textid = zcx_dbgl_testcase=>no_function_module.
151 | ENDIF.
152 |
153 | function_module = source_position-eventname.
154 | end_reached = source_position-flag_eoev.
155 | get_function_mod_signature( EXPORTING name = function_module ).
156 | LOOP AT signature ASSIGNING FIELD-SYMBOL().
157 |
158 | ASSIGN -value_ref->* TO FIELD-SYMBOL().
159 | CASE -type-kind.
160 | WHEN cl_abap_datadescr=>kind_elem.
161 | recorded_locals->get_simple( EXPORTING name = -name
162 | IMPORTING value = ).
163 | WHEN cl_abap_datadescr=>kind_struct.
164 | recorded_locals->get_structur( EXPORTING name = -name
165 | IMPORTING value = ).
166 | WHEN cl_abap_datadescr=>kind_table.
167 | recorded_locals->get_table( EXPORTING name = -name
168 | IMPORTING value = ).
169 | WHEN OTHERS.
170 | CONTINUE.
171 | ENDCASE.
172 |
173 | parameter_value-name = -name.
174 | GET REFERENCE OF -type INTO parameter_value-value.
175 | INSERT parameter_value INTO TABLE parameter_declaration.
176 | INSERT VALUE #( name = -name value = -value_ref )
177 | INTO TABLE parameter_values.
178 |
179 | ENDLOOP.
180 |
181 | instance = me.
182 |
183 | ENDMETHOD.
184 | ENDCLASS.
185 |
--------------------------------------------------------------------------------
/src/zdbgl_signature_record.clas.testclasses.abap:
--------------------------------------------------------------------------------
1 | CLASS test_signature_record DEFINITION FOR TESTING
2 | DURATION SHORT RISK LEVEL HARMLESS.
3 |
4 | PRIVATE SECTION.
5 |
6 | METHODS record_sample_function_mod FOR TESTING
7 | RAISING cx_static_check.
8 |
9 | ENDCLASS.
10 |
11 | CLASS test_signature_record IMPLEMENTATION.
12 |
13 | METHOD record_sample_function_mod.
14 | DATA: exp_declaration TYPE string,
15 | act_declaration TYPE string,
16 | exp_signature TYPE string,
17 | act_signature TYPE string,
18 | exp_values TYPE string,
19 | act_values TYPE string.
20 |
21 | " given
22 | DATA(recorder) = NEW zdbgl_getter( values =
23 | `{"TABLE":[{"MANDT":"ICAg","CARRID":"TEgg","CONNID":"NTAwMA==",` &&
24 | `"FLDATE":"MjAyMDAyMDY=","PRICE":"AAAAAAAAAAw=","CURRENCY":"ICAgICA=",` &&
25 | `"PLANETYPE":"ICAgICAgICAgIA==","SEATSMAX":"AAAAAA==","SEATSOCC":"AAAAAA==",` &&
26 | `"PAYMENTSUM":"AAAAAAAAAAAM","SEATSMAX_B":"AAAAAA==",` &&
27 | `"SEATSOCC_B":"AAAAAA==","SEATSMAX_F":"AAAAAA==","SEATSOCC_F":"AAAAAA=="}],` &&
28 | `"E_MESSAGE":"","C_PARAMETER":{"MANDT":"ICAg","CARRID":"TEcg","CONNID":"MDUwMA==",` &&
29 | `"FLDATE":"MjAyMDAyMDU=","PRICE":"AAAAAAAAAAw=","CURRENCY":"ICAgICA=","PLANETYPE":"ICAgICAgICAgIA==",` &&
30 | `"SEATSMAX":"AAAAAA==","SEATSOCC":"AAAAAA==","PAYMENTSUM":"AAAAAAAAAAAM",` &&
31 | `"SEATSMAX_B":"AAAAAA==","SEATSOCC_B":"AAAAAA==","SEATSMAX_F":"AAAAAA==",` &&
32 | `"SEATSOCC_F":"AAAAAA=="},"I_ABAP_BUILT_IN":"AgAAAA==","I_DICTIONARY_TYPE":` &&
33 | `{"MANDT":"ICAg","CARRID":"TEgg","CARRNAME":"TFVGVEhBTlNBICAgICAgICAgICA=",` &&
34 | `"CURRCODE":"ICAgICA=","URL":"ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg` &&
35 | `ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg` &&
36 | `ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg` &&
37 | `ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg"}}`
38 | program = 'ZDBGL_DEMO_MODULE' ).
39 |
40 | " when
41 | DATA(cut) = NEW zdbgl_signature_record( )->record_function_mod_signature(
42 | recorded_locals = recorder
43 | source_position = VALUE #( eventtype = 'FUNCTION' eventname = 'ZDBGL_DEMO_MODULE' ) ).
44 | cut->get_parameter_values( IMPORTING values_as_json = DATA(act_binary_values)
45 | declaration_as_json = DATA(act_binary_declaration) signature = act_signature ).
46 |
47 | " then
48 | exp_declaration = `{"C_PARAMETER":{"IS_OPTIONAL":false,"IS_IMPORT":false,"IS_EXPORT":false,"IS_CHANGING":true,"IS_TABLE":false,"DICTIONARY_TYPE":"SFLIGHT","KIND":"S"},` &&
49 | `"E_MESSAGE":{"IS_OPTIONAL":false,"IS_IMPORT":false,"IS_EXPORT":true,"IS_CHANGING":false,"IS_TABLE":false,"DICTIONARY_TYPE":"STRING","KIND":"E"},` &&
50 | `"I_ABAP_BUILT_IN":{"IS_OPTIONAL":false,"IS_IMPORT":true,"IS_EXPORT":false,"IS_CHANGING":false,"IS_TABLE":false,"DICTIONARY_TYPE":"INT4","KIND":"E"},` &&
51 | `"I_DICTIONARY_TYPE":{"IS_OPTIONAL":false,"IS_IMPORT":true,"IS_EXPORT":false,"IS_CHANGING":false,"IS_TABLE":false,"DICTIONARY_TYPE":"SCARR","KIND":"S"},` &&
52 | `"TABLE":{"IS_OPTIONAL":false,"IS_IMPORT":false,"IS_EXPORT":false,"IS_CHANGING":false,"IS_TABLE":true,"DICTIONARY_TYPE":"SFLIGHT","KIND":"T"}}`.
53 | exp_values = `{"C_PARAMETER":{"MANDT":"","CARRID":"LG","CONNID":"0500","FLDATE":"2020-02-05","PRICE":0.0,"CURRENCY":"","PLANETYPE":"","SEATSMAX":0,"SEATSOCC":0,"PAYMENTSUM":0.0,"SEATSMAX_B":0,"SEATSOCC_B":0,"SEATSMAX_F":0,"SEATSOCC_F":0},` &&
54 | `"E_MESSAGE":"","I_ABAP_BUILT_IN":2,"I_DICTIONARY_TYPE":{"MANDT":"","CARRID":"LH","CARRNAME":"LUFTHANSA","CURRCODE":"","URL":""},` &&
55 | `"TABLE":[{"MANDT":"","CARRID":"LH","CONNID":"5000","FLDATE":"2020-02-06","PRICE":0.0,"CURRENCY":"","PLANETYPE":"","SEATSMAX":0,"SEATSOCC":0,"PAYMENTSUM":0.0,"SEATSMAX_B":0,"SEATSOCC_B":0,"SEATSMAX_F":0,"SEATSOCC_F":0}]}`.
56 | exp_signature = |\{"function_module":"ZDBGL_DEMO_MODULE","declaration":{ exp_declaration },"values":{ exp_values }\}|.
57 |
58 | DATA(converter) = cl_abap_conv_in_ce=>create( encoding = 'UTF-8' ).
59 | converter->convert( EXPORTING input = act_binary_values->get_output( )
60 | IMPORTING data = act_values ).
61 | converter->convert( EXPORTING input = act_binary_declaration->get_output( )
62 | IMPORTING data = act_declaration ).
63 | cl_abap_unit_assert=>assert_equals( exp = exp_values act = act_values ).
64 | cl_abap_unit_assert=>assert_equals( exp = exp_declaration act = act_declaration ).
65 | cl_abap_unit_assert=>assert_equals( exp = exp_signature act = act_signature ).
66 |
67 | ENDMETHOD.
68 |
69 | ENDCLASS.
70 |
--------------------------------------------------------------------------------
/src/zdbgl_signature_record.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_SIGNATURE_RECORD
7 | E
8 | Record function module signatures
9 | 1
10 | X
11 | X
12 | X
13 | X
14 |
15 |
16 |
17 | GET_PARAMETER_VALUES
18 | C
19 | serialized as json
20 |
21 |
22 | GET_PARAMETER_VALUES
23 | E
24 | serialized as json
25 |
26 |
27 | RECORD_FUNCTION_MOD_SIGNATURE
28 | C
29 | Record signature
30 |
31 |
32 | RECORD_FUNCTION_MOD_SIGNATURE
33 | E
34 | Record signature
35 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/src/zdbgl_snap_record.para.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_SNAP_RECORD
7 |
8 |
9 | ZDBGL_SNAP_RECORD
10 | E
11 | create/update snapshots
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/src/zdbgl_snapshots.prog.abap:
--------------------------------------------------------------------------------
1 | *&---------------------------------------------------------------------*
2 | *& Report ZDBGL_SNAPSHOTS
3 | *& This sample reports shows how to create and use snapshots
4 | *& in ABAP unit testing.
5 | *&---------------------------------------------------------------------*
6 | REPORT ZDBGL_SNAPSHOTS.
7 |
8 | CLASS test_snapshot DEFINITION FOR TESTING
9 | DURATION SHORT RISK LEVEL HARMLESS.
10 |
11 | PRIVATE SECTION.
12 |
13 | METHODS flight_test FOR TESTING
14 | RAISING zcx_dbgl_snapshot.
15 |
16 | ENDCLASS.
17 |
18 | CLASS test_snapshot IMPLEMENTATION.
19 |
20 | METHOD flight_test.
21 |
22 | DATA(snapshot_manager) = CAST zif_dbgl_snapshots(
23 | NEW zdbgl_snapshots_tdc( key_tdc_variant =
24 | VALUE #( name = 'ZDBGL_TEST_SNAPSHOT1' version = 1 variant_name = 'ECATTDEFAULT' )
25 | )
26 | ).
27 |
28 | DATA(carrier) = VALUE scarr_tab(
29 | ( carrid = 'SAP' carrname = 'SAP Flights' )
30 | ( carrid = 'IN' carrname = 'Internat. Airways' )
31 | ).
32 | DATA(flight) = VALUE sflight( carrid = 'SAP' connid = 700 fldate = '20201231' ).
33 |
34 | snapshot_manager->compare_or_record( name = 'CARRIER' actual = carrier ).
35 | snapshot_manager->compare_or_record( name = 'FLIGHT' actual = flight ).
36 |
37 | " can be omitted, when autosave = abap_true in constructor
38 | snapshot_manager->commit_changes( ).
39 |
40 | ENDMETHOD.
41 |
42 | ENDCLASS.
43 |
--------------------------------------------------------------------------------
/src/zdbgl_snapshots.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_SNAPSHOTS
7 | 1
8 | T
9 | E
10 | X
11 | X
12 |
13 |
14 | -
15 | R
16 | Create and use snapshots in unit-tests
17 | 38
18 |
19 |
20 |
21 | -
22 | C
23 |
24 |
-
25 | R
26 | Create and use snapshots in unit-tests
27 | 38
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/src/zdbgl_snapshots_tdc.clas.testclasses.abap:
--------------------------------------------------------------------------------
1 | CLASS test_snapshot_tdc DEFINITION FOR TESTING
2 | DURATION SHORT RISK LEVEL DANGEROUS FINAL.
3 |
4 | PRIVATE SECTION.
5 | CONSTANTS: tdc_name TYPE etobj_name VALUE 'ZDBGL_TEST_SNAPSHOT'.
6 |
7 | METHODS setup
8 | RAISING cx_static_check.
9 |
10 | METHODS delete_snapshot.
11 |
12 | METHODS snapshot
13 | RAISING cx_static_check.
14 |
15 | METHODS compare
16 | IMPORTING
17 | key_tdc_variant TYPE zdbgl_tdc_variant_key
18 | RAISING cx_static_check.
19 |
20 | METHODS compare_version_1 FOR TESTING
21 | RAISING cx_static_check.
22 |
23 | METHODS compare_latest_version FOR TESTING
24 | RAISING cx_static_check.
25 |
26 | ENDCLASS.
27 |
28 | CLASS test_snapshot_tdc IMPLEMENTATION.
29 |
30 | METHOD setup.
31 |
32 | delete_snapshot( ).
33 | snapshot( ).
34 |
35 | ENDMETHOD.
36 |
37 | METHOD delete_snapshot.
38 |
39 | TRY.
40 | cl_apl_ecatt_tdc_api=>delete_tdc( i_name = tdc_name i_version = 1 ).
41 | ##NO_HANDLER
42 | CATCH cx_ecatt_tdc_access.
43 | ENDTRY.
44 |
45 | ENDMETHOD.
46 |
47 | METHOD snapshot.
48 | DATA: carrier TYPE HASHED TABLE OF scarr WITH UNIQUE KEY carrid.
49 |
50 | carrier = VALUE #(
51 | ( carrid = 'SAP' carrname = 'SAP Flights' )
52 | ( carrid = 'IN' carrname = 'Internat Airways' )
53 | ).
54 | DATA(flight) = VALUE sflight( carrid = 'SAP' connid = 700 fldate = '20201231' ).
55 |
56 | SET PARAMETER ID 'ZDBGL_SNAP_RECORD' FIELD abap_true.
57 |
58 | DATA(snapshot_manager) = CAST zif_dbgl_snapshots( NEW zdbgl_snapshots_tdc(
59 | key_tdc_variant = VALUE #( name = tdc_name version = 1 variant_name = 'ECATTDEFAULT' ) ) ).
60 |
61 | snapshot_manager->compare_or_record( name = 'CARRIER' actual = carrier ).
62 | snapshot_manager->compare_or_record( name = 'FLIGHT' actual = flight ).
63 |
64 | snapshot_manager->commit_changes( ).
65 |
66 | ENDMETHOD.
67 |
68 | METHOD compare.
69 | DATA: carrier TYPE HASHED TABLE OF scarr WITH UNIQUE KEY carrid.
70 |
71 | carrier = VALUE #(
72 | ( carrid = 'SAP' carrname = 'SAP Flights' )
73 | ( carrid = 'IN' carrname = 'Internat Airways' )
74 | ).
75 |
76 | DATA(flight) = VALUE sflight( carrid = 'SAP' connid = 700 fldate = '20201231' ).
77 |
78 | SET PARAMETER ID 'ZDBGL_SNAP_RECORD' FIELD abap_false.
79 |
80 | DATA(snapshot_manager) = CAST zif_dbgl_snapshots( NEW zdbgl_snapshots_tdc(
81 | key_tdc_variant = key_tdc_variant ) ).
82 |
83 | snapshot_manager->compare_or_record( name = 'CARRIER' actual = carrier ).
84 | snapshot_manager->compare_or_record( name = 'FLIGHT' actual = flight ).
85 |
86 | ENDMETHOD.
87 |
88 | METHOD compare_version_1.
89 |
90 | compare( VALUE #( name = tdc_name version = 1 variant_name = 'ECATTDEFAULT' ) ).
91 |
92 | ENDMETHOD.
93 |
94 | METHOD compare_latest_version.
95 |
96 | compare( VALUE #( name = tdc_name variant_name = 'ECATTDEFAULT' use_latest_version = abap_true ) ).
97 |
98 | ENDMETHOD.
99 |
100 | ENDCLASS.
101 |
--------------------------------------------------------------------------------
/src/zdbgl_snapshots_tdc.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_SNAPSHOTS_TDC
7 | E
8 | Snapshots storage in test data container
9 | 1
10 | X
11 | X
12 | X
13 | X
14 |
15 |
16 | -
17 | I
18 | 001
19 | Snapshots were recorded.
20 | 48
21 |
22 |
23 |
24 | -
25 | C
26 |
27 |
-
28 | I
29 | 001
30 | Snapshots were recorded.
31 | 48
32 |
33 |
34 |
35 | -
36 | D
37 |
38 |
-
39 | I
40 | 001
41 | Schnapschüsse wurden aufgezeichnet.
42 | 48
43 |
44 |
45 |
46 |
47 |
48 |
49 | COMPARE
50 | C
51 | released for redefinition
52 |
53 |
54 | COMPARE
55 | E
56 | released for redefinition
57 |
58 |
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/src/zdbgl_store_globals.acid.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debugger Wert globale Variablen festhalten
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/src/zdbgl_store_globals.clas.abap:
--------------------------------------------------------------------------------
1 | class ZDBGL_STORE_GLOBALS definition
2 | public
3 | inheriting from ZDBGL_ABSTRACT_STORAGE
4 | final
5 | create public .
6 |
7 | public section.
8 |
9 | class-methods STORE
10 | importing
11 | !PROGRAM type PROGNAME
12 | !KEY_TESTCASE type ZDBGL_KEY_TESTCASES
13 | !FORCE type SAP_BOOL
14 | raising
15 | CX_STATIC_CHECK .
16 | methods CONSTRUCTOR
17 | importing
18 | !PROGRAM type PROGNAME
19 | !IN_UNIT_TEST type SAP_BOOL optional
20 | raising
21 | CX_TPDA .
22 |
23 | methods HANDLE
24 | redefinition .
25 | protected section.
26 |
27 | data GLOBALS type TPDA_SCR_GLOBALS_IT .
28 | private section.
29 |
30 | types:
31 | _db_fragments TYPE STANDARD TABLE OF zdbgl_variables .
32 |
33 | methods CONCAT_JSON_FRAGMENTS_SSTRINGS
34 | exporting
35 | !DB_FRAGMENTS type _DB_FRAGMENTS .
36 | methods LOG_STORAGE
37 | importing
38 | !PROGRAM type PROGRAM
39 | !KEY_TESTCASE type ZDBGL_KEY_TESTCASES .
40 | methods GET_LENGTH_DB_FRAGMENT
41 | returning
42 | value(LENGTH) type I .
43 | ENDCLASS.
44 |
45 |
46 |
47 | CLASS ZDBGL_STORE_GLOBALS IMPLEMENTATION.
48 |
49 |
50 | METHOD CONCAT_JSON_FRAGMENTS_SSTRINGS.
51 | DATA: len TYPE i,
52 | offset TYPE i,
53 | json_as_string TYPE string.
54 | FIELD-SYMBOLS: TYPE zdbgl_variables.
55 |
56 | len = get_length_db_fragment( ).
57 | json_as_string = concat_json_fragments_string( ).
58 |
59 | WHILE offset < strlen( json_as_string ).
60 | APPEND INITIAL LINE TO db_fragments ASSIGNING .
61 | TRY.
62 | -globals = substring( val = json_as_string
63 | off = offset len = len ).
64 | offset = offset + len.
65 | CATCH cx_sy_range_out_of_bounds.
66 | -globals = substring( val = json_as_string
67 | off = offset ).
68 | offset = strlen( json_as_string ).
69 | ENDTRY.
70 | ENDWHILE.
71 |
72 | ENDMETHOD.
73 |
74 |
75 | method CONSTRUCTOR.
76 |
77 | super->constructor( ).
78 | IF in_unit_test = abap_false.
79 | globals = cl_tpda_script_data_descr=>globals(
80 | EXPORTING p_program = program ).
81 | ENDIF.
82 |
83 | endmethod.
84 |
85 |
86 | method GET_LENGTH_DB_FRAGMENT.
87 | DATA: field_desc TYPE STANDARD TABLE OF dfies.
88 |
89 | CALL FUNCTION 'DDIF_FIELDINFO_GET'
90 | EXPORTING
91 | tabname = 'ZDBGL_VARIABLES'
92 | fieldname = 'GLOBALS'
93 | TABLES
94 | dfies_tab = field_desc.
95 |
96 | READ TABLE field_desc ASSIGNING FIELD-SYMBOL()
97 | INDEX 1.
98 | length = -leng.
99 |
100 | endmethod.
101 |
102 |
103 | METHOD handle.
104 | FIELD-SYMBOLS: TYPE tpda_scr_globals.
105 |
106 | LOOP AT globals ASSIGNING .
107 |
108 | TRY.
109 | APPEND _handle( name = -name
110 | is_object = abap_true ) TO json_fragments.
111 | ##NO_HANDLER
112 | CATCH zcx_dbgl_type_not_supported.
113 | ENDTRY.
114 |
115 | ENDLOOP.
116 |
117 | ENDMETHOD.
118 |
119 |
120 | method LOG_STORAGE.
121 | DATA: subkey(200).
122 |
123 | subkey = program && '_' && key_testcase.
124 | LOG-POINT ID zdbgl_store_globals SUBKEY subkey
125 | FIELDS json_fragments.
126 |
127 | endmethod.
128 |
129 |
130 | METHOD store.
131 | DATA: parser TYPE REF TO zdbgl_store_globals,
132 | " Fragment in db table zdbgl_variables
133 | db_fragments TYPE _db_fragments,
134 | exception TYPE REF TO cx_root,
135 | exc_program TYPE syrepid,
136 | exc_include TYPE syrepid,
137 | exc_source_line TYPE i.
138 | FIELD-SYMBOLS: TYPE zdbgl_variables.
139 |
140 | TRY.
141 | CREATE OBJECT parser
142 | EXPORTING
143 | program = program.
144 |
145 | parser->handle( ).
146 |
147 | parser->log_storage( program = program
148 | key_testcase = key_testcase ).
149 | parser->concat_json_fragments_sstrings( IMPORTING db_fragments
150 | = db_fragments ).
151 |
152 | LOOP AT db_fragments ASSIGNING .
153 | -abap_program = program.
154 | -key_testcase = key_testcase.
155 | -key_data = sy-tabix.
156 | ENDLOOP.
157 |
158 | IF force = abap_true.
159 | DELETE FROM zdbgl_variables WHERE abap_program = program AND
160 | key_testcase = key_testcase.
161 | INSERT zdbgl_variables FROM TABLE db_fragments.
162 | ELSE.
163 | TRY.
164 | INSERT zdbgl_variables FROM TABLE db_fragments.
165 | CATCH cx_sy_open_sql_db INTO DATA(fail).
166 | IF fail->textid = fail->duplicate_key.
167 | RAISE EXCEPTION TYPE zcx_dbgl_testcase
168 | EXPORTING
169 | key_testcase = key_testcase
170 | textid = zcx_dbgl_testcase=>duplicate_testcase.
171 | ELSE.
172 | RAISE EXCEPTION fail.
173 | ENDIF.
174 | ENDTRY.
175 | ENDIF.
176 | COMMIT WORK.
177 |
178 | ##CATCH_ALL
179 | CATCH cx_root INTO exception.
180 | " log exception and raise again
181 | exception->get_source_position(
182 | IMPORTING program_name = exc_program include_name = exc_include
183 | source_line = exc_source_line ).
184 | LOG-POINT ID zdbgl_store_globals FIELDS program
185 | exception->get_text( ) exc_program exc_include exc_source_line.
186 | RAISE EXCEPTION exception.
187 | ENDTRY.
188 |
189 | ENDMETHOD.
190 | ENDCLASS.
191 |
--------------------------------------------------------------------------------
/src/zdbgl_store_globals.clas.testclasses.abap:
--------------------------------------------------------------------------------
1 | CLASS test_store_globals DEFINITION FOR TESTING
2 | DURATION SHORT RISK LEVEL HARMLESS FINAL.
3 |
4 | PRIVATE SECTION.
5 | DATA cut TYPE REF TO zdbgl_store_globals.
6 |
7 | METHODS setup
8 | RAISING cx_tpda.
9 |
10 | METHODS concat FOR TESTING.
11 |
12 | ENDCLASS.
13 |
14 | CLASS zdbgl_store_globals DEFINITION LOCAL FRIENDS test_store_globals.
15 |
16 | CLASS test_store_globals IMPLEMENTATION.
17 |
18 | METHOD setup.
19 |
20 | CREATE OBJECT cut
21 | EXPORTING
22 | program = space
23 | in_unit_test = abap_true.
24 |
25 | ENDMETHOD.
26 |
27 | METHOD concat.
28 | DATA: exp_db_fragments TYPE zdbgl_store_globals=>_db_fragments,
29 | act_db_fragments TYPE zdbgl_store_globals=>_db_fragments.
30 | FIELD-SYMBOLS: TYPE string,
31 | TYPE zdbgl_variables.
32 |
33 | APPEND INITIAL LINE TO cut->json_fragments ASSIGNING .
34 | DO 2499 TIMES.
35 | = && 'A'.
36 | ENDDO.
37 | APPEND INITIAL LINE TO cut->json_fragments ASSIGNING .
38 | DO 50 TIMES.
39 | = && 'B'.
40 | ENDDO.
41 |
42 | APPEND INITIAL LINE TO exp_db_fragments ASSIGNING .
43 | -globals = '{'.
44 | DO 1199 TIMES.
45 | -globals = -globals && 'A'.
46 | ENDDO.
47 | APPEND INITIAL LINE TO exp_db_fragments ASSIGNING .
48 | DO 1200 TIMES.
49 | -globals = -globals && 'A'.
50 | ENDDO.
51 |
52 | APPEND INITIAL LINE TO exp_db_fragments ASSIGNING .
53 | DO 100 TIMES.
54 | -globals = -globals && 'A'.
55 | ENDDO.
56 | -globals = -globals && ','.
57 | DO 50 TIMES.
58 | -globals = -globals && 'B'.
59 | ENDDO.
60 | -globals = -globals && '}'.
61 |
62 | cut->concat_json_fragments_sstrings( IMPORTING db_fragments = act_db_fragments ).
63 |
64 | cl_abap_unit_assert=>assert_equals( exp = exp_db_fragments
65 | act = act_db_fragments msg = 'Splitted Table' ).
66 |
67 | ENDMETHOD.
68 |
69 | ENDCLASS.
70 |
--------------------------------------------------------------------------------
/src/zdbgl_store_globals.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_STORE_GLOBALS
7 | E
8 | store global variables in database
9 | 1
10 | X
11 | X
12 | X
13 | X
14 |
15 |
16 |
17 | CONCAT_JSON_FRAGMENTS_SSTRINGS
18 | C
19 | concatenate json fragments to short strings
20 |
21 |
22 | CONCAT_JSON_FRAGMENTS_SSTRINGS
23 | E
24 | concatenate json fragments to short strings
25 |
26 |
27 | CONSTRUCTOR
28 | C
29 | read global variable in the constructor
30 |
31 |
32 | CONSTRUCTOR
33 | E
34 | read global variable in the constructor
35 |
36 |
37 | GET_LENGTH_DB_FRAGMENT
38 | C
39 | length fragment globals in table zdbgl_variables
40 |
41 |
42 | GET_LENGTH_DB_FRAGMENT
43 | E
44 | length fragment globals in table zdbgl_variables
45 |
46 |
47 | LOG_STORAGE
48 | C
49 | log saved values
50 |
51 |
52 | LOG_STORAGE
53 | E
54 | log saved values
55 |
56 |
57 | STORE
58 | C
59 | save new testcase in table zdbgl_variables
60 |
61 |
62 | STORE
63 | E
64 | save new testcase in table zdbgl_variables
65 |
66 |
67 |
68 |
69 |
70 |
--------------------------------------------------------------------------------
/src/zdbgl_store_locals.acid.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Store local variables
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/src/zdbgl_store_locals.clas.abap:
--------------------------------------------------------------------------------
1 | class ZDBGL_STORE_LOCALS definition
2 | public
3 | inheriting from ZDBGL_ABSTRACT_STORAGE
4 | final
5 | create public .
6 |
7 | public section.
8 |
9 | methods CONSTRUCTOR
10 | importing
11 | !IN_UNIT_TEST type SAP_BOOL optional .
12 | class-methods STORE
13 | IMPORTING
14 | source_position TYPE tpda_curr_source_pos
15 | key_testcase TYPE zdbgl_key_testcases
16 | force TYPE abap_bool
17 | RAISING
18 | cx_static_check.
19 | methods handle redefinition.
20 | protected section.
21 | private section.
22 |
23 | types:
24 | _db_fragments TYPE STANDARD TABLE OF zdbgl_locals .
25 |
26 | data LOCALS type TPDA_SCR_LOCALS_IT .
27 |
28 | methods GET_LENGTH_DB_FRAGMENT
29 | returning
30 | value(LENGTH) type I .
31 | methods LOG_STORAGE
32 | importing
33 | !SOURCE_POSITION type TPDA_CURR_SOURCE_POS
34 | !KEY_TESTCASE type ZDBGL_KEY_TESTCASES .
35 | class-methods MOVE_SP_TO_DB_FRAGMENT
36 | importing
37 | !SOURCE_POSITION type TPDA_CURR_SOURCE_POS
38 | changing
39 | !FRAGMENT type ZDBGL_LOCALS .
40 | methods CONCAT_JSON_FRAGMENTS_SSTRINGS
41 | exporting
42 | !DB_FRAGMENTS type _DB_FRAGMENTS .
43 | ENDCLASS.
44 |
45 |
46 |
47 | CLASS ZDBGL_STORE_LOCALS IMPLEMENTATION.
48 |
49 |
50 | METHOD concat_json_fragments_sstrings.
51 | DATA: len TYPE i,
52 | offset TYPE i,
53 | json_as_string TYPE string.
54 | FIELD-SYMBOLS: TYPE zdbgl_locals.
55 |
56 | len = get_length_db_fragment( ).
57 | json_as_string = concat_json_fragments_string( ).
58 |
59 | WHILE offset < strlen( json_as_string ).
60 | APPEND INITIAL LINE TO db_fragments ASSIGNING .
61 | TRY.
62 | -locals = substring( val = json_as_string
63 | off = offset len = len ).
64 | offset = offset + len.
65 | CATCH cx_sy_range_out_of_bounds.
66 | -locals = substring( val = json_as_string
67 | off = offset ).
68 | offset = strlen( json_as_string ).
69 | ENDTRY.
70 | ENDWHILE.
71 |
72 | ENDMETHOD.
73 |
74 |
75 | method CONSTRUCTOR.
76 |
77 | super->constructor( ).
78 | IF in_unit_test = abap_false.
79 | locals = cl_tpda_script_data_descr=>locals( ).
80 | ENDIF.
81 |
82 | endmethod.
83 |
84 |
85 | method GET_LENGTH_DB_FRAGMENT.
86 | DATA: field_desc TYPE STANDARD TABLE OF dfies.
87 |
88 | CALL FUNCTION 'DDIF_FIELDINFO_GET'
89 | EXPORTING
90 | tabname = 'ZDBGL_LOCALS'
91 | fieldname = 'LOCALS'
92 | TABLES
93 | dfies_tab = field_desc.
94 |
95 | READ TABLE field_desc ASSIGNING FIELD-SYMBOL()
96 | INDEX 1.
97 | length = -leng.
98 |
99 | endmethod.
100 |
101 |
102 | METHOD handle.
103 | DATA: variable TYPE REF TO tpda_scr_localsline.
104 |
105 | LOOP AT locals REFERENCE INTO variable.
106 |
107 | TRY.
108 | APPEND _handle( name = variable->*-name
109 | is_object = abap_true ) TO json_fragments.
110 | ##NO_HANDLER
111 | CATCH zcx_dbgl_type_not_supported.
112 | ENDTRY.
113 |
114 | ENDLOOP.
115 |
116 | ENDMETHOD.
117 |
118 |
119 | method LOG_STORAGE.
120 |
121 | DATA: subkey(200).
122 |
123 | subkey = source_position-program && '_' && source_position-include &&
124 | '_' && key_testcase.
125 | LOG-POINT ID zdbgl_store_locals SUBKEY subkey
126 | FIELDS json_fragments.
127 |
128 | endmethod.
129 |
130 |
131 | METHOD move_sp_to_db_fragment.
132 |
133 | fragment-abap_program = source_position-program.
134 | ##ENH_OK
135 | MOVE-CORRESPONDING source_position TO fragment.
136 |
137 | ENDMETHOD.
138 |
139 |
140 | METHOD store.
141 | DATA: parser TYPE REF TO zdbgl_store_locals,
142 | " Fragment in db table zdbgl_locals
143 | db_fragments TYPE _db_fragments,
144 | exception TYPE REF TO cx_root,
145 | exc_program TYPE syrepid,
146 | exc_include TYPE syrepid,
147 | exc_source_line TYPE i.
148 | FIELD-SYMBOLS: TYPE zdbgl_locals.
149 |
150 | TRY.
151 | CREATE OBJECT parser.
152 |
153 | parser->handle( ).
154 |
155 | parser->log_storage( source_position = source_position
156 | key_testcase = key_testcase ).
157 | parser->concat_json_fragments_sstrings( IMPORTING db_fragments
158 | = db_fragments ).
159 |
160 | LOOP AT db_fragments ASSIGNING .
161 | -key_testcase = key_testcase.
162 | -key_data = sy-tabix.
163 | move_sp_to_db_fragment( EXPORTING source_position = source_position
164 | CHANGING fragment = ).
165 | ENDLOOP.
166 |
167 | IF force = abap_true.
168 | DELETE FROM zdbgl_locals WHERE abap_program = source_position-program
169 | AND include = source_position-include AND line = source_position-line
170 | AND key_testcase = key_testcase.
171 | INSERT zdbgl_locals FROM TABLE db_fragments.
172 | ELSE.
173 | TRY.
174 | INSERT zdbgl_locals FROM TABLE db_fragments.
175 | CATCH cx_sy_open_sql_db INTO DATA(fail).
176 | IF fail->textid = fail->duplicate_key.
177 | RAISE EXCEPTION TYPE zcx_dbgl_testcase
178 | EXPORTING
179 | key_testcase = key_testcase
180 | textid = zcx_dbgl_testcase=>duplicate_testcase.
181 | ELSE.
182 | RAISE EXCEPTION fail.
183 | ENDIF.
184 | ENDTRY.
185 | ENDIF.
186 | COMMIT WORK.
187 |
188 | ##CATCH_ALL
189 | CATCH cx_root INTO exception.
190 | " log exception and raise again
191 | exception->get_source_position(
192 | IMPORTING program_name = exc_program include_name = exc_include
193 | source_line = exc_source_line ).
194 | LOG-POINT ID zdbgl_store_locals FIELDS source_position-program
195 | exception->get_text( ) exc_program exc_include exc_source_line.
196 | RAISE EXCEPTION exception.
197 | ENDTRY.
198 |
199 | ENDMETHOD.
200 | ENDCLASS.
201 |
--------------------------------------------------------------------------------
/src/zdbgl_store_locals.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_STORE_LOCALS
7 | E
8 | Store local variables
9 | 1
10 | X
11 | X
12 | X
13 |
14 |
15 |
16 | CONCAT_JSON_FRAGMENTS_SSTRINGS
17 | C
18 | concatenate json fragments to short strings
19 |
20 |
21 | CONCAT_JSON_FRAGMENTS_SSTRINGS
22 | E
23 | concatenate json fragments to short strings
24 |
25 |
26 | CONSTRUCTOR
27 | C
28 | get locals in constructor
29 |
30 |
31 | CONSTRUCTOR
32 | E
33 | get locals in constructor
34 |
35 |
36 | GET_LENGTH_DB_FRAGMENT
37 | C
38 | length fragment locals in table zdbgl_locals
39 |
40 |
41 | GET_LENGTH_DB_FRAGMENT
42 | E
43 | length fragment locals in table zdbgl_locals
44 |
45 |
46 | STORE
47 | C
48 | Store the globals
49 |
50 |
51 | STORE
52 | E
53 | Store the globals
54 |
55 |
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/src/zdbgl_tdc_parameter.tabl.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_TDC_PARAMETER
7 | E
8 | INTTAB
9 | Test data container parameter
10 | 3
11 |
12 |
13 |
14 | NAME
15 | ETP_NAME
16 | 0
17 | E
18 |
19 |
20 | INITIAL
21 | SAP_BOOL
22 | 0
23 | X
24 | F
25 | E
26 |
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/src/zdbgl_tdc_variant_key.tabl.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_TDC_VARIANT_KEY
7 | E
8 | INTTAB
9 | X
10 | Variant key test-data-container
11 | 3
12 |
13 |
14 |
15 | .INCLUDE
16 | 0
17 | ETOBJ_KEY2
18 | S
19 | eCATT All Key Fields for eCATT Objects
20 | S
21 |
22 |
23 | VARIANT_NAME
24 | ETVAR_ID
25 | 0
26 | E
27 |
28 |
29 | TRANSPORT_REQUEST
30 | TRKORR
31 | 0
32 | E
33 |
34 |
35 | INCREMENT_VERSION_NO
36 | ZDBGL_INCREMENT_VERSION_NO
37 | 0
38 | X
39 | F
40 | E
41 |
42 |
43 | USE_LATEST_VERSION
44 | ZDBGL_USE_LATEST_VERSION
45 | 0
46 | X
47 | F
48 | E
49 |
50 |
51 |
52 | C
53 |
54 |
55 | -
56 | C
57 | Variant key test-data-container
58 |
59 |
60 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/src/zdbgl_tdc_variant_key1.tabl.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_TDC_VARIANT_KEY1
7 | E
8 | INTTAB
9 | X
10 | Testdatacontainer key
11 | 3
12 |
13 |
14 |
15 | .INCLUDE
16 | 0
17 | ZDBGL_TDC_VARIANT_KEY
18 | S
19 | Variant key test-data-container
20 | S
21 | A
22 |
23 |
24 | DISPLAY_APP_LOG
25 | ZDBGL_DISPLAY_APP_LOG
26 | 0
27 | X
28 | F
29 | E
30 |
31 |
32 |
33 | C
34 |
35 |
36 | -
37 | C
38 | Testdatacontainer key
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/src/zdbgl_unit_test.prog.abap:
--------------------------------------------------------------------------------
1 | *&---------------------------------------------------------------------*
2 | *& Report ZTEST_DEBUG_GLOBALS
3 | *&
4 | *&---------------------------------------------------------------------*
5 | *&
6 | *&
7 | *&---------------------------------------------------------------------*
8 | REPORT zdbgl_unit_test.
9 |
10 | DATA: var_i TYPE i VALUE 5,
11 | var_string TYPE string VALUE 'a sample string',
12 | var_character(10) VALUE 'CHARACT',
13 | fldate TYPE d VALUE '20191115',
14 | " flat structure,
15 | BEGIN OF struct,
16 | key TYPE i,
17 | ch(10),
18 | END OF struct,
19 | " Table with a flat structered type
20 | table_struc_type TYPE STANDARD TABLE OF sflight,
21 | " Hashed table
22 | hashed_table TYPE HASHED TABLE OF sflight WITH UNIQUE KEY
23 | carrid connid fldate,
24 | " complex structure
25 | BEGIN OF com_struct,
26 | key TYPE i,
27 | table LIKE table_struc_type,
28 | END OF com_struct,
29 | " Table with a simple type
30 | table_simple_type TYPE STANDARD TABLE OF i,
31 | " Table with a complex structured type
32 | table_com_type LIKE STANDARD TABLE OF table_struc_type,
33 | " Object-Reference
34 | object_ref TYPE REF TO zdbgl_store_globals,
35 | data_ref TYPE REF TO data.
36 |
37 | FORM setup_variables.
38 | DATA: l_var_i TYPE i VALUE 70,
39 | BEGIN OF l_struct,
40 | key TYPE i,
41 | ch(10),
42 | END OF l_struct.
43 | FIELD-SYMBOLS: TYPE sflight.
44 |
45 | struct-key = 2.
46 | struct-ch = 'chara'.
47 | l_struct-key = 3.
48 | l_struct-ch = 'local'.
49 |
50 | APPEND INITIAL LINE TO table_struc_type ASSIGNING .
51 | -carrid = 'LH'. -connid = '300'.
52 | APPEND INITIAL LINE TO table_struc_type ASSIGNING .
53 | -carrid = 'LH'. -connid = '350'.
54 |
55 | INSERT LINES OF table_struc_type INTO TABLE hashed_table.
56 | APPEND: 1 TO table_simple_type,
57 | 2 TO table_simple_type.
58 |
59 | com_struct-key = 3.
60 | com_struct-table = table_struc_type.
61 |
62 | APPEND: table_struc_type TO table_com_type,
63 | table_struc_type TO table_com_type.
64 |
65 | " Steps at this breakpoint:
66 | " load script "ZDBGL_SCRIPT_STORE_GLOBALS", execute with test-case "B"
67 | " load script "ZDBGL_SCRIPT_STORE_LOCALS", execute with test-case "B"
68 | " load script "ZDBGL_SCRIPT_STORE_IN_TDC", execute with
69 | " test-data-container "ZDBGL_UNIT_TEST_CONTAINER", Version 1, Variant "SCRIPT_STORE_IN_TDC"
70 | BREAK-POINT.
71 |
72 | ENDFORM.
73 |
74 | CLASS test_debugger_scripts DEFINITION FOR TESTING DURATION SHORT
75 | RISK LEVEL HARMLESS INHERITING FROM cl_aunit_assert.
76 |
77 | PRIVATE SECTION.
78 | CLASS-DATA: cut_globals TYPE REF TO zdbgl_get_globals,
79 | cut_locals TYPE REF TO zdbgl_get_locals.
80 |
81 | CLASS-METHODS class_setup
82 | RAISING cx_static_check.
83 |
84 | CLASS-METHODS class_teardown
85 | RAISING cx_static_check.
86 |
87 | CLASS-METHODS get_tdc_accessor
88 | IMPORTING
89 | write_access TYPE abap_bool
90 | RETURNING VALUE(result) TYPE REF TO cl_apl_ecatt_tdc_api
91 | RAISING cx_ecatt_tdc_access.
92 |
93 | METHODS act_global_variables FOR TESTING
94 | RAISING cx_static_check.
95 |
96 | METHODS act_local_variables FOR TESTING
97 | RAISING cx_static_check.
98 |
99 | METHODS act_variables_stored_in_tdc FOR TESTING
100 | RAISING cx_static_check.
101 |
102 | ENDCLASS.
103 |
104 | CLASS test_debugger_scripts IMPLEMENTATION.
105 |
106 | METHOD class_setup.
107 | DATA source_position TYPE zdbgl_get_locals=>_source_position.
108 |
109 | source_position-abap_program = sy-repid.
110 | source_position-include = sy-repid.
111 | source_position-line = 64.
112 |
113 | PERFORM setup_variables.
114 |
115 | cut_globals = zdbgl_get_globals=>factory( EXPORTING program = sy-repid
116 | key_testcase = 'B' ).
117 | cut_locals = zdbgl_get_locals=>factory( EXPORTING source_position = source_position
118 | key_testcase = 'B' ).
119 |
120 | ENDMETHOD.
121 |
122 | METHOD class_teardown.
123 |
124 | get_tdc_accessor( abap_true )->delete_variant( 'SCRIPT_STORE_IN_TDC' ).
125 | COMMIT WORK.
126 |
127 | ENDMETHOD.
128 |
129 | METHOD get_tdc_accessor.
130 |
131 | result = cl_apl_ecatt_tdc_api=>get_instance(
132 | i_testdatacontainer = 'ZDBGL_UNIT_TEST_CONTAINER'
133 | i_testdatacontainer_version = 1 i_write_access = write_access ).
134 |
135 | ENDMETHOD.
136 |
137 | METHOD act_global_variables.
138 | DATA: act_var_i TYPE i,
139 | act_string TYPE string,
140 | act_character LIKE var_character,
141 | act_struct LIKE struct,
142 | act_fldate TYPE d,
143 | act_table_simple_type LIKE table_simple_type,
144 | act_table_struc_type LIKE table_struc_type,
145 | act_hashed_table LIKE hashed_table.
146 |
147 | cut_globals->get_simple( EXPORTING name = 'VAR_STRING'
148 | IMPORTING value = act_string ).
149 | cut_globals->get_simple( EXPORTING name = 'VAR_I'
150 | IMPORTING value = act_var_i ).
151 | cut_globals->get_simple( EXPORTING name = 'VAR_CHARACTER'
152 | IMPORTING value = act_character ).
153 | cut_globals->get_simple( EXPORTING name = 'FLDATE'
154 | IMPORTING value = act_fldate ).
155 | cut_globals->get_structur( EXPORTING name = 'STRUCT'
156 | IMPORTING value = act_struct ).
157 | cut_globals->get_table( EXPORTING name = 'TABLE_SIMPLE_TYPE'
158 | IMPORTING value = act_table_simple_type ).
159 | cut_globals->get_table( EXPORTING name = 'TABLE_STRUC_TYPE'
160 | IMPORTING value = act_table_struc_type ).
161 | cut_globals->get_table( EXPORTING name = 'HASHED_TABLE'
162 | IMPORTING value = act_hashed_table ).
163 |
164 | assert_equals( exp = var_i act = act_var_i
165 | msg = 'Variable var_i of type integer' ).
166 | assert_equals( exp = var_i act = act_var_i
167 | msg = 'Variable var_string of type string' ).
168 | assert_equals( exp = var_character act = act_character
169 | msg = 'Variable var_character of type character' ).
170 | assert_equals( exp = fldate act = act_fldate
171 | msg = 'Variable fldate with same name as component internal table' ).
172 | assert_equals( exp = struct act = act_struct
173 | msg = 'Variable struct a flat structur' ).
174 | "assert_equals( exp = com_struct act = act_com_struct
175 | " msg = 'Variable com_struct a complex structur' ).
176 | assert_equals( exp = table_simple_type act = act_table_simple_type
177 | msg = 'Variable table_simple_type table with simple type' ).
178 | assert_equals( exp = table_struc_type act = act_table_struc_type
179 | msg = 'Variable table_struc_type table with structured type' ).
180 | assert_equals( exp = hashed_table act = act_hashed_table
181 | msg = 'Variable hashed_table of type hashed_table' ).
182 |
183 | ENDMETHOD.
184 |
185 | METHOD act_local_variables.
186 | DATA: act_var_i TYPE i,
187 | act_struct LIKE struct,
188 | exp_var_i TYPE i VALUE 70,
189 | exp_struct LIKE struct.
190 |
191 | exp_struct-key = 3.
192 | exp_struct-ch = 'local'.
193 |
194 | cut_locals->get_simple( EXPORTING name = 'L_VAR_I'
195 | IMPORTING value = act_var_i ).
196 | cut_locals->get_structur( EXPORTING name = 'L_STRUCT'
197 | IMPORTING value = act_struct ).
198 |
199 | assert_equals( exp = exp_var_i act = act_var_i
200 | msg = 'Variable l_var_i of type integer' ).
201 | assert_equals( exp = exp_struct act = act_struct
202 | msg = 'Variable l_struct a flat structur' ).
203 |
204 | ENDMETHOD.
205 |
206 | METHOD act_variables_stored_in_tdc.
207 | DATA: act_var_character LIKE var_character,
208 | act_var_string TYPE string,
209 | act_table_struc_type LIKE table_struc_type,
210 | act_table_simple_type LIKE table_simple_type,
211 | act_hashed_table LIKE hashed_table,
212 | tdc_accessor TYPE REF TO cl_apl_ecatt_tdc_api.
213 |
214 | tdc_accessor = get_tdc_accessor( abap_false ).
215 |
216 | tdc_accessor->get_value( EXPORTING i_param_name = 'VAR_CHARACTER'
217 | i_variant_name = 'SCRIPT_STORE_IN_TDC'
218 | CHANGING e_param_value = act_var_character ).
219 | tdc_accessor->get_value( EXPORTING i_param_name = 'VAR_STRING'
220 | i_variant_name = 'SCRIPT_STORE_IN_TDC'
221 | CHANGING e_param_value = act_var_string ).
222 | tdc_accessor->get_value( EXPORTING i_param_name = 'TABLE_STRUC_TYPE'
223 | i_variant_name = 'SCRIPT_STORE_IN_TDC'
224 | CHANGING e_param_value = act_table_struc_type ).
225 | tdc_accessor->get_value( EXPORTING i_param_name = 'TABLE_SIMPLE_TYPE'
226 | i_variant_name = 'SCRIPT_STORE_IN_TDC'
227 | CHANGING e_param_value = act_table_simple_type ).
228 | tdc_accessor->get_value( EXPORTING i_param_name = 'HASHED_TABLE'
229 | i_variant_name = 'SCRIPT_STORE_IN_TDC'
230 | CHANGING e_param_value = act_hashed_table ).
231 |
232 | assert_equals( exp = var_character act = act_var_character
233 | msg = 'Variable var_charachter of type char' ).
234 | assert_equals( exp = var_string act = act_var_string
235 | msg = 'Variable var_string of type string' ).
236 | assert_equals( exp = table_struc_type act = act_table_struc_type
237 | msg = 'Internal table table_struc_type with line-type sflight' ).
238 | assert_equals( exp = table_simple_type act = act_table_simple_type
239 | msg = 'Internal table table_simple_type with line-type integer' ).
240 | assert_equals( exp = hashed_table act = act_hashed_table
241 | msg = 'Internal hashed table' ).
242 |
243 | ENDMETHOD.
244 |
245 | ENDCLASS.
246 |
--------------------------------------------------------------------------------
/src/zdbgl_unit_test.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_UNIT_TEST
7 | 1
8 | E
9 | X
10 | X
11 |
12 |
13 | -
14 | R
15 | Test debugging globals variables
16 | 70
17 |
18 |
19 |
20 | -
21 | C
22 |
23 |
-
24 | R
25 | Test debugging globals variables
26 | 70
27 |
28 |
29 |
30 | -
31 | D
32 |
33 |
-
34 | R
35 | Test Debugging globale Variablen
36 | 32
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/src/zdbgl_use_latest_version.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_USE_LATEST_VERSION
7 | E
8 | SAP_BOOL
9 | 55
10 | 10
11 | 20
12 | 40
13 | Use latest version of snapshot
14 | Use latest version of snapshot for reading
15 | Last. vers
16 | Use latest version
17 | Use latest version of snapshot for readi
18 | E
19 | D
20 |
21 |
22 | C
23 |
24 |
25 | -
26 | C
27 | Use latest version of snapshot
28 | Use latest version of snapshot for reading
29 | Last. vers
30 | Use latest version
31 | Use latest version of snapshot for readi
32 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/src/zdbgl_utils.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zdbgl_utils DEFINITION
2 | PUBLIC
3 | FINAL
4 | CREATE PUBLIC .
5 |
6 | PUBLIC SECTION.
7 |
8 | CLASS-METHODS ask_for_transport_request
9 | IMPORTING
10 | VALUE(package_name) TYPE devclass OPTIONAL
11 | CHANGING key_tdc_variant TYPE zdbgl_tdc_variant_key
12 | RAISING cx_ecatt_tdc_access.
13 |
14 | CLASS-METHODS must_add_to_transport_request
15 | IMPORTING
16 | VALUE(package_name) TYPE devclass OPTIONAL
17 | key_tdc_variant TYPE zdbgl_tdc_variant_key
18 | RETURNING VALUE(result) TYPE sap_bool
19 | RAISING cx_ecatt_tdc_access.
20 |
21 | CLASS-METHODS create_tadir_entry
22 | IMPORTING
23 | tdc_name TYPE etobj_name
24 | RETURNING VALUE(package_name) TYPE devclass.
25 |
26 | CLASS-METHODS is_tdc_parameter_initial
27 | IMPORTING
28 | tdc_key TYPE etobj_key2
29 | param_name TYPE etp_name
30 | variant_name TYPE etvar_id
31 | RETURNING
32 | VALUE(is_initial) TYPE sap_bool.
33 |
34 | PROTECTED SECTION.
35 |
36 | PRIVATE SECTION.
37 |
38 | CLASS-METHODS transport_request_is_mandatory
39 | IMPORTING
40 | package_name TYPE devclass
41 | RETURNING VALUE(is_mandatory) TYPE abap_bool
42 | RAISING cx_ecatt_tdc_access.
43 |
44 | CLASS-METHODS tdc_is_part_of_open_task
45 | IMPORTING
46 | key_tdc_variant TYPE zdbgl_tdc_variant_key
47 | RETURNING VALUE(result) TYPE abap_bool.
48 |
49 | CLASS-METHODS read_package_name
50 | IMPORTING
51 | key_tdc_variant TYPE zdbgl_tdc_variant_key
52 | RETURNING VALUE(result) TYPE devclass
53 | RAISING cx_ecatt_tdc_access.
54 |
55 | ENDCLASS.
56 |
57 |
58 |
59 | CLASS ZDBGL_UTILS IMPLEMENTATION.
60 |
61 |
62 | METHOD ask_for_transport_request.
63 |
64 | IF package_name IS NOT SUPPLIED.
65 | package_name = read_package_name( key_tdc_variant ).
66 | ENDIF.
67 |
68 | IF transport_request_is_mandatory( package_name ) = abap_true
69 | AND tdc_is_part_of_open_task( key_tdc_variant ) = abap_false.
70 |
71 | CALL FUNCTION 'TR_POPUP_INPUT_REQUEST'
72 | IMPORTING
73 | ev_trkorr = key_tdc_variant-transport_request.
74 |
75 | ENDIF.
76 |
77 | ENDMETHOD.
78 |
79 |
80 | METHOD create_tadir_entry.
81 | DATA package TYPE tdevc.
82 |
83 | CALL FUNCTION 'TR_TADIR_POPUP_ENTRY_E071'
84 | EXPORTING
85 | wi_e071_pgmid = 'R3TR'
86 | wi_e071_object = cl_apl_ecatt_const=>obj_type_test_data
87 | wi_e071_obj_name = CONV e071-obj_name( tdc_name )
88 | IMPORTING
89 | es_tdevc = package.
90 | package_name = package-devclass.
91 |
92 | ENDMETHOD.
93 |
94 |
95 | METHOD is_tdc_parameter_initial.
96 | DATA:
97 | object_key TYPE etapi_obj,
98 | messages TYPE bapirettab,
99 | variant_values TYPE etpar_vari_streams_tabtype.
100 |
101 | DATA(logger) = zcl_logger_factory=>create_log( ).
102 | CALL FUNCTION 'ECATT_OBJ_LOAD'
103 | EXPORTING
104 | is_key = tdc_key
105 | IMPORTING
106 | es_object_key = object_key
107 | TABLES
108 | return = messages.
109 | logger->add( messages ).
110 |
111 | CALL FUNCTION 'ECATT_OBJ_PAR_VALS_GET'
112 | EXPORTING
113 | is_key = object_key
114 | i_var_id = variant_name
115 | i_par_name = param_name
116 | IMPORTING
117 | et_variant_values = variant_values
118 | TABLES
119 | return = messages.
120 | logger->add( messages ).
121 |
122 | LOOP AT variant_values REFERENCE INTO DATA(variant_value)
123 | WHERE var_name = variant_name.
124 | is_initial = xsdbool( line_exists( variant_value->*-par_values_streams[ pname = param_name value = '' ] ) ).
125 | ENDLOOP.
126 |
127 | ENDMETHOD.
128 |
129 |
130 | METHOD must_add_to_transport_request.
131 |
132 | IF package_name IS NOT SUPPLIED.
133 | package_name = read_package_name( key_tdc_variant ).
134 | ENDIF.
135 |
136 | result = xsdbool( transport_request_is_mandatory( package_name ) = abap_true AND
137 | tdc_is_part_of_open_task( key_tdc_variant ) = abap_false ).
138 |
139 | ENDMETHOD.
140 |
141 |
142 | METHOD read_package_name.
143 |
144 | SELECT SINGLE devclass FROM tadir INTO result
145 | WHERE pgmid = 'R3TR' AND object = cl_apl_ecatt_const=>obj_type_test_data
146 | AND obj_name = key_tdc_variant-name.
147 | IF sy-subrc <> 0.
148 | RAISE EXCEPTION TYPE cx_ecatt_tdc_access
149 | EXPORTING
150 | textid = cx_ecatt_tdc_access=>object_not_found
151 | last_obj_name = key_tdc_variant-name
152 | last_obj_type = CONV string( cl_apl_ecatt_const=>obj_type_test_data )
153 | last_obj_ver = CONV string( key_tdc_variant-version ).
154 | ENDIF.
155 |
156 | ENDMETHOD.
157 |
158 |
159 | METHOD tdc_is_part_of_open_task.
160 |
161 | SELECT COUNT(*) FROM e071
162 | WHERE pgmid = 'R3TR' AND object = cl_apl_ecatt_const=>obj_type_test_data
163 | AND obj_name = key_tdc_variant-name AND lockflag = abap_true.
164 | IF sy-subrc = 0.
165 | result = abap_true.
166 | ENDIF.
167 |
168 | ENDMETHOD.
169 |
170 |
171 | METHOD transport_request_is_mandatory.
172 |
173 | cl_package_helper=>check_package_name(
174 | EXPORTING i_package_name = package_name
175 | IMPORTING e_package_type = DATA(package_type) ).
176 | IF package_type <> '$'.
177 | is_mandatory = abap_true.
178 | ENDIF.
179 |
180 | ENDMETHOD.
181 | ENDCLASS.
182 |
--------------------------------------------------------------------------------
/src/zdbgl_utils.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_UTILS
7 | E
8 | Utils
9 | 1
10 | X
11 | X
12 | X
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/zdbgl_variables.tabl.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZDBGL_VARIABLES
7 | E
8 | TRANSP
9 | X
10 | Debugging Legacy Code globals
11 | A
12 | 4
13 |
14 |
15 | ZDBGL_VARIABLES
16 | A
17 | 1
18 | APPL0
19 | P
20 | X
21 |
22 |
23 |
24 | MANDT
25 | X
26 | MANDT
27 | 0
28 | X
29 | E
30 |
31 |
32 | ABAP_PROGRAM
33 | X
34 | PROGNAME
35 | 0
36 | X
37 | E
38 |
39 |
40 | KEY_TESTCASE
41 | X
42 | ZDBGL_KEY_TESTCASES
43 | 0
44 | X
45 | E
46 |
47 |
48 | KEY_DATA
49 | X
50 | 0
51 | X
52 | 000002
53 | X
54 | INT2
55 | 000005
56 | INT2
57 | continuous key
58 |
59 |
60 | GLOBALS
61 | 0
62 | g
63 | 000008
64 | SSTR
65 | 001200
66 | SSTR
67 |
68 |
69 |
70 | C
71 | D
72 |
73 |
74 | -
75 | C
76 | Debugging Legacy Code globals
77 |
78 | -
79 | D
80 | Debugging Legacy Code Variablen
81 |
82 |
83 |
84 | -
85 |
86 | TB
87 |
88 | D
89 | E
90 | 0001
91 | 00007
92 | A
93 |
94 |
95 | DOKU
96 | ZDBGL_VARIABLES
97 | TB
98 | D
99 | S_DOCU_SHOW
100 | S_DOCUS1
101 | 00001
102 | 072
103 |
104 |
105 |
106 | U1
107 | &USE&
108 |
109 |
110 | AS
111 | Zeichnet die globalen Variablen bei einem Break-Point auf.
112 |
113 |
114 | AS
115 | Jedes Testfall bekommt dabei einen eindeutigen Schlüssel im Feld key_tes
116 |
117 |
118 | =
119 | tcase. Die globalen Variablen werden im JSON Format aufgezeichnet.
120 |
121 |
122 | AS
123 | Das Feld globals ist unter Umständen nicht lang genug. Daher wird das 3.
124 |
125 |
126 | =
127 | Schlüsselfeld key_data fortlaufend gefüllt.
128 |
129 |
130 | AS
131 | Die Aufzeichnung im JSON Format wurde gewählt, damit die globalen
132 |
133 |
134 | =
135 | Variablen besser zu lesen sind.
136 |
137 |
138 | U1
139 | &MAINTENANCE&
140 |
141 |
142 | AS
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
--------------------------------------------------------------------------------
/src/zif_dbgl_snapshots.intf.abap:
--------------------------------------------------------------------------------
1 | INTERFACE zif_dbgl_snapshots
2 | PUBLIC .
3 |
4 | METHODS compare_or_record
5 | IMPORTING
6 | name TYPE clike
7 | actual TYPE any
8 | RETURNING VALUE(unequal) TYPE sap_bool
9 | RAISING
10 | zcx_dbgl_snapshot.
11 |
12 | METHODS commit_changes
13 | RAISING
14 | zcx_dbgl_snapshot.
15 |
16 | ENDINTERFACE.
17 |
--------------------------------------------------------------------------------
/src/zif_dbgl_snapshots.intf.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZIF_DBGL_SNAPSHOTS
7 | E
8 | Snapshot definition
9 | 2
10 | 1
11 | X
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------