File 6291-ct-add-internal_doc-and-ct_notes.md.patch of Package erlang

From 87291144f9c78e9390c5fdf2905454829368276c Mon Sep 17 00:00:00 2001
From: Jakub Witczak <kuba@erlang.org>
Date: Tue, 20 Jun 2023 18:32:11 +0200
Subject: [PATCH] ct: add internal_doc and ct_notes.md

---
 lib/common_test/internal_doc/ct_notes.md | 161 +++++++++++++++++++++++
 1 file changed, 161 insertions(+)
 create mode 100644 lib/common_test/internal_doc/ct_notes.md

diff --git a/lib/common_test/internal_doc/ct_notes.md b/lib/common_test/internal_doc/ct_notes.md
new file mode 100644
index 0000000000..84c70b97ef
--- /dev/null
+++ b/lib/common_test/internal_doc/ct_notes.md
@@ -0,0 +1,161 @@
+# CT test_server
+
+## Problem (GH-7119, OTP-11894, OTP-14480)
+I think the most confusing thing is that today OTP behavior and design seems to be a mix of Configuration and Testcase centric attributes:
+1. (Configuration centric) CT hook callback looks as designed to wrap around CT Configuration functions (i.e. you have *pre* and *post* to wrapp around init_per_testcase or end_per_testcase)
+   - Furthermore if you consider hook callback function names, there are no hooks wrapping around Testcase function at all!
+2. (Testcase centric) AND at the same the hook execution order is determined by relation to CT Testcase callback
+### Next step ideas
+1. improve existing documentation for hooks (actually it was planned for many years but down prioritized)
+2. add mermaid diagrams to docs when that is possible
+3. introduce a CT option for Configuration centric hook execution order (maybe named ct_hooks_order := [testcase(default) | configuration])
+### CT hooks priorities (documentation sketch)
+Let's assume:
+1. cth_A and cth_B being CT hook modules to be installed
+2. A, B are CT hook priorities where A is more important than B (higher priority)
+3. hook priorities affect order in which hook callbacks of the same type are executed
+4. Testcase functions - are CT callback functions defined in suite which will have test verdict assigned (e.g. ok, fail, skip)
+5. Configuration functions - are CT callback functions defining initialization and cleanup routines for testcases (e.g. init_per_testcase, end_per_testcase)
+
+```mermaid
+---
+title: Diagram legend
+---
+flowchart LR
+    dc((("double circle"))) -.- i>item determining hook execution order]
+    pgr[/"parallelogram"/] -.- j>item not relevant for hook execution order]
+```
+
+#### Testcase centric (default)
+1. execution order is related to position in relation to Testcase
+2. all *init* hook callbacks(positioned before Testcase) are executed in some order 
+3. all *end* hook callbacks(positioned after Testcase) are executed in reversed order
+4. *pre* and *post* hook callback type is not affecting execution order
+```mermaid
+---
+title: Testcase centric CT hook execution order (default)
+---
+flowchart TD
+    subgraph hooks
+    pre_init_pt_A["(A) pre_init_per_testcase"] --> pre_init_pt_B
+    end
+    subgraph suite
+    pre_init_pt_B["(B) pre_init_per_testcase"] --> init_pt[/"init_per_testcase"/]
+    end
+    init_pt --> post_init_pt_A
+    subgraph hooks
+    post_init_pt_A["(A) post_init_per_testcase"] --> post_init_pt_B
+    end
+    subgraph suite
+    post_init_pt_B["(B) post_init_per_testcase"] --> testcase
+    testcase((("Testcase")))
+    end
+    subgraph hooks
+    testcase --> pre_end_pt_B
+    pre_end_pt_B["(B) pre_end_per_testcase"] --> pre_end_pt_A
+    end
+    subgraph suite
+    pre_end_pt_A["(A) pre_end_per_testcase"] --> end_per_test_case
+    end
+    subgraph hooks
+    end_per_test_case[/"end_per_testcase"/] --> post_end_pt_B
+    post_end_pt_B["(B) post_end_per_testcase"] --> post_end_pt_A["(A) post_end_per_testcase"]
+    end
+```
+#### Configuration centric (option candidate)
+- all *pre* hooks will be executed in some order
+- all *post* hooks will be executed in reversed order
+- relation to Testcase is not relevant for hook execution order
+- Note: I think, it might be considered a bit inconsistent because there are no hook callbacks wrapping around Testcase (e.g. pre_testcase, post_testcase)
+- Above could be ugly workarounded by using pre_init_per_testcase with post_end_per_testcase
+- Adding pre_testcase, post_testcase might not be simple but maybe it is not needed
+
+```mermaid
+---
+title: Configuration centric CT hook execution order (option)
+---
+flowchart TD
+    subgraph hooks
+    pre_init_pt_A["(A) pre_init_per_testcase"] --> pre_init_pt_B
+    end
+    subgraph suite
+    pre_init_pt_B["(B) pre_init_per_testcase"] --> init_pt((("init_per_testcase")))
+    end
+    init_pt --> post_init_pt_B
+    subgraph hooks
+    post_init_pt_B["(B) post_init_per_testcase"] --> post_init_pt_A
+    end
+    subgraph suite
+    post_init_pt_A["(A) post_init_per_testcase"] --> testcase
+    testcase[/"Testcase"/]
+    end
+    subgraph hooks
+    testcase --> pre_end_pt_A
+    pre_end_pt_A["(A) pre_end_per_testcase"] --> pre_end_pt_B
+    end
+    subgraph suite
+    pre_end_pt_B["(B) pre_end_per_testcase"] --> end_per_test_case
+    end
+    subgraph hooks
+    end_per_test_case((("end_per_testcase"))) --> post_end_pt_B
+    post_end_pt_B["(B) post_end_per_testcase"] --> post_end_pt_A["(A) post_end_per_testcase"]
+    end
+```
+
+## processes
+```mermaid
+flowchart LR
+    tc["`tc
+         every CT callback function`"]
+    testcase["`testcase
+               the user Testcase`"]
+    testcase --> tc
+```
+
+## test_server code
+
+```mermaid
+mindmap
+    code
+        run_test_case_apply/1
+            run_test_case_apply/6
+                ))run_test_case_eval_fun/9((
+                    run_test_case_eval/9
+                        do_init_tc_call/4
+                        run_test_case_eval1/6
+                        do_end_tc_call/4
+                ct_util mark_process/0
+                run_test_case_msgloop/1
+                    [receive]
+        run_test_case_eval1/6
+            ts_tc/3
+```
+## processes
+```mermaid
+flowchart LR
+    job["`(job process GL)
+        captures output`"]
+    case["`(case process)
+        runs test suite`"]
+
+    case --news--> job
+```
+## concept
+```mermaid
+mindmap
+  root)test_server(
+    interfaces
+        sup
+            get_loc/1
+            set_ct_state/1
+        ctrl
+            run_test_case_apply/1
+            init_target_info/0
+            init_memory_checker/0
+        suite
+    init
+        target_info
+        memory_checker
+    questions
+        why call_end_conf not called when init/end_per_testcase not defined?
+```
-- 
2.35.3

openSUSE Build Service is sponsored by