Skip to content

Commit fdf8fc3

Browse files
author
mike dupont
committed
adding new unit tests
1 parent 1a68914 commit fdf8fc3

File tree

4 files changed

+249
-5
lines changed

4 files changed

+249
-5
lines changed
+117
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
name: run Perf Test and collect data
2+
env:
3+
default_image: "ghcr.io/meta-introspector/o1js/o1js-perf-recording:latest"
4+
container_name: "unit-tests"
5+
on:
6+
workflow_dispatch:
7+
inputs:
8+
image_url:
9+
description: 'Docker url to execute'
10+
default: "ghcr.io/meta-introspector/o1js/o1js-perf-recording:latest"
11+
push:
12+
branches:
13+
# add your branch here to auto trigger on push
14+
#- "feature/just_test"
15+
#- "feature/rebase"
16+
- "feature/unit-tests"
17+
pull_request:
18+
branches: [ "collect-perf" ]
19+
jobs:
20+
build:
21+
strategy:
22+
matrix:
23+
tests:
24+
- "/app/dist/node/lib/util/base58.unit-test.js"
25+
- "/app/dist/node/lib/ml/consistency.unit-test.js"
26+
- "/app/dist/node/lib/mina/account-update.unit-test.js"
27+
- "/app/dist/node/lib/mina/hash-input.unit-test.js"
28+
- "/app/dist/node/lib/mina/mina.unit-test.js"
29+
- "/app/dist/node/lib/mina/actions/offchain-contract.unit-test.js"
30+
- "/app/dist/node/lib/mina/actions/batch-reducer.unit-test.js"
31+
- "/app/dist/node/lib/mina/actions/batch-reducer-program.unit-test.js"
32+
- "/app/dist/node/lib/mina/test/dynamic-call.unit-test.js"
33+
- "/app/dist/node/lib/mina/token/forest-iterator.unit-test.js"
34+
- "/app/dist/node/lib/mina/token/token-contract.unit-test.js"
35+
- "/app/dist/node/lib/mina/fetch.unit-test.js"
36+
- "/app/dist/node/lib/mina/account-update-layout.unit-test.js"
37+
- "/app/dist/node/lib/proof-system/proof-system.unit-test.js"
38+
- "/app/dist/node/lib/proof-system/sideloaded.unit-test.js"
39+
- "/app/dist/node/lib/provable/test/bitwise.unit-test.js"
40+
- "/app/dist/node/lib/provable/test/base64.unit-test.js"
41+
- "/app/dist/node/lib/provable/test/field.unit-test.js"
42+
- "/app/dist/node/lib/provable/test/nullifier.unit-test.js"
43+
- "/app/dist/node/lib/provable/test/provable.unit-test.js"
44+
- "/app/dist/node/lib/provable/test/sha256.unit-test.js"
45+
- "/app/dist/node/lib/provable/test/string.unit-test.js"
46+
- "/app/dist/node/lib/provable/test/range-check.unit-test.js"
47+
- "/app/dist/node/lib/provable/test/foreign-field.unit-test.js"
48+
- "/app/dist/node/lib/provable/test/group.unit-test.js"
49+
- "/app/dist/node/lib/provable/test/custom-gates-recursion.unit-test.js"
50+
- "/app/dist/node/lib/provable/test/foreign-curve.unit-test.js"
51+
- "/app/dist/node/lib/provable/test/foreign-field-gadgets.unit-test.js"
52+
- "/app/dist/node/lib/provable/test/elliptic-curve.unit-test.js"
53+
- "/app/dist/node/lib/provable/test/lookup.unit-test.js"
54+
- "/app/dist/node/lib/provable/test/ecdsa.unit-test.js"
55+
- "/app/dist/node/lib/provable/test/arithmetic.unit-test.js"
56+
- "/app/dist/node/lib/provable/test/primitives.unit-test.js"
57+
- "/app/dist/node/lib/provable/test/keccak.unit-test.js"
58+
- "/app/dist/node/lib/provable/test/struct.unit-test.js"
59+
- "/app/dist/node/lib/provable/test/merkle-tree.unit-test.js"
60+
- "/app/dist/node/lib/testing/testing.unit-test.js"
61+
- "/app/dist/node/mina-signer/tests/verify-in-snark.unit-test.js"
62+
- "/app/dist/node/mina-signer/tests/zkapp.unit-test.js"
63+
- "/app/dist/node/mina-signer/src/sign-legacy.unit-test.js"
64+
- "/app/dist/node/mina-signer/src/transaction-hash.unit-test.js"
65+
- "/app/dist/node/mina-signer/src/signature.unit-test.js"
66+
- "/app/dist/node/mina-signer/src/sign-zkapp-command.unit-test.js"
67+
- "/app/dist/node/bindings/lib/binable.unit-test.js"
68+
- "/app/dist/node/bindings/crypto/bigint.unit-test.js"
69+
- "/app/dist/node/bindings/crypto/finite-field.unit-test.js"
70+
- "/app/dist/node/bindings/crypto/glv.unit-test.js"
71+
- "/app/dist/node/bindings/crypto/poseidon.unit-test.js"
72+
- "/app/dist/node/bindings/crypto/bindings/bindings.unit-test.js"
73+
- "/app/dist/node/bindings/crypto/elliptic-curve.unit-test.js"
74+
75+
runs-on: ubuntu-latest
76+
steps:
77+
- name: Sets NAME
78+
env:
79+
name: "${{matrix.tests}}"
80+
run: |
81+
TEST_NAME1=`echo $name | sed -e 's!/!-!g' `
82+
echo "TEST_NAME=test${TEST_NAME1}" >> $GITHUB_ENV
83+
84+
- uses: meta-introspector/checkout@v4
85+
#with:
86+
# submodules: recursive
87+
88+
- name: Login to GHCR
89+
uses: meta-introspector/login-action@v1
90+
with:
91+
registry: ghcr.io
92+
username: ${{ github.actor }}
93+
password: ${{ secrets.GITHUB_TOKEN }}
94+
95+
- name: pull the image
96+
run: docker pull ${{ inputs.image_url || env.default_image }}
97+
98+
- name: run the Docker tests
99+
run: TESTS=${{matrix.tests}} docker compose up ${{ env.container_name }}
100+
env:
101+
DOCKER_IMAGE_URL: ${{ inputs.image_url || env.default_image}}
102+
103+
- name: docker cp results
104+
run: docker compose cp ${{ env.container_name }}:/tmp/perf.data.tar.gz perf.data.tar.gz
105+
106+
- name: Archive results
107+
uses: meta-introspector/upload-artifact@v4
108+
with:
109+
name: ${{ env.TEST_NAME }}.perf.data.tar.gz
110+
path: perf.data.tar.gz
111+
112+
- name: delete the results
113+
run: rm -rf /tmp/perf*
114+
115+
- name: delete the container
116+
run: |
117+
docker compose down

