File tree Expand file tree Collapse file tree 6 files changed +106
-1
lines changed
Expand file tree Collapse file tree 6 files changed +106
-1
lines changed Original file line number Diff line number Diff line change 1+ on : [ push ]
2+
3+ concurrency :
4+ group : ${{ github.workflow }}-${{ github.ref }}-jepsen-test
5+
6+ name : Jepsen Test
7+ jobs :
8+ test :
9+ runs-on : ubuntu-latest
10+ env :
11+ RUN_JEPSEN : ' true'
12+ steps :
13+ - uses : actions/checkout@v5
14+ - uses : actions/setup-java@v4
15+ with :
16+ distribution : temurin
17+ java-version : ' 21'
18+ - name : Install Leiningen
19+ run : |
20+ curl -L https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein > ~/lein
21+ chmod +x ~/lein
22+ ~/lein version
23+ - name : Run Jepsen tests
24+ if : env.RUN_JEPSEN == 'true'
25+ working-directory : jepsen
26+ run : ~/lein test
Original file line number Diff line number Diff line change 2121go.work
2222
2323# Built binary
24- elastickv
24+ /elastickv
25+
26+ # Clojure/Leiningen build artifacts
27+ jepsen /target /
28+ jepsen /.lein- *
29+ jepsen /.nrepl-port
Original file line number Diff line number Diff line change 7171
7272### Development
7373
74+ ### Running Jepsen tests
75+
76+ Jepsen tests live in ` jepsen/ ` . Install Leiningen and run tests locally:
77+
78+ ``` bash
79+ curl -L https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein > ~ /lein
80+ chmod +x ~ /lein
81+ (cd jepsen && ~ /lein test)
82+ ```
83+
84+ These Jepsen tests execute concurrent read and write operations while a nemesis
85+ injects random network partitions. Jepsen's linearizability checker verifies the
86+ history.
87+
88+
7489
7590### Setup pre-commit hooks
7691``` bash
Original file line number Diff line number Diff line change 1+ (defproject elastickv-jepsen " 0.1.0-SNAPSHOT"
2+ :description " Jepsen tests for Elastickv"
3+ :repositories [[" clojars" {:url " https://repo.clojars.org" }]]
4+ :dependencies [[org.clojure/clojure " 1.11.1" ]
5+ [jepsen " 0.3.5" ]
6+ [redis.clients/jedis " 5.1.0" :exclusions [org.slf4j/slf4j-api]]
7+ [org.slf4j/slf4j-nop " 2.0.9" ]]
8+ :main elastickv.jepsen-test )
Original file line number Diff line number Diff line change 1+ (ns elastickv.jepsen-test
2+ (:gen-class )
3+ (:require [jepsen
4+ [core :as jepsen]
5+ [cli :as cli]
6+ [db :as db]
7+ [client :as client]
8+ [checker :as checker]]
9+ [jepsen.checker.timeline :as timeline]
10+ [jepsen.tests.linearizable-register :as register]
11+ [jepsen.nemesis :as nemesis])
12+ (:import (redis.clients.jedis Jedis)))
13+
14+ (defrecord RedisClient [port]
15+ client /Client
16+ (open! [this test node]
17+ (assoc this :conn (Jedis. (name node) port)))
18+ (close! [this test]
19+ (.close (:conn this))
20+ this)
21+ (setup! [this test])
22+ (teardown! [this test])
23+ (invoke! [this test op]
24+ (let [conn (:conn this)
25+ value (:value op)]
26+ (case (:f op)
27+ :write (do (.set conn " k" (pr-str value))
28+ (assoc op :type :ok ))
29+ :read (let [v (.get conn " k" )]
30+ (assoc op :type :ok
31+ :value (when v (read-string v))))
32+ (assoc op :type :fail :error :unknown-op )))))
33+
34+ (defn elastickv-test []
35+ (register/test
36+ {:name " elastickv-register"
37+ :nodes [" n1" " n2" " n3" ]
38+ :db db/noop
39+ :client (->RedisClient 63791 )
40+ :concurrency 5
41+ :nemesis (nemesis/partition-random-halves )}))
42+
43+ (defn -main
44+ [& args]
45+ (cli/run! (cli/single-test-cmd {:test-fn elastickv-test}) args))
Original file line number Diff line number Diff line change 1+ (ns elastickv.jepsen-test-test
2+ (:require [clojure.test :refer :all ]
3+ [elastickv.jepsen-test :as jt]))
4+
5+ (deftest builds-test-spec
6+ (is (map? (jt/elastickv-test ))))
You can’t perform that action at this time.
0 commit comments