Skip to content

Commit a58111d

Browse files
committed
automation: introduce simple streaming of transcripts to runner script
1 parent 86f8126 commit a58111d

File tree

7 files changed

+137
-6
lines changed

7 files changed

+137
-6
lines changed

src/automation/dirac/automation/task.cljs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
[oops.core :refer [oget oset! ocall oapply gset!]]
55
[chromex.logging :refer-macros [log warn error info]]
66
[dirac.settings :refer-macros [get-signal-server-url
7+
get-transcript-streamer-server-url
78
get-chrome-remote-debugging-port
89
get-chrome-remote-debugging-host
910
get-pending-replies-wait-timeout
@@ -100,6 +101,10 @@
100101
(runner/normalized?)
101102
true))
102103

104+
(defn get-transcript-streamer-server-url-if-needed []
105+
(if (helpers/automated-testing?)
106+
(get-transcript-streamer-server-url)))
107+
103108
(defn make-failure-matcher []
104109
(fn [[label _message]]
105110
(if-not (failed?)
@@ -118,7 +123,7 @@
118123
(messages/init! "task-runner")
119124
; transcript is a fancy name for "log of interesting events"
120125
(register-global-exception-handler!)
121-
(transcript-host/init-transcript! "transcript-box" (normalized?))
126+
(transcript-host/init-transcript! "transcript-box" (normalized?) (get-transcript-streamer-server-url-if-needed))
122127
; when we are not running under test-runner, we want skip all future actions after a failure
123128
; this helps inspection of the problems in an interactive way
124129
(transcript-host/register-observer! (make-failure-matcher))

src/automation/dirac/automation/transcript_host.cljs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
get-transcript-label-padding-type]])
77
(:require [cljs.core.async :refer [put! <! chan timeout alts! close!]]
88
[dirac.automation.transcript :as transcript]
9+
[dirac.automation.transcript-streamer :as streamer]
910
[oops.core :refer [oget oset! ocall oapply gcall!]]
1011
[chromex.logging :refer-macros [log warn error info]]
1112
[cuerdas.core :as cuerdas]
@@ -253,7 +254,8 @@
253254
generated-style)]
254255
(transcript/append-to-transcript! @current-transcript text style)
255256
(helpers/scroll-page-to-bottom!)
256-
(record-output! [effective-label effective-text])))))
257+
(record-output! [effective-label effective-text])
258+
(streamer/publish! text style)))))
257259

258260
(defn forced-append-to-transcript! [label text & [style]]
259261
(append-to-transcript! label text style true))
@@ -281,9 +283,10 @@
281283
(match-observer-record! observer-record value))
282284
(recur))))
283285

