From 5ba08de566b33fc16e5f8af3894d5d4277325bca Mon Sep 17 00:00:00 2001 From: Aveline <352441+ym@users.noreply.github.com> Date: Mon, 19 May 2025 22:51:11 +0200 Subject: [PATCH] fix: unit test not returning error when test fails * fix: unit test not returning error when test fails * chore: add unit test to smoketest.yml * fix: make linter happy --- .github/workflows/smoketest.yml | 55 +++++++++++++++++++++---- Makefile | 35 +++++++++------- dev_deploy.sh | 42 ++++++++++++------- go.mod | 10 +++-- go.sum | 24 +++++------ internal/usbgadget/changeset_symlink.go | 2 +- resource/dev_test.sh | 2 - 7 files changed, 114 insertions(+), 56 deletions(-) diff --git a/.github/workflows/smoketest.yml b/.github/workflows/smoketest.yml index 3f8eb6c..a7154cb 100644 --- a/.github/workflows/smoketest.yml +++ b/.github/workflows/smoketest.yml @@ -75,9 +75,40 @@ jobs: make build_dev_test echo "+ Copying device-tests.tar.gz to remote host" - ssh jkci "cat > /userdata/jetkvm/device-tests.tar.gz" < device-tests.tar.gz + ssh jkci "cat > /tmp/device-tests.tar.gz" < device-tests.tar.gz echo "+ Running go tests" - ssh jkci "cd /userdata/jetkvm && tar zxvf device-tests.tar.gz && ./run_all_tests -json" + ssh jkci ash << 'EOF' + set -e + TMP_DIR=$(mktemp -d) + cd ${TMP_DIR} + tar zxf /tmp/device-tests.tar.gz + ./gotestsum --format=testdox \ + --jsonfile=/tmp/device-tests.json \ + --post-run-command 'sh -c "echo $TESTS_FAILED > /tmp/device-tests.failed"' \ + --raw-command -- ./run_all_tests -json + + GOTESTSUM_EXIT_CODE=$? + if [ $GOTESTSUM_EXIT_CODE -ne 0 ]; then + echo "❌ Tests failed (exit code: $GOTESTSUM_EXIT_CODE)" + rm -rf ${TMP_DIR} /tmp/device-tests.tar.gz + exit 1 + fi + + TESTS_FAILED=$(cat /tmp/device-tests.failed) + if [ "$TESTS_FAILED" -ne 0 ]; then + echo "❌ Tests failed $TESTS_FAILED tests failed" + rm -rf ${TMP_DIR} /tmp/device-tests.tar.gz + exit 1 + fi + + echo "✅ Tests passed" + rm -rf ${TMP_DIR} /tmp/device-tests.tar.gz + EOF + ssh jkci "cat /tmp/device-tests.json" > device-tests.json + - name: Golang Test Report + uses: becheran/go-testreport@v0.3.2 + with: + input: "device-tests.json" - name: Deploy application run: | set -e @@ -117,15 +148,25 @@ jobs: run: | echo "+ Checking the status of the device" curl -v http://$CI_HOST/device/status && echo - echo "+ Waiting for 10 seconds to allow all services to start" - sleep 10 + echo "+ Waiting for 15 seconds to allow all services to start" + sleep 15 echo "+ Collecting logs" - ssh jkci "cat /userdata/jetkvm/last.log" > last.log - cat last.log + local_log_tar=$(mktemp) + ssh jkci ash > $local_log_tar <<'EOF' + log_path=$(mktemp -d) + dmesg > $log_path/dmesg.log + cp /userdata/jetkvm/last.log $log_path/last.log + tar -czf - -C $log_path . + EOF + tar -xf $local_log_tar + cat dmesg.log last.log env: CI_HOST: ${{ vars.JETKVM_CI_HOST }} - name: Upload logs uses: actions/upload-artifact@v4 with: name: device-logs - path: last.log + path: | + last.log + dmesg.log + device-tests.json diff --git a/Makefile b/Makefile index 0b0b060..1a9f41d 100644 --- a/Makefile +++ b/Makefile @@ -15,6 +15,9 @@ GO_LDFLAGS := \ -X $(PROMETHEUS_TAG).Revision=$(REVISION) \ -X $(KVM_PKG_NAME).builtTimestamp=$(BUILDTS) +GO_CMD := GOOS=linux GOARCH=arm GOARM=7 go +BIN_DIR := $(shell pwd)/bin + TEST_DIRS := $(shell find . -name "*_test.go" -type f -exec dirname {} \; | sort -u) hash_resource: @@ -22,31 +25,35 @@ hash_resource: build_dev: hash_resource @echo "Building..." - GOOS=linux GOARCH=arm GOARM=7 go build -ldflags="$(GO_LDFLAGS) -X $(KVM_PKG_NAME).builtAppVersion=$(VERSION_DEV)" -o bin/jetkvm_app cmd/main.go + $(GO_CMD) build -ldflags="$(GO_LDFLAGS) -X $(KVM_PKG_NAME).builtAppVersion=$(VERSION_DEV)" -o $(BIN_DIR)/jetkvm_app cmd/main.go build_test2json: - GOOS=linux GOARCH=arm GOARM=7 go build -o bin/test2json cmd/test2json + $(GO_CMD) build -o $(BIN_DIR)/test2json cmd/test2json -build_dev_test: build_test2json +build_gotestsum: + @echo "Building gotestsum..." + $(GO_CMD) install gotest.tools/gotestsum@latest + cp $(shell $(GO_CMD) env GOPATH)/bin/linux_arm/gotestsum $(BIN_DIR)/gotestsum + +build_dev_test: build_test2json build_gotestsum # collect all directories that contain tests @echo "Building tests for devices ..." - @rm -rf bin/tests && mkdir -p bin/tests + @rm -rf $(BIN_DIR)/tests && mkdir -p $(BIN_DIR)/tests - @cat resource/dev_test.sh > bin/tests/run_all_tests + @cat resource/dev_test.sh > $(BIN_DIR)/tests/run_all_tests @for test in $(TEST_DIRS); do \ test_pkg_name=$$(echo $$test | sed 's/^.\///g'); \ test_pkg_full_name=$(KVM_PKG_NAME)/$$(echo $$test | sed 's/^.\///g'); \ test_filename=$$(echo $$test_pkg_name | sed 's/\//__/g')_test; \ - GOOS=linux GOARCH=arm GOARM=7 \ - go test -v \ + $(GO_CMD) test -v \ -ldflags="$(GO_LDFLAGS) -X $(KVM_PKG_NAME).builtAppVersion=$(VERSION_DEV)" \ - -c -o bin/tests/$$test_filename $$test; \ - echo "runTest ./$$test_filename $$test_pkg_full_name" >> bin/tests/run_all_tests; \ + -c -o $(BIN_DIR)/tests/$$test_filename $$test; \ + echo "runTest ./$$test_filename $$test_pkg_full_name" >> $(BIN_DIR)/tests/run_all_tests; \ done; \ - chmod +x bin/tests/run_all_tests; \ - cp bin/test2json bin/tests/; \ - chmod +x bin/tests/test2json; \ - tar czfv device-tests.tar.gz -C bin/tests . + chmod +x $(BIN_DIR)/tests/run_all_tests; \ + cp $(BIN_DIR)/test2json $(BIN_DIR)/tests/ && chmod +x $(BIN_DIR)/tests/test2json; \ + cp $(BIN_DIR)/gotestsum $(BIN_DIR)/tests/ && chmod +x $(BIN_DIR)/tests/gotestsum; \ + tar czfv device-tests.tar.gz -C $(BIN_DIR)/tests . frontend: cd ui && npm ci && npm run build:device @@ -59,7 +66,7 @@ dev_release: frontend build_dev build_release: frontend hash_resource @echo "Building release..." - GOOS=linux GOARCH=arm GOARM=7 go build -ldflags="$(GO_LDFLAGS) -X $(KVM_PKG_NAME).builtAppVersion=$(VERSION)" -o bin/jetkvm_app cmd/main.go + $(GO_CMD) build -ldflags="$(GO_LDFLAGS) -X $(KVM_PKG_NAME).builtAppVersion=$(VERSION)" -o bin/jetkvm_app cmd/main.go release: @if rclone lsf r2://jetkvm-update/app/$(VERSION)/ | grep -q "jetkvm_app"; then \ diff --git a/dev_deploy.sh b/dev_deploy.sh index 7bd649b..a2d32ed 100755 --- a/dev_deploy.sh +++ b/dev_deploy.sh @@ -27,7 +27,6 @@ show_help() { echo " -u, --user Remote username (default: root)" echo " --run-go-tests Run go tests" echo " --run-go-tests-only Run go tests and exit" - echo " --run-go-tests-json Run go tests and output JSON" echo " --skip-ui-build Skip frontend/UI build" echo " --help Display this help message" echo @@ -43,7 +42,6 @@ SKIP_UI_BUILD=false RESET_USB_HID_DEVICE=false LOG_TRACE_SCOPES="${LOG_TRACE_SCOPES:-jetkvm,cloud,websocket,native,jsonrpc}" RUN_GO_TESTS=false -RUN_GO_TESTS_JSON=false RUN_GO_TESTS_ONLY=false # Parse command line arguments @@ -69,11 +67,6 @@ while [[ $# -gt 0 ]]; do RUN_GO_TESTS=true shift ;; - --run-go-tests-json) - RUN_GO_TESTS_JSON=true - RUN_GO_TESTS=true - shift - ;; --run-go-tests-only) RUN_GO_TESTS_ONLY=true RUN_GO_TESTS=true @@ -109,18 +102,35 @@ if [ "$RUN_GO_TESTS" = true ]; then make build_dev_test msg_info "▶ Copying device-tests.tar.gz to remote host" - ssh "${REMOTE_USER}@${REMOTE_HOST}" "cat > ${REMOTE_PATH}/device-tests.tar.gz" < device-tests.tar.gz + ssh "${REMOTE_USER}@${REMOTE_HOST}" "cat > /tmp/device-tests.tar.gz" < device-tests.tar.gz msg_info "▶ Running go tests" - TEST_ARGS="" - if [ "$RUN_GO_TESTS_JSON" = true ]; then - TEST_ARGS="-json" - fi - ssh "${REMOTE_USER}@${REMOTE_HOST}" ash << EOF + ssh "${REMOTE_USER}@${REMOTE_HOST}" ash << 'EOF' set -e -cd ${REMOTE_PATH} -tar zxvf device-tests.tar.gz -PION_LOG_TRACE=all ./run_all_tests $TEST_ARGS +TMP_DIR=$(mktemp -d) +cd ${TMP_DIR} +tar zxf /tmp/device-tests.tar.gz +./gotestsum --format=testdox \ + --jsonfile=/tmp/device-tests.json \ + --post-run-command 'sh -c "echo $TESTS_FAILED > /tmp/device-tests.failed"' \ + --raw-command -- ./run_all_tests -json + +GOTESTSUM_EXIT_CODE=$? +if [ $GOTESTSUM_EXIT_CODE -ne 0 ]; then + echo "❌ Tests failed (exit code: $GOTESTSUM_EXIT_CODE)" + rm -rf ${TMP_DIR} /tmp/device-tests.tar.gz + exit 1 +fi + +TESTS_FAILED=$(cat /tmp/device-tests.failed) +if [ "$TESTS_FAILED" -ne 0 ]; then + echo "❌ Tests failed $TESTS_FAILED tests failed" + rm -rf ${TMP_DIR} /tmp/device-tests.tar.gz + exit 1 +fi + +echo "✅ Tests passed" +rm -rf ${TMP_DIR} /tmp/device-tests.tar.gz EOF if [ "$RUN_GO_TESTS_ONLY" = true ]; then diff --git a/go.mod b/go.mod index 0e288db..4abd752 100644 --- a/go.mod +++ b/go.mod @@ -30,9 +30,9 @@ require ( github.com/stretchr/testify v1.10.0 github.com/vishvananda/netlink v1.3.0 go.bug.st/serial v1.6.2 - golang.org/x/crypto v0.36.0 - golang.org/x/net v0.38.0 - golang.org/x/sys v0.32.0 + golang.org/x/crypto v0.38.0 + golang.org/x/net v0.40.0 + golang.org/x/sys v0.33.0 ) replace github.com/pojntfx/go-nbd v0.3.2 => github.com/chemhack/go-nbd v0.0.0-20241006125820-59e45f5b1e7b @@ -52,6 +52,7 @@ require ( github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.26.0 // indirect github.com/goccy/go-json v0.10.5 // indirect + github.com/google/go-cmp v0.7.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.17.11 // indirect github.com/klauspost/cpuid/v2 v2.2.10 // indirect @@ -78,13 +79,14 @@ require ( github.com/pion/turn/v4 v4.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.6.1 // indirect + github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect github.com/vishvananda/netns v0.0.4 // indirect github.com/wlynxg/anet v0.0.5 // indirect golang.org/x/arch v0.15.0 // indirect golang.org/x/oauth2 v0.24.0 // indirect - golang.org/x/text v0.23.0 // indirect + golang.org/x/text v0.25.0 // indirect google.golang.org/protobuf v1.36.6 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 14aadb1..63ebc96 100644 --- a/go.sum +++ b/go.sum @@ -51,8 +51,8 @@ github.com/go-playground/validator/v10 v10.26.0/go.mod h1:I5QpIEbmr8On7W0TktmJAu github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -147,8 +147,8 @@ github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0leargg github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/psanford/httpreadat v0.1.0 h1:VleW1HS2zO7/4c7c7zNl33fO6oYACSagjJIyMIwZLUE= github.com/psanford/httpreadat v0.1.0/go.mod h1:Zg7P+TlBm3bYbyHTKv/EdtSJZn3qwbPwpfZ/I9GKCRE= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= @@ -181,10 +181,10 @@ go.bug.st/serial v1.6.2 h1:kn9LRX3sdm+WxWKufMlIRndwGfPWsH1/9lCWXQCasq8= go.bug.st/serial v1.6.2/go.mod h1:UABfsluHAiaNI+La2iESysd9Vetq7VRdpxvjx7CmmOE= golang.org/x/arch v0.15.0 h1:QtOrQd0bTUnhNVNndMpLHNWrDmYzZ2KDqSrEymqInZw= golang.org/x/arch v0.15.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE= -golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= -golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= -golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= -golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= +golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= +golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= +golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -194,10 +194,10 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= +golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/internal/usbgadget/changeset_symlink.go b/internal/usbgadget/changeset_symlink.go index 16ffb77..d94c759 100644 --- a/internal/usbgadget/changeset_symlink.go +++ b/internal/usbgadget/changeset_symlink.go @@ -29,7 +29,7 @@ func checkIfSymlinksInOrder(fc *FileChange, logger *zerolog.Logger) (FileState, } l := logger.With().Str("path", fc.Path).Logger() - if fc.ParamSymlinks == nil || len(fc.ParamSymlinks) == 0 { + if len(fc.ParamSymlinks) == 0 { return FileStateUnknown, fmt.Errorf("no symlinks to check") } diff --git a/resource/dev_test.sh b/resource/dev_test.sh index ce152aa..0497801 100644 --- a/resource/dev_test.sh +++ b/resource/dev_test.sh @@ -29,8 +29,6 @@ runTest() { function exit_with_code() { if [ $EXIT_CODE -ne 0 ]; then printf "\e[0;31m❌ Test failed\e[0m\n" - else - printf "\e[0;32m✅ All tests passed\e[0m\n" fi exit $EXIT_CODE