diff --git a/.circleci/config.yml b/.circleci/config.yml index 2f61bf4448..68c0f794b3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -196,7 +196,7 @@ jobs: command: | export PATH="$GOBIN:$PATH" export GO111MODULE=on - scripts/multisim.sh 500 50 TestFullGaiaSimulation + cmd/gaia/contrib/sim/multisim.sh 500 50 TestFullGaiaSimulation test_sim_gaia_multi_seed: <<: *linux_defaults @@ -214,7 +214,7 @@ jobs: command: | export PATH="$GOBIN:$PATH" export GO111MODULE=on - scripts/multisim.sh 50 10 TestFullGaiaSimulation + cmd/gaia/contrib/sim/multisim.sh 50 10 TestFullGaiaSimulation test_cover: <<: *linux_defaults diff --git a/Makefile b/Makefile index f592445015..6d5df8a78c 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,9 @@ +#!/usr/bin/make -f + PACKAGES_NOSIMULATION=$(shell go list ./... | grep -v '/simulation') PACKAGES_SIMTEST=$(shell go list ./... | grep '/simulation') VERSION := $(shell echo $(shell git describe --tags) | sed 's/^v//') COMMIT := $(shell git log -1 --format='%H') -CAT := $(if $(filter $(OS),Windows_NT),type,cat) LEDGER_ENABLED ?= true GOBIN ?= $(GOPATH)/bin GOSUM := $(shell which gosum) @@ -166,20 +167,20 @@ test_sim_gaia_fast: test_sim_gaia_import_export: @echo "Running Gaia import/export simulation. This may take several minutes..." - @bash scripts/multisim.sh 50 5 TestGaiaImportExport + @bash cmd/gaia/contrib/sim/multisim.sh 50 5 TestGaiaImportExport test_sim_gaia_simulation_after_import: @echo "Running Gaia simulation-after-import. This may take several minutes..." - @bash scripts/multisim.sh 50 5 TestGaiaSimulationAfterImport + @bash cmd/gaia/contrib/sim/multisim.sh 50 5 TestGaiaSimulationAfterImport test_sim_gaia_custom_genesis_multi_seed: @echo "Running multi-seed custom genesis simulation..." @echo "By default, ${HOME}/.gaiad/config/genesis.json will be used." - @bash scripts/multisim.sh 400 5 TestFullGaiaSimulation ${HOME}/.gaiad/config/genesis.json + @bash cmd/gaia/contrib/sim/multisim.sh 400 5 TestFullGaiaSimulation ${HOME}/.gaiad/config/genesis.json test_sim_gaia_multi_seed: @echo "Running multi-seed Gaia simulation. This may take awhile!" - @bash scripts/multisim.sh 400 5 TestFullGaiaSimulation + @bash cmd/gaia/contrib/sim/multisim.sh 400 5 TestFullGaiaSimulation test_sim_benchmark_invariants: @echo "Running simulation invariant benchmarks..." diff --git a/cmd/gaia/Makefile b/cmd/gaia/Makefile new file mode 100644 index 0000000000..f966ee4361 --- /dev/null +++ b/cmd/gaia/Makefile @@ -0,0 +1,154 @@ +#!/usr/bin/make -f + +PACKAGES_SIMTEST=$(shell go list ./... | grep '/simulation') +VERSION := $(shell echo $(shell git describe --tags) | sed 's/^v//') +COMMIT := $(shell git log -1 --format='%H') +LEDGER_ENABLED ?= true +GOBIN ?= $(GOPATH)/bin +GOSUM := $(shell which gosum) + +export GO111MODULE = on + +# process build tags + +build_tags = netgo +ifeq ($(LEDGER_ENABLED),true) + ifeq ($(OS),Windows_NT) + GCCEXE = $(shell where gcc.exe 2> NUL) + ifeq ($(GCCEXE),) + $(error gcc.exe not installed for ledger support, please install or set LEDGER_ENABLED=false) + else + build_tags += ledger + endif + else + UNAME_S = $(shell uname -s) + ifeq ($(UNAME_S),OpenBSD) + $(warning OpenBSD detected, disabling ledger support (https://github.com/cosmos/cosmos-sdk/issues/1988)) + else + GCC = $(shell command -v gcc 2> /dev/null) + ifeq ($(GCC),) + $(error gcc not installed for ledger support, please install or set LEDGER_ENABLED=false) + else + build_tags += ledger + endif + endif + endif +endif + +ifeq ($(WITH_CLEVELDB),yes) + build_tags += gcc +endif +build_tags += $(BUILD_TAGS) +build_tags := $(strip $(build_tags)) + +# process linker flags + +ldflags = -X github.com/cosmos/cosmos-sdk/version.Version=$(VERSION) \ + -X github.com/cosmos/cosmos-sdk/version.Commit=$(COMMIT) \ + -X "github.com/cosmos/cosmos-sdk/version.BuildTags=$(build_tags)" + +ifneq ($(GOSUM),) +ldflags += -X github.com/cosmos/cosmos-sdk/version.GoSumHash=$(shell $(GOSUM) ../../go.sum) +endif + +ifeq ($(WITH_CLEVELDB),yes) + ldflags += -X github.com/cosmos/cosmos-sdk/types.DBBackend=cleveldb +endif +ldflags += $(LDFLAGS) +ldflags := $(strip $(ldflags)) + +BUILD_FLAGS := -tags "$(build_tags)" -ldflags '$(ldflags)' + +# The below include contains the tools target. +include ../../contrib/devtools/Makefile + +all: install lint check + +build: ../../go.sum +ifeq ($(OS),Windows_NT) + go build -mod=readonly $(BUILD_FLAGS) -o build/gaiad.exe ../../cmd/gaia/cmd/gaiad + go build -mod=readonly $(BUILD_FLAGS) -o build/gaiacli.exe ../../cmd/gaia/cmd/gaiacli +else + go build -mod=readonly $(BUILD_FLAGS) -o build/gaiad ../../cmd/gaia/cmd/gaiad + go build -mod=readonly $(BUILD_FLAGS) -o build/gaiacli ../../cmd/gaia/cmd/gaiacli + go build -mod=readonly $(BUILD_FLAGS) -o build/gaiareplay ../../cmd/gaia/cmd/gaiareplay + go build -mod=readonly $(BUILD_FLAGS) -o build/gaiakeyutil ../../cmd/gaia/cmd/gaiakeyutil +endif + +build-linux: ../../go.sum + LEDGER_ENABLED=false GOOS=linux GOARCH=amd64 $(MAKE) build + +install: ../../go.sum check-ledger + go install -mod=readonly $(BUILD_FLAGS) ../../cmd/gaia/cmd/gaiad + go install -mod=readonly $(BUILD_FLAGS) ../../cmd/gaia/cmd/gaiacli + go install -mod=readonly $(BUILD_FLAGS) ../../cmd/gaia/cmd/gaiareplay + go install -mod=readonly $(BUILD_FLAGS) ../../cmd/gaia/cmd/gaiakeyutil + +install-debug: ../../go.sum + go install -mod=readonly $(BUILD_FLAGS) ../../cmd/gaia/cmd/gaiadebug + + +######################################## +### Tools & dependencies + +go-mod-cache: go.sum + @echo "--> Download go modules to local cache" + @go mod download + +go.sum: go.mod + @echo "--> Ensure dependencies have not been modified" + @go mod verify + +draw-deps: + @# requires brew install graphviz or apt-get install graphviz + go get github.com/RobotsAndPencils/goviz + @goviz -i ./cmd/gaiad -d 2 | dot -Tpng -o dependency-graph.png + +clean: + rm -rf snapcraft-local.yaml build/ + +distclean: clean + rm -rf vendor/ + +######################################## +### Testing + + +check: check-unit +check-unit: + @VERSION=$(VERSION) go test -mod=readonly -race -tags='ledger test_ledger_mock' ./... + +check-race: + @VERSION=$(VERSION) go test -mod=readonly -tags='ledger test_ledger_mock' -race ./... + +check-cover: + @go test -mod=readonly -timeout 30m -race -coverprofile=coverage.txt -covermode=atomic -tags='ledger test_ledger_mock' ./... + +check-build: build + @go test -mod=readonly -p 4 `go list ./cli_test/...` -tags=cli_test + +check-all: check-unit check-race check-cover check-build + +lint: ci-lint +ci-lint: + golangci-lint run + go vet -composites=false -tests=false ./... + find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" | xargs gofmt -d -s + go mod verify + +format: + find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "./client/lcd/statik/statik.go" | xargs gofmt -w -s + find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "./client/lcd/statik/statik.go" | xargs misspell -w + find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "./client/lcd/statik/statik.go" | xargs goimports -w -local github.com/cosmos/cosmos-sdk + +benchmark: + @go test -mod=readonly -bench=. ./... + + +# include simulations +include sims.mk + +.PHONY: all build-linux install install-debug \ + go-mod-cache draw-deps clean \ + check check-all check-build check-cover check-ledger check-unit check-race + diff --git a/scripts/multisim.sh b/cmd/gaia/contrib/sim/multisim.sh similarity index 92% rename from scripts/multisim.sh rename to cmd/gaia/contrib/sim/multisim.sh index 9ff71c5674..fc2e1bd19d 100755 --- a/scripts/multisim.sh +++ b/cmd/gaia/contrib/sim/multisim.sh @@ -26,7 +26,7 @@ sim() { echo "Running Gaia simulation with seed $seed. This may take awhile!" file="$tmpdir/gaia-simulation-seed-$seed-date-$(date -u +"%Y-%m-%dT%H:%M:%S+00:00").stdout" echo "Writing stdout to $file..." - go test ./cmd/gaia/app -run $testname -SimulationEnabled=true -SimulationNumBlocks=$blocks -SimulationGenesis=$genesis \ + go test github.com/cosmos/cosmos-sdk/cmd/gaia/app -run $testname -SimulationEnabled=true -SimulationNumBlocks=$blocks -SimulationGenesis=$genesis \ -SimulationVerbose=true -SimulationCommit=true -SimulationSeed=$seed -SimulationPeriod=$period -v -timeout 24h > $file } diff --git a/cmd/gaia/sims.mk b/cmd/gaia/sims.mk new file mode 100644 index 0000000000..0e731299e5 --- /dev/null +++ b/cmd/gaia/sims.mk @@ -0,0 +1,58 @@ +#!/usr/bin/make -f + +######################################## +### Simulations + +sim-gaia-nondeterminism: + @echo "Running nondeterminism test..." + @go test -mod=readonly ./cmd/gaia/app -run TestAppStateDeterminism -SimulationEnabled=true -v -timeout 10m + +sim-gaia-custom-genesis-fast: + @echo "Running custom genesis simulation..." + @echo "By default, ${HOME}/.gaiad/config/genesis.json will be used." + @go test -mod=readonly github.com/cosmos/cosmos-sdk/cmd/gaia/app -run TestFullGaiaSimulation -SimulationGenesis=${HOME}/.gaiad/config/genesis.json \ + -SimulationEnabled=true -SimulationNumBlocks=100 -SimulationBlockSize=200 -SimulationCommit=true -SimulationSeed=99 -SimulationPeriod=5 -v -timeout 24h + +sim-gaia-fast: + @echo "Running quick Gaia simulation. This may take several minutes..." + @go test -mod=readonly github.com/cosmos/cosmos-sdk/cmd/gaia/app -run TestFullGaiaSimulation -SimulationEnabled=true -SimulationNumBlocks=100 -SimulationBlockSize=200 -SimulationCommit=true -SimulationSeed=99 -SimulationPeriod=5 -v -timeout 24h + +sim-gaia-import-export: + @echo "Running Gaia import/export simulation. This may take several minutes..." + @bash contrib/sim/multisim.sh 50 5 TestGaiaImportExport + +sim-gaia-simulation-after-import: + @echo "Running Gaia simulation-after-import. This may take several minutes..." + @bash contrib/sim/multisim.sh 50 5 TestGaiaSimulationAfterImport + +sim-gaia-custom-genesis-multi-seed: + @echo "Running multi-seed custom genesis simulation..." + @echo "By default, ${HOME}/.gaiad/config/genesis.json will be used." + @bash contrib/sim/multisim.sh 400 5 TestFullGaiaSimulation ${HOME}/.gaiad/config/genesis.json + +sim-gaia-multi-seed: + @echo "Running multi-seed Gaia simulation. This may take awhile!" + @bash contrib/sim/multisim.sh 400 5 TestFullGaiaSimulation + +sim-benchmark-invariants: + @echo "Running simulation invariant benchmarks..." + @go test -mod=readonly github.com/cosmos/cosmos-sdk/cmd/gaia/app -benchmem -bench=BenchmarkInvariants -run=^$ \ + -SimulationEnabled=true -SimulationNumBlocks=1000 -SimulationBlockSize=200 \ + -SimulationCommit=true -SimulationSeed=57 -v -timeout 24h + +SIM_NUM_BLOCKS ?= 500 +SIM_BLOCK_SIZE ?= 200 +SIM_COMMIT ?= true +sim-gaia-benchmark: + @echo "Running Gaia benchmark for numBlocks=$(SIM_NUM_BLOCKS), blockSize=$(SIM_BLOCK_SIZE). This may take awhile!" + @go test -mod=readonly -benchmem -run=^$$ github.com/cosmos/cosmos-sdk/cmd/gaia/app -bench ^BenchmarkFullGaiaSimulation$$ \ + -SimulationEnabled=true -SimulationNumBlocks=$(SIM_NUM_BLOCKS) -SimulationBlockSize=$(SIM_BLOCK_SIZE) -SimulationCommit=$(SIM_COMMIT) -timeout 24h + +sim-gaia-profile: + @echo "Running Gaia benchmark for numBlocks=$(SIM_NUM_BLOCKS), blockSize=$(SIM_BLOCK_SIZE). This may take awhile!" + @go test -mod=readonly -benchmem -run=^$$ github.com/cosmos/cosmos-sdk/cmd/gaia/app -bench ^BenchmarkFullGaiaSimulation$$ \ + -SimulationEnabled=true -SimulationNumBlocks=$(SIM_NUM_BLOCKS) -SimulationBlockSize=$(SIM_BLOCK_SIZE) -SimulationCommit=$(SIM_COMMIT) -timeout 24h -cpuprofile cpu.out -memprofile mem.out + +.PHONY: sim-gaia-nondeterminism sim-gaia-custom-genesis-fast sim-gaia-fast sim-gaia-import-export \ + sim-gaia-simulation-after-import sim-gaia-custom-genesis-multi-seed sim-gaia-multi-seed \ + sim-benchmark-invariants sim-gaia-benchmark sim-gaia-profile diff --git a/contrib/devtools/Makefile b/contrib/devtools/Makefile index e6f3ccc6b4..7bee314b51 100644 --- a/contrib/devtools/Makefile +++ b/contrib/devtools/Makefile @@ -47,8 +47,8 @@ tools: tools-stamp tools-stamp: $(GOBIN)/golangci-lint $(GOBIN)/statik $(GOBIN)/goimports $(GOBIN)/gosum $(GOBIN)/clog touch $@ -$(GOBIN)/golangci-lint: contrib/devtools/install-golangci-lint.sh $(GOBIN)/gosum - bash contrib/devtools/install-golangci-lint.sh $(GOBIN) $(GOLANGCI_LINT_VERSION) $(GOLANGCI_LINT_HASHSUM) +$(GOBIN)/golangci-lint: $(mkfile_dir)/install-golangci-lint.sh $(GOBIN)/gosum + bash $(mkfile_dir)/install-golangci-lint.sh $(GOBIN) $(GOLANGCI_LINT_VERSION) $(GOLANGCI_LINT_HASHSUM) $(GOBIN)/statik: $(call go_install,rakyll,statik,v0.1.5) @@ -57,10 +57,10 @@ $(GOBIN)/goimports: go get golang.org/x/tools/cmd/goimports@v0.0.0-20190114222345-bf090417da8b $(GOBIN)/gosum: - go install -mod=readonly ./contrib/devtools/gosum/ + go install -mod=readonly github.com/cosmos/cosmos-sdk/contrib/devtools/gosum/ $(GOBIN)/clog: - go install -mod=readonly ./contrib/devtools/clog/ + go install -mod=readonly github.com/cosmos/cosmos-sdk/contrib/devtools/clog/ tools-clean: cd $(GOBIN) && rm -f golangci-lint statik goimports gosum clog