1Test/Run start an [Interface]
2 - Listens for events and renders/logs them
3 - Listens for keystrokes and responds
4 - Curses interface maybe?
5
6Test/Start start a [Runner]
7 - Starts Stages (if any)
8 - Directs stages to spawn tests, or spawn tests directly if no stages
9 - Brings stages back up to speed if they respawn without having done some expected work
10 - Re-spawns stages when necessary
11 - Exits when work is done
12
13[Stage]s
14 - Get to a ready state, report ready to the runner
15 - Report to the runner when they respawn
16 - Run tests
17
18[Auditor]
19 - Parent to tests
20 - Exec'd after child is spawned
21
22[Test]
23 - Duh
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44Runner should be a poll loop, spawning tests or directing stages to spawn tests
45
46
47______________________
48
49Only use COMPRESS if there is a dip between the workers and the main process.. which seems unlikely
50
51PURGE post-exit timeout. Not needed, event-timeout is good enough
52
53
54Test(stdout, stderr) -> Overlord(-> muxer -> auditor ->) -> Logger(-> logfile/namedpipe)
55
56Main((<- logfile/namedpipe)(-> Renderers))
57
58===========================
59
60 - Run      - Keep as-is
61
62 - Runner   - Keep current name
63            - Runner spawns an auditor, which spawns the test
64            - Runner cannot spawn a new job until the auditor is done
65            - Runner no longer handles timeouts or killing all child processes, auditors handle it
66
67 - Stream   - Fix show_buffered to be false outside of the master process.
68            - Clean up
69            - If an FD is specified send it to the FD
70            - Otherwise print it ~pretty~ in STDOUT
71            - Maybe fix real problem in Test2::API/HUB/Subtest/IPC that sends buffered events to the local formatter.
72
73 - Events   - Can be just json that gets decoded when/if needed
74            - json is preserved to be passed along
75            - dirty() method to clear the json?
76            - readonly, ->dirty() makes a deep copy that is not read-only?
77            - see yy.pl
78
79 - Auditor  - Process that wraps a test and produces single-job results (collector+auditor by current names)
80            - Collect events for 1 job
81            - Audit events
82            - Kills itself and test if runner goes away
83            - Removes job dir after done (unless -k)
84            - Use SIGCHLD to make sure exit is written ASAP
85            - 4 parts:
86                - Collector   (jobdir)
87                - Muxer       (Re-orders and/or combines events)
88                - TimeTracker (TimeTracker, extend to include post-exit audit-time)
89                - Watcher     (Test State)
90            - Writes output
91                - See (job log below)
92
93 - Overlord - Should be the module for test/run (has no current name!)
94            - Should do the combining of results from multiple jobs
95            - Reads main process/runner output (all events from this are eminent)
96            - Produces aggregate info
97            - Sends events to log, renderer, plugin, etc
98            - Renderers have an event_types
99            - Only decode the set(s) needed for the renderer
100            - Delete job-files when done (except -k) but first ask each renderer if a replay is needed (qvf)
101            - Logger can write events as-is without decoding them :-)
102
103
104- Add custom color support
105
106
107
108- Double check bail-out behavior, some "cruft" was removed from stream
109- Change reload to send a "RELOAD" event to the queue instead of using sighup
110- Bail-out should bail just the current run, not kill the runner
111
112========================================
113
114job log: .ljsonl
115\d\nJSON\n...0\nnull\n
116
117========================================
118
119Event stream: .jsonl
120
121========================================
122
123Default Renderer
124 - Add display of done but still processing
125    - [P] Pass
126    - [F] Fail
127    - [A] Auditing
128    - [R] Running
129    - [T] To do or retry
130 050 500 025 155 433    (rgbXXX)
131[P:0|F:0|A:0|R:0|T:100]
132
133
134
135\x10\x0C\0\x10
136