2019-08-09 12:51:42 +00:00
|
|
|
(ns babashka.test-utils
|
|
|
|
|
(:require
|
|
|
|
|
[babashka.main :as main]
|
2019-12-07 10:48:57 +00:00
|
|
|
[me.raynes.conch :refer [let-programs] :as sh]
|
2019-12-19 22:34:27 +00:00
|
|
|
[sci.core :as sci]
|
|
|
|
|
[sci.impl.vars :as vars]))
|
2019-08-09 12:51:42 +00:00
|
|
|
|
|
|
|
|
(set! *warn-on-reflection* true)
|
|
|
|
|
|
2020-05-06 19:14:14 +00:00
|
|
|
(defn bb-jvm [input-or-opts & args]
|
2020-01-19 17:08:08 +00:00
|
|
|
(reset! main/cp-state 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.))
|
|
|
|
|
is (when (string? input-or-opts)
|
|
|
|
|
(java.io.StringReader. input-or-opts))
|
2019-12-07 10:48:57 +00:00
|
|
|
bindings-map (cond-> {sci/out os
|
|
|
|
|
sci/err es}
|
|
|
|
|
is (assoc sci/in is))]
|
2019-12-19 22:34:27 +00:00
|
|
|
(try
|
2020-05-06 19:14:14 +00:00
|
|
|
(when (string? input-or-opts) (vars/bindRoot sci/in is))
|
2019-12-19 22:34:27 +00:00
|
|
|
(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))
|
2019-12-19 22:34:27 +00:00
|
|
|
(apply main/main args)))]
|
|
|
|
|
(if (zero? res)
|
|
|
|
|
(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*))
|
2019-12-19 22:34:27 +00:00
|
|
|
(vars/bindRoot sci/out *out*)
|
|
|
|
|
(vars/bindRoot sci/err *err*)))))
|
2019-08-09 12:51:42 +00:00
|
|
|
|
|
|
|
|
(defn bb-native [input & args]
|
|
|
|
|
(let-programs [bb "./bb"]
|
2019-08-15 04:28:00 +00:00
|
|
|
(try (if input
|
|
|
|
|
(apply bb (conj (vec args)
|
|
|
|
|
{:in input}))
|
2019-08-17 21:44:17 +00:00
|
|
|
(apply bb args))
|
2019-08-15 04:28:00 +00:00
|
|
|
(catch Exception e
|
2019-08-17 12:50:02 +00:00
|
|
|
(let [d (ex-data e)
|
|
|
|
|
err-msg (or (:stderr (ex-data e)) "")]
|
|
|
|
|
(throw (ex-info err-msg d)))))))
|
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))
|