From 908162436f7d4047bfeff8c6f1aa00dd6915b68a Mon Sep 17 00:00:00 2001 From: dahn510 Date: Thu, 5 Jun 2025 19:03:28 -0700 Subject: [PATCH 01/28] venom test case --- test/e2e/test-init.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 test/e2e/test-init.yml diff --git a/test/e2e/test-init.yml b/test/e2e/test-init.yml new file mode 100644 index 0000000..2df8ecb --- /dev/null +++ b/test/e2e/test-init.yml @@ -0,0 +1,26 @@ +name: Test Sequoia Init Command +description: Test initialization of sequoia +vars: + dev-mode: false + +testcases: + +- name: Check creation of sequoia directory + skip: + - dev-mode ShouldEqual false + + steps: + - name: check if directory already exists + script: ls $HOME/.sequoia + assertions: + - result.code ShouldNotEqual 0 + + - name: check init command creating directory + script: sequoia init + skip: + - isDevMode ShouldBeFalse + + - name: check if directory is created + script: ls $HOME/.sequoia + assertions: + - result.code ShouldEqual 0 From c3ea7dad614b08a4c5cca61f849be564046b910b Mon Sep 17 00:00:00 2001 From: dahn510 Date: Thu, 5 Jun 2025 19:11:08 -0700 Subject: [PATCH 02/28] e2e test make command --- Makefile | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 8517452..3cf88d1 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ COMMIT := $(shell git log -1 --format='%H') ldflags = -X github.com/JackalLabs/sequoia/config.COMMIT=$(COMMIT) \ -X github.com/JackalLabs/sequoia/config.VERSION=$(VERSION) -all: lint test-unit +all: lint test install: @go install -ldflags '$(ldflags)' @@ -69,7 +69,21 @@ format: ### Tests & Simulation ### ############################################################################### +test: test-unit test-e2e + test-unit: @echo "Executing unit tests..." @go test -mod=readonly -v -coverprofile coverage.txt ./... -.PHONY: test-unit + +test-e2e: + @echo "Executing e2e tests..." + @venom run ./test/e2e/*.yml + +test-e2e-dev-mode: + @echo "Executing e2e tests..." + @venom run --var dev-mode=true ./test/e2e/*.yml + +test-clean: + rm venom*.log + +.PHONY: test-unit test-e2e test-e2e-dev-mode test test-clean From ec222eef277698f11fd1956d9a3f81ef00bcaad8 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Thu, 5 Jun 2025 19:19:45 -0700 Subject: [PATCH 03/28] e2e testing readme --- test/e2e/README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 test/e2e/README.md diff --git a/test/e2e/README.md b/test/e2e/README.md new file mode 100644 index 0000000..193d0bb --- /dev/null +++ b/test/e2e/README.md @@ -0,0 +1,14 @@ +# End-to-End Testing + +### Requirements +[venom](https://github.com/ovh/venom/tree/master?tab=readme-ov-file#installing) + +### Running Tests +```bash +venom run ./test/e2e/*.yml +``` + +`dev-mode`: skip tests that might alter existing files and configs +```bash +venom run --var dev-mode=true ./test/e2e/*.yml +``` From 4abc2a1f93c390851fbfd0bb2a572f20d5fc2063 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Wed, 11 Jun 2025 18:02:50 -0700 Subject: [PATCH 04/28] docker canine-chain --- test/e2e/resources/Dockerfile | 57 +++++++++++++++++ test/e2e/resources/setup-chain.sh | 103 ++++++++++++++++++++++++++++++ 2 files changed, 160 insertions(+) create mode 100644 test/e2e/resources/Dockerfile create mode 100755 test/e2e/resources/setup-chain.sh diff --git a/test/e2e/resources/Dockerfile b/test/e2e/resources/Dockerfile new file mode 100644 index 0000000..eeaf5d0 --- /dev/null +++ b/test/e2e/resources/Dockerfile @@ -0,0 +1,57 @@ +# syntax=docker/dockerfile:1 + +# Start from a base Golang image to build the binary +FROM golang:1.23 AS builder + +# Update package list and install jq +RUN apt-get update && apt-get install -y jq + +# Create working directory inside the container +WORKDIR /lib + +COPY ./setup-chain.sh . + +RUN wget https://github.com/CosmWasm/wasmvm/raw/v1.2.6/internal/api/libwasmvm.x86_64.so + +WORKDIR /app + +# Clone the Canine Chain source code +RUN git clone https://github.com/JackalLabs/canine-chain.git . + +# Checkout a specific release tag (replace with the latest if needed) +RUN git checkout v4.6.1 + +# Build the binary +RUN make build + +# Use a smaller image to run the binary +FROM debian:bookworm-slim + +WORKDIR /root + +RUN apt-get update && apt-get install -y \ + build-essential \ + git \ + curl \ + bash \ + wget \ + jq + +# Copy the binary from the builder +COPY --from=builder /app/build/canined /usr/local/bin/canined + +COPY --from=builder /lib/libwasmvm.x86_64.so /lib/libwasmvm.x86_64.so + +COPY --from=builder /lib/setup-chain.sh /root/setup-chain.sh + +WORKDIR /root + +RUN ./setup-chain.sh + +# Expose default RPC, P2P, and REST ports +EXPOSE 26656 26657 1317 9092 9090 + +WORKDIR /root/.canine + +# Command to start the node (adjust args as needed) +CMD ["canined", "start"] diff --git a/test/e2e/resources/setup-chain.sh b/test/e2e/resources/setup-chain.sh new file mode 100755 index 0000000..83f16da --- /dev/null +++ b/test/e2e/resources/setup-chain.sh @@ -0,0 +1,103 @@ +#!/bin/bash + +set -eu + +KEY="j1" +KEY1="j2" +KEY2="charlie" +DEPOACCKEY="deposit_account" + +CHAINID="test-1" +MONIKER="localjack" +KEYALGO="secp256k1" +KEYRING="test" +LOGLEVEL="info" +BROADCASTMODE="block" + +command -v jq > /dev/null 2>&1 || { echo >&2 "jq not installed. More info: https://stedolan.github.io/jq/download/"; exit 1; } + +from_scratch () { + # remove existing daemon + rm -rf ~/.canine/* + + # jkl1hj5fveer5cjtn4wd6wstzugjfdxzl0xpljur4u '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"ApZa31BR3NWLylRT6Qi5+f+zXtj2OpqtC76vgkUGLyww"}' + echo "decorate bright ozone fork gallery riot bus exhaust worth way bone indoor calm squirrel merry zero scheme cotton until shop any excess stage laundry" | canined keys add $KEY --keyring-backend $KEYRING --algo $KEYALGO --recover + # j2 jkl1s00nvkagel9xe6luqmmd09jt6jgjl7qu57prct '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"Ah3VzRghgXLn8IA2AH6qaoiuBwZv3ADg3gNPFTo92FwM"}' + echo "guess census arena parent ribbon among advice green electric almost wink muffin size unfold hedgehog gather warfare embrace float entry cargo ice fade best" | canined keys add $DEPOACCKEY --keyring-backend $KEYRING --algo $KEYALGO --recover + + echo "video pluck level diagram maximum grant make there clog tray enrich book hawk confirm spot you book vendor ensure theory sure jewel sort basket" | canined keys add $KEY1 --algo $KEYALGO --keyring-backend $KEYRING --recover + + echo "flock stereo dignity lawsuit mouse page faith exact mountain clinic hazard parent arrest face couch asset jump feed benefit upper hair scrap loud spirit" | canined keys add $KEY2 --algo $KEYALGO --keyring-backend $KEYRING --recover + + canined init $MONIKER --chain-id $CHAINID + + canined config keyring-backend $KEYRING + canined config chain-id $CHAINID + canined config broadcast-mode $BROADCASTMODE + + # Function updates the config based on a jq argument as a string + update_test_genesis () { + # EX: update_test_genesis '.consensus_params["block"]["max_gas"]="100000000"' + cat $HOME/.canine/config/genesis.json | jq "$1" > $HOME/.canine/config/tmp_genesis.json && mv $HOME/.canine/config/tmp_genesis.json $HOME/.canine/config/genesis.json + } + + # Set gas limit in genesis + update_test_genesis '.consensus_params["block"]["max_gas"]="100000000"' + update_test_genesis '.app_state["gov"]["voting_params"]["voting_period"]="15s"' + update_test_genesis '.app_state["staking"]["params"]["bond_denom"]="ujkl"' + update_test_genesis '.app_state["mint"]["params"]["mint_denom"]="ujkl"' + update_test_genesis '.app_state["gov"]["deposit_params"]["min_deposit"]=[{"denom": "ujkl","amount": "1000000"}]' + update_test_genesis '.app_state["crisis"]["constant_fee"]={"denom": "ujkl","amount": "1000"}' + + # Use jkl bech32 prefix account for storage and oracle modules + update_test_genesis '.app_state["storage"]["params"]["deposit_account"]="'"$(canined keys show -a $DEPOACCKEY)"'"' + update_test_genesis '.app_state["storage"]["params"]["chunk_size"]="'10240'"' + update_test_genesis '.app_state["storage"]["params"]["proof_window"]="'25'"' + update_test_genesis '.app_state["oracle"]["params"]["deposit"]="'"$(canined keys show -a $DEPOACCKEY)"'"' + update_test_genesis '.app_state["rns"]["params"]["deposit_account"]="'"$(canined keys show -a $DEPOACCKEY)"'"' + #'.app_state["storage"]["params"]["check_window"]="'10'"' + + #update_test_genesis '.app_state["jklmint"]["params"]["deposit_account"]="'"$(canined keys show -a $DEPOACCKEY)"'"' + + # adding providers to genesis + canined add-genesis-account jkl1xclg3utp4yuvaxa54r39xzrudc988s82ykve3f 1100000000000ujkl + canined add-genesis-account jkl1tcveayn80pe3d5wallj9kev3rfefctsmrqf6ks 1100000000000ujkl + canined add-genesis-account jkl1eg3gm3e3k4dypvvme26ejmajnyvtgwwlaaeu2y 1100000000000ujkl + canined add-genesis-account jkl1ga0348r8zhn8k4xy3fagwvkwzvyh5lynxr5kak 1100000000000ujkl + canined add-genesis-account jkl18encuf0esmxv3pxqjqvn0u4tgd6yzuc8urzlp0 1100000000000ujkl + canined add-genesis-account jkl1sqt9v0zwwx362szrek7pr3lpq29aygw06hgyza 1100000000000ujkl + canined add-genesis-account jkl1yu099xns2qpslvyrymxq3hwrqhevs7qxksvu8p 1100000000000ujkl + canined add-genesis-account jkl1su8xhm089rg2qs7hx4ngzt42mg45ma89g00e30 1100000000000ujkl + + + # Allocate genesis accounts + canined add-genesis-account $KEY 100000000000000ujkl --keyring-backend $KEYRING + canined add-genesis-account $DEPOACCKEY 1000000000000ujkl --keyring-backend $KEYRING + canined add-genesis-account $KEY1 1000000000000ujkl --keyring-backend $KEYRING + canined add-genesis-account $KEY2 1000000000000ujkl --keyring-backend $KEYRING + + canined gentx $KEY 1000000ujkl --keyring-backend $KEYRING --chain-id $CHAINID + + canined collect-gentxs + + canined validate-genesis +} + +fix_config() { + sed -i.bak -e 's/stake/ujkl/' $HOME/.canine/config/genesis.json + sed -i.bak -e 's/ujklr_ratio/staker_ratio/' $HOME/.canine/config/genesis.json + sed -i.bak -e 's/^minimum-gas-prices =""/minimum-gas-prices = \"0.0025ujkl\"/' $HOME/.canine/config/app.toml + sed -i.bak -e 's/enable = false/enable=true/' $HOME/.canine/config/app.toml + sed -i.bak -e 's/enable=false/enable=true/' $HOME/.canine/config/app.toml + sed -i.bak -e 's/enabled-unsafe-cors = false/enabled-unsafe-cors = true/' $HOME/.canine/config/app.toml + sed -i.bak -e 's/cors_allowed_origins = \[\]/cors_allowed_origins = \["*"\]/' $HOME/.canine/config/config.toml + sed -i.bak -e 's/laddr = "tcp:\/\/127.0.0.1:26657"/laddr = "tcp:\/\/0.0.0.0:26657"/' $HOME/.canine/config/config.toml + sed -i.bak -e 's/laddr = "tcp:\/\/127.0.0.1:26656"/laddr = "tcp:\/\/0.0.0.0:26656"/' $HOME/.canine/config/config.toml + sed -i.bak -e 's/chain-id = ""/chain-id = "canine-1"/' $HOME/.canine/config/client.toml + sed -i.bak -e 's/address = "0.0.0.0:9090"/address = "0.0.0.0:9090"/' $HOME/.canine/config/app.toml + sed -i.bak -e 's/grpc_laddr = ""/grpc_laddr = "tcp:\/\/0.0.0.0:9092"/' $HOME/.canine/config/config.toml + +} + +from_scratch +fix_config From cf3eacc7a525e91ee33da1972b99f9ff376da474 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Mon, 7 Jul 2025 19:37:03 -0700 Subject: [PATCH 05/28] auto init sequoia and chain containers --- Dockerfile | 25 ++++++++ test/README.md | 34 +++++++++++ test/compose.yaml | 27 +++++++++ test/e2e/01_test-post-file.yaml | 18 ++++++ test/e2e/README.md | 14 ----- test/e2e/init.yaml | 58 +++++++++++++++++++ test/e2e/test-init.yml | 26 --------- .../resources => resources/canine}/Dockerfile | 0 .../canine}/setup-chain.sh | 12 ++-- 9 files changed, 170 insertions(+), 44 deletions(-) create mode 100644 Dockerfile create mode 100644 test/README.md create mode 100644 test/compose.yaml create mode 100644 test/e2e/01_test-post-file.yaml delete mode 100644 test/e2e/README.md create mode 100644 test/e2e/init.yaml delete mode 100644 test/e2e/test-init.yml rename test/{e2e/resources => resources/canine}/Dockerfile (100%) rename test/{e2e/resources => resources/canine}/setup-chain.sh (99%) diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..0d4a987 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,25 @@ +FROM golang:1.24 + +ARG RPC_ADDR="http://localhost:26657" +ARG GRPC_ADDR="localhost:9090" + +WORKDIR /usr/src/app + +# pre-copy/cache go.mod for pre-downloading dependencies and only redownloading them in subsequent builds if they change +COPY go.mod go.sum ./ +RUN go mod download + +COPY . . +RUN make install + +# RPC GRPC api ipfs +EXPOSE 26657 9090 3333 4005 + +WORKDIR /root/.sequoia + +RUN sequoia init + +RUN sed -i -e "s/http:\/\/localhost:26657/${RPC_ADDR}/" config.yaml +RUN sed -i -e "s/localhost:9090/${GRPC_ADDR}/" config.yaml + +CMD ["sequoia", "start"] diff --git a/test/README.md b/test/README.md new file mode 100644 index 0000000..fdcdd04 --- /dev/null +++ b/test/README.md @@ -0,0 +1,34 @@ +# End-to-End Testing + +### Requirements +[canined](https://github.com/JackalLabs/canine-chain/releases) +[venom](https://github.com/ovh/venom/tree/master?tab=readme-ov-file#installing) +docker +docker compose + +### Running Tests + +> Add `--var dev-mode=true` to skip tests that alter current setup files +> Add `-vv` flag to debug tests + +Setup canined and sequoia containers +```bash +venom run e2e/init.yaml +``` +Run tests: +```bash +venom run ./test/e2e/*_test-*.yaml +``` +Or all at once: +```bash +venom run e2e/init.yaml `find e2e/ -type f -name "*_test-*.yaml" | sort` +``` + +Stop and delete test containers +```bash +docker compose down +``` + +### Writing Tests + +If one test depends on the other, make the file name in [sort](https://en.wikipedia.org/wiki/Sort_(Unix))ed order. diff --git a/test/compose.yaml b/test/compose.yaml new file mode 100644 index 0000000..ef1039c --- /dev/null +++ b/test/compose.yaml @@ -0,0 +1,27 @@ +services: + chain: + build: ./resources/canine + image: e2e-test-chain + ports: + - "26656:26656" + - "26657:26657" + - "1317:1317" + - "9092:9092" + - "9090:9090" + + sequoia: + build: + context: ../ + args: + RPC_ADDR: 'http:\/\/chain:26657' + GRPC_ADDR: "chain:9090" + image: e2e-test-sequoia + volumes: + - $HOME/.sequoia/provider_wallet.json:/root/.sequoia/provider_wallet.json + depends_on: + - chain + entrypoint: ["/bin/sh", "-c", "sleep 10 && sequoia start"] + ports: + - "3333:3333" + - "4005:4005" + diff --git a/test/e2e/01_test-post-file.yaml b/test/e2e/01_test-post-file.yaml new file mode 100644 index 0000000..ee20709 --- /dev/null +++ b/test/e2e/01_test-post-file.yaml @@ -0,0 +1,18 @@ +name: Test Sequoia File Upload +description: Test file upload to sequoia +vars: + dev-mode: false + +testcases: +- name: Start sequoia and canine-chain containers + steps: + - script: docker compose up -d; sleep 5 + +- name: Upload file to sequoia + + steps: + - name: Upload file using canined + script: 'canined tx storage post ../../.assets/logo.png 500000 --dest http://localhost:3333 --max_proofs 1 --from j1 -y' + assertions: + - result.systemout ShouldContainSubstring 1ab5cd31e2d001fedad0b92abb01cf36f16e1c395c7880a67e2d18d39d81040d7732fa5a33d81bb33578243c54d60c8d5a56de604b1827243dc1feab39b4b3a6 + - result.code ShouldEqual 0 diff --git a/test/e2e/README.md b/test/e2e/README.md deleted file mode 100644 index 193d0bb..0000000 --- a/test/e2e/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# End-to-End Testing - -### Requirements -[venom](https://github.com/ovh/venom/tree/master?tab=readme-ov-file#installing) - -### Running Tests -```bash -venom run ./test/e2e/*.yml -``` - -`dev-mode`: skip tests that might alter existing files and configs -```bash -venom run --var dev-mode=true ./test/e2e/*.yml -``` diff --git a/test/e2e/init.yaml b/test/e2e/init.yaml new file mode 100644 index 0000000..96b8ecd --- /dev/null +++ b/test/e2e/init.yaml @@ -0,0 +1,58 @@ +name: Test Sequoia Initialization +description: Test provider Initialization on chain +vars: + dev-mode: false + faucet: jkl1hj5fveer5cjtn4wd6wstzugjfdxzl0xpljur4u + +testcases: +- name: Initialize canine-chain and sequoia configs + skip: + - dev-mode ShouldEqual false + + steps: + - name: Delete existing docker containers + script: "docker compose down" + + - name: Initialize sequoia config + script: "rm -rf $HOME/.sequoia; sequoia init" + + - name: Initialize canined config + script: "rm -rf $HOME/.canine; ../resources/canine/setup-chain.sh" + + - name: Build and start canined container + script: "docker compose up -d chain; sleep 5" # wait for the chain to open api + +- name: Fund sequoia provider wallet + skip: + - dev-mode ShouldEqual false + + steps: + - name: Get provider address + script: "sequoia wallet address | sed 's/Provider Address: //'" + vars: + address: + from: result.systemout + + - name: Fund provider + info: "provider address {{.address}}" + script: "canined tx bank send {{.faucet}} {{.address}} 100000000000ujkl -y" + retry: 3 + delay: 10 + assertions: + - result.code ShouldEqual 0 + +- name: Start sequoia + steps: + - name: Build and start sequoia container + script: "docker compose up -d sequoia" + assertions: + - result.code ShouldEqual 0 + +- name: Verify provider registration on chain + steps: + - script: "canined query storage show-providers {{.Fund-sequoia-provider-wallet.address}}" + retry: 3 + delay: 10 # bump this number if provider takes longer to start up + assertions: + - result.systemout ShouldContainSubstring {{.Fund-sequoia-provider-wallet.address}} + - result.code ShouldEqual 0 diff --git a/test/e2e/test-init.yml b/test/e2e/test-init.yml deleted file mode 100644 index 2df8ecb..0000000 --- a/test/e2e/test-init.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Test Sequoia Init Command -description: Test initialization of sequoia -vars: - dev-mode: false - -testcases: - -- name: Check creation of sequoia directory - skip: - - dev-mode ShouldEqual false - - steps: - - name: check if directory already exists - script: ls $HOME/.sequoia - assertions: - - result.code ShouldNotEqual 0 - - - name: check init command creating directory - script: sequoia init - skip: - - isDevMode ShouldBeFalse - - - name: check if directory is created - script: ls $HOME/.sequoia - assertions: - - result.code ShouldEqual 0 diff --git a/test/e2e/resources/Dockerfile b/test/resources/canine/Dockerfile similarity index 100% rename from test/e2e/resources/Dockerfile rename to test/resources/canine/Dockerfile diff --git a/test/e2e/resources/setup-chain.sh b/test/resources/canine/setup-chain.sh similarity index 99% rename from test/e2e/resources/setup-chain.sh rename to test/resources/canine/setup-chain.sh index 83f16da..ba9ae6d 100755 --- a/test/e2e/resources/setup-chain.sh +++ b/test/resources/canine/setup-chain.sh @@ -16,10 +16,7 @@ BROADCASTMODE="block" command -v jq > /dev/null 2>&1 || { echo >&2 "jq not installed. More info: https://stedolan.github.io/jq/download/"; exit 1; } -from_scratch () { - # remove existing daemon - rm -rf ~/.canine/* - +add_keys () { # jkl1hj5fveer5cjtn4wd6wstzugjfdxzl0xpljur4u '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"ApZa31BR3NWLylRT6Qi5+f+zXtj2OpqtC76vgkUGLyww"}' echo "decorate bright ozone fork gallery riot bus exhaust worth way bone indoor calm squirrel merry zero scheme cotton until shop any excess stage laundry" | canined keys add $KEY --keyring-backend $KEYRING --algo $KEYALGO --recover # j2 jkl1s00nvkagel9xe6luqmmd09jt6jgjl7qu57prct '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"Ah3VzRghgXLn8IA2AH6qaoiuBwZv3ADg3gNPFTo92FwM"}' @@ -28,6 +25,13 @@ from_scratch () { echo "video pluck level diagram maximum grant make there clog tray enrich book hawk confirm spot you book vendor ensure theory sure jewel sort basket" | canined keys add $KEY1 --algo $KEYALGO --keyring-backend $KEYRING --recover echo "flock stereo dignity lawsuit mouse page faith exact mountain clinic hazard parent arrest face couch asset jump feed benefit upper hair scrap loud spirit" | canined keys add $KEY2 --algo $KEYALGO --keyring-backend $KEYRING --recover +} + +from_scratch () { + # remove existing daemon + rm -rf ~/.canine/* + + add_keys canined init $MONIKER --chain-id $CHAINID From ad69f5be94c38a2eeb3cb584e5b39abbcac94cc2 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 8 Jul 2025 15:11:28 -0700 Subject: [PATCH 06/28] init e2e gh workflow --- .github/workflows/test-e2e.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/test-e2e.yml diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml new file mode 100644 index 0000000..ecb472a --- /dev/null +++ b/.github/workflows/test-e2e.yml @@ -0,0 +1,19 @@ +name: End-to-end Test + +on: + pull_request: + push: + branches: ["main"] + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4.2.2 + - uses: actions/setup-go@v5 + - name: Test + shell: bash + run: cd test + run: venom run e2e/init.yaml `find e2e/ -type f -name "*_test-*.yaml" | sort` + From 56f7cdf5d3e28bbba3f01aec62d16b689df00542 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 8 Jul 2025 15:16:53 -0700 Subject: [PATCH 07/28] working dir --- .github/workflows/test-e2e.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index ecb472a..ad50c75 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -14,6 +14,6 @@ jobs: - uses: actions/setup-go@v5 - name: Test shell: bash - run: cd test + working-directory: ./test run: venom run e2e/init.yaml `find e2e/ -type f -name "*_test-*.yaml" | sort` From 205fbc4d99b8257decd9b51be96bd75bce326d36 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 8 Jul 2025 15:25:05 -0700 Subject: [PATCH 08/28] install venom --- .github/workflows/test-e2e.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index ad50c75..516ea2a 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -12,6 +12,9 @@ jobs: steps: - uses: actions/checkout@v4.2.2 - uses: actions/setup-go@v5 + - name: Install Venom + shell: bash + run: curl https://github.com/ovh/venom/releases/download/v1.2.0/venom.linux-amd64 -L -o /usr/local/bin/venom && chmod +x /usr/local/bin/venom - name: Test shell: bash working-directory: ./test From 0a386c814a4198c1dce26336df8811dd45006e7b Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 8 Jul 2025 15:32:11 -0700 Subject: [PATCH 09/28] run venom verbose --- .github/workflows/test-e2e.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 516ea2a..2d6eb68 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -18,5 +18,5 @@ jobs: - name: Test shell: bash working-directory: ./test - run: venom run e2e/init.yaml `find e2e/ -type f -name "*_test-*.yaml" | sort` + run: venom run -vv e2e/init.yaml `find e2e/ -type f -name "*_test-*.yaml" | sort` From 20a3de3466cf000cbe58071e4640c988d8fc215e Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 8 Jul 2025 15:42:10 -0700 Subject: [PATCH 10/28] install canined --- .github/workflows/test-e2e.yml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 2d6eb68..22f4715 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -10,8 +10,22 @@ jobs: name: Test runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4.2.2 - uses: actions/setup-go@v5 + - name: Build directory for canined + shell: bash + run: mkdir canined + - name: Clone canined repo + working-directory: ./canined + run: git clone https://github.com/JackalLabs/canine-chain.git + - name: Checkout to version + working-directory: ./canined + run: git checkout v4.6.1 + - name: Install canined + working-directory: ./canined + run: install canined + - name: Get canined dependency + run: wget https://github.com/CosmWasm/wasmvm/raw/v1.2.6/internal/api/libwasmvm.x86_64.so + - uses: actions/checkout@v4.2.2 - name: Install Venom shell: bash run: curl https://github.com/ovh/venom/releases/download/v1.2.0/venom.linux-amd64 -L -o /usr/local/bin/venom && chmod +x /usr/local/bin/venom From 78da13215fd07e3988965c3c8de6949c7b101b29 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 8 Jul 2025 15:43:16 -0700 Subject: [PATCH 11/28] fix working dir --- .github/workflows/test-e2e.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 22f4715..1a3f857 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -18,10 +18,10 @@ jobs: working-directory: ./canined run: git clone https://github.com/JackalLabs/canine-chain.git - name: Checkout to version - working-directory: ./canined + working-directory: ./canined/canine-chain run: git checkout v4.6.1 - name: Install canined - working-directory: ./canined + working-directory: ./canined/canine-chain run: install canined - name: Get canined dependency run: wget https://github.com/CosmWasm/wasmvm/raw/v1.2.6/internal/api/libwasmvm.x86_64.so From 6aae642812a4c7e7162e022c0994c912667d568b Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 8 Jul 2025 15:46:23 -0700 Subject: [PATCH 12/28] fix install cmd --- .github/workflows/test-e2e.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 1a3f857..d47e8e8 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -22,7 +22,7 @@ jobs: run: git checkout v4.6.1 - name: Install canined working-directory: ./canined/canine-chain - run: install canined + run: make install - name: Get canined dependency run: wget https://github.com/CosmWasm/wasmvm/raw/v1.2.6/internal/api/libwasmvm.x86_64.so - uses: actions/checkout@v4.2.2 From 56b083d3baa9b22f77c70a95017a7c11b8136e29 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 8 Jul 2025 15:50:34 -0700 Subject: [PATCH 13/28] install sequoia --- .github/workflows/test-e2e.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index d47e8e8..26debd3 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -29,6 +29,8 @@ jobs: - name: Install Venom shell: bash run: curl https://github.com/ovh/venom/releases/download/v1.2.0/venom.linux-amd64 -L -o /usr/local/bin/venom && chmod +x /usr/local/bin/venom + - name: Install sequoia + run: make install - name: Test shell: bash working-directory: ./test From cb92600e9304100f1dc70c2920f46276e2090d37 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 8 Jul 2025 16:25:04 -0700 Subject: [PATCH 14/28] action cache --- .github/workflows/test-e2e.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 26debd3..45e6ee9 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -11,6 +11,12 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/setup-go@v5 + - name: Cache test dependencies + uses: actions/cache@v4 + with: + path: | + $GOPATH/bin + /lib - name: Build directory for canined shell: bash run: mkdir canined @@ -24,7 +30,7 @@ jobs: working-directory: ./canined/canine-chain run: make install - name: Get canined dependency - run: wget https://github.com/CosmWasm/wasmvm/raw/v1.2.6/internal/api/libwasmvm.x86_64.so + run: wget -O /lib/libwasmvm.x86_64.so https://github.com/CosmWasm/wasmvm/raw/v1.2.6/internal/api/libwasmvm.x86_64.so - uses: actions/checkout@v4.2.2 - name: Install Venom shell: bash From e190e7766b8ee92dcfc93cc24689361e32eeaf7c Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 8 Jul 2025 16:27:13 -0700 Subject: [PATCH 15/28] keys --- .github/workflows/test-e2e.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 45e6ee9..326b6f1 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -15,8 +15,12 @@ jobs: uses: actions/cache@v4 with: path: | + /usr/local/bin $GOPATH/bin /lib + key: ${{ runner.os }}-${{ hashFiles('/usr/local/bin', '$GOPATH/bin', '/lib') }} + restore-keys: | + ${{ runner.os }}- - name: Build directory for canined shell: bash run: mkdir canined From 2df33b6564bb2bf6d12d443384a9dde020985349 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 8 Jul 2025 16:44:29 -0700 Subject: [PATCH 16/28] run if no cache hit --- .github/workflows/test-e2e.yml | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 326b6f1..f4983ec 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -13,32 +13,34 @@ jobs: - uses: actions/setup-go@v5 - name: Cache test dependencies uses: actions/cache@v4 + id: cache-dependencies with: path: | + ~/.cache/go-build + ~/go/pkg/mod /usr/local/bin $GOPATH/bin /lib - key: ${{ runner.os }}-${{ hashFiles('/usr/local/bin', '$GOPATH/bin', '/lib') }} + key: ${{ runner.os }}-${{ hashFiles('/usr/local/bin', '$GOPATH/bin', '/lib', '**/go.sum') }} restore-keys: | ${{ runner.os }}- - - name: Build directory for canined - shell: bash - run: mkdir canined - - name: Clone canined repo - working-directory: ./canined + - name: Clone canine-chain repo + if: steps.cache-dependencies.outputs.cache-it != 'true' run: git clone https://github.com/JackalLabs/canine-chain.git - - name: Checkout to version - working-directory: ./canined/canine-chain - run: git checkout v4.6.1 - name: Install canined - working-directory: ./canined/canine-chain - run: make install - - name: Get canined dependency - run: wget -O /lib/libwasmvm.x86_64.so https://github.com/CosmWasm/wasmvm/raw/v1.2.6/internal/api/libwasmvm.x86_64.so - - uses: actions/checkout@v4.2.2 - - name: Install Venom - shell: bash + if: steps.cache-dependencies.outputs.cache-it != 'true' + working-directory: ./canine-chain + run: | + git checkout v4.6.1 + make install + wget -O /lib/libwasmvm.x86_64.so https://github.com/CosmWasm/wasmvm/raw/v1.2.6/internal/api/libwasmvm.x86_64.so + - name: Install venom + if: steps.cache-dependencies.outputs.cache-it != 'true' run: curl https://github.com/ovh/venom/releases/download/v1.2.0/venom.linux-amd64 -L -o /usr/local/bin/venom && chmod +x /usr/local/bin/venom + - uses: actions/checkout@v4.2.2 + - name: Get sequoia build pkgs + if: steps.cache-dependencies.outputs.cache-it != 'true' + run: go mod download - name: Install sequoia run: make install - name: Test From 0db209a31beb65eede98617958ae0c41f84d7b83 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 8 Jul 2025 16:47:59 -0700 Subject: [PATCH 17/28] fix permission --- .github/workflows/test-e2e.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index f4983ec..4da2dfb 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -33,7 +33,7 @@ jobs: run: | git checkout v4.6.1 make install - wget -O /lib/libwasmvm.x86_64.so https://github.com/CosmWasm/wasmvm/raw/v1.2.6/internal/api/libwasmvm.x86_64.so + wget -O /lib/libwasmvm.x86_64.so https://github.com/CosmWasm/wasmvm/raw/v1.2.6/internal/api/libwasmvm.x86_64.so && chmod +x /lib/libwasmvm.x86_64.so - name: Install venom if: steps.cache-dependencies.outputs.cache-it != 'true' run: curl https://github.com/ovh/venom/releases/download/v1.2.0/venom.linux-amd64 -L -o /usr/local/bin/venom && chmod +x /usr/local/bin/venom From 61fa5be4a722047079fe57f2e16150f13d637679 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 8 Jul 2025 16:50:45 -0700 Subject: [PATCH 18/28] get lib before make --- .github/workflows/test-e2e.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 4da2dfb..24fa632 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -31,9 +31,9 @@ jobs: if: steps.cache-dependencies.outputs.cache-it != 'true' working-directory: ./canine-chain run: | + wget -O /lib/libwasmvm.x86_64.so https://github.com/CosmWasm/wasmvm/raw/v1.2.6/internal/api/libwasmvm.x86_64.so && chmod +x /lib/libwasmvm.x86_64.so git checkout v4.6.1 make install - wget -O /lib/libwasmvm.x86_64.so https://github.com/CosmWasm/wasmvm/raw/v1.2.6/internal/api/libwasmvm.x86_64.so && chmod +x /lib/libwasmvm.x86_64.so - name: Install venom if: steps.cache-dependencies.outputs.cache-it != 'true' run: curl https://github.com/ovh/venom/releases/download/v1.2.0/venom.linux-amd64 -L -o /usr/local/bin/venom && chmod +x /usr/local/bin/venom From 655374ce109d06836219ef11ab23bec81867d729 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 8 Jul 2025 17:19:23 -0700 Subject: [PATCH 19/28] clone to action/checkout --- .github/workflows/test-e2e.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 24fa632..b4ad668 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -26,25 +26,31 @@ jobs: ${{ runner.os }}- - name: Clone canine-chain repo if: steps.cache-dependencies.outputs.cache-it != 'true' - run: git clone https://github.com/JackalLabs/canine-chain.git + - uses: actions/checkout@v4.2.2 + with: + repository: JackalLabs/canine-chain + ref: v4.6.1 + path: canine-chain - name: Install canined if: steps.cache-dependencies.outputs.cache-it != 'true' working-directory: ./canine-chain run: | - wget -O /lib/libwasmvm.x86_64.so https://github.com/CosmWasm/wasmvm/raw/v1.2.6/internal/api/libwasmvm.x86_64.so && chmod +x /lib/libwasmvm.x86_64.so - git checkout v4.6.1 + wget -O /lib/libwasmvm.x86_64.so https://github.com/CosmWasm/wasmvm/raw/v1.2.6/internal/api/libwasmvm.x86_64.so make install - name: Install venom if: steps.cache-dependencies.outputs.cache-it != 'true' run: curl https://github.com/ovh/venom/releases/download/v1.2.0/venom.linux-amd64 -L -o /usr/local/bin/venom && chmod +x /usr/local/bin/venom - uses: actions/checkout@v4.2.2 + with: + path: sequoia - name: Get sequoia build pkgs if: steps.cache-dependencies.outputs.cache-it != 'true' + working-directory: ./sequoia run: go mod download - name: Install sequoia run: make install - name: Test shell: bash - working-directory: ./test + working-directory: ./sequoia/test run: venom run -vv e2e/init.yaml `find e2e/ -type f -name "*_test-*.yaml" | sort` From c01bf9394e4023b84bf2787b0be41834d37672e1 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 8 Jul 2025 17:21:30 -0700 Subject: [PATCH 20/28] syntax fix --- .github/workflows/test-e2e.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index b4ad668..e835e3d 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -24,9 +24,8 @@ jobs: key: ${{ runner.os }}-${{ hashFiles('/usr/local/bin', '$GOPATH/bin', '/lib', '**/go.sum') }} restore-keys: | ${{ runner.os }}- - - name: Clone canine-chain repo - if: steps.cache-dependencies.outputs.cache-it != 'true' - uses: actions/checkout@v4.2.2 + if: steps.cache-dependencies.outputs.cache-it != 'true' with: repository: JackalLabs/canine-chain ref: v4.6.1 From 2def8efb3f3dd22c2ae65390478596cbf5515246 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 8 Jul 2025 17:24:35 -0700 Subject: [PATCH 21/28] fix permission --- .github/workflows/test-e2e.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index e835e3d..10d0a7e 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -34,7 +34,7 @@ jobs: if: steps.cache-dependencies.outputs.cache-it != 'true' working-directory: ./canine-chain run: | - wget -O /lib/libwasmvm.x86_64.so https://github.com/CosmWasm/wasmvm/raw/v1.2.6/internal/api/libwasmvm.x86_64.so + sudo wget -O /lib/libwasmvm.x86_64.so https://github.com/CosmWasm/wasmvm/raw/v1.2.6/internal/api/libwasmvm.x86_64.so make install - name: Install venom if: steps.cache-dependencies.outputs.cache-it != 'true' From cbddeea633493238c838d5a3bc7e7953d0d6b592 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 8 Jul 2025 17:27:26 -0700 Subject: [PATCH 22/28] work dir to make sequoia --- .github/workflows/test-e2e.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 10d0a7e..7db6dee 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -47,6 +47,7 @@ jobs: working-directory: ./sequoia run: go mod download - name: Install sequoia + working-directory: ./sequoia run: make install - name: Test shell: bash From 43fd8fa61623e5796d7ca6d631261a9625efc456 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 8 Jul 2025 17:44:54 -0700 Subject: [PATCH 23/28] fix post file test --- test/e2e/01_test-post-file.yaml | 2 +- test/resources/logo.png | Bin 0 -> 17737 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 test/resources/logo.png diff --git a/test/e2e/01_test-post-file.yaml b/test/e2e/01_test-post-file.yaml index ee20709..b5a48d1 100644 --- a/test/e2e/01_test-post-file.yaml +++ b/test/e2e/01_test-post-file.yaml @@ -12,7 +12,7 @@ testcases: steps: - name: Upload file using canined - script: 'canined tx storage post ../../.assets/logo.png 500000 --dest http://localhost:3333 --max_proofs 1 --from j1 -y' + script: 'canined tx storage post ../resources/logo.png 500000 --dest http://localhost:3333 --max_proofs 1 --from j1 -y' assertions: - result.systemout ShouldContainSubstring 1ab5cd31e2d001fedad0b92abb01cf36f16e1c395c7880a67e2d18d39d81040d7732fa5a33d81bb33578243c54d60c8d5a56de604b1827243dc1feab39b4b3a6 - result.code ShouldEqual 0 diff --git a/test/resources/logo.png b/test/resources/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7dc23f02e3be0929d393c54e55f221ab00f123ed GIT binary patch literal 17737 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 literal 0 HcmV?d00001 From 34f0d20cf79bf4160b0088dc71744d43e3a1b0d4 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 8 Jul 2025 18:43:45 -0700 Subject: [PATCH 24/28] upload check sys err --- test/e2e/01_test-post-file.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/test/e2e/01_test-post-file.yaml b/test/e2e/01_test-post-file.yaml index b5a48d1..4bd3c88 100644 --- a/test/e2e/01_test-post-file.yaml +++ b/test/e2e/01_test-post-file.yaml @@ -14,5 +14,6 @@ testcases: - name: Upload file using canined script: 'canined tx storage post ../resources/logo.png 500000 --dest http://localhost:3333 --max_proofs 1 --from j1 -y' assertions: + - result.systemerr ShouldBeBlank - result.systemout ShouldContainSubstring 1ab5cd31e2d001fedad0b92abb01cf36f16e1c395c7880a67e2d18d39d81040d7732fa5a33d81bb33578243c54d60c8d5a56de604b1827243dc1feab39b4b3a6 - result.code ShouldEqual 0 From 599c0283841876ae45341b499007a8e369ebd8c2 Mon Sep 17 00:00:00 2001 From: Marston Connell <34043723+TheMarstonConnell@users.noreply.github.com> Date: Thu, 10 Jul 2025 17:01:37 -0400 Subject: [PATCH 25/28] Content Encoding Handling (#129) * content encoding fix? * linting --- go.mod | 1 + go.sum | 2 ++ network/downloads.go | 31 +++++++++++++++++++++++++++++-- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 15c7ee6..e5800f1 100644 --- a/go.mod +++ b/go.mod @@ -49,6 +49,7 @@ require ( github.com/Workiva/go-datastructures v1.0.53 // indirect github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 // indirect github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 // indirect + github.com/andybalholm/brotli v1.2.0 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect diff --git a/go.sum b/go.sum index 56272db..1031fa9 100644 --- a/go.sum +++ b/go.sum @@ -143,6 +143,8 @@ github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= diff --git a/network/downloads.go b/network/downloads.go index 4c82681..fa41944 100644 --- a/network/downloads.go +++ b/network/downloads.go @@ -2,6 +2,8 @@ package network import ( "bytes" + "compress/flate" + "compress/gzip" "context" "encoding/json" "errors" @@ -11,6 +13,8 @@ import ( "os" "time" + "github.com/andybalholm/brotli" + apiTypes "github.com/JackalLabs/sequoia/api/types" ipfslite "github.com/hsanjuan/ipfs-lite" @@ -79,7 +83,7 @@ func DownloadFile(f *file_system.FileSystem, merkle []byte, owner string, start // Returns the number of bytes written, or an error if the download or write fails. Timeout and HTTP errors are // reported with detailed messages. func DownloadFileFromURL(f *file_system.FileSystem, url string, merkle []byte, owner string, start int64, chunkSize int64, proofType int64, ipfsParams *ipfslite.AddParams, fileSize int64) (int, error) { - log.Info().Msg(fmt.Sprintf("Downloading %x from %s...", merkle, url)) + log.Info().Msgf("Downloading %x from %s...", merkle, url) // Calculate timeout based on file size // Base timeout + additional time for large files @@ -153,6 +157,29 @@ func DownloadFileFromURL(f *file_system.FileSystem, url string, merkle []byte, o //nolint:errcheck defer resp.Body.Close() + var bodyReader io.Reader = resp.Body + contentEncoding := resp.Header.Get("Content-Encoding") + log.Info().Str("merkle", fmt.Sprintf("%x", merkle)).Msgf("Downloads content encoding: %s", contentEncoding) + switch contentEncoding { + case "gzip": + gz, err := gzip.NewReader(resp.Body) + if err != nil { + return 0, fmt.Errorf("failed to create gzip reader: %w", err) + } + //nolint:errcheck + defer gz.Close() + bodyReader = gz + case "deflate": + deflateReader := flate.NewReader(resp.Body) + //nolint:errcheck + defer deflateReader.Close() + bodyReader = deflateReader + case "br": + bodyReader = brotli.NewReader(resp.Body) + default: + // No compression or unsupported; use raw body + } + buff := bytes.NewBuffer([]byte{}) // Use TeeReader to monitor for context cancellation while copying @@ -160,7 +187,7 @@ func DownloadFileFromURL(f *file_system.FileSystem, url string, merkle []byte, o errCh := make(chan error, 1) go func() { - _, err := io.Copy(buff, resp.Body) + _, err := io.Copy(buff, bodyReader) if err != nil { errCh <- err } From 3573f9ddf6afd879aa6390a21e4f2a7c717047f4 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Thu, 10 Jul 2025 15:54:28 -0700 Subject: [PATCH 26/28] update canined img to use latest version --- test/e2e/01_test-post-file.yaml | 2 ++ test/resources/canine/Dockerfile | 11 +---------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/test/e2e/01_test-post-file.yaml b/test/e2e/01_test-post-file.yaml index 4bd3c88..c40de1f 100644 --- a/test/e2e/01_test-post-file.yaml +++ b/test/e2e/01_test-post-file.yaml @@ -13,6 +13,8 @@ testcases: steps: - name: Upload file using canined script: 'canined tx storage post ../resources/logo.png 500000 --dest http://localhost:3333 --max_proofs 1 --from j1 -y' + retry: 3 + delay: 10 assertions: - result.systemerr ShouldBeBlank - result.systemout ShouldContainSubstring 1ab5cd31e2d001fedad0b92abb01cf36f16e1c395c7880a67e2d18d39d81040d7732fa5a33d81bb33578243c54d60c8d5a56de604b1827243dc1feab39b4b3a6 diff --git a/test/resources/canine/Dockerfile b/test/resources/canine/Dockerfile index eeaf5d0..0bcf3cd 100644 --- a/test/resources/canine/Dockerfile +++ b/test/resources/canine/Dockerfile @@ -3,10 +3,8 @@ # Start from a base Golang image to build the binary FROM golang:1.23 AS builder -# Update package list and install jq RUN apt-get update && apt-get install -y jq -# Create working directory inside the container WORKDIR /lib COPY ./setup-chain.sh . @@ -15,13 +13,10 @@ RUN wget https://github.com/CosmWasm/wasmvm/raw/v1.2.6/internal/api/libwasmvm.x8 WORKDIR /app -# Clone the Canine Chain source code RUN git clone https://github.com/JackalLabs/canine-chain.git . -# Checkout a specific release tag (replace with the latest if needed) -RUN git checkout v4.6.1 +RUN git checkout $(git describe --abbrev=0 --tags) -# Build the binary RUN make build # Use a smaller image to run the binary @@ -37,11 +32,8 @@ RUN apt-get update && apt-get install -y \ wget \ jq -# Copy the binary from the builder COPY --from=builder /app/build/canined /usr/local/bin/canined - COPY --from=builder /lib/libwasmvm.x86_64.so /lib/libwasmvm.x86_64.so - COPY --from=builder /lib/setup-chain.sh /root/setup-chain.sh WORKDIR /root @@ -53,5 +45,4 @@ EXPOSE 26656 26657 1317 9092 9090 WORKDIR /root/.canine -# Command to start the node (adjust args as needed) CMD ["canined", "start"] From ff795f3b3d4fdd55b40040451b3e0cde9c984c65 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Thu, 10 Jul 2025 15:59:20 -0700 Subject: [PATCH 27/28] clean up --- .github/workflows/test-e2e.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 7db6dee..e87a4a4 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -53,4 +53,7 @@ jobs: shell: bash working-directory: ./sequoia/test run: venom run -vv e2e/init.yaml `find e2e/ -type f -name "*_test-*.yaml" | sort` + - name: Stop containers + working-directory: ./sequoia/test + run: docker compose down From 737a0d042e2523c85a69ff404ce086333b89d2f1 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Thu, 10 Jul 2025 18:21:36 -0700 Subject: [PATCH 28/28] update canined version --- .github/workflows/test-e2e.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index e87a4a4..7c28dc1 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -28,7 +28,7 @@ jobs: if: steps.cache-dependencies.outputs.cache-it != 'true' with: repository: JackalLabs/canine-chain - ref: v4.6.1 + ref: v4.6.2-alpha.1 path: canine-chain - name: Install canined if: steps.cache-dependencies.outputs.cache-it != 'true'