babashka/test/babashka/test_utils.clj

121 lines
3.8 KiB
Clojure
Raw Normal View History

2019-08-09 12:51:42 +00:00
(ns babashka.test-utils
(:require
[babashka.fs :as fs]
2020-12-06 10:41:05 +00:00
[babashka.impl.classpath :as cp]
2021-04-10 12:42:58 +00:00
[babashka.impl.common :as common]
2019-08-09 12:51:42 +00:00
[babashka.main :as main]
2021-03-28 15:30:44 +00:00
[babashka.process :as p]
[clojure.edn :as edn]
[clojure.test :as test :refer [*report-counters*]]
[sci.core :as sci]
[sci.impl.vars :as vars]))
2019-08-09 12:51:42 +00:00
(set! *warn-on-reflection* true)
2021-03-28 15:30:44 +00:00
(def ^:dynamic *bb-edn-path* nil)
(defmethod clojure.test/report :begin-test-var [m]
(println "===" (-> m :var meta :name))
(println))
(defmethod clojure.test/report :end-test-var [_m]
(let [{:keys [:fail :error]} @*report-counters*]
(when (and (= "true" (System/getenv "BABASHKA_FAIL_FAST"))
(or (pos? fail) (pos? error)))
(println "=== Failing fast")
(System/exit 1))))
2020-05-06 19:14:14 +00:00
(defn bb-jvm [input-or-opts & args]
2020-12-06 10:41:05 +00:00
(reset! cp/cp-state nil)
2021-03-28 15:30:44 +00:00
(reset! main/env {})
(if-let [path *bb-edn-path*]
2021-04-25 19:51:00 +00:00
(let [raw (slurp path)]
(vreset! common/bb-edn
(assoc (edn/read-string raw)
:raw raw)))
2021-04-10 12:42:58 +00:00
(vreset! common/bb-edn nil))
2019-12-07 10:48:57 +00:00
(let [os (java.io.StringWriter.)
2020-05-06 19:14:14 +00:00
es (if-let [err (:err input-or-opts)]
err (java.io.StringWriter.))
2020-09-23 08:40:33 +00:00
in (if (string? input-or-opts)
input-or-opts (:in input-or-opts))
is (when in
(java.io.StringReader. in))
2019-12-07 10:48:57 +00:00
bindings-map (cond-> {sci/out os
sci/err es}
is (assoc sci/in is))]
(try
2020-05-06 19:14:14 +00:00
(when (string? input-or-opts) (vars/bindRoot sci/in is))
(vars/bindRoot sci/out os)
(vars/bindRoot sci/err es)
(sci/with-bindings bindings-map
(let [res (binding [*out* os
*err* es]
2020-05-06 19:14:14 +00:00
(if (string? input-or-opts)
(with-in-str input-or-opts (apply main/main args))
(apply main/main args)))]
(if (zero? res)
(str os)
2021-03-28 15:30:44 +00:00
(do
(println (str os))
(throw (ex-info (str es)
{:stdout (str os)
:stderr (str es)}))))))
(finally
2020-05-06 19:14:14 +00:00
(when (string? input-or-opts) (vars/bindRoot sci/in *in*))
(vars/bindRoot sci/out *out*)
(vars/bindRoot sci/err *err*)))))
2019-08-09 12:51:42 +00:00
(defn bb-native [input & args]
2021-03-28 15:30:44 +00:00
(let [res (p/process (into ["./bb"] args)
(cond-> {:in input
2021-04-10 13:16:12 +00:00
:out :string
:err :string}
2021-03-28 15:30:44 +00:00
*bb-edn-path*
(assoc
2021-04-10 13:16:12 +00:00
:extra-env (assoc (into {} (System/getenv))
"BABASHKA_EDN" *bb-edn-path*))))
2021-03-28 15:30:44 +00:00
res (deref res)
exit (:exit res)
error? (pos? exit)]
(if error? (throw (ex-info (or (:err res) "") {}))
(:out res))))
2019-08-09 12:51:42 +00:00
(def bb
2019-08-09 21:08:49 +00:00
(case (System/getenv "BABASHKA_TEST_ENV")
2019-08-09 12:51:42 +00:00
"jvm" #'bb-jvm
"native" #'bb-native
#'bb-jvm))
2019-08-28 21:42:15 +00:00
(def jvm? (= bb #'bb-jvm))
(def native? (not jvm?))
(if jvm?
2019-08-09 12:51:42 +00:00
(println "==== Testing JVM version")
(println "==== Testing native version"))
2019-12-23 10:12:20 +00:00
(defn socket-loop [^java.net.ServerSocket server]
(with-open [listener server]
(loop []
(with-open [socket (.accept listener)]
(let [input-stream (.getInputStream socket)]
(print (slurp input-stream))
(flush)))
(recur))))
(defn start-server! [port]
(let [server (java.net.ServerSocket. port)]
(future (socket-loop server))
server))
(defn stop-server! [^java.net.ServerSocket server]
(.close server))
(defmacro with-config [cfg & body]
`(let [temp-dir# (fs/create-temp-dir)
bb-edn-file# (fs/file temp-dir# "bb.edn")]
(binding [*print-meta* true]
(spit bb-edn-file# ~cfg))
(binding [*bb-edn-path* (str bb-edn-file#)]
~@body)))