├── .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 | ![Parameter ZDBGL_SNAP_RECORD](img/update_snap.png) 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 | ![Permit api access](img/tdc_permit_api_access.png) 68 | 69 | #### Before the modification #### 70 | Set an appropriate breakpoint and create the snapshot with the debugger-script ```zdbgl_script_store_in_tdc```. 71 | ![Load script](img/load_script1.png) 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 | ![Prompt tdc key](img/script_prompt_tdc.png) 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 | ![Load Debugger Script](../img/load_script.png) 44 | 45 | The script will prompt you to enter an Key for the testcase. For each record you should choose an unique id. 46 | ![Enter key testcase](../img/script_prompt_testcase.png) 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 | ![Permit api access](../img/tdc_permit_api_access.png) 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 | ![copy records to test data container](../img/copy_globals_before.png) 106 | ![copy records to test data container](../img/copy_globals_after.png) 107 | ![values test data container](../img/tdc_with_values.png) 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 | CPUB 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 | CPUB 116 | ZCX_DBGL_TESTCASE 117 | 005056914D751EE99886C50523FD3A6D 118 | 0001 119 | 120 | 121 | LIMU 122 | CPUB 123 | ZCX_DBGL_TESTCASE 124 | 005056914D751EE99887164588613A6D 125 | 0001 126 | 127 | 128 | LIMU 129 | CPUB 130 | ZCX_DBGL_TESTCASE 131 | 005056914D751EE99887164588615A6D 132 | 0001 133 | 134 | 135 | LIMU 136 | CPUB 137 | ZCX_DBGL_TESTCASE 138 | 005056914D751EE99887164588617A6D 139 | 0001 140 | 141 | 142 | LIMU 143 | CPUB 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 | CPUB 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 | ZDBGL_INCREMENT_VERSION_NO 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 | ZDBGL_VARIABLES 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 | --------------------------------------------------------------------------------