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