mirror of
https://github.com/luxfi/consensus.git
synced 2026-09-24 00:26:58 +00:00
Seven main packages sat at 0% coverage. Only cmd/consensus reaches a user: .hanzo/workflows/release.yml builds it into the release artifact. The other six were built by a Makefile CI never invokes, or by nothing at all, and nothing in or outside the module imports them. They did not merely go unused, they misreported. bench printed a 30k TPS figure that was the throughput of a failed map lookup, its chain half unable to start at all. checker exited 0 announcing "all health checks passed" while asserting nothing. sim drew from rand and formatted it like a quorum. server asserted its engine to an interface the engine does not implement, so health was a hardcoded true, and it was in no build recipe. conformance printed a 1-of-3 accept as normal. params duplicated cmd/consensus. cmd/consensus keeps only what it can prove. The engine "test" and "health" actions started an engine, printed a check mark and asserted nothing, so they would pass against a Start that does nothing; they are gone along with the stale "not yet implemented" arms for constructors that do exist. What remains is the parameter report, absorbing the -json flag from params. An unknown -network no longer falls back to mainnet. A typo used to print mainnet's K=21 while the operator read it as the network they asked for. Its old test never called a single symbol from main.go: it reimplemented a CLI in the test file, parsed flags main.go does not have, and passed with main.go deleted. Replaced with tests pinned to config, each verified to fail under a deliberate mutation of the code it covers. The .gitignore build-artifact patterns were unanchored, so `consensus` and `bench` matched the cmd/consensus and bench source directories and silently untracked new files in both. Anchored to the root artifacts they meant. Also drops the Makefile and scripts that drove the deleted binaries, the zmq-bench target chain building a cmd/ package absent for many commits, and the E2E server test that can now only ever skip. cmd/consensus: 0.0% -> 100.0% of statements, 1302 lines deleted. Co-authored-by: Hanzo Dev <[email protected]>
318 lines
11 KiB
Makefile
318 lines
11 KiB
Makefile
# Copyright (C) 2020-2025, Lux Industries Inc All rights reserved.
|
|
# See the file LICENSE for licensing terms.
|
|
|
|
.PHONY: all test build clean lint format check tools help benchmark \
|
|
coverage coverage-html coverage-95 \
|
|
install-tools examples examples-go examples-c examples-cpp examples-rust
|
|
|
|
# Default target
|
|
all: build test
|
|
|
|
# === BUILD TARGETS ===
|
|
|
|
# Build the commands. A failure here fails the build: swallowing it with
|
|
# `|| echo` is how this target came to report success while building nothing.
|
|
build: ## Build all tools and commands
|
|
@echo "๐จ Building..."
|
|
@go build -o bin/consensus ./cmd/consensus
|
|
@echo "โ
Built:"
|
|
@ls -1 bin/
|
|
|
|
# === TEST TARGETS ===
|
|
|
|
# Run all tests
|
|
test: guard-no-trusted-dealer ## Run all tests
|
|
@echo "๐งช Running tests..."
|
|
@go test -race -timeout 5m -tags="!integration" ./... 2>&1 | grep -v "warning.*LD_DYSYMTAB" | grep -v "has malformed LC_DYSYMTAB"
|
|
|
|
# Run tests (verbose, showing warnings)
|
|
test-verbose: ## Run tests with all output including warnings
|
|
@echo "๐งช Running tests (verbose)..."
|
|
@go test -race -timeout 5m -tags="!integration" -v ./...
|
|
|
|
# Run tests with coverage
|
|
test-coverage: ## Run tests with coverage report
|
|
@echo "๐ Running tests with coverage..."
|
|
@go test -race -timeout 5m -coverprofile=coverage.out -covermode=atomic ./...
|
|
@go tool cover -func=coverage.out
|
|
@echo "Coverage report: coverage.out"
|
|
|
|
# Generate HTML coverage report
|
|
coverage-html: test-coverage ## Generate HTML coverage report
|
|
@echo "๐ Generating HTML coverage report..."
|
|
@go tool cover -html=coverage.out -o coverage.html
|
|
@echo "โ
Coverage report generated: coverage.html"
|
|
|
|
# Ensure 95%+ coverage
|
|
coverage-95: ## Run tests and ensure 95%+ coverage
|
|
@echo "๐ฏ Running tests with 95% coverage target..."
|
|
@go test -race -timeout 5m -coverprofile=coverage.out -covermode=atomic ./...
|
|
@echo ""
|
|
@COVERAGE=$$(go tool cover -func=coverage.out | grep total | awk '{print $$3}' | sed 's/%//'); \
|
|
echo "๐ Total Coverage: $$COVERAGE%"; \
|
|
if [ $$(echo "$$COVERAGE < 95" | bc) -eq 1 ]; then \
|
|
echo "โ Coverage $$COVERAGE% is below 95% target"; \
|
|
go tool cover -func=coverage.out | grep -v "100.0%"; \
|
|
exit 1; \
|
|
else \
|
|
echo "โ
Coverage $$COVERAGE% meets 95% target!"; \
|
|
fi
|
|
|
|
# Run tests for AI package specifically
|
|
test-ai: ## Run AI package tests with coverage
|
|
@echo "๐ค Testing AI package..."
|
|
@go test -v -race -coverprofile=ai_coverage.out ./ai
|
|
@go tool cover -func=ai_coverage.out
|
|
|
|
# Run tests for core package specifically
|
|
test-core: ## Run core package tests with coverage
|
|
@echo "โ๏ธ Testing core package..."
|
|
@go test -v -race -coverprofile=core_coverage.out ./core
|
|
@go tool cover -func=core_coverage.out
|
|
|
|
# Run a specific test
|
|
test-specific: ## Run a specific test (use TEST=TestName)
|
|
@if [ -z "$(TEST)" ]; then \
|
|
echo "Usage: make test-specific TEST=TestName"; \
|
|
exit 1; \
|
|
fi
|
|
@echo "๐งช Running test: $(TEST)"
|
|
@go test -race -v -run $(TEST) ./...
|
|
|
|
# Run tests for a specific package
|
|
test-package: ## Run tests for a specific package (use PKG=./ai)
|
|
@if [ -z "$(PKG)" ]; then \
|
|
echo "Usage: make test-package PKG=./ai"; \
|
|
exit 1; \
|
|
fi
|
|
@echo "๐งช Testing package: $(PKG)"
|
|
@go test -race -v $(PKG)
|
|
|
|
# === BENCHMARK TARGETS ===
|
|
|
|
# Run benchmarks
|
|
bench: ## Run performance benchmarks
|
|
@echo "โก Running benchmarks..."
|
|
@go test -bench=. -benchmem ./config ./protocol/... ./engine/... ./photon ./core/... ./qzmq ./ai
|
|
|
|
# Run pure consensus benchmarks
|
|
benchmark: ## Run pure algorithm benchmarks without networking
|
|
@echo "๐ Running pure consensus benchmarks..."
|
|
@go test -bench=. -benchmem ./config ./protocol/... ./engine/... ./photon ./core/... ./qzmq
|
|
|
|
# Run massively parallel ZMQ benchmarks with Ginkgo
|
|
benchmark-zmq: check-ginkgo ## Run ZeroMQ transport benchmarks
|
|
@echo "๐ Running transport benchmarks..."
|
|
go test -tags zmq -v ./qzmq -ginkgo.v
|
|
|
|
# Run Ginkgo tests in parallel
|
|
test-parallel: check-ginkgo ## Run tests in parallel with Ginkgo
|
|
@echo "โก Running tests in parallel..."
|
|
ginkgo -p ./...
|
|
|
|
# === CODE QUALITY TARGETS ===
|
|
|
|
# Run linters
|
|
lint: ## Run linters
|
|
@echo "๐ Running linters..."
|
|
@golangci-lint run ./... || echo "โ ๏ธ Some linter issues found"
|
|
|
|
# Format code
|
|
format: ## Format code
|
|
@echo "โจ Formatting code..."
|
|
@go fmt ./...
|
|
@goimports -w . 2>/dev/null || echo "โ ๏ธ goimports not found, skipping"
|
|
|
|
# Check if code is properly formatted
|
|
check-format: ## Check if code is properly formatted
|
|
@echo "๐ Checking code format..."
|
|
@if [ -n "$$(gofmt -l .)" ]; then \
|
|
echo "โ The following files need formatting:"; \
|
|
gofmt -l .; \
|
|
exit 1; \
|
|
fi
|
|
@echo "โ
All files properly formatted"
|
|
|
|
# Run static analysis
|
|
static-analysis: ## Run static analysis
|
|
@echo "๐ Running static analysis..."
|
|
@go vet ./...
|
|
@staticcheck ./... 2>/dev/null || echo "โ ๏ธ staticcheck not found, skipping"
|
|
|
|
# Guard: no trusted-dealer keygen in production (non-test) code
|
|
guard-no-trusted-dealer: ## Fail if trusted-dealer keygen helpers exist in non-test code
|
|
@echo "๐ Guard: no trusted-dealer keygen in non-test code..."
|
|
@bash scripts/no-trusted-dealer-guard.sh
|
|
|
|
# Check for security vulnerabilities
|
|
security: guard-no-trusted-dealer ## Check for security vulnerabilities
|
|
@echo "๐ Checking for vulnerabilities..."
|
|
@govulncheck ./... 2>/dev/null || echo "โ ๏ธ govulncheck not found, install with: go install golang.org/x/vuln/cmd/govulncheck@latest"
|
|
|
|
# Run pre-commit checks
|
|
pre-commit: check-format lint test ## Run pre-commit checks
|
|
@echo "โ
All pre-commit checks passed"
|
|
|
|
# === DEPENDENCY TARGETS ===
|
|
|
|
# Update dependencies
|
|
update-deps: ## Update dependencies
|
|
@echo "๐ฆ Updating dependencies..."
|
|
@go get -u ./...
|
|
@go mod tidy
|
|
|
|
# Verify dependencies
|
|
verify-deps: ## Verify dependencies
|
|
@echo "๐ Verifying dependencies..."
|
|
@go mod verify
|
|
|
|
# Tidy dependencies
|
|
tidy: ## Tidy go.mod and go.sum
|
|
@echo "๐งน Tidying dependencies..."
|
|
@go mod tidy
|
|
|
|
# === INSTALLATION TARGETS ===
|
|
|
|
# Install all development tools
|
|
tools: install-tools ## Install all development tools
|
|
|
|
# Install development tools
|
|
install-tools: ## Install development tools
|
|
@echo "๐ฆ Installing development tools..."
|
|
@go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
|
|
@go install honnef.co/go/tools/cmd/staticcheck@latest
|
|
@go install golang.org/x/tools/cmd/goimports@latest
|
|
@go install golang.org/x/vuln/cmd/govulncheck@latest
|
|
@$(MAKE) check-ginkgo
|
|
@echo "โ
Development tools installed"
|
|
|
|
# === EXAMPLE TARGETS ===
|
|
|
|
# Build all integration examples
|
|
examples: examples-go examples-c examples-cpp examples-rust ## Build all integration examples
|
|
|
|
# Build Go integration examples
|
|
examples-go: ## Build Go integration examples
|
|
@echo "๐จ Building Go examples..."
|
|
@cd examples && go build -o ../bin/example-go ./go_sdk_example.go
|
|
@echo "โ
Go examples built"
|
|
|
|
# Build C integration examples
|
|
examples-c: ## Build C integration examples
|
|
@echo "๐จ Building C examples..."
|
|
@cd pkg/c && $(MAKE) all || echo "โ ๏ธ C examples build failed"
|
|
@echo "โ
C examples built"
|
|
|
|
# Build Rust integration examples
|
|
examples-rust: ## Build Rust integration examples
|
|
@echo "๐จ Building Rust examples..."
|
|
@cd pkg/rust && cargo build --release || echo "โ ๏ธ Rust examples build failed"
|
|
@echo "โ
Rust examples built"
|
|
|
|
# === CLEAN TARGETS ===
|
|
|
|
# Clean build artifacts
|
|
clean: ## Clean build artifacts
|
|
@echo "๐งน Cleaning..."
|
|
@rm -rf bin/ coverage.out coverage.html *.coverage benchmark_report.txt *.prof
|
|
@$(MAKE) paper-clean
|
|
@cd pkg/rust && cargo clean 2>/dev/null || true
|
|
@echo "โ
Clean complete"
|
|
|
|
# === PAPER TARGETS ===
|
|
|
|
# Build the PDF white paper
|
|
paper: check-latex ## Build PDF white paper
|
|
@echo "๐ Building white paper..."
|
|
@cd paper && pdflatex main.tex
|
|
@cd paper && bibtex main
|
|
@cd paper && pdflatex main.tex
|
|
@cd paper && pdflatex main.tex
|
|
@echo "โ
Paper built: paper/main.pdf"
|
|
|
|
# Clean paper build artifacts
|
|
paper-clean: ## Clean paper build artifacts
|
|
@echo "๐งน Cleaning paper build artifacts..."
|
|
@cd paper && rm -f *.aux *.bbl *.blg *.log *.out *.toc *.fdb_latexmk *.fls *.synctex.gz
|
|
|
|
# Watch and rebuild paper on changes (requires entr)
|
|
paper-watch: check-latex check-entr ## Watch and rebuild paper on changes
|
|
@echo "๐ Watching for paper changes..."
|
|
@find paper -name "*.tex" -o -name "*.bib" | entr -s 'make paper'
|
|
|
|
# === DOCUMENTATION TARGETS ===
|
|
|
|
# Build documentation site
|
|
docs: ## Build documentation site
|
|
@echo "๐ Building documentation..."
|
|
@cd docs && pnpm install && pnpm build
|
|
@echo "โ
Documentation built in docs/out/"
|
|
|
|
# Run documentation dev server
|
|
docs-dev: ## Run documentation dev server
|
|
@echo "๐ Starting documentation dev server..."
|
|
@cd docs && pnpm dev
|
|
|
|
# Clean documentation build artifacts
|
|
docs-clean: ## Clean documentation build artifacts
|
|
@echo "๐งน Cleaning documentation..."
|
|
@cd docs && rm -rf .next out node_modules
|
|
@echo "โ
Documentation cleaned"
|
|
|
|
# Show comprehensive help
|
|
help: ## Show this help
|
|
@echo "๐ง Lux Consensus Makefile"
|
|
@echo ""
|
|
@echo "Usage: make [target]"
|
|
@echo ""
|
|
@echo "๐ Main Targets:"
|
|
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
|
|
grep -E '^(all|build|test|coverage-95|clean|help):' | \
|
|
sort | awk 'BEGIN {FS = ":.*?## "}; {printf " %-20s %s\n", $$1, $$2}'
|
|
@echo ""
|
|
@echo "๐งช Test Targets:"
|
|
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
|
|
grep -E '^test-' | \
|
|
sort | awk 'BEGIN {FS = ":.*?## "}; {printf " %-20s %s\n", $$1, $$2}'
|
|
@echo ""
|
|
@echo "โก Benchmark Targets:"
|
|
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
|
|
grep -E '^(bench|benchmark)' | \
|
|
sort | awk 'BEGIN {FS = ":.*?## "}; {printf " %-20s %s\n", $$1, $$2}'
|
|
@echo ""
|
|
@echo "๐ Code Quality:"
|
|
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
|
|
grep -E '^(lint|format|security|pre-commit)' | \
|
|
sort | awk 'BEGIN {FS = ":.*?## "}; {printf " %-20s %s\n", $$1, $$2}'
|
|
@echo ""
|
|
@echo "๐ฆ Examples:"
|
|
@echo " # Achieve 95% test coverage"
|
|
@echo " make coverage-95"
|
|
@echo ""
|
|
@echo " # Clean and rebuild everything"
|
|
@echo " make clean build test"
|
|
@echo ""
|
|
@echo " # Build integration examples"
|
|
@echo " make examples"
|
|
|
|
# === CHECK TARGETS (Internal) ===
|
|
|
|
# Check if Ginkgo is installed
|
|
check-ginkgo:
|
|
@which ginkgo > /dev/null || (echo "๐ฆ Installing Ginkgo..."; go install github.com/onsi/ginkgo/v2/ginkgo@latest)
|
|
|
|
# Check if LaTeX is installed
|
|
check-latex:
|
|
@which pdflatex > /dev/null || (echo "โ pdflatex not found. Install LaTeX (e.g., brew install --cask mactex)"; exit 1)
|
|
@which bibtex > /dev/null || (echo "โ bibtex not found. Install LaTeX (e.g., brew install --cask mactex)"; exit 1)
|
|
|
|
# Check if entr is installed (for watch mode)
|
|
check-entr:
|
|
@which entr > /dev/null || (echo "๐ฆ Installing entr for watch mode..."; brew install entr || echo "โ ๏ธ Could not install entr. Install manually for watch mode.")
|
|
|
|
# === CI TARGETS ===
|
|
|
|
# Run CI checks (used by GitHub Actions)
|
|
ci: pre-commit coverage-95 ## Run all CI checks
|
|
@echo "โ
All CI checks passed"
|