docker-compose.yml

+21
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,27 @@ services:
3737
command: "bash -x /opt/introspector/test/run-all-tests.sh"
3838

3939

40+
unit-tests:
41+
restart: no
42+
image: ghcr.io/meta-introspector/o1js/o1js-perf-recording:latest
43+
privileged: true
44+
environment:
45+
- PROOF_LEVEL=full
46+
- LOG_LEVEL=Debug
47+
- TESTS=${UNIT_TESTS}
48+
working_dir: /app
49+
# mount the source
50+
volumes:
51+
- type: bind
52+
source: "/home/runner/work/o1js/o1js/"
53+
target: "/opt/introspector/test/"
54+
cap_add:
55+
- SYS_PTRACE
56+
- SYS_ADMIN
57+
# run the test from the mounted source
58+
command: "bash -x /opt/introspector/test/run-all-tests.sh"
59+
60+
4061
reporting:
4162
restart: no
4263
image: ghcr.io/meta-introspector/o1js/o1js-perf-reporting:latest

run-all-unit-tests.sh

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
#!/bin/bash
2+
set +e
3+
set -x
4+
export OUTPUT_DIR="/tmp/perf"
5+
export NODE_OUTPUT_DIR="${OUTPUT_DIR}/node"
6+
export CLINIC_OUTPUT_DIR="${OUTPUT_DIR}/clinic"
7+
export NO_INSIGHT=true
8+
export NODE_OPTIONS="--experimental-vm-modules --perf-basic-prof --enable-source-maps --stack-trace-limit=1000 --report-dir $NODE_OUTPUT_DIR --perf-prof-unwinding-info --perf-prof"
9+
export NO_INSIGHT=true
10+
export JESTOPTS=--collectCoverage
11+
export NODEOPT1="--prof --expose-gc"
12+
13+
14+
# setup perf permissions
15+
echo 2 > /proc/sys/kernel/perf_event_paranoid
16+
17+
mkdir "${OUTPUT_DIR}"
18+
mkdir "${NODE_OUTPUT_DIR}"
19+
mkdir "${CLINIC_OUTPUT_DIR}"
20+
pnpm install -g clinic
21+
22+
cd /app/
23+
export SOURCE_DIR=/app/src
24+
# limit to only working tests
25+
#TESTS="${SOURCE_DIR}/lib/provable/test/merkle-list.test.ts ${SOURCE_DIR}/lib/provable/test/merkle-tree.test.ts ${SOURCE_DIR}/lib/provable/test/scalar.test.ts ${SOURCE_DIR}/lib/provable/test/merkle-map.test.ts ${SOURCE_DIR}/lib/provable/test/provable.test.ts ${SOURCE_DIR}/lib/provable/test/primitives.test.ts ${SOURCE_DIR}/lib/provable/test/group.test.ts ${SOURCE_DIR}/lib/provable/test/int.test.ts ${SOURCE_DIR}/lib/mina/precondition.test.ts"
26+
#${SOURCE_DIR}/lib/mina/token.test.ts"
27+
# FIXME this all tests is not used because many of them fail.
28+
ALL_TESTS=`ls -b ${SOURCE_DIR}/lib/provable/test/*.test.ts ${SOURCE_DIR}/lib/mina/*.test.ts `
29+
30+
31+
run_test() {
32+
testname=$1
33+
export MULTIPLE="${testname}"
34+
export perfdata="${testname}.perf.data"
35+
OUTPUT_DIR2="${OUTPUT_DIR}$testname/"
36+
mkdir -p "${OUTPUT_DIR2}clinic/"
37+
mkdir -p "${OUTPUT_DIR2}log/"
38+
mkdir -p "${OUTPUT_DIR2}coverage/"
39+
40+
clinic flame -- node $NODEOPT1 ./node_modules/.bin/../jest/bin/jest.js "${JESTOPTS}" "${MULTIPLE}" | tee "${OUTPUT_DIR2}clinic-flame.txt" 2>&1
41+
clinic doctor -- node $NODEOPT1 ./node_modules/.bin/../jest/bin/jest.js "${JESTOPTS}" "${MULTIPLE}" | tee "${OUTPUT_DIR2}clinic-doctor.txt" 2>&1
42+
clinic bubbleprof -- node $NODEOPT1 ./node_modules/.bin/../jest/bin/jest.js "${JESTOPTS}" "${MULTIPLE}" | tee "${OUTPUT_DIR2}clinic-bubble.txt" 2>&1
43+
clinic heapprofiler -- node $NODEOPT1 ./node_modules/.bin/../jest/bin/jest.js "${JESTOPTS}" "${MULTIPLE}" | tee "${OUTPUT_DIR2}clinic-heap.txt" 2>&1
44+
perf record -g -o "${testname}.perf.data" -F 999 --call-graph dwarf node $NODEOPT1 ./node_modules/.bin/../jest/bin/jest.js "${JESTOPTS}" "${MULTIPLE}" > "${testname}.reportout.txt" 2>&1
45+
perf archive ${testname}.perf.data
46+
perf report -i "${perfdata}" --verbose --stdio --header > "${perfdata}.header.txt" 2>&1
47+
perf report -i "${perfdata}" --verbose --stdio --stats > "${perfdata}.stats.txt" 2>&1
48+
perf script -F +pid -i "${perfdata}" > "${perfdata}.script.txt" 2>&1
49+
perf report --stdio -i "${perfdata}" > "${perfdata}.report.txt" 2>&1
50+
ls -latr jit*.dump
51+
rm -r jit*.dump
52+
53+
mv ${testname}.perf.data "${OUTPUT_DIR2}/perf_data"
54+
mv "${testname}.*.txt" "${OUTPUT_DIR2}/perf_data"
55+
mv .clinic/* "${OUTPUT_DIR2}clinic/"
56+
mv coverage/* "${OUTPUT_DIR2}coverage/"
57+
mv *.log "${OUTPUT_DIR2}log/"
58+
du -s "${OUTPUT_DIR2}"
59+
find "${OUTPUT_DIR2}"
60+
ls -latr "${OUTPUT_DIR2}"
61+
}
62+
63+
for testname in $TESTS;
64+
do
65+
export MULTIPLE1="${testname}"
66+
export perfdata1="${testname}.perf.data"
67+
export OUTPUT_DIR3="${OUTPUT_DIR}$testname/"
68+
results=$(run_test $testname)
69+
echo $results > "${OUTPUT_DIR3}stdout.txt"
70+
tar -czvf "${OUTPUT_DIR}${testname}.tgz" "${OUTPUT_DIR3}"
71+
# remove the intermediates for space saving.
72+
rm -rf "${OUTPUT_DIR3}/"
73+
ls -latr "${OUTPUT_DIR}"
74+
done
75+
76+
tar -czf /tmp/perf.data.tar.gz /tmp/perf/*
77+
78+
79+

run-unit-tests.sh

+32-5
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,40 @@
22
set -e
33
shopt -s globstar # to expand '**' into nested directories./
44

5-
npm run build
5+
#npm run build
6+
7+
export NODEOPT1="--prof --expose-gc --enable-source-maps --stack-trace-limit=1000"
68

79
# find all unit tests in dist/node and run them
810
# TODO it would be nice to make this work on Mac
911
# here is a first attempt which has the problem of not failing if one of the tests fails
1012
# find ./dist/node -name "*.unit-test.js" -print -exec node {} \;
11-
for f in ./dist/node/**/*.unit-test.js; do
12-
echo "Running $f"
13-
node --enable-source-maps --stack-trace-limit=1000 $f;
14-
done
13+
#for f in ./dist/node/**/*.unit-test.js; do
14+
# echo "Running $f"
15+
testname=$TESTS
16+
export MULTIPLE="${testname}"
17+
export perfdata="${testname}.perf.data"
18+
OUTPUT_DIR2="${OUTPUT_DIR}$testname/"
19+
mkdir -p "${OUTPUT_DIR2}clinic/"
20+
mkdir -p "${OUTPUT_DIR2}log/"
21+
mkdir -p "${OUTPUT_DIR2}coverage/"
22+
23+
#node $f;
24+
clinic flame -- node $NODEOPT1 ./node_modules/.bin/../jest/bin/jest.js "${JESTOPTS}" "${MULTIPLE}" | tee "${OUTPUT_DIR2}clinic-flame.txt" 2>&1
25+
clinic doctor -- node $NODEOPT1 ./node_modules/.bin/../jest/bin/jest.js "${JESTOPTS}" "${MULTIPLE}" | tee "${OUTPUT_DIR2}clinic-doctor.txt" 2>&1
26+
clinic bubbleprof -- node $NODEOPT1 ./node_modules/.bin/../jest/bin/jest.js "${JESTOPTS}" "${MULTIPLE}" | tee "${OUTPUT_DIR2}clinic-bubble.txt" 2>&1
27+
clinic heapprofiler -- node $NODEOPT1 ./node_modules/.bin/../jest/bin/jest.js "${JESTOPTS}" "${MULTIPLE}" | tee "${OUTPUT_DIR2}clinic-heap.txt" 2>&1
28+
perf record -g -o "${testname}.perf.data" -F 999 --call-graph dwarf node $NODEOPT1 ./node_modules/.bin/../jest/bin/jest.js "${JESTOPTS}" "${MULTIPLE}" > "${testname}.reportout.txt" 2>&1
29+
perf archive ${testname}.perf.data
30+
perf report -i "${perfdata}" --verbose --stdio --header > "${perfdata}.header.txt" 2>&1
31+
perf report -i "${perfdata}" --verbose --stdio --stats > "${perfdata}.stats.txt" 2>&1
32+
perf script -F +pid -i "${perfdata}" > "${perfdata}.script.txt" 2>&1
33+
perf report --stdio -i "${perfdata}" > "${perfdata}.report.txt" 2>&1
34+
ls -latr jit*.dump
35+
rm -r jit*.dump
36+
37+
tar -czvf "${OUTPUT_DIR}${testname}.tgz" "${OUTPUT_DIR}/*"
38+
ls -latr "${OUTPUT_DIR}"
39+
#done
40+
41+
tar -czf /tmp/perf.data.tar.gz /tmp/perf/*

0 commit comments

Comments
 (0)