diff --git a/.github/workflows/graal-tests.yml b/.github/workflows/graal-tests.yml new file mode 100644 index 0000000..b2ea89b --- /dev/null +++ b/.github/workflows/graal-tests.yml @@ -0,0 +1,32 @@ +name: Graal tests +on: [push, pull_request] + +jobs: + test: + strategy: + matrix: + java: ['17'] + os: [ubuntu-latest, macOS-latest, windows-latest] + + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v3 + - uses: graalvm/setup-graalvm@v1 + with: + version: 'latest' + java-version: ${{ matrix.java }} + components: 'native-image' + github-token: ${{ secrets.GITHUB_TOKEN }} + + - uses: DeLaGuardo/setup-clojure@10.0 + with: + lein: latest + bb: latest + + - uses: actions/cache@v3 + with: + path: ~/.m2/repository + key: deps-${{ hashFiles('deps.edn') }} + restore-keys: deps- + + - run: bb graal-tests diff --git a/.github/workflows/main-tests.yml b/.github/workflows/main-tests.yml new file mode 100644 index 0000000..900a96e --- /dev/null +++ b/.github/workflows/main-tests.yml @@ -0,0 +1,30 @@ +name: Main tests +on: [push, pull_request] + +jobs: + tests: + strategy: + matrix: + java: ['17', '18', '19'] + os: [ubuntu-latest] + + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-java@v3 + with: + distribution: 'corretto' + java-version: ${{ matrix.java }} + + - uses: DeLaGuardo/setup-clojure@10.0 + with: + lein: latest + + - uses: actions/cache@v3 + id: cache-deps + with: + path: ~/.m2/repository + key: deps-${{ hashFiles('project.clj') }} + restore-keys: deps- + + - run: lein test-all diff --git a/bb.edn b/bb.edn new file mode 100644 index 0000000..5721f2a --- /dev/null +++ b/bb.edn @@ -0,0 +1,10 @@ +{:paths ["bb"] + :tasks + {:requires ([graal-tests]) + graal-tests + {:doc "Run Graal native-image tests" + :task + (do + (graal-tests/uberjar) + (graal-tests/native-image) + (graal-tests/run-tests))}}} diff --git a/bb/graal_tests.clj b/bb/graal_tests.clj new file mode 100755 index 0000000..b8c00d6 --- /dev/null +++ b/bb/graal_tests.clj @@ -0,0 +1,36 @@ +#!/usr/bin/env bb + +(ns graal-tests + (:require + [clojure.string :as str] + [babashka.fs :as fs] + [babashka.process :refer [shell]])) + +(defn uberjar [] + (let [command "lein with-profiles +graal-tests uberjar" + command + (if (fs/windows?) + (if (fs/which "lein") + command + ;; Assume PowerShell powershell module + (str "powershell.exe -command " (pr-str command))) + command)] + + (shell command))) + +(defn executable [dir name] + (-> (fs/glob dir (if (fs/windows?) (str name ".{exe,bat,cmd}") name)) + first + fs/canonicalize + str)) + +(defn native-image [] + (let [graalvm-home (System/getenv "GRAALVM_HOME") + bin-dir (str (fs/file graalvm-home "bin"))] + (shell (executable bin-dir "gu") "install" "native-image") + (shell (executable bin-dir "native-image") "-jar" "target/graal-tests.jar" "--no-fallback" "graal_tests"))) + +(defn run-tests [] + (let [{:keys [out]} (shell {:out :string} (executable "." "graal_tests"))] + (assert (str/includes? out "loaded") out) + (println "Native image works!"))) diff --git a/project.clj b/project.clj index f0fd841..600397b 100644 --- a/project.clj +++ b/project.clj @@ -36,6 +36,13 @@ [[lein-expectations "0.0.8"] [lein-autoexpect "1.4.2"]]} + :graal-tests + {:dependencies [[org.clojure/clojure "1.11.1"] + [com.github.clj-easy/graal-build-time "0.1.4"]] + :main taoensso.graal-tests + :aot [taoensso.graal-tests] + :uberjar-name "graal-tests.jar"} + :dev [:c1.11 :test {:jvm-opts ["-server"] diff --git a/test/taoensso/graal_tests.clj b/test/taoensso/graal_tests.clj new file mode 100644 index 0000000..064d478 --- /dev/null +++ b/test/taoensso/graal_tests.clj @@ -0,0 +1,5 @@ +(ns taoensso.graal-tests + (:require [taoensso.encore :as encore]) + (:gen-class)) + +(defn -main [& args] (println "Namespace loaded successfully")) diff --git a/test/taoensso/tower/tests/main.clj b/test/taoensso/tower_tests.clj similarity index 98% rename from test/taoensso/tower/tests/main.clj rename to test/taoensso/tower_tests.clj index 1a9ac0d..1a493dd 100644 --- a/test/taoensso/tower/tests/main.clj +++ b/test/taoensso/tower_tests.clj @@ -1,9 +1,9 @@ -(ns taoensso.tower.tests.main +(ns taoensso.tower-tests (:require [expectations :as test :refer :all] [taoensso.tower :as tower :refer (with-tscope)]) (:import [java.util Date])) -(comment (test/run-tests '[taoensso.tower.tests.main])) +(comment (test/run-tests '[taoensso.tower-tests])) (defn- before-run {:expectations-options :before-run} []) (defn- after-run {:expectations-options :after-run} [])