holado 0.2.1__py3-none-any.whl → 0.2.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of holado might be problematic. Click here for more details.

Files changed (524) hide show
  1. holado/__init__.py +8 -4
  2. {holado-0.2.1.dist-info → holado-0.2.3.dist-info}/METADATA +13 -9
  3. holado-0.2.3.dist-info/RECORD +535 -0
  4. holado_ais/__init__.py +33 -0
  5. holado_ais/ais/MaritimeIdentificationDigits.csv +295 -0
  6. holado_ais/ais/ais_manager.py +151 -0
  7. holado_ais/ais/ais_messages.py +203 -0
  8. holado_ais/ais/ais_payload.py +35 -0
  9. holado_ais/ais/enums.py +37 -0
  10. holado_ais/ais/patch_pyais.py +1303 -0
  11. holado_ais/tests/behave/steps/__init__.py +17 -0
  12. holado_ais/tests/behave/steps/ais/__init__.py +0 -0
  13. holado_ais/tests/behave/steps/ais/ais_manager_steps.py +50 -0
  14. holado_ais/tests/behave/steps/ais/ais_messages_steps.py +182 -0
  15. holado_binary/__init__.py +17 -0
  16. holado_binary/ipc/binary.py +125 -0
  17. holado_binary/ipc/bit_series.py +307 -0
  18. holado_binary/tests/behave/steps/__init__.py +17 -0
  19. holado_binary/tests/behave/steps/ipc/binary_steps.py +57 -0
  20. holado_binary/tests/behave/steps/ipc/bit_series_steps.py +131 -0
  21. holado_context/__init__.py +16 -0
  22. holado_context/tests/behave/steps/__init__.py +16 -0
  23. holado_context/tests/behave/steps/private/__init__.py +16 -0
  24. holado_context/tests/behave/steps/private/common/context_steps.py +36 -0
  25. holado_core/__init__.py +32 -0
  26. holado_core/common/__init__.py +0 -0
  27. holado_core/common/actors/actions.py +97 -0
  28. holado_core/common/actors/actor.py +226 -0
  29. holado_core/common/actors/element_actor.py +32 -0
  30. holado_core/common/actors/find_actor.py +106 -0
  31. holado_core/common/actors/tree_actor.py +32 -0
  32. holado_core/common/actors/verify_actions.py +69 -0
  33. holado_core/common/block/base.py +122 -0
  34. holado_core/common/block/block_manager.py +173 -0
  35. holado_core/common/block/block_method.py +46 -0
  36. holado_core/common/block/block_steps.py +37 -0
  37. holado_core/common/block/function.py +42 -0
  38. holado_core/common/block/scope_function.py +28 -0
  39. holado_core/common/block/scope_manager.py +238 -0
  40. holado_core/common/block/scope_steps.py +141 -0
  41. holado_core/common/criterias/and_criteria.py +61 -0
  42. holado_core/common/criterias/criteria.py +78 -0
  43. holado_core/common/criterias/or_criteria.py +64 -0
  44. holado_core/common/criterias/tools/criteria_context.py +20 -0
  45. holado_core/common/criterias/tools/criteria_parameters.py +18 -0
  46. holado_core/common/drivers/driver.py +153 -0
  47. holado_core/common/drivers/element_driver.py +30 -0
  48. holado_core/common/drivers/element_internal_api.py +239 -0
  49. holado_core/common/drivers/internal_api.py +40 -0
  50. holado_core/common/drivers/tree_driver.py +30 -0
  51. holado_core/common/drivers/tree_internal_api.py +176 -0
  52. holado_core/common/exceptions/__init__.py +0 -0
  53. holado_core/common/exceptions/element_exception.py +28 -0
  54. holado_core/common/exceptions/exceptions.py +24 -0
  55. holado_core/common/exceptions/functional_exception.py +21 -0
  56. holado_core/common/exceptions/holado_exception.py +25 -0
  57. holado_core/common/exceptions/technical_exception.py +27 -0
  58. holado_core/common/exceptions/timeout_exception.py +20 -0
  59. holado_core/common/exceptions/verify_exception.py +20 -0
  60. holado_core/common/finders/after_in_tree_finder.py +87 -0
  61. holado_core/common/finders/element_finder.py +60 -0
  62. holado_core/common/finders/else_finder.py +105 -0
  63. holado_core/common/finders/finder.py +478 -0
  64. holado_core/common/finders/or_finder.py +98 -0
  65. holado_core/common/finders/then_finder.py +157 -0
  66. holado_core/common/finders/tools/enums.py +30 -0
  67. holado_core/common/finders/tools/find_builder.py +118 -0
  68. holado_core/common/finders/tools/find_context.py +405 -0
  69. holado_core/common/finders/tools/find_info.py +27 -0
  70. holado_core/common/finders/tools/find_parameters.py +240 -0
  71. holado_core/common/finders/tools/find_updater.py +95 -0
  72. holado_core/common/finders/tools/finder_info.py +26 -0
  73. holado_core/common/finders/tree_finder.py +146 -0
  74. holado_core/common/handlers/__init__.py +0 -0
  75. holado_core/common/handlers/abstracts/base_redo.py +695 -0
  76. holado_core/common/handlers/abstracts/get_or_create.py +120 -0
  77. holado_core/common/handlers/element_holder.py +122 -0
  78. holado_core/common/handlers/enums.py +23 -0
  79. holado_core/common/handlers/exceptions/redo_exceptions.py +28 -0
  80. holado_core/common/handlers/features/resource_by_name.py +187 -0
  81. holado_core/common/handlers/features/resource_by_type.py +174 -0
  82. holado_core/common/handlers/redo.py +119 -0
  83. holado_core/common/handlers/wait.py +127 -0
  84. holado_core/common/inspectors/element_inspector.py +57 -0
  85. holado_core/common/inspectors/inspector.py +221 -0
  86. holado_core/common/inspectors/tools/inspect_builder.py +169 -0
  87. holado_core/common/inspectors/tools/inspect_context.py +69 -0
  88. holado_core/common/inspectors/tools/inspect_parameters.py +181 -0
  89. holado_core/common/inspectors/tree_inspector.py +73 -0
  90. holado_core/common/resource/persisted_data_manager.py +113 -0
  91. holado_core/common/resource/persisted_method_to_call_manager.py +133 -0
  92. holado_core/common/resource/resource_manager.py +143 -0
  93. holado_core/common/tables/__init__.py +1 -0
  94. holado_core/common/tables/comparators/__init__.py +0 -0
  95. holado_core/common/tables/comparators/boolean_table_cell_comparator.py +25 -0
  96. holado_core/common/tables/comparators/bytes_table_cell_comparator.py +25 -0
  97. holado_core/common/tables/comparators/datetime_table_cell_comparator.py +24 -0
  98. holado_core/common/tables/comparators/float_table_cell_comparator.py +31 -0
  99. holado_core/common/tables/comparators/integer_table_cell_comparator.py +25 -0
  100. holado_core/common/tables/comparators/internal_table_cell_comparator.py +30 -0
  101. holado_core/common/tables/comparators/string_table_cell_comparator.py +24 -0
  102. holado_core/common/tables/comparators/string_table_comparator.py +29 -0
  103. holado_core/common/tables/comparators/string_table_row_comparator.py +29 -0
  104. holado_core/common/tables/comparators/table_cell_comparator.py +40 -0
  105. holado_core/common/tables/comparators/table_comparator.py +209 -0
  106. holado_core/common/tables/comparators/table_comparator_manager.py +60 -0
  107. holado_core/common/tables/comparators/table_row_comparator.py +116 -0
  108. holado_core/common/tables/comparators/table_with_header_comparator.py +68 -0
  109. holado_core/common/tables/converters/__init__.py +0 -0
  110. holado_core/common/tables/converters/table_converter.py +194 -0
  111. holado_core/common/tables/enums.py +23 -0
  112. holado_core/common/tables/table.py +261 -0
  113. holado_core/common/tables/table_cell.py +126 -0
  114. holado_core/common/tables/table_manager.py +366 -0
  115. holado_core/common/tables/table_row.py +169 -0
  116. holado_core/common/tables/table_with_header.py +236 -0
  117. holado_core/common/tools/__init__.py +0 -0
  118. holado_core/common/tools/comparators/comparator.py +151 -0
  119. holado_core/common/tools/comparators/object_comparator.py +21 -0
  120. holado_core/common/tools/converters/converter.py +107 -0
  121. holado_core/common/tools/path_manager.py +185 -0
  122. holado_core/common/tools/string_tools.py +135 -0
  123. holado_core/common/tools/tools.py +172 -0
  124. holado_core/common/transport/__init__.py +0 -0
  125. holado_core/common/transport/crc.py +40 -0
  126. holado_core/tests/behave/steps/__init__.py +20 -0
  127. holado_core/tests/behave/steps/common/__init__.py +0 -0
  128. holado_core/tests/behave/steps/common/common_steps.py +136 -0
  129. holado_core/tests/behave/steps/common/config_steps.py +42 -0
  130. holado_core/tests/behave/steps/common/resource_steps.py +62 -0
  131. holado_core/tests/behave/steps/common/tables_steps.py +537 -0
  132. holado_core/tools/__init__.py +0 -0
  133. holado_core/tools/abstracts/__init__.py +0 -0
  134. holado_core/tools/abstracts/blocking_command_service.py +56 -0
  135. holado_core/tools/abstracts/service.py +48 -0
  136. holado_data/__init__.py +31 -0
  137. holado_data/data/generator/base.py +93 -0
  138. holado_data/data/generator/python_generator.py +30 -0
  139. holado_data/tests/behave/steps/__init__.py +17 -0
  140. holado_data/tests/behave/steps/data/generator_steps.py +91 -0
  141. holado_data/tests/behave/steps/tools/utils_steps.py +60 -0
  142. holado_db/__init__.py +32 -0
  143. holado_db/tests/behave/steps/__init__.py +18 -0
  144. holado_db/tests/behave/steps/tools/db/db_client_steps.py +134 -0
  145. holado_db/tests/behave/steps/tools/db/postgresql_client_steps.py +59 -0
  146. holado_db/tests/behave/steps/tools/db/sqlite_client_steps.py +57 -0
  147. holado_db/tools/db/clients/base/db_client.py +206 -0
  148. holado_db/tools/db/clients/postgresql/postgresql_client.py +65 -0
  149. holado_db/tools/db/clients/sqlite/sqlite_client.py +56 -0
  150. holado_db/tools/db/db_manager.py +109 -0
  151. holado_db/tools/db/query/base/query_builder.py +87 -0
  152. holado_db/tools/db/query/pypika/pypika_query_builder.py +193 -0
  153. holado_db/tools/db/query/query_manager.py +77 -0
  154. holado_docker/__init__.py +25 -0
  155. holado_docker/sdk/docker/docker_client.py +268 -0
  156. holado_docker/sdk/docker/docker_service.py +71 -0
  157. holado_docker/tests/behave/steps/__init__.py +16 -0
  158. holado_docker/tests/behave/steps/tools/docker_steps.py +33 -0
  159. holado_docker/tools/docker_controler/__init__.py +26 -0
  160. holado_docker/tools/docker_controler/docker_controler_client.py +36 -0
  161. holado_docker/tools/docker_controler/docker_controler_server.py +31 -0
  162. holado_docker/tools/docker_controler/proto/compile_proto.py +60 -0
  163. holado_docker/tools/docker_controler/proto/definitions/docker_controler.proto +63 -0
  164. holado_docker/tools/docker_controler/proto/generated/docker_controler_pb2.py +52 -0
  165. holado_docker/tools/docker_controler/proto/generated/docker_controler_pb2_grpc.py +233 -0
  166. holado_grpc/__init__.py +32 -0
  167. holado_grpc/api/rpc/TODO.txt +4 -0
  168. holado_grpc/api/rpc/grpc_client.py +181 -0
  169. holado_grpc/api/rpc/grpc_manager.py +81 -0
  170. holado_grpc/ipc/rpc/__init__.py +0 -0
  171. holado_grpc/ipc/rpc/grpc_compiler.py +45 -0
  172. holado_grpc/ipc/rpc/grpc_services.py +165 -0
  173. holado_grpc/tests/behave/steps/__init__.py +16 -0
  174. holado_grpc/tests/behave/steps/api/grpc_client_steps.py +173 -0
  175. holado_grpc/tests/behave/steps/private/__init__.py +16 -0
  176. holado_grpc/tests/behave/steps/private/api/grpc_steps.py +77 -0
  177. holado_helper/__init__.py +35 -0
  178. holado_helper/debug/README.txt +32 -0
  179. holado_helper/debug/memory/memory_profiler.py +106 -0
  180. holado_helper/docker/init_user.sh +24 -0
  181. holado_helper/docker/logging.conf +42 -0
  182. holado_helper/docker/run_holado_test_nonreg_in_docker.sh +120 -0
  183. holado_helper/docker/run_terminal_in_docker-with_docker_control.sh +103 -0
  184. holado_helper/docker/run_terminal_in_docker.sh +101 -0
  185. holado_helper/holado_module_template/__init__.py +31 -0
  186. holado_helper/holado_module_template/test/behave/steps/__init__.py +16 -0
  187. holado_helper/holado_module_template/test/behave/steps/private/__init__.py +16 -0
  188. holado_helper/script/action.py +109 -0
  189. holado_helper/script/action_script.py +477 -0
  190. holado_helper/script/any_action_script.py +126 -0
  191. holado_helper/script/behave_action_script.py +99 -0
  192. holado_helper/script/csv_action_script.py +142 -0
  193. holado_helper/script/initialize_script.py +115 -0
  194. holado_helper/script/input_output_script.py +136 -0
  195. holado_helper/script/job.py +75 -0
  196. holado_helper/script/json_action_script.py +104 -0
  197. holado_helper/script/script.py +110 -0
  198. holado_json/__init__.py +16 -0
  199. holado_json/ipc/json.py +125 -0
  200. holado_json/ipc/json_converter.py +69 -0
  201. holado_json/ipc/json_types.py +183 -0
  202. holado_json/tests/behave/steps/__init__.py +16 -0
  203. holado_json/tests/behave/steps/ipc/__init__.py +0 -0
  204. holado_json/tests/behave/steps/ipc/json_steps.py +120 -0
  205. holado_keycloak/__init__.py +16 -0
  206. holado_keycloak/tests/behave/steps/__init__.py +16 -0
  207. holado_keycloak/tests/behave/steps/tools/keycloak_client_steps.py +59 -0
  208. holado_keycloak/tools/keycloak/__init__.py +0 -0
  209. holado_keycloak/tools/keycloak/keycloak_client.py +61 -0
  210. holado_logging/__init__.py +36 -0
  211. holado_logging/common/logging/holado_logger.py +75 -0
  212. holado_logging/common/logging/log_config.py +128 -0
  213. holado_logging/common/logging/log_manager.py +292 -0
  214. holado_multitask/__init__.py +33 -0
  215. holado_multitask/multiprocessing/context/process_context.py +35 -0
  216. holado_multitask/multiprocessing/function_process.py +102 -0
  217. holado_multitask/multiprocessing/periodic_function_process.py +135 -0
  218. holado_multitask/multiprocessing/process.py +196 -0
  219. holado_multitask/multiprocessing/processesmanager.py +133 -0
  220. holado_multitask/multitasking/multitask_manager.py +439 -0
  221. holado_multitask/multithreading/__init__.py +0 -0
  222. holado_multitask/multithreading/context/thread_context.py +84 -0
  223. holado_multitask/multithreading/functionthreaded.py +129 -0
  224. holado_multitask/multithreading/loopfunctionthreaded.py +45 -0
  225. holado_multitask/multithreading/loopthread.py +100 -0
  226. holado_multitask/multithreading/periodicfunctionthreaded.py +136 -0
  227. holado_multitask/multithreading/reflection/inspect.py +47 -0
  228. holado_multitask/multithreading/reflection/sys.py +29 -0
  229. holado_multitask/multithreading/reflection/traceback.py +35 -0
  230. holado_multitask/multithreading/thread.py +177 -0
  231. holado_multitask/multithreading/threadsmanager.py +162 -0
  232. holado_multitask/multithreading/timer.py +48 -0
  233. holado_multitask/tests/behave/steps/__init__.py +17 -0
  234. holado_multitask/tests/behave/steps/multiprocessing_steps.py +138 -0
  235. holado_multitask/tests/behave/steps/multithreading_steps.py +129 -0
  236. holado_protobuf/__init__.py +61 -0
  237. holado_protobuf/ipc/protobuf/__init__.py +0 -0
  238. holado_protobuf/ipc/protobuf/abstracts/type.py +45 -0
  239. holado_protobuf/ipc/protobuf/protobuf_compiler.py +118 -0
  240. holado_protobuf/ipc/protobuf/protobuf_converter.py +153 -0
  241. holado_protobuf/ipc/protobuf/protobuf_messages.py +965 -0
  242. holado_protobuf/ipc/protobuf/protobuf_modifier.py +65 -0
  243. holado_protobuf/ipc/protobuf/types/__init__.py +0 -0
  244. holado_protobuf/ipc/protobuf/types/google/__init__.py +0 -0
  245. holado_protobuf/ipc/protobuf/types/google/protobuf.py +124 -0
  246. holado_protobuf/tests/behave/steps/__init__.py +16 -0
  247. holado_protobuf/tests/behave/steps/ipc/protobuf_steps.py +297 -0
  248. holado_python/__init__.py +35 -0
  249. holado_python/common/enums.py +34 -0
  250. holado_python/common/iterables.py +30 -0
  251. holado_python/common/tools/comparators/boolean_comparator.py +37 -0
  252. holado_python/common/tools/comparators/bytes_comparator.py +48 -0
  253. holado_python/common/tools/comparators/datetime_comparator.py +74 -0
  254. holado_python/common/tools/comparators/float_comparator.py +97 -0
  255. holado_python/common/tools/comparators/integer_comparator.py +37 -0
  256. holado_python/common/tools/comparators/string_comparator.py +99 -0
  257. holado_python/common/tools/comparators/type_comparator.py +31 -0
  258. holado_python/common/tools/datetime.py +279 -0
  259. holado_python/standard_library/csv.py +207 -0
  260. holado_python/standard_library/hashlib.py +82 -0
  261. holado_python/standard_library/multiprocessing.py +62 -0
  262. holado_python/standard_library/queue.py +79 -0
  263. holado_python/standard_library/socket/blocking_socket.py +136 -0
  264. holado_python/standard_library/socket/echo_server.py +28 -0
  265. holado_python/standard_library/socket/message_socket.py +91 -0
  266. holado_python/standard_library/socket/non_blocking_socket.py +151 -0
  267. holado_python/standard_library/socket/socket.py +148 -0
  268. holado_python/standard_library/ssl/resources/certificates/NOTES.txt +5 -0
  269. holado_python/standard_library/ssl/resources/certificates/localhost.crt +19 -0
  270. holado_python/standard_library/ssl/resources/certificates/localhost.key +28 -0
  271. holado_python/standard_library/ssl/ssl.py +81 -0
  272. holado_python/standard_library/typing.py +192 -0
  273. holado_python/tests/behave/steps/__init__.py +27 -0
  274. holado_python/tests/behave/steps/builtins/str_steps.py +45 -0
  275. holado_python/tests/behave/steps/convert_steps.py +59 -0
  276. holado_python/tests/behave/steps/iterable_steps.py +87 -0
  277. holado_python/tests/behave/steps/standard_library/csv_steps.py +134 -0
  278. holado_python/tests/behave/steps/standard_library/datetime_steps.py +163 -0
  279. holado_python/tests/behave/steps/standard_library/hashlib_steps.py +57 -0
  280. holado_python/tests/behave/steps/standard_library/multiprocessing_steps.py +56 -0
  281. holado_python/tests/behave/steps/standard_library/queue_steps.py +358 -0
  282. holado_python/tests/behave/steps/standard_library/socket_steps.py +258 -0
  283. holado_python/tests/behave/steps/standard_library/ssl_steps.py +67 -0
  284. holado_rabbitmq/__init__.py +28 -0
  285. holado_rabbitmq/tests/behave/steps/__init__.py +17 -0
  286. holado_rabbitmq/tests/behave/steps/tools/rabbitmq_client_steps.py +537 -0
  287. holado_rabbitmq/tests/behave/steps/tools/rabbitmq_server_steps.py +64 -0
  288. holado_rabbitmq/tools/rabbitmq/rabbitmq_blocking_client.py +311 -0
  289. holado_rabbitmq/tools/rabbitmq/rabbitmq_client.py +675 -0
  290. holado_rabbitmq/tools/rabbitmq/rabbitmq_manager.py +173 -0
  291. holado_rabbitmq/tools/rabbitmq/rabbitmq_select_client.py +428 -0
  292. holado_rabbitmq/tools/rabbitmq/rabbitmq_server.py +24 -0
  293. holado_redis/__init__.py +17 -0
  294. holado_redis/tests/behave/steps/__init__.py +16 -0
  295. holado_redis/tests/behave/steps/tools/redis_client_steps.py +101 -0
  296. holado_redis/tools/redis/TODO.txt +7 -0
  297. holado_redis/tools/redis/redis_client.py +190 -0
  298. holado_redis/tools/redis/redis_manager.py +38 -0
  299. holado_report/__init__.py +27 -0
  300. holado_report/report/analyze/execution_historic_manager.py +96 -0
  301. holado_report/report/analyze/scenario_duration_manager.py +245 -0
  302. holado_report/report/builders/detailed_scenario_failed_report_builder.py +146 -0
  303. holado_report/report/builders/json_execution_historic_report_builder.py +123 -0
  304. holado_report/report/builders/report_builder.py +64 -0
  305. holado_report/report/builders/short_scenario_failed_report_builder.py +76 -0
  306. holado_report/report/builders/summary_report_builder.py +89 -0
  307. holado_report/report/builders/summary_scenario_failed_report_builder.py +56 -0
  308. holado_report/report/builders/summary_scenario_report_builder.py +74 -0
  309. holado_report/report/execution_historic.py +141 -0
  310. holado_report/report/report_manager.py +256 -0
  311. holado_report/report/reports/base_report.py +163 -0
  312. holado_report/report/reports/feature_report.py +106 -0
  313. holado_report/report/reports/scenario_report.py +64 -0
  314. holado_rest/__init__.py +24 -0
  315. holado_rest/api/rest/TODO.txt +2 -0
  316. holado_rest/api/rest/rest_client.py +113 -0
  317. holado_rest/api/rest/rest_manager.py +62 -0
  318. holado_rest/tests/behave/steps/__init__.py +16 -0
  319. holado_rest/tests/behave/steps/api/__init__.py +0 -0
  320. holado_rest/tests/behave/steps/api/rest_client_steps.py +141 -0
  321. holado_rest/tests/behave/steps/private/__init__.py +16 -0
  322. holado_rest/tests/behave/steps/private/api/__init__.py +0 -0
  323. holado_rest/tests/behave/steps/private/api/rest_steps.py +70 -0
  324. holado_s3/__init__.py +17 -0
  325. holado_s3/tests/behave/steps/__init__.py +17 -0
  326. holado_s3/tests/behave/steps/private/__init__.py +16 -0
  327. holado_s3/tests/behave/steps/private/tools/s3_steps.py +89 -0
  328. holado_s3/tests/behave/steps/tools/s3_client_steps.py +403 -0
  329. holado_s3/tests/behave/steps/tools/s3_server_steps.py +57 -0
  330. holado_s3/tools/s3/__init__.py +0 -0
  331. holado_s3/tools/s3/boto3_s3_client.py +59 -0
  332. holado_s3/tools/s3/minio_client.py +75 -0
  333. holado_s3/tools/s3/moto_server.py +52 -0
  334. holado_scripting/__init__.py +53 -0
  335. holado_scripting/common/tools/dynamic_text_manager.py +73 -0
  336. holado_scripting/common/tools/evaluate_parameters.py +210 -0
  337. holado_scripting/common/tools/expression_evaluator.py +387 -0
  338. holado_scripting/common/tools/variable_manager.py +321 -0
  339. holado_scripting/tests/behave/steps/__init__.py +22 -0
  340. holado_scripting/tests/behave/steps/common/tools/variable_convert_steps.py +158 -0
  341. holado_scripting/tests/behave/steps/common/tools/variable_new_steps.py +130 -0
  342. holado_scripting/tests/behave/steps/common/tools/variable_steps.py +108 -0
  343. holado_scripting/tests/behave/steps/common/tools/variable_verify_steps.py +160 -0
  344. holado_scripting/tests/behave/steps/scenario/function_steps.py +77 -0
  345. holado_scripting/tests/behave/steps/scenario/if_steps.py +87 -0
  346. holado_scripting/tests/behave/steps/scenario/loop_steps.py +119 -0
  347. holado_scripting/text/base/base_function.py +25 -0
  348. holado_scripting/text/base/base_verify_function.py +25 -0
  349. holado_scripting/text/base/text_inspecter.py +204 -0
  350. holado_scripting/text/interpreter/exceptions/interpreter_exception.py +25 -0
  351. holado_scripting/text/interpreter/functions/function_cast.py +60 -0
  352. holado_scripting/text/interpreter/functions/function_convert.py +57 -0
  353. holado_scripting/text/interpreter/functions/function_dynamic_value.py +40 -0
  354. holado_scripting/text/interpreter/functions/function_escape_all_bytes.py +35 -0
  355. holado_scripting/text/interpreter/functions/function_exists_variable.py +39 -0
  356. holado_scripting/text/interpreter/functions/function_hex_to_bytes.py +49 -0
  357. holado_scripting/text/interpreter/functions/function_hex_to_int.py +53 -0
  358. holado_scripting/text/interpreter/functions/function_to_base_64.py +41 -0
  359. holado_scripting/text/interpreter/functions/function_to_bytes.py +50 -0
  360. holado_scripting/text/interpreter/functions/function_to_hex.py +42 -0
  361. holado_scripting/text/interpreter/text_interpreter.py +216 -0
  362. holado_scripting/text/verifier/exceptions/verifier_exception.py +21 -0
  363. holado_scripting/text/verifier/functions/verify_function_extract_in.py +35 -0
  364. holado_scripting/text/verifier/functions/verify_function_match_pattern.py +63 -0
  365. holado_scripting/text/verifier/text_verifier.py +103 -0
  366. holado_sftp/__init__.py +16 -0
  367. holado_sftp/tests/behave/steps/__init__.py +17 -0
  368. holado_sftp/tests/behave/steps/private/__init__.py +16 -0
  369. holado_sftp/tests/behave/steps/private/tools/sftp_steps.py +78 -0
  370. holado_sftp/tests/behave/steps/tools/sftp_client_steps.py +94 -0
  371. holado_sftp/tests/behave/steps/tools/sftp_server_steps.py +82 -0
  372. holado_sftp/tools/sftp/__init__.py +0 -0
  373. holado_sftp/tools/sftp/sftp_client.py +103 -0
  374. holado_sftp/tools/sftp/sftp_server.py +39 -0
  375. holado_swagger/__init__.py +31 -0
  376. holado_swagger/swagger_hub/mockserver/mockserver_client.py +82 -0
  377. holado_swagger/swagger_hub/mockserver/mockserver_manager.py +32 -0
  378. holado_swagger/tests/behave/steps/__init__.py +16 -0
  379. holado_swagger/tests/behave/steps/swagger_hub/mockserver_steps.py +74 -0
  380. holado_system/system/command/command.py +216 -0
  381. holado_system/system/command/command_result.py +128 -0
  382. holado_system/system/command/curl_command.py +101 -0
  383. holado_system/system/command/exceptions.py +59 -0
  384. holado_system/system/filesystem/file.py +76 -0
  385. holado_system/system/global_system.py +187 -0
  386. holado_system/tests/behave/steps/__init__.py +18 -0
  387. holado_system/tests/behave/steps/system/commands_steps.py +92 -0
  388. holado_system/tests/behave/steps/system/file_steps.py +215 -0
  389. holado_system/tests/behave/steps/system/system_steps.py +84 -0
  390. holado_test/__init__.py +27 -0
  391. holado_test/behave/__init__.py +0 -0
  392. holado_test/behave/behave.py +397 -0
  393. holado_test/behave/behave_environment.py +143 -0
  394. holado_test/behave/behave_function.py +33 -0
  395. holado_test/behave/behave_manager.py +555 -0
  396. holado_test/behave/independant_runner.py +68 -0
  397. holado_test/behave/scenario/__init__.py +0 -0
  398. holado_test/behave/scenario/behave_step_tools.py +157 -0
  399. holado_test/common/context/feature_context.py +79 -0
  400. holado_test/common/context/scenario_context.py +217 -0
  401. holado_test/common/context/step_context.py +66 -0
  402. holado_test/common/exceptions/undefined_step_exception.py +21 -0
  403. holado_test/scenario/step_tools.py +523 -0
  404. holado_test/scenario/tester_tools.py +52 -0
  405. holado_test/test_config.py +26 -0
  406. holado_test/tests/behave/steps/__init__.py +18 -0
  407. holado_test/tests/behave/steps/scenario/exception_steps.py +87 -0
  408. holado_test/tests/behave/steps/scenario/scenario_steps.py +87 -0
  409. holado_test/tests/behave/steps/scenario/tester_steps.py +65 -0
  410. holado_value/__init__.py +24 -0
  411. holado_value/common/tables/comparators/table_2_value_table_cell_comparator.py +195 -0
  412. holado_value/common/tables/comparators/table_2_value_table_comparator.py +27 -0
  413. holado_value/common/tables/comparators/table_2_value_table_row_comparator.py +27 -0
  414. holado_value/common/tables/comparators/table_2_value_table_with_header_comparator.py +27 -0
  415. holado_value/common/tables/converters/value_table_converter.py +217 -0
  416. holado_value/common/tables/value_table.py +29 -0
  417. holado_value/common/tables/value_table_cell.py +67 -0
  418. holado_value/common/tables/value_table_manager.py +58 -0
  419. holado_value/common/tables/value_table_row.py +44 -0
  420. holado_value/common/tables/value_table_with_header.py +28 -0
  421. holado_value/common/tools/unique_value_manager.py +108 -0
  422. holado_value/common/tools/value.py +164 -0
  423. holado_value/common/tools/value_types.py +35 -0
  424. holado_value/tests/behave/steps/__init__.py +16 -0
  425. holado_value/tests/behave/steps/private/__init__.py +16 -0
  426. holado_ws/__init__.py +16 -0
  427. holado_ws/api/ws/TODO.txt +2 -0
  428. holado_ws/tests/behave/steps/__init__.py +16 -0
  429. holado_ws/tests/behave/steps/api/web_service_steps.py +189 -0
  430. holado_yaml/__init__.py +31 -0
  431. holado_yaml/tests/behave/steps/__init__.py +16 -0
  432. holado_yaml/tests/behave/steps/yaml_steps.py +64 -0
  433. holado_yaml/yaml/yaml_manager.py +86 -0
  434. test_holado/Dockerfile_test_holado +82 -0
  435. test_holado/__init__.py +4 -0
  436. test_holado/__main__.py +25 -0
  437. test_holado/build_docker_image_to_test_holado_in_docker.sh +7 -0
  438. test_holado/environment.py +42 -0
  439. test_holado/features/NonReg/api/REST.feature +21 -0
  440. test_holado/features/NonReg/api/gRPC.feature +122 -0
  441. test_holado/features/NonReg/common/multiprocessing/simple.feature +60 -0
  442. test_holado/features/NonReg/common/system/commands.feature +43 -0
  443. test_holado/features/NonReg/common/system/system.feature +20 -0
  444. test_holado/features/NonReg/common/tables/table.feature +239 -0
  445. test_holado/features/NonReg/common/tables/value_table_conversion.feature +29 -0
  446. test_holado/features/NonReg/common/tools/DateTime.feature +88 -0
  447. test_holado/features/NonReg/common/tools/UniqueValueManager.feature +43 -0
  448. test_holado/features/NonReg/holado_ais/ais_message-bitarray_to_nmea.feature +135 -0
  449. test_holado/features/NonReg/holado_protobuf/protobuf.feature +291 -0
  450. test_holado/features/NonReg/holado_python/convert.feature +20 -0
  451. test_holado/features/NonReg/holado_python/iterable.feature +61 -0
  452. test_holado/features/NonReg/holado_python/standard_library/socket.feature +101 -0
  453. test_holado/features/NonReg/holado_python/standard_library/socket_with_ssl.feature +180 -0
  454. test_holado/features/NonReg/holado_scripting/common/tools/dynamic_text_manager.feature +18 -0
  455. test_holado/features/NonReg/holado_scripting/common/tools/expression_evaluator.feature +185 -0
  456. test_holado/features/NonReg/holado_scripting/common/tools/variable_manager.feature +71 -0
  457. test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.error.feature +21 -0
  458. test_holado/features/NonReg/holado_scripting/text/interpreter/interpreter.feature +120 -0
  459. test_holado/features/NonReg/holado_yaml/yaml.feature +218 -0
  460. test_holado/features/NonReg/ipc/bit_series.error.feature +33 -0
  461. test_holado/features/NonReg/ipc/bit_series.feature +131 -0
  462. test_holado/features/NonReg/ipc/json.feature +20 -0
  463. test_holado/features/NonReg/scenario/scenario.feature +139 -0
  464. test_holado/features/NonReg/test_steps/behave.feature +275 -0
  465. test_holado/features/NonReg/test_steps/common.feature +100 -0
  466. test_holado/features/NonReg/tools/RabbitMQ.feature +445 -0
  467. test_holado/features/NonReg/tools/RabbitMQ_steps.feature +276 -0
  468. test_holado/features/NonReg/tools/S3/boto3_client.feature +73 -0
  469. test_holado/features/NonReg/tools/S3/minio_client.feature +75 -0
  470. test_holado/features/NonReg/tools/db_sqlite3.feature +41 -0
  471. test_holado/features/NonReg/tools/sFTP.feature +25 -0
  472. test_holado/features/Test/logger.feature +28 -0
  473. test_holado/features/__init__.py +0 -0
  474. test_holado/logging.conf +41 -0
  475. test_holado/resources/proto/definitions/protobuf/custom_types/field_types.proto +24 -0
  476. test_holado/resources/proto/definitions/protobuf/protobuf.dev/tutorial/addressbook.proto +56 -0
  477. test_holado/resources/proto/generated/protobuf/custom_types/field_types_pb2.py +34 -0
  478. test_holado/resources/proto/generated/protobuf/protobuf/dev/tutorial/addressbook_pb2.py +34 -0
  479. test_holado/resources/scripts/list_tags.sh +2 -0
  480. test_holado/resources/scripts/update_resources_proto_generated.py +70 -0
  481. test_holado/steps/__init__.py +0 -0
  482. test_holado/steps/private_steps.py +20 -0
  483. test_holado/steps/public_steps.py +23 -0
  484. test_holado/test_holado_session_context.py +43 -0
  485. test_holado/tools/django/README.txt +3 -0
  486. test_holado/tools/django/api_grpc/api_grpc/__init__.py +0 -0
  487. test_holado/tools/django/api_grpc/api_grpc/api1/__init__.py +0 -0
  488. test_holado/tools/django/api_grpc/api_grpc/api1/admin.py +3 -0
  489. test_holado/tools/django/api_grpc/api_grpc/api1/apps.py +6 -0
  490. test_holado/tools/django/api_grpc/api_grpc/api1/migrations/__init__.py +0 -0
  491. test_holado/tools/django/api_grpc/api_grpc/api1/models.py +3 -0
  492. test_holado/tools/django/api_grpc/api_grpc/api1/proto/__init__.py +0 -0
  493. test_holado/tools/django/api_grpc/api_grpc/api1/proto/account.proto +27 -0
  494. test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2.py +33 -0
  495. test_holado/tools/django/api_grpc/api_grpc/api1/proto/account_pb2_grpc.py +199 -0
  496. test_holado/tools/django/api_grpc/api_grpc/api1/serializers.py +12 -0
  497. test_holado/tools/django/api_grpc/api_grpc/api1/services.py +11 -0
  498. test_holado/tools/django/api_grpc/api_grpc/api1/tests.py +3 -0
  499. test_holado/tools/django/api_grpc/api_grpc/api1/views.py +3 -0
  500. test_holado/tools/django/api_grpc/api_grpc/asgi.py +16 -0
  501. test_holado/tools/django/api_grpc/api_grpc/settings.py +126 -0
  502. test_holado/tools/django/api_grpc/api_grpc/urls.py +27 -0
  503. test_holado/tools/django/api_grpc/api_grpc/wsgi.py +16 -0
  504. test_holado/tools/django/api_grpc/db.sqlite3 +0 -0
  505. test_holado/tools/django/api_grpc/manage.py +27 -0
  506. test_holado/tools/django/api_grpc/manual_test_commands.txt +25 -0
  507. test_holado/tools/django/api_rest/api_rest/__init__.py +0 -0
  508. test_holado/tools/django/api_rest/api_rest/api1/__init__.py +0 -0
  509. test_holado/tools/django/api_rest/api_rest/api1/admin.py +3 -0
  510. test_holado/tools/django/api_rest/api_rest/api1/apps.py +6 -0
  511. test_holado/tools/django/api_rest/api_rest/api1/migrations/__init__.py +0 -0
  512. test_holado/tools/django/api_rest/api_rest/api1/models.py +3 -0
  513. test_holado/tools/django/api_rest/api_rest/api1/serializers.py +15 -0
  514. test_holado/tools/django/api_rest/api_rest/api1/tests.py +3 -0
  515. test_holado/tools/django/api_rest/api_rest/api1/views.py +24 -0
  516. test_holado/tools/django/api_rest/api_rest/asgi.py +16 -0
  517. test_holado/tools/django/api_rest/api_rest/settings.py +133 -0
  518. test_holado/tools/django/api_rest/api_rest/urls.py +32 -0
  519. test_holado/tools/django/api_rest/api_rest/wsgi.py +16 -0
  520. test_holado/tools/django/api_rest/db.sqlite3 +0 -0
  521. test_holado/tools/django/api_rest/manage.py +22 -0
  522. holado-0.2.1.dist-info/RECORD +0 -17
  523. {holado-0.2.1.dist-info → holado-0.2.3.dist-info}/WHEEL +0 -0
  524. {holado-0.2.1.dist-info → holado-0.2.3.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,120 @@
1
+ @testing_solution
2
+ @TextInterpreter
3
+ Feature: Features related to TextInterpreter
4
+
5
+ @variable
6
+ Scenario: interpret with variable reference
7
+ Given VAL_1 = 'value 1'
8
+ Given PARAM_NAME = 'VAL_1'
9
+
10
+ When RES = PARAM_NAME
11
+ Then RES == 'VAL_1'
12
+
13
+ When RES = '${PARAM_NAME}'
14
+ Then RES == 'VAL_1'
15
+
16
+ When RES = ${PARAM_NAME}
17
+ Then RES == 'value 1'
18
+
19
+ When RES = '${${PARAM_NAME}}'
20
+ Then RES == 'value 1'
21
+
22
+ @HexToBytes
23
+ Scenario: function HexToBytes
24
+
25
+ Given HEX = '01569F'
26
+ Given VALUE_1 = ${HexToBytes(HEX)}
27
+ Then VALUE_1 == b'\x01\x56\x9F'
28
+
29
+ Given VALUE_2 = ${HexToBytes('FFFF')}
30
+ Then VALUE_2 == b'\xFF\xFF'
31
+
32
+ @HexToInt
33
+ Scenario: function HexToInt
34
+
35
+ Given HEX = '040A'
36
+ Given VALUE = ${HexToInt(HEX)}
37
+ Then VALUE == 1034
38
+
39
+ Given VALUE = ${HexToInt(040A)}
40
+ Then VALUE == 1034
41
+
42
+ Given VALUE = ${HexToInt('040A')}
43
+ Then VALUE == 1034
44
+
45
+ @MatchPattern
46
+ Scenario: function MatchPattern
47
+
48
+ Given TEXT = 'Hello TOTO !'
49
+ Then TEXT == '${MatchPattern(.*TOTO.*)}'
50
+
51
+ Then TEXT == '${MatchPattern([^ ]+ (?P<NAME>\w+).*)}'
52
+ Then NAME == 'TOTO'
53
+
54
+
55
+ Given TEXT = 'Hello !\nHow are you TOTO ?'
56
+
57
+ Given next step shall fail on exception matching '.*holado_core.common.exceptions.verify_exception.VerifyException\(Match failure, value doesn't match pattern.*'
58
+ Then TEXT == '${MatchPattern(.*(?P<NAME>\w+) \?)}'
59
+
60
+ Then TEXT == '${MatchPattern(.*?(?P<NAME>\w+) \?, re.DOTALL)}'
61
+ Then NAME == 'TOTO'
62
+
63
+
64
+ Given TEXT = 'First plan was launched at 2024-06-20'
65
+ Then TEXT == '${MatchPattern(^First plan was launched at \d{4}-\d{2}-\d{2}$)}'
66
+
67
+
68
+ Given TABLE = table with header
69
+ | Name | Value |
70
+ | 'text' | 'First plan was launched at 2024-06-20' |
71
+ Then table TABLE is
72
+ | Name | Value |
73
+ | 'text' | '${MatchPattern(^First plan was launched at \d{4}-\d{2}-\d{2})}' |
74
+
75
+
76
+ @ToHex
77
+ Scenario: function ToHex
78
+
79
+ Given VALUE = 1034
80
+ Given HEX = '${ToHex(VALUE)}'
81
+ Then HEX == '040A'
82
+ Given HEX = '${ToHex(VALUE, False)}'
83
+ Then HEX == '040a'
84
+
85
+ Given VALUE = 'TEST'
86
+ Given HEX = '${ToHex(VALUE)}'
87
+ Then HEX == '54455354'
88
+
89
+ Given VALUE = b'\xF1\x4A'
90
+ Given HEX = '${ToHex(VALUE)}'
91
+ Then HEX == 'F14A'
92
+
93
+ @EscapeAllBytes
94
+ Scenario: function EscapeAllBytes
95
+
96
+ Given HEX = 'd27ced'
97
+ Given VALUE = ${HexToBytes(HEX)}
98
+ Given ESCAPED_VALUE = '${EscapeAllBytes(VALUE)}'
99
+
100
+ Then ESCAPED_VALUE == 'b'\\xd2\\x7c\\xed''
101
+
102
+ # Same in a thread
103
+ Given THREAD_ID = call steps in a thread
104
+ """
105
+ Given ESCAPED_VALUE_2 = '${EscapeAllBytes(VALUE)}'
106
+ """
107
+ When join thread THREAD_ID
108
+ Then ESCAPED_VALUE_2 == ESCAPED_VALUE
109
+
110
+ # Same with explicit byte expression in text
111
+ Given THREAD_ID = call steps in a thread
112
+ """
113
+ Given ESCAPED_VALUE_3 = '${EscapeAllBytes(b'\\xd2\\x7c\\xed')}'
114
+ """
115
+ When join thread THREAD_ID
116
+ Then ESCAPED_VALUE_3 == ESCAPED_VALUE
117
+
118
+
119
+
120
+
@@ -0,0 +1,218 @@
1
+ @testing_solution
2
+ @yaml
3
+ Feature: Test YAML module
4
+
5
+ @load_file
6
+ Scenario: Load a YAML file
7
+ Given FILE_PATH = create file with name 'load.yaml'
8
+ """
9
+ company: spacelift
10
+ domain:
11
+ - devops
12
+ - devsecops
13
+ tutorial:
14
+ - yaml:
15
+ name: "YAML Ain't Markup Language"
16
+ type: awesome
17
+ born: 2001
18
+ - json:
19
+ name: JavaScript Object Notation
20
+ type: great
21
+ born: 2001
22
+ - xml:
23
+ name: Extensible Markup Language
24
+ type: good
25
+ born: 1996
26
+ author: omkarbirade
27
+ """
28
+
29
+ When CONTENT = load YAML file FILE_PATH
30
+
31
+ Given TABLE = convert json CONTENT to name/value table with names and list uncollapsed
32
+ Then table TABLE is
33
+ | Name | Value |
34
+ | 'author' | 'omkarbirade' |
35
+ | 'company' | 'spacelift' |
36
+ | 'domain[0]' | 'devops' |
37
+ | 'domain[1]' | 'devsecops' |
38
+ | 'tutorial[0].yaml.born' | 2001 |
39
+ | 'tutorial[0].yaml.name' | 'YAML Ain't Markup Language' |
40
+ | 'tutorial[0].yaml.type' | 'awesome' |
41
+ | 'tutorial[1].json.born' | 2001 |
42
+ | 'tutorial[1].json.name' | 'JavaScript Object Notation' |
43
+ | 'tutorial[1].json.type' | 'great' |
44
+ | 'tutorial[2].xml.born' | 1996 |
45
+ | 'tutorial[2].xml.name' | 'Extensible Markup Language' |
46
+ | 'tutorial[2].xml.type' | 'good' |
47
+
48
+ @base_load_file
49
+ Scenario: Load a YAML file with only base YAML features
50
+ Given FILE_PATH = create file with name 'load.yaml'
51
+ """
52
+ company: spacelift
53
+ domain:
54
+ - devops
55
+ - devsecops
56
+ tutorial:
57
+ - yaml:
58
+ name: "YAML Ain't Markup Language"
59
+ type: awesome
60
+ born: 2001
61
+ - json:
62
+ name: JavaScript Object Notation
63
+ type: great
64
+ born: 2001
65
+ - xml:
66
+ name: Extensible Markup Language
67
+ type: good
68
+ born: 1996
69
+ author: omkarbirade
70
+ """
71
+
72
+ When CONTENT = load YAML file FILE_PATH (with only strings)
73
+
74
+ Given TABLE = convert json CONTENT to name/value table with names and list uncollapsed
75
+ Then table TABLE is
76
+ | Name | Value |
77
+ | 'author' | 'omkarbirade' |
78
+ | 'company' | 'spacelift' |
79
+ | 'domain[0]' | 'devops' |
80
+ | 'domain[1]' | 'devsecops' |
81
+ | 'tutorial[0].yaml.born' | '2001' |
82
+ | 'tutorial[0].yaml.name' | 'YAML Ain't Markup Language' |
83
+ | 'tutorial[0].yaml.type' | 'awesome' |
84
+ | 'tutorial[1].json.born' | '2001' |
85
+ | 'tutorial[1].json.name' | 'JavaScript Object Notation' |
86
+ | 'tutorial[1].json.type' | 'great' |
87
+ | 'tutorial[2].xml.born' | '1996' |
88
+ | 'tutorial[2].xml.name' | 'Extensible Markup Language' |
89
+ | 'tutorial[2].xml.type' | 'good' |
90
+
91
+ @full_load_file
92
+ Scenario: Load a YAML file with full YAML features
93
+ Given FILE_PATH = create file with name 'load.yaml'
94
+ """
95
+ company: spacelift
96
+ domain:
97
+ - devops
98
+ - devsecops
99
+ tutorial:
100
+ - yaml: &reference
101
+ name: "YAML Ain't Markup Language"
102
+ type: awesome
103
+ born: 2001
104
+ - json: *reference
105
+ - xml:
106
+ <<: *reference
107
+ born: 1996
108
+ author: omkarbirade
109
+ """
110
+
111
+ When CONTENT = load YAML file FILE_PATH (with full YAML features)
112
+
113
+ Given TABLE = convert json CONTENT to name/value table with names and list uncollapsed
114
+ Then table TABLE is
115
+ | Name | Value |
116
+ | 'author' | 'omkarbirade' |
117
+ | 'company' | 'spacelift' |
118
+ | 'domain[0]' | 'devops' |
119
+ | 'domain[1]' | 'devsecops' |
120
+ | 'tutorial[0].yaml.born' | 2001 |
121
+ | 'tutorial[0].yaml.name' | 'YAML Ain't Markup Language' |
122
+ | 'tutorial[0].yaml.type' | 'awesome' |
123
+ | 'tutorial[1].json.born' | 2001 |
124
+ | 'tutorial[1].json.name' | 'YAML Ain't Markup Language' |
125
+ | 'tutorial[1].json.type' | 'awesome' |
126
+ | 'tutorial[2].xml.born' | 1996 |
127
+ | 'tutorial[2].xml.name' | 'YAML Ain't Markup Language' |
128
+ | 'tutorial[2].xml.type' | 'awesome' |
129
+
130
+
131
+ @load_multiple_document
132
+ Scenario: Load a multiple document YAML file
133
+ Given FILE_PATH = create file with name 'load_multiple.yaml'
134
+ """
135
+ ---
136
+ company: spacelift
137
+ domain:
138
+ - devops
139
+ - devsecops
140
+ ---
141
+ tutorial:
142
+ - yaml:
143
+ name: "YAML Ain't Markup Language"
144
+ type: awesome
145
+ born: 2001
146
+ - json:
147
+ name: JavaScript Object Notation
148
+ type: great
149
+ born: 2001
150
+ - xml:
151
+ name: Extensible Markup Language
152
+ type: good
153
+ born: 1996
154
+ author: omkarbirade
155
+ ...
156
+ """
157
+
158
+ When CONTENT = load multiple documents YAML file FILE_PATH
159
+
160
+ Given TABLE_1 = convert json CONTENT[0] to name/value table with names and list uncollapsed
161
+ Given TABLE_2 = convert json CONTENT[1] to name/value table with names and list uncollapsed
162
+ Then table TABLE_1 is
163
+ | Name | Value |
164
+ | 'company' | 'spacelift' |
165
+ | 'domain[0]' | 'devops' |
166
+ | 'domain[1]' | 'devsecops' |
167
+ Then table TABLE_2 is
168
+ | Name | Value |
169
+ | 'author' | 'omkarbirade' |
170
+ | 'tutorial[0].yaml.born' | 2001 |
171
+ | 'tutorial[0].yaml.name' | 'YAML Ain't Markup Language' |
172
+ | 'tutorial[0].yaml.type' | 'awesome' |
173
+ | 'tutorial[1].json.born' | 2001 |
174
+ | 'tutorial[1].json.name' | 'JavaScript Object Notation' |
175
+ | 'tutorial[1].json.type' | 'great' |
176
+ | 'tutorial[2].xml.born' | 1996 |
177
+ | 'tutorial[2].xml.name' | 'Extensible Markup Language' |
178
+ | 'tutorial[2].xml.type' | 'good' |
179
+
180
+
181
+ @save_file
182
+ Scenario: Save data in a YAML file
183
+ Given DATA = ${{'company': 'spacelift', 'domain': ['devops', 'devsecops'], 'tutorial': [{'yaml': {'name': "YAML Ain't Markup Language", 'type': 'awesome', 'born': 2001}}, {'json': {'name': 'JavaScript Object Notation', 'type': 'great', 'born': 2001}}, {'xml': {'name': 'Extensible Markup Language', 'type': 'good', 'born': 1996}}], 'author': 'omkarbirade'}}
184
+
185
+ Given FILE_PATH = path to file with name 'save.yaml'
186
+ When save DATA in YAML file FILE_PATH
187
+
188
+ Given CONTENT_BYTES = content of file FILE_PATH
189
+ Given CONTENT_STR = convert object value CONTENT_BYTES to string
190
+ Given CONTENT_STR = ${CONTENT_STR.strip()}
191
+
192
+ Given EXPECTED = multiline text
193
+ """
194
+ author: omkarbirade
195
+ company: spacelift
196
+ domain:
197
+ - devops
198
+ - devsecops
199
+ tutorial:
200
+ - yaml:
201
+ born: 2001
202
+ name: YAML Ain't Markup Language
203
+ type: awesome
204
+ - json:
205
+ born: 2001
206
+ name: JavaScript Object Notation
207
+ type: great
208
+ - xml:
209
+ born: 1996
210
+ name: Extensible Markup Language
211
+ type: good
212
+ """
213
+ Then CONTENT_STR == EXPECTED
214
+
215
+
216
+
217
+
218
+
@@ -0,0 +1,33 @@
1
+ @testing_solution
2
+ @bit_series
3
+ @error
4
+ @go_nogo
5
+ Feature: Test bit_series module
6
+
7
+ Scenario: Create from hexa bit-series of bit length out of bytes array length
8
+ Given BIT_SERIES = bit series
9
+ | Name | Bit length | Type |
10
+ | 'F1' | 3 | int |
11
+ | 'F2' | 1 | int |
12
+ | 'F3' | 1 | int |
13
+
14
+ Given next step shall fail on exception matching 'Hexadecimal string has unexpected padded characters, only zero padding is managed \(expected bits number: 5 ; left padding ; obtained padding bits: 100\)'
15
+ When fill bit series BIT_SERIES from hexadecimal string '92'
16
+
17
+ Given next step shall fail on exception matching 'Hexadecimal string has unexpected padded characters, only zero padding is managed \(expected bits number: 5 ; left padding ; obtained padding bits: 100\)'
18
+ When fill bit series BIT_SERIES from hexadecimal string '92' (left padded)
19
+
20
+ Given next step shall fail on exception matching 'Hexadecimal string has unexpected padded characters, only zero padding is managed \(expected bits number: 5 ; right padding ; obtained padding bits: 010\)'
21
+ When fill bit series BIT_SERIES from hexadecimal string '92' (right padded)
22
+
23
+ Scenario: Create and convert bit-series to hexa with a field value exceeding bit length
24
+ Given BIT_SERIES = bit series
25
+ | Name | Bit length | Type | Value |
26
+ | 'F1' | 3 | int | 4 |
27
+ | 'F2' | 1 | int | 1 |
28
+ | 'F3' | 2 | int | 2 |
29
+ | 'F4' | 2 | int | 4 |
30
+ Given next step shall fail on exception matching 'For field 'F4', the value \[4\] has binary length 3 \(expected length: 2\)'
31
+ Given RAW_TM = convert bit series BIT_SERIES to hexadecimal string
32
+
33
+
@@ -0,0 +1,131 @@
1
+ @testing_solution
2
+ @bit_series
3
+ @go_nogo
4
+ Feature: Test bit_series module
5
+
6
+ Scenario: Create and convert bit-series to hexa
7
+ Given BIT_SERIES = bit series
8
+ | Name | Bit length | Type | Value |
9
+ | 'F1' | 3 | int | 4 |
10
+ | 'F2' | 1 | int | 1 |
11
+ | 'F3' | 2 | int | 2 |
12
+ | 'F4' | 2 | int | 1 |
13
+ Given RAW_TM = convert bit series BIT_SERIES to hexadecimal string
14
+ Then RAW_TM == '99'
15
+
16
+ Given BIT_SERIES = bit series
17
+ | Name | Bit length | Type | Value |
18
+ | 'F1' | 3 | int | 4 |
19
+ | 'F2' | 1 | int | 1 |
20
+ | 'F3' | 2 | int | 2 |
21
+ | 'F4' | 2 | int | 1 |
22
+ | 'F5' | 16 | str | 'ffff' |
23
+ | 'F6' | 16 | str | 'AE1B' |
24
+ Given RAW_TM = convert bit series BIT_SERIES to hexadecimal string
25
+ Then RAW_TM == '99FFFFAE1B'
26
+
27
+ Scenario: Create and convert to hexa bit-series of bit length out of bytes array length
28
+ Given BIT_SERIES = bit series
29
+ | Name | Bit length | Type | Value |
30
+ | 'F1' | 3 | int | 4 |
31
+ | 'F2' | 1 | int | 1 |
32
+ | 'F3' | 1 | int | 1 |
33
+
34
+ Given RAW_TM = convert bit series BIT_SERIES to hexadecimal string
35
+ Then RAW_TM == '13'
36
+
37
+ Given RAW_TM = convert bit series BIT_SERIES to hexadecimal string (left padded)
38
+ Then RAW_TM == '13'
39
+
40
+ Given RAW_TM = convert bit series BIT_SERIES to hexadecimal string (right padded)
41
+ Then RAW_TM == '98'
42
+
43
+
44
+ Given BIT_SERIES = bit series
45
+ | Name | Bit length | Type | Value |
46
+ | 'F1' | 3 | int | 4 |
47
+ | 'F2' | 1 | int | 1 |
48
+ | 'F3' | 3 | int | 1 |
49
+
50
+ Given RAW_TM = convert bit series BIT_SERIES to hexadecimal string
51
+ Then RAW_TM == '49'
52
+
53
+ Given RAW_TM = convert bit series BIT_SERIES to hexadecimal string (left padded)
54
+ Then RAW_TM == '49'
55
+
56
+ Given RAW_TM = convert bit series BIT_SERIES to hexadecimal string (right padded)
57
+ Then RAW_TM == '92'
58
+
59
+ Scenario: Create a bit-series from hexa
60
+ Given BIT_SERIES = bit series
61
+ | Name | Bit length | Type |
62
+ | 'F1' | 3 | int |
63
+ | 'F2' | 1 | int |
64
+ | 'F3' | 2 | int |
65
+ | 'F4' | 2 | int |
66
+ When fill bit series BIT_SERIES from hexadecimal string '92'
67
+ Then bit series BIT_SERIES is
68
+ | Name | Bit length | Type | Value |
69
+ | 'F1' | 3 | int | 4 |
70
+ | 'F2' | 1 | int | 1 |
71
+ | 'F3' | 2 | int | 0 |
72
+ | 'F4' | 2 | int | 2 |
73
+
74
+ Scenario: Create from hexa bit-series of bit length out of bytes array length
75
+ Given BIT_SERIES = bit series
76
+ | Name | Bit length | Type |
77
+ | 'F1' | 3 | int |
78
+ | 'F2' | 1 | int |
79
+ | 'F3' | 1 | int |
80
+
81
+ When fill bit series BIT_SERIES from hexadecimal string '13'
82
+ Then bit series BIT_SERIES is
83
+ | Name | Bit length | Type | Value |
84
+ | 'F1' | 3 | int | 4 |
85
+ | 'F2' | 1 | int | 1 |
86
+ | 'F3' | 1 | int | 1 |
87
+
88
+ When fill bit series BIT_SERIES from hexadecimal string '13' (left padded)
89
+ Then bit series BIT_SERIES is
90
+ | Name | Bit length | Type | Value |
91
+ | 'F1' | 3 | int | 4 |
92
+ | 'F2' | 1 | int | 1 |
93
+ | 'F3' | 1 | int | 1 |
94
+
95
+ When fill bit series BIT_SERIES from hexadecimal string '98' (right padded)
96
+ Then bit series BIT_SERIES is
97
+ | Name | Bit length | Type | Value |
98
+ | 'F1' | 3 | int | 4 |
99
+ | 'F2' | 1 | int | 1 |
100
+ | 'F3' | 1 | int | 1 |
101
+
102
+ Scenario: Verify hexa string is bit series
103
+ Then hexadecimal string '92' is bit series
104
+ | Name | Bit length | Type | Value |
105
+ | 'F1' | 3 | int | 4 |
106
+ | 'F2' | 1 | int | 1 |
107
+ | 'F3' | 2 | int | 0 |
108
+ | 'F4' | 2 | int | 2 |
109
+
110
+ Scenario: Set bit-series field by variable expression
111
+ Given BIT_SERIES = bit series
112
+ | Name | Bit length | Type | Value |
113
+ | 'F1' | 3 | int | 4 |
114
+ | 'F2' | 1 | int | 1 |
115
+ | 'F3' | 2 | int | 2 |
116
+ | 'F4' | 2 | int | 1 |
117
+ | 'F5' | 16 | int | 0 |
118
+ Given RAW_TM = convert bit series BIT_SERIES to hexadecimal string
119
+ Then BIT_SERIES['F5'] == 0
120
+ Then RAW_TM[-4:] == '0000'
121
+
122
+ Given BIT_SERIES['F5'] = 1
123
+ Given RAW_TM = convert bit series BIT_SERIES to hexadecimal string
124
+
125
+ Then BIT_SERIES['F5'] == 1
126
+ Then RAW_TM[-4:] == '0001'
127
+ Then BIT_SERIES['F5'] != 0
128
+ Then RAW_TM[-4:] != '0000'
129
+
130
+
131
+
@@ -0,0 +1,20 @@
1
+ @testing_solution
2
+ @json
3
+ @go_nogo
4
+ Feature: Test json module
5
+
6
+ Scenario: Convert text to json object
7
+
8
+ ### PRECONDITIONS - BEGIN
9
+ Given begin preconditions
10
+
11
+ Given FILE_CONTENT = b'[{\n "beaconData": "AAAH24LhKz2M+ICw4tTWc26VM8/D2t0QOva9GgOg7cQ8wLsdpiT3aHGDjYHp9YaRnmtrObAjsxIHvB5AUQlZMo0NaY7YJIroAOE/1WD1/Skofh71N4MVT9VmB8eqeYmP1vhaggycgJ3sa5AUin3fawT6TPm2ULC1JA1tjAhKrr6ziTyT0N+WmlXRwKNef1NQcO1pjcNIpvzTsYfVAeDM4zDec4HT70b9O93vtCeFMUCqjaBQh8rKVJQCyPhocy01trjWKV9QAB5Nt6vTjEZ9jUurbeJywj/sMf7C07OsX79Hu5tdvhB8+pFpFucmPIxdR6k21daA/SboxLErR+1PqJFxqGVxqendVshgQEAJImDIZSmt0q3ITAVYBY10ZHqApxWQSAE+Yox6xjQkL4EzZy3EI2+2zRCf7c6DhtKg3+PhlROOrzSSm5W40SLZdVyN/8Q413xx7ZW9Vcr+O024Fic9f1FwKEWWbv5aInYuiyIQrOATwNcWmBQpbTPVJ8M9kN4/Xl0eIgWZklakBamuJCF+SFD5yXjAUHyiq+lQVBxW7uULC5AucpoHry0I5htJi8Qc4n+T16wPlbdeVb/lC+3Fd9aF+q/yLQv7S8mIk5XpVq48hlc6Tu8gqgXKY5fYwBUjehnPW0qsgpqKddRiHbX6W85d3sTw7w3q+6ZW3RA=",\n "argosMetadata": {\n "base": {\n "satelliteId": "KIN1A",\n "onboardPacketTimeTai": "2023-01-01T00:32:17Z",\n "receptionLevel": -133.0,\n "cn0Dbhz": 44.8\n },\n "modulation": "MODULATION_HDA4",\n "blockCount": 4,\n "messageToaTai": "2023-01-01T00:32:17.167127609Z",\n "processingContext": {\n "processorId": 1,\n "utId": 21,\n "basebandId": 0\n },\n "dopplerRawFoaHz": 401657625.63,\n "qualityIndicator": 0\n },\n "grsMetadata": {\n "stationId": "TLS1",\n "receptionTimeTai": "2023-01-01T00:32:17Z"\n },\n "mcsMetadata": {\n "base": {\n "mcsInstance": "INSTANCE_SITE1",\n "receivedTimeTai": "2023-03-09T15:32:19.811Z",\n "availableTimeTai": "2023-03-09T15:32:19.839Z"\n },\n "foaValid": true,\n "dopplerCompensatedFoaHz": 401657728.29170704,\n "toaValid": true,\n "dopplerToaTai": "2023-01-01T00:32:17.179503679Z"\n }\n},\n{\n "beaconData": "AAAH2/VfdtJF2OKFG1cHg1C9i6ApjT4PsUFMKRSCejlUrO1bYv919RRbMwB6HB9APKZwcRvBU4xd/7kqsitALONMlJ8BsyZoN8r0UIIK7H9YNzkbbaBJZ6ce15UZLYdNEjvvtlCvB60EL5hlH7qsVccywmgf3seg0wu8HftUJMr0W7OCA/3mwfkPB2Ml4mmMRKJkE7EQNsrzm4E1gJRifRD1lG8Qgo+2njuN0YPC1zEpFW33wyf/ukSN0+wBFPqqNKHc6ARP8178xdaHY8OCKFjBh/7oOm91uMtFhajOJ4yCcxTzbvgq2Fhi3qPVKb5Tt+LN3ts1Mod96EXf2bz8GHz0bpCBRc4A53l2lpX7DY0W57vTUrt0moYvC22VXxJso6D4XDmOziaZL9NmBItgDiAAlXUrj9bYn1or93StPSjI9UruHuOIj5fu9cLHvdNEVtXGa2BF1gY0C/YP6EiRHkbdaf0WPWAfIHrB3Ad8HB2JpWyE9buNuIZu0FLYKe4M/WkLlOY28cyifRifZPiMMG2iL3NXQbG8W9n1yua8tOuKHqwmrXXL7LUYP1jnkxOZYF4wjkKvitN5QSAfJGNVUdIfe4TkeKrWgjsK2HPnVe7szCNjIqZFbdVGicAPoffhJSpuR9uBIzRflj1zKJDxwBaovGz0/w/kdXfc+k220QE=",\n "argosMetadata": {\n "base": {\n "satelliteId": "KIN1A",\n "onboardPacketTimeTai": "2023-01-01T00:31:17Z",\n "receptionLevel": -131.0,\n "cn0Dbhz": 48.0\n },\n "modulation": "MODULATION_HDA4",\n "blockCount": 4,\n "messageToaTai": "2023-01-01T00:31:17.168287038Z",\n "processingContext": {\n "utId": 39,\n "basebandId": 0,\n "processorId": 0\n },\n "dopplerRawFoaHz": 401658033.66,\n "qualityIndicator": 0\n },\n "grsMetadata": {\n "stationId": "TLS1",\n "receptionTimeTai": "2023-01-01T00:31:17Z"\n },\n "mcsMetadata": {\n "base": {\n "mcsInstance": "INSTANCE_SITE1",\n "receivedTimeTai": "2023-03-09T15:32:19.805Z",\n "availableTimeTai": "2023-03-09T15:32:19.836Z"\n },\n "foaValid": true,\n "dopplerCompensatedFoaHz": 401658136.3218114,\n "toaValid": true,\n "dopplerToaTai": "2023-01-01T00:31:17.179518938Z"\n }\n},\n{\n "beaconData": "AAAH21gMNR9eyMOyrHdJZw+kCxjdGC19BRlOzRc2P51hdzN2laSbQRlDVJMKeP/T3MpH/fgF5P5HA26jANhk540o/8lPST4XOemTqHAngCOw7qyOOIhCJPMYKZYvfou7PDy+8Et+whuNEidbDAD6FL58NPugDpd2PYPzOmxg0UHjGjWb6lEjtWJw7PCQ7TOWt2kRnRMTINCgX7Ja0S2GmcLqxfJNvCz0R73A4D2ZptFPb2YKwXYT6KgmuERj6a6TjVzib6Qunsq5BPifN/WKlhV8o53lXzOUf1KoQj12eVrCX7Ek0zPRyAyIdl9u0reDcsfIiK7o0HTaayXInEZOAP8juWpFJZAusK7Z4IkKfzZwgseNYpequY1UY5hyOGqrKnKO0OD+brbCtlc1Hp1Sdvezy0m7pNY/nqs+JRIJpICWcgCajkl2tkx4qNo7xVpDmYM9762ubTUP/K7Ea78i8Nqq/fOoKc62n9yVsXGFXFXOSmaOPGr6u9rgNTVp1kwcENgXjhRRTG8x44hF/mPrvzX4BuG7Khgv9jd01kiGftS2GImuxrGG3AKuZyjWyb0JlOKMIf2z3sIaa3v/+IfBaWThomO6EGGf2YwicYT4ixm64A2D2BDF++Fc2a4zTCNucxO0/QrLdu16ETFM/pqEGNUs/U+PcsNHB2VAuC6fLOE=",\n "argosMetadata": {\n "base": {\n "satelliteId": "KIN1A",\n "onboardPacketTimeTai": "2023-01-01T00:33:17Z",\n "receptionLevel": -136.2,\n "cn0Dbhz": 40.0\n },\n "modulation": "MODULATION_HDA4",\n "blockCount": 4,\n "messageToaTai": "2023-01-01T00:33:17.166072368Z",\n "processingContext": {\n "utId": 93,\n "basebandId": 0,\n "processorId": 0\n },\n "dopplerRawFoaHz": 401656977.09,\n "qualityIndicator": 0\n },\n "grsMetadata": {\n "stationId": "TLS1",\n "receptionTimeTai": "2023-01-01T00:33:17Z"\n },\n "mcsMetadata": {\n "base": {\n "mcsInstance": "INSTANCE_SITE1",\n "receivedTimeTai": "2023-03-09T15:32:19.814Z",\n "availableTimeTai": "2023-03-09T15:32:19.842Z"\n },\n "foaValid": true,\n "dopplerCompensatedFoaHz": 401657079.75154126,\n "toaValid": true,\n "dopplerToaTai": "2023-01-01T00:33:17.179488420Z"\n }\n}]'
12
+
13
+ Given end preconditions
14
+ ### PRECONDITIONS - END
15
+
16
+ Given LIST = convert text FILE_CONTENT to json
17
+
18
+ Given SIZE = size of LIST
19
+ Then SIZE == 3
20
+
@@ -0,0 +1,139 @@
1
+ @testing_solution
2
+ @scenario
3
+ Feature: Features related to scenario
4
+
5
+ @preconditions
6
+ Scenario: preconditions
7
+
8
+ Given next step shall fail on exception matching ''ScenarioContext' object has no attribute 'is_in_preconditions''
9
+ Then SCENARIO_CONTEXT.is_in_preconditions == False
10
+
11
+ ### PRECONDITIONS - BEGIN
12
+ Given begin preconditions
13
+
14
+ Then SCENARIO_CONTEXT.is_in_preconditions == True
15
+
16
+ Given end preconditions
17
+ ### PRECONDITIONS - END
18
+
19
+ Then SCENARIO_CONTEXT.is_in_preconditions == False
20
+
21
+
22
+ Scenario: postconditions
23
+
24
+ ### PRECONDITIONS - BEGIN
25
+ Given begin preconditions
26
+
27
+ Given VAR = 'before postcondition'
28
+ Given at end of scenario, call steps
29
+ """
30
+ Given VAR = 'after postcondition'
31
+ """
32
+
33
+ Given end preconditions
34
+ ### PRECONDITIONS - END
35
+
36
+ Then VAR == 'before postcondition'
37
+
38
+ When execute post processes of scenario context
39
+
40
+ Then VAR == 'after postcondition'
41
+
42
+
43
+ @table_possible_values
44
+ Scenario: Scenario table possible values
45
+
46
+ ### PRECONDITIONS - BEGIN
47
+ Given begin preconditions
48
+
49
+ Given INPUT_TEXT = multiline text
50
+ """
51
+ {"test01": 1, "test02":2.0, "test03": "test3", "test04": null, "test05": "dummy",
52
+ "test06": "Variable value", "test07": "Variable value", "test08": "ExtractIn function",
53
+ "test09": "has txt inside", "test10": 3}
54
+ """
55
+ Given INPUT_TABLE = convert json INPUT_TEXT to name/value table with names uncollapsed
56
+ Given VAR = 'Variable value'
57
+ Given TXT = 'txt'
58
+ Given VAL_2 = 2
59
+
60
+ Given end preconditions
61
+ ### PRECONDITIONS - END
62
+
63
+ Then table INPUT_TABLE is
64
+ | Name | Value |
65
+ | 'test01' | 1 |
66
+ | 'test02' | 2.0 |
67
+ | 'test03' | 'test3' |
68
+ | 'test04' | None |
69
+ | 'test05' | N/A |
70
+ | 'test06' | VAR |
71
+ | 'test07' | '${VAR}' |
72
+ | 'test08' | '${ExtractIn(VAR2)}' |
73
+ | 'test09' | '${MatchPattern(has ${TXT} inside)}' |
74
+ | 'test10' | ${VAL_2} + 1 |
75
+
76
+ Then VAR2 == 'ExtractIn function'
77
+
78
+ Scenario: Use a table variable as a scenario table
79
+
80
+ ### PRECONDITIONS - BEGIN
81
+ Given begin preconditions
82
+
83
+ Given INPUT_TABLE = convert json '{"test1": 1, "test2":2.0, "test3": "test3", "test4": null, "test5": "dummy", "test6": "Variable value", "test7": "Variable value", "test8": "ExtractIn function"}' to name/value table with names uncollapsed
84
+ Given VAR = 'Variable value'
85
+
86
+ Given end preconditions
87
+ ### PRECONDITIONS - END
88
+
89
+ Given TABLE = table with header
90
+ | INPUT_TABLE |
91
+
92
+ Then table TABLE is
93
+ | Name | Value |
94
+ | 'test1' | 1 |
95
+ | 'test2' | 2.0 |
96
+ | 'test3' | 'test3' |
97
+ | 'test4' | None |
98
+ | 'test5' | N/A |
99
+ | 'test6' | VAR |
100
+ | 'test7' | '${VAR}' |
101
+ | 'test8' | '${ExtractIn(VAR2)}' |
102
+
103
+ Then VAR2 == 'ExtractIn function'
104
+
105
+
106
+ @ScenarioTools.evaluate_scenario_parameter
107
+ Scenario: ScenarioTools.evaluate_scenario_parameter
108
+ Given VAR1 = 10
109
+ Given VAR2 = 11
110
+ Given VAR2S = '11'
111
+ Given VAR2_PLUS = '10 + 1'
112
+ Given VAR3 = 9
113
+
114
+ Then VAR2 == ${VAR1} + 1
115
+ Then VAR2_PLUS == '${VAR1} + 1'
116
+ Then VAR2 == ${${VAR1} + 1}
117
+ Then VAR2S == '${${VAR1} + 1}'
118
+ Then VAR3 == ${VAR1} - 1
119
+
120
+ Given URL = 'http://auto.test'
121
+ Given PORT = '1234'
122
+ Given ENDPOINT = '${URL}:${PORT}'
123
+ Then ENDPOINT == 'http://auto.test:1234'
124
+
125
+
126
+ # Python expression evaluation
127
+ Given VAR4 = ${"{:>08s}".format("A0")}
128
+ Then VAR4 == '000000A0'
129
+ Given VAR4 = ${"{{:>08s}}".format("A0")}
130
+ Then VAR4 == '000000A0'
131
+ Given VAR4 = ${'{{:>08s}}'.format('A0')}
132
+ Then VAR4 == '000000A0'
133
+
134
+ Given VAR5 = ${[{'a': {'b': 'c'}}]}
135
+ Then VAR5 is list
136
+ Then VAR5[0]['a']['b'] == 'c'
137
+
138
+
139
+