# Testing signals — fatedier/frp

> Canonical page: https://codevetter.com/unpack/frp/testing-signals

# Testing signals — fatedier/frp

Scanned commit d20a232996007dfe6ab425abc0a39a3ae9a0889b (2026-09-10). Generated by codevetter codevetter 1.12.0 on 2026-09-22.

Unit tests use Go's testing with testify and rodaine/table, spread through pkg/, client/, server/ and cmd/ (run via `make test`/`gotest` with the noweb tag). End-to-end tests use Ginkgo/Gomega under test/e2e with a framework that spawns real frps/frpc binaries, organized into v1/basic, v1/features, plugin, legacy and mock server helpers; `make e2e` runs hack/run-e2e.sh with 16-way parallelism. Cross-version compatibility suites run released binaries via hack/run-e2e-compatibility.sh and download scripts. The web workspace uses Vitest + @vue/test-utils; linting is via golangci-lint (.golangci.yml) plus gofmt/gofumpt/gci/vet make targets and GitHub Actions workflows.
- make gotest runs `go test -tags noweb -v --cover` over ./assets/..., ./cmd/..., ./client/..., ./server/..., ./pkg/...; make alltest adds vet and e2e. — [Makefile#L46-56](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/Makefile#L46-L56) [Makefile#L84](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/Makefile#L84)
- E2E harness: test/e2e/e2e.go RunE2ETests registers Gomega fail handler, enables EmitSpecProgress and RandomizeAllSpecs; hack/run-e2e.sh installs ginkgo v2.23.4 and runs against bin/frpc and bin/frps (overridable via FRPC_PATH/FRPS_PATH). — [test/e2e/e2e.go](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/test/e2e/e2e.go) [hack/run-e2e.sh](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/hack/run-e2e.sh) [Makefile#L55-59](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/Makefile#L55-L59)
- E2E framework provides process management, port allocation, mock servers and request helpers under test/e2e/framework and test/e2e/pkg (cert, plugin, port, process, relay, request, rpc, ssh). — [test/e2e/framework/framework.go](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/test/e2e/framework/framework.go) [test/e2e/framework/process.go](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/test/e2e/framework/process.go) [test/e2e/mock](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/test/e2e/mock)
- E2E coverage areas include basic client/server behavior, config, HTTP, tcpmux, xtcp, OIDC, token_source, wire protocol, plus features: bandwidth_limit, chaos, control_replacement, group, heartbeat, monitor, real_ip, ssh_tunnel, store. — [test/e2e/v1/basic](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/test/e2e/v1/basic) [test/e2e/v1/features](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/test/e2e/v1/features)
- Compatibility testing: make e2e-compatibility runs hack/run-e2e-compatibility.sh against FRP_COMPAT_BASELINE_COUNT released versions (floor 0.61.0); e2e-compatibility-last-frpc/last-frps download the last release into ./lastversion and run the suite with one side pinned old. — [Makefile#L5-6](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/Makefile#L5-L6) [Makefile#L61-82](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/Makefile#L61-L82) [test/e2e/compatibility](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/test/e2e/compatibility)
- Unit tests exist for config decode/load (pkg/config/v1 *_test.go, pkg/config/load_test.go), msg codecs (pkg/msg msg_test.go, wire_v2_test.go, udp_binary_test.go + benchmarks), auth OIDC (pkg/auth/oidc_test.go), source aggregator/store, client service/config_manager/control_session, server control/service/proxy, nathole analysis/discovery, vnet controller, health. — [pkg/config/load_test.go](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/pkg/config/load_test.go) [pkg/msg/wire_v2_test.go](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/pkg/msg/wire_v2_test.go) [pkg/auth/oidc_test.go](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/pkg/auth/oidc_test.go) [client/service_test.go](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/client/service_test.go) [server/control_test.go](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/server/control_test.go) [pkg/nathole/analysis_test.go](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/pkg/nathole/analysis_test.go)
- cmd/frpc/sub has verify_test.go covering the verify subcommand; most other cmd code (proxy/admin/nathole subcommands) has no direct unit tests. — [cmd/frpc/sub/verify_test.go](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/cmd/frpc/sub/verify_test.go)
- Web frontend testing: web/package.json defines test:unit via vitest run (vitest 4.1.10, jsdom, @vue/test-utils) across workspaces shared/frpc/frps; Makefile web-ci runs npm ci, lint:check, test:unit and builds. — [web/package.json](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/web/package.json) [Makefile#L19-20](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/Makefile#L19-L20)
- Lint/format toolchain: golangci-lint run configured by .golangci.yml; make fmt (go fmt), fmt-more (gofumpt), gci (import grouping with frp prefix), vet; CI workflows include golangci-lint.yml and goreleaser.yml. — [.golangci.yml](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/.golangci.yml) [Makefile#L28-38](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/Makefile#L28-L38) [.github/workflows/golangci-lint.yml](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/.github/workflows/golangci-lint.yml) [.github/workflows/goreleaser.yml](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/.github/workflows/goreleaser.yml)
- runMultipleClients (--config_dir) is explicitly documented as 'only designed for testing. It's not guaranteed to be stable' yet is reachable via a public flag. — [cmd/frpc/sub/root.go#L70-75](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/cmd/frpc/sub/root.go#L70-L75)
- Ginkgo parallel runs default to CONCURRENCY=16 in run-e2e.sh and framework.RunID isolates per-node resources. — [hack/run-e2e.sh](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/hack/run-e2e.sh) [test/e2e/e2e.go](https://github.com/fatedier/frp/blob/d20a232996007dfe6ab425abc0a39a3ae9a0889b/test/e2e/e2e.go)

Every claim links to its cited files at the pinned commit. Citations identify source evidence; they do not establish runtime correctness. Independent CodeVetter scan — not reviewed by upstream maintainers.

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