284-
(defn init-transcript! [id normalized?]
286+
(defn init-transcript! [id normalized? streamer-server-url]
285287
(let [transcript-el (transcript/create-transcript! (helpers/get-el-by-id id))]
286288
(reset! current-transcript transcript-el)
287289
(vreset! normalized-transcript normalized?)
290+
(streamer/init! streamer-server-url)
288291
(run-output-matching-loop!)))
289292

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
(ns dirac.automation.transcript-streamer
2+
(:require-macros [cljs.core.async.macros :refer [go go-loop]])
3+
(:require [cljs.core.async :refer [<! chan sliding-buffer put! timeout]]
4+
[chromex.logging :refer-macros [log warn error info]]
5+
[dirac.lib.ws-client :as ws-client]))
6+
7+
(defonce current-client (atom nil))
8+
(defonce transcript-stream (chan (sliding-buffer 1024)))
9+
10+
(defn publish! [text style]
11+
(put! transcript-stream {:op :publish
12+
:text text
13+
:style style}))
14+
15+
; -- message sending --------------------------------------------------------------------------------------------------------
16+
17+
(defn send! [msg]
18+
(if-let [client @current-client]
19+
(ws-client/send! client msg)
20+
(throw (ex-info "No client!" msg))))
21+
22+
; -- message processing -----------------------------------------------------------------------------------------------------
23+
24+
(defmulti process-message :op)
25+
26+
(defmethod process-message :error [message]
27+
(throw (ex-info "Received error message" message))
28+
(go
29+
{:op :error
30+
:message (:type message)}))
31+
32+
; -- connection -------------------------------------------------------------------------------------------------------------
33+
34+
(defn run-streaming-loop! []
35+
(log "transcript-streamer: entering streaming loop...")
36+
(go-loop []
37+
(when-let [msg (<! transcript-stream)]
38+
(send! msg)
39+
(recur))
40+
(log "transcript-streamer: leaving streaming loop...")))
41+
42+
(defn on-message-handler [_client message]
43+
(go
44+
(if-let [result (<! (process-message message))]
45+
(send! result))))
46+
47+
(defn on-open-handler [client]
48+
(run-streaming-loop!))
49+
50+
(defn connect! [server-url opts]
51+
(log (str "transcript-streamer: connecting " server-url))
52+
(let [default-opts {:name "Transcript Streamer (client)"
53+
:on-message on-message-handler
54+
:on-open on-open-handler}
55+
effective-opts (merge default-opts opts)
56+
client (ws-client/connect! server-url effective-opts)]
57+
(reset! current-client client)))
58+
59+
(defn disconnect! []
60+
(when-let [client @current-client]
61+
(ws-client/close! client)
62+
true))
63+
64+
(defn init! [server-url & [opts]]
65+
(if (some? server-url)
66+
(connect! server-url opts)))

src/logging/dirac/logging.clj

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
(def tests-options
2525
(standard-layout :magenta))
2626

27+
(def transcript-stream-options
28+
(standard-layout :yellow))
29+
2730
(def weasel-options
2831
(standard-layout :cyan))
2932

@@ -36,8 +39,9 @@
3639
(config/set-loggers!
3740
:root (merge-options root-options options {:level Level/INFO}) ; root level should be always INFO, otherwise we would get very verbose logs from java libs
3841
; test runners
39-
"dirac.tests.browser" (merge-options tests-options options)
4042
"dirac.tests.backend" (merge-options tests-options options)
43+
"dirac.tests.browser" (merge-options tests-options options)
44+
"dirac.tests.browser.tasks.transcript-streamer-server" (merge-options transcript-stream-options options)
4145
; test mocks / helpers
4246
"dirac.test-lib" (merge-options tests-options options)
4347
; agent

src/settings/dirac/settings.clj

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@
6363
(def ^:const SIGNAL_SERVER_HOST "localhost")
6464
(def ^:const SIGNAL_SERVER_PORT 22555)
6565

66+
(def ^:const TRANSCRIPT_STREAMER_SERVER_HOST "localhost")
67+
(def ^:const TRANSCRIPT_STREAMER_SERVER_PORT 22556)
68+
6669
(def ^:const AUTOMATION_ENTRY_POINT_KEY "diracAutomateDevTools")
6770
(def ^:const FLUSH_PENDING_FEEDBACK_MESSAGES_KEY "diracFlushPendingFeedbackMessages")
6871
(def ^:const DIRAC_INTERCOM_KEY "diracIntercom")
@@ -283,3 +286,14 @@
283286

284287
(defmacro get-failed-backend-url-resolution-delay []
285288
FAILED_BACKEND_URL_RESOLUTION_DELAY)
289+
290+
(defmacro get-transcript-streamer-server-host []
291+
TRANSCRIPT_STREAMER_SERVER_HOST)
292+
293+
(defmacro get-transcript-streamer-server-port []
294+
TRANSCRIPT_STREAMER_SERVER_PORT)
295+
296+
(defmacro get-transcript-streamer-server-url []
297+
(let [port (get-transcript-streamer-server-port)]
298+
(str "ws://" (get-transcript-streamer-server-host) (if (some? port) (str ":" port)))))
299+

test/browser/src/browser_tests/dirac/tests/browser/runner.clj

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@
99
[dirac.test-lib.nrepl-server :refer [with-nrepl-server]]
1010
[dirac.test-lib.agent :refer [with-dirac-agent]]
1111
[dirac.test-lib.taxi :refer [with-taxi-setup]]
12-
[dirac.test-lib.nrepl-server :as test-nrepl-server]))
12+
[dirac.test-lib.nrepl-server :as test-nrepl-server]
13+
[dirac.tests.browser.tasks.transcript-streamer-server :refer [with-transcript-streamer-server]]))
1314

1415
; this test runner runs tests against real chrome browser using chrome driver
1516

16-
(def setup-fixtures! (join-fixtures [with-fixtures-web-server
17+
(def setup-fixtures! (join-fixtures [with-transcript-streamer-server
18+
with-fixtures-web-server
1719
with-nrepl-server
1820
with-dirac-agent
1921
with-browser
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
(ns dirac.tests.browser.tasks.transcript-streamer-server
2+
(:require [clojure.tools.logging :as log]
3+
[dirac.settings :refer [get-transcript-streamer-server-host get-transcript-streamer-server-port]]
4+
[dirac.lib.ws-server :as ws-server]))
5+
6+
(defonce current-server (volatile! nil))
7+
8+
; -- transcript-streamer server ---------------------------------------------------------------------------------------------
9+
10+
(defn publish! [msg]
11+
(let [{:keys [text]} msg]
12+
(log/info text)))
13+
14+
(defn on-message-handler [_server _client msg]
15+
(log/debug "transcript-streamer server: got transcript-streamer message" msg)
16+
(case (:op msg)
17+
:ready nil ; ignore
18+
:publish (publish! msg)
19+
(log/error "transcript-streamer server: received unrecognized message" msg)))
20+
21+
(defn create-transcript-streamer-server! []
22+
(log/debug "transcript-streamer server: creating server")
23+
(assert (not @current-server))
24+
(vreset! current-server (ws-server/create! {:name "Transcript Streamer (server)"
25+
:host (get-transcript-streamer-server-host)
26+
:port (get-transcript-streamer-server-port)
27+
:on-message on-message-handler})))
28+
29+
(defn destroy-transcript-streamer-server! []
30+
(log/debug "transcript-streamer server: destroying server")
31+
(assert @current-server)
32+
(ws-server/destroy! @current-server))
33+
34+
(defn with-transcript-streamer-server [f]
35+
(create-transcript-streamer-server!)
36+
(f)
37+
(destroy-transcript-streamer-server!))

0 commit comments

Comments
 (0)