Skip to content

Commit cdc2c08

Browse files
authored
Merge pull request #218 from bootjp/codex/implement-jepsen-test-2lucqi
ci: enable jepsen tests by default
2 parents 9e059e7 + 000c505 commit cdc2c08

File tree

6 files changed

+106
-1
lines changed

6 files changed

+106
-1
lines changed

.github/workflows/jepsen-test.yml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
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

.gitignore

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,9 @@
2121
go.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

README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,21 @@ quit
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

jepsen/project.clj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
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)
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
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))
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
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))))

0 commit comments

Comments
 (0)