This document describes the test suite for the Marchat chat application.
The Marchat test suite provides foundational coverage of the application's core functionality, including:
- Unit Tests: Testing individual components and functions in isolation
- Integration Tests: Testing the interaction between different components
- Crypto Tests: Testing cryptographic functions and E2E encryption
- Database Tests: Testing database operations and schema management
- Server Tests: Testing WebSocket handling, message routing, and user management
Note: When main has moved past the latest Git tag, a narrative summary may appear in README.md → Latest Updates. This is a foundational test suite with good coverage for smaller utility packages and significantly improved coverage for client and server components. Overall statement coverage is 38.1% across all packages in the main module, computed from the merged profile at the repo root (for example the coverage file or another path passed to go test -coverprofile=... ./...). Regenerate summaries with go tool cover -func=<same-path>. On Windows PowerShell, prefer a profile filename without a .out suffix (e.g. mergedcoverage, coverage, or per-package ph / sv) so the argument is not misparsed. The nested plugin/sdk module (separate go.mod) is not included in that merged number; its package statement coverage is 58.8% when measured with cd plugin/sdk && go test -coverprofile=sdkcover ./... && go tool cover -func=sdkcover.
Doctor env tests: Production code reads process env via collectMarchatEnviron and the swappable osEnviron variable (see internal/doctor/env.go), guarded by environMu. Tests that replace osEnviron must capture the previous function while holding environMu and must not use t.Parallel() alongside other tests that also swap it, or go test -race can observe races and overlapping mocks. buildEnvLines tests are therefore sequential in the package.
Database backends: Automated tests open SQLite (usually in-memory or a temp file). PostgreSQL and MySQL/MariaDB are supported at runtime via MARCHAT_DB_PATH. GitHub Actions runs an extra database-smoke job (see .github/workflows/go.yml) with Postgres 16 and MySQL 8 service containers: it sets MARCHAT_CI_POSTGRES_URL and MARCHAT_CI_MYSQL_URL and runs TestPostgresInitDBAndSchemaSmoke / TestMySQLInitDBAndSchemaSmoke in server/db_ci_smoke_test.go (InitDB + CreateSchema + table checks). Locally, those tests skip unless you export the same variables (for MySQL, use a mysql: or mysql:// prefix on the DSN so it is not parsed as a SQLite path). Schema creation is dialect-aware (including MySQL/MariaDB rules for indexed text).
Release workflow (maintainers): .github/workflows/release.yml uses a resolve-version job so the version string is available to Docker and all matrix legs (GitHub Actions does not support job outputs from matrix jobs). The build job sets CGO_ENABLED=0 for static cross-compiled binaries. On a published release (not workflow_dispatch), upload-assets uploads all matrix .zip files with gh release upload, and the docker job appends Docker Hub pull instructions with gh release edit (GitHub CLI on the runner, GITHUB_TOKEN), avoiding third-party actions that still declare Node 20. Termux installs use the linux-arm64 zip; install.sh / install.ps1 map Android+aarch64 to that asset when needed.
| File | Description | Coverage |
|---|---|---|
internal/doctor/doctor_test.go |
CLI diagnostics | Env masking, GitHub release JSON parsing, update check with fake HTTP transport, plain -doctor output when writer is not a terminal, server report env includes .env after load, ordered buildEnvLines / osEnviron hook tests without t.Parallel where the global mock is swapped |
internal/doctor/mask_test.go |
Env value masking | Full redaction of secret env values (no suffix leak), secret/non-secret key classification |
config/config_test.go |
Configuration loading and validation | Environment variables, validation rules, MARCHAT_CONFIG_DIR from .env |
shared/crypto_test.go |
Cryptographic operations | Key generation, encryption, decryption, session keys, nil-safety guards |
shared/types_test.go |
Data structures and serialization | Message types, JSON marshaling/unmarshaling |
client/crypto/keystore_test.go |
Client keystore management | Keystore initialization, encryption/decryption, file I/O |
client/config/config_test.go |
Client configuration management | Config loading/saving, path utilities, keystore migration |
client/config/interactive_ui_test.go |
Client interactive UI components | TUI forms, profile selection, authentication prompts |
client/code_snippet_test.go |
Client code snippet functionality | Text editing, selection, clipboard, syntax highlighting |
client/file_picker_test.go |
Client file picker functionality | File browsing, selection, size validation, directory navigation |
client/main_test.go |
Client main functionality | Message rendering, user lists, URL handling, encryption functions, flag validation |
client/websocket_sanitize_test.go |
WebSocket URL / TLS hints | Sanitization helpers for display and connection hints |
client/exthook/exthook_test.go |
Client hook helpers | Executable validation, hook JSON shaping, path rules |
internal/doctor/db_checks_test.go |
Doctor DB probes | SQLite connectivity and version checks used by -doctor |
cmd/server/main_test.go |
Server main function and startup | Flag parsing, configuration validation, TLS setup, admin normalization, validateStartupConfig, deprecated flags |
cmd/server/subprocess_doctor_test.go |
Server binary smoke | go run ./cmd/server -doctor / -doctor-json subprocess (covers main early exits) |
server/handlers_test.go |
Server-side request handling | Database operations, message insertion, IP extraction |
server/hub_test.go |
WebSocket hub management | User bans, kicks, connection management, non-blocking send verification |
server/loadverify_ratelimit_test.go |
WebSocket read-pump rate limit | Window, burst (20), and cooldown behavior (same constants as client.go) |
server/loadverify_bench_test.go |
Hub broadcast benchmarks (optional) | Channel vs system-wide fan-out, parallel senders, JSON marshal baseline; see Optional hub load benchmarks |
server/integration_test.go |
End-to-end workflows | Message flow, ban flow, concurrent operations |
server/admin_web_test.go |
Admin web interface | HTTP endpoints, authentication, admin panel functionality |
server/config_ui_test.go |
Server configuration UI | Configuration management, environment handling |
server/admin_panel_test.go |
Admin panel functionality | Admin-specific operations and controls |
server/db_test.go |
Database operations | Database initialization, schema setup |
server/db_dialect_test.go |
SQL dialect helpers | DSN → driver detection, Postgres placeholder rebinding, mysql:// DSN form |
server/db_ci_smoke_test.go |
CI DB smoke | Postgres/MySQL InitDB, CreateSchema, core tables (env-gated) |
server/message_state_test.go |
Durable reactions | Reaction persistence and replay helpers |
server/config_test.go |
Server configuration | Server configuration logic and validation |
server/client_test.go |
Server client management | WebSocket client initialization, message handling, admin operations |
server/health_test.go |
Server health monitoring | Health checks, system metrics, HTTP endpoints, concurrent access |
plugin/sdk/plugin_test.go |
Plugin SDK | Message types, extended fields (channel, encrypted, message_id, recipient, edited), JSON serialization, omitempty validation, backwards-compat unknown-field handling |
plugin/sdk/stdio_test.go |
Plugin SDK stdio | HandlePluginRequest / RunIO (init, message, command, shutdown), EOF handling |
plugin/host/host_test.go |
Plugin Host | Plugin lifecycle, communication, enable/disable |
plugin/host/outbound_test.go |
Plugin Host | Chat fan-out queue: drop when full, drain-on-stop, nil-queue safety |
plugin/host/plugin_lifecycle_test.go |
Plugin Host subprocess IPC | Minimal JSON plugin built with go build, StartPlugin / StopPlugin, ExecuteCommand, double-start guard |
plugin/store/store_test.go |
Plugin Store | Registry management, platform resolution, filtering |
plugin/manager/manager_test.go |
Plugin Manager | validatePluginName, plugin state fallbacks, installation, uninstallation, command execution |
plugin/manager/manager_lifecycle_test.go |
Plugin Manager + host | Discovery auto-start, DisablePlugin / EnablePlugin, ExecuteCommand delegation |
plugin/integration_test.go |
Plugin Integration | End-to-end plugin system workflows |
shared/version_test.go |
Version information | Version functions, variable validation, format consistency |
plugin/license/validator_test.go |
License validation | Signature verification, caching, expiration, tampered cache, plugin/cache key mismatch, file-path plugin name binding, error propagation from IsLicenseValid |
cmd/license/main_test.go |
License CLI tool functions | CLI functions (validateLicense, generateLicense, generateKeyPair, checkLicense) |
Per-file statement percentages for important paths are listed under Test Coverage Areas (from the same merged profile).
- Crypto Functions: Key generation, encryption/decryption, session key derivation
- Data Types: Message structures, JSON serialization, validation
- Utility Functions: IP extraction, message sorting, database stats
- Configuration: Environment variable parsing, validation rules
- Client Keystore: Keystore initialization, encryption/decryption, file operations, passphrase handling
- Client Config: Configuration loading/saving, path utilities, keystore migration
- Client Interactive UI: TUI forms, profile selection, authentication prompts, navigation, validation
- Client Code Snippet: Text editing, selection, clipboard operations, syntax highlighting, state management
- Client Main: Message rendering, user lists, URL handling, encryption functions, flag validation
- Client WebSocket helpers: URL / TLS hint sanitization (
websocket_sanitize_test.go) - Client Hooks (
client/exthook): Executable path validation and hook-safe JSON for send/receive events (exthook_test.go) - Client File Picker: File browsing, directory navigation, file selection, size validation, error handling
- Doctor (
internal/doctor): Server/client diagnostics, env masking, update checks, DB connectivity probes - Server Main: Flag parsing, multi-flag handling, banner display, startup config validation (
validateStartupConfig), admin username normalization (normalizeAndValidateAdmins), subprocess-doctor/-doctor-jsonsmoke (subprocess_doctor_test.go) - Plugin Host (lifecycle): Minimal JSON plugin built with
go build,StartPlugin/StopPlugin,ExecuteCommand(plugin_lifecycle_test.go) - Server Admin Web: HTTP endpoints, authentication, admin panel functionality, web interface
- Server Configuration: Configuration management, environment handling, UI components
- Server Database: Database initialization, schema setup, connection management
- Server Admin Panel: Admin-specific operations, user management, administrative controls
- Message Flow: Complete message lifecycle from insertion to retrieval
- User Management: Ban/kick/unban workflows with database persistence
- Concurrent Operations: Thread-safe operations and race condition testing
- Database Operations: Schema creation, message capping, backup functionality
- WebSocket Handling: Connection management, authentication, message routing
- Hub Management: User registration, broadcasting, cleanup operations
- Admin Functions: Ban management, user administration, system commands
- Server Main Function: Flag parsing, configuration validation, startup requirements (admins, key, port), TLS setup, admin username normalization, banner display
- Client Management: WebSocket client initialization, message handling, admin operations, connection settings
- Health Monitoring: Database health checks, system metrics collection, HTTP endpoints, concurrent access safety
- Go 1.25.9 or later
- SQLite support (built into Go)
- PowerShell (for Windows test script)
# Run all tests
go test ./...
# Run tests with verbose output
go test -v ./...
# Run tests for a specific package
go test ./server
go test ./shared
# Nested modules (separate go.mod; not run by root `go test ./...`)
cd plugin/sdk
go test ./...
cd ../examples/echo
go test ./... # optional sample plugin (may report [no test files])Client hook sample binary: client/exthook/_example_hook is a small package main logger used with CLIENT_HOOKS.md. The leading _ on the directory name follows the Go ./... omission rules so root go test ./... does not compile it as a second package under client/exthook (build it only with an explicit path, for example go build ./client/exthook/_example_hook).
server/loadverify_bench_test.go defines BenchmarkLoadverify_* helpers for profiling hub broadcast paths. go test ./... does not run benchmarks unless you pass -bench (and usually -run=^$ so only benchmarks execute).
What they approximate:
- Hub
Runloop fed byhub.broadcast, with clients registered and channel membership like production, but no real WebSocket and large per-client send buffers so the harness measures routing/coordination rather than production backpressure. TypingMessageon the broadcast path avoidsSendMessageToPlugins(see file comments). A separate sub-benchmark timesjson.Marshalon a text-shaped message for comparison.
Interpreting results: channel-scoped delivery still iterates all registered clients in hub.go and filters by channel; the fixedChannel8 sub-benchmarks vary total clients while keeping eight members in #bench to highlight that cost scales with server-wide connections, not only room size. ns/op and B/op depend on hardware, OS, and Go version, so use these runs for trends and profiling, not as fixed targets.
Examples (repo root; adjust -bench regex as needed):
go test ./server -run=Loadverify -v
go test ./server -run='^$' -bench=Loadverify -benchmem -count=5Windows PowerShell: quote -cpuprofile (e.g. -cpuprofile="loadverify-cpu.pprof") so the path is not misparsed; the profile is written to the shell’s current directory unless you pass an absolute path.
go test ./server -run='^$' -bench=Loadverify_HubBroadcast_ChannelMessage/all_in_channel_128 -cpuprofile="loadverify-cpu.pprof"
go tool pprof -top .\loadverify-cpu.pprof# Run the test suite
./test.sh# Run basic test suite
.\test.ps1
# Run with coverage report
.\test.ps1 -Coverage
# Run with verbose output
.\test.ps1 -VerboseGenerate and view test coverage:
# Generate merged profile (use a name without ".out" on Windows PowerShell)
go test -coverprofile=mergedcoverage ./...
# View coverage in terminal (same path as -coverprofile)
go tool cover -func=mergedcoverage
# Generate HTML coverage report
go tool cover -html=mergedcoverage -o coverage.html
# View coverage percentages directly
go test -cover ./...| Package | Coverage | Status | Lines of Code¹ | Weighted Impact |
|---|---|---|---|---|
shared |
88.1% | High | 253 | Small |
plugin/license |
87.1% | High | 246 | Small |
client/crypto |
80.3% | High | 387 | Small |
config |
73.2% | High | 339 | Small |
plugin/host |
64.6% | Medium | 721 | Medium |
client/config |
58.0% | Medium | 1993 | Medium |
internal/doctor |
52.5% | Medium | 809 | Medium |
plugin/store |
47.0% | Medium | 552 | Medium |
cmd/license |
42.2% | Medium | 160 | Small |
server |
36.3% | Low | 7217 | Large |
plugin/manager |
32.1% | Low | 747 | Medium |
client/exthook |
24.1% | Low | 204 | Small |
client |
23.1% | Low | 5555 | Large |
cmd/server |
13.7% | Low | 484 | Medium |
¹Non-test .go files only, physical line count (wc -l style), only .go files in that package directory (not subpackages such as client/config inside client/). Regenerate with the Python snippet in Test Metrics or find + wc.
Overall coverage: 38.1% (all packages in the main module; merged profile coverage or another -coverprofile path)
- Shared Package: Cryptographic operations, data types, message handling, version utilities (88.1%)
- Plugin License Package: License validation, signature verification, caching, plugin name binding (87.1%)
- Client Crypto Package: Keystore management, encryption/decryption, file operations, raw encrypt/decrypt for file transfers (80.3%)
- Config Package: Configuration loading, validation, environment variables (73.2%)
- Plugin Host Package: Load/start/stop lifecycle, JSON IPC with a minimal test plugin,
ExecuteCommand, bounded async chat fan-out to plugins, stop waits for IPC reader goroutines before clearing instance state (64.6%) - Client Config Package: Configuration management, path utilities, keystore migration, interactive UI (58.0%)
- Doctor Package: Server/client diagnostics, env checks, update metadata, DB probes (52.5%)
- Plugin Store: Registry management, platform resolution, filtering, caching (47.0%)
- Command License: CLI functions for license management (42.2%)
- Server Package: WebSocket handling, admin panel, database operations, message edit/delete/pin/search, channels, DMs (36.3%)
- Plugin Manager: Installation, store download paths, enable/disable with persisted state (32.1%)
- Client Hooks (
client/exthook): Hook path validation and hook-safe message JSON (24.1%) - Client Package: Message rendering, user lists, encryption functions, flag validation, TUI entrypoints (23.1%)
- Server Main (
cmd/server): Fullmainstartup, HTTP/TLS serving, admin panel wiring (13.7% forcmd/server); helpers such asnormalizeAndValidateAdminsandvalidateStartupConfigplus-doctor/-doctor-jsonsubprocess smoke tests cover parts ofmain
Statement percentages below are from the merged profile (go tool cover -func=coverage). Listed files are either high-signal (≥40% and larger sources) or important entrypoints even when lower.
| File | Coverage | Package | Description |
|---|---|---|---|
shared/version.go |
100.0% | shared | Version information functions |
internal/doctor/db_checks.go |
100.0% | internal/doctor | SQLite checks for -doctor |
internal/doctor/env.go |
97.4% | internal/doctor | Ordered MARCHAT_* env lines for doctor reports (osEnviron injectable under environMu) |
client/file_picker.go |
98.2% | client | File selection TUI component |
server/health.go |
89.3% | server | Health monitoring and status |
plugin/license/validator.go |
87.1% | plugin/license | License validation and verification |
client/render.go |
80.0% | client | TUI rendering helpers |
client/crypto/keystore.go |
80.3% | client/crypto | Keystore management, raw encrypt/decrypt |
shared/crypto.go |
82.5% | shared | Cryptographic operations |
server/db.go |
75.8% | server | Database operations |
config/config.go |
73.2% | config | Configuration management |
client/notification_manager.go |
67.5% | client | Desktop / notification integration |
client/config/interactive_ui.go |
66.9% | client/config | Interactive configuration UI |
plugin/host/host.go |
64.6% | plugin/host | Plugin subprocess lifecycle and IPC |
server/logger.go |
61.4% | server | Logging functionality |
server/message_state.go |
59.2% | server | Reactions, read receipts, channel prefs |
server/db_dialect.go |
58.5% | server | SQL dialect helpers |
server/hub.go |
58.1% | server | WebSocket hub management, channels, DMs |
client/code_snippet.go |
53.4% | client | Code snippet TUI component |
server/handlers.go |
50.5% | server | HTTP/WebSocket handlers, edit/delete/pin/search |
plugin/store/store.go |
47.0% | plugin/store | Plugin store operations |
cmd/license/main.go |
42.2% | cmd/license | License CLI tool |
client/config/config.go |
43.2% | client/config | Client configuration |
internal/doctor/doctor.go |
37.3% | internal/doctor | Doctor orchestration and reporting |
server/config_ui.go |
36.0% | server | Server configuration UI |
server/admin_web.go |
33.4% | server | Admin web interface |
plugin/manager/manager.go |
32.1% | plugin/manager | Plugin management |
server/admin_panel.go |
15.9% | server | Admin panel functionality |
server/client.go |
14.4% | server | Client management, message type routing |
cmd/server/main.go |
13.7% | cmd/server | Server main application |
server/plugin_commands.go |
11.9% | server | Plugin command handling |
client/exthook/exthook.go |
24.1% | client/exthook | Client hook path checks and hook JSON |
client/main.go |
6.6% | client | Client main application |
- Server Package: Advanced WebSocket handling, complex message routing scenarios (current: 36.3%)
- Client Package: WebSocket communication, full TUI integration (current: 23.1%)
- Plugin Host: Broader command/response paths and failure modes beyond the minimal IPC test plugin (current: 64.6%)
- Plugin Manager: Store download, checksum, and install edge cases (current: 32.1%)
- Server Main: Full
mainexecution, HTTP/TLS serving, admin panel integration (current: 13.7% statement coverage forcmd/server/main.go) - File Transfer: File upload/download functionality
- Client Hooks: Broader hook execution paths and failure modes (current: 24.1% for
client/exthook) - Plugin License: License validation and enforcement (package: 87.1%;
validator.gofile line in the table above)
- Uses in-memory SQLite databases for isolation
- Creates fresh schema for each test
- Tests both encrypted and plaintext messages
- Verifies message ordering and retrieval
- Postgres / MySQL (CI):
server/db_ci_smoke_test.gorunsInitDB+CreateSchemaagainst real servers whenMARCHAT_CI_POSTGRES_URL/MARCHAT_CI_MYSQL_URLare set (see.github/workflows/go.yml)
- Tests ChaCha20-Poly1305 encrypt/decrypt for text payloads (
shared/crypto_test.go) - Client Keystore: Tests keystore initialization, global key load, encryption/decryption, file operations, passphrase handling, legacy path-salted file migration to the embedded-salt format, and loading the same file after changing its path
- Tests various message types (text, file, admin)
- Verifies JSON serialization/deserialization
- Tests message ordering and timestamp handling
- Validates encrypted message handling
- Tests command-line flag parsing and validation
- Verifies multi-flag functionality for admin users
- Tests configuration loading and environment variable handling
- Validates TLS configuration and WebSocket scheme selection
- Tests admin username normalization and duplicate detection (including empty or whitespace-only entries)
- Tests startup validation helpers (
validateStartupConfig) for admins, admin key, and listen port - Verifies banner display functionality
- Tests deprecated flag warnings and backward compatibility
- Tests
validatePluginNamefor allowed names and rejection of traversal, invalid characters, length, and casing - Tests
loadPluginStatewhen the state file is missing, corrupted, or valid JSON with a nilenabledmap - Tests discovery auto-start,
DisablePlugin/EnablePlugin, andExecuteCommandwith a minimal built plugin (manager_lifecycle_test.go)
The test suite is designed to run in CI/CD environments:
- Default job (
.github/workflows/go.ymlbuild):gofmt -lmust be empty on the root tree, thengo test -race ./...,go vet ./...,govulncheck -show verbose ./..., andgolangci-lint run ./...(SQLite only for DB tests; DB smoke skips without env). Thenplugin/sdkandplugin/examples/echoeach rungo mod tidy,gofmt -l,go build ./...,go test -race ./...,go vet ./...,govulncheck, andgolangci-lint(nested modules use their owngo.modand are not included in root./...). - Database smoke job (
database-smoke): Postgres 16 and MySQL 8 services, thengo test -race ./server -run 'Test(Postgres|MySQL)InitDBAndSchemaSmoke'withMARCHAT_CI_POSTGRES_URL/MARCHAT_CI_MYSQL_URLset. - Parallel Safe: Standard tests avoid shared mutable global state; subprocess tests serialize via their own
go runinvocations. Doctor tests that swaposEnvirondo not uset.Parallel()with each other. Plugin hostStopPluginjoins stdout/stderr readers before clearing instance fields so lifecycle tests stay race-clean. - Deterministic: Doctor subprocess tests set
MARCHAT_DOCTOR_NO_NETWORK=1to avoid GitHub API flakiness.
- Test Naming: Use descriptive test names that explain the scenario
- Test Structure: Follow the Arrange-Act-Assert pattern
- Isolation: Each test should be independent and not rely on other tests
- Coverage: Aim for meaningful coverage, not just line coverage
- Documentation: Add comments for complex test scenarios
func TestFeatureName(t *testing.T) {
// Arrange
setup := createTestSetup()
input := createTestInput()
// Act
result, err := functionUnderTest(input)
// Assert
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
if result != expectedResult {
t.Errorf("Expected %v, got %v", expectedResult, result)
}
}func TestDatabaseOperation(t *testing.T) {
// Create test database
db, err := sql.Open("sqlite", ":memory:")
if err != nil {
t.Fatalf("Failed to open test database: %v", err)
}
defer db.Close()
// Create schema
CreateSchema(db)
// Test the operation
// ... test implementation
}- In-Memory Databases: Tests use SQLite in-memory mode for speed
- Parallel Execution: Tests are designed to run in parallel when possible
- Minimal Setup: Each test creates only the data it needs
- Fast Cleanup: Tests clean up resources immediately
- Import Errors: Ensure all dependencies are properly imported
- Database Locks: Tests use separate in-memory databases to avoid conflicts
- Race Conditions: All concurrent tests use proper synchronization
- Memory Leaks: Tests properly close database connections and channels
- PowerShell Execution Policy: May need to enable script execution:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser - Coverage Tool Syntax: Use
go tool cover -func=coverage.outor-func=coverage(path must match your profile file)
Run tests with debug output:
# Enable Go test debugging
go test -v -race ./...From the repo root, with golangci-lint and govulncheck on PATH (install with go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest and go install golang.org/x/vuln/cmd/govulncheck@latest):
$env:GOTOOLCHAIN = "auto"
gofmt -w .
golangci-lint run ./...
go test ./... -count=1
go vet ./...
govulncheck -show verbose ./...
foreach ($D in @("plugin\sdk", "plugin\examples\echo")) {
Push-Location $D
gofmt -w .
golangci-lint run ./...
go test ./... -count=1
go vet ./...
govulncheck -show verbose ./...
Pop-Location
}When adding new functionality to Marchat:
- Write Tests First: Follow TDD principles where possible
- Update This Document: Add new test categories and coverage areas
- Maintain Coverage: Ensure new code is properly tested
- Run Full Suite: Always run all tests before submitting changes
- Top-level tests: 352
Test*entrypoints fromgo test -list . ./...on the main module; the nestedplugin/sdkmodule adds 21 more (cd plugin/sdk && go test -list . ./...). - Test files: 44 tracked
_test.gofiles (git ls-files '*_test.go'), includingplugin/sdk/plugin_test.goandplugin/sdk/stdio_test.goin the nested SDK module. - Packages (
go list ./...): 15 in the main module;plugin/sdkandplugin/examples/echoare nested modules with their owngo.modfiles (rootgo test ./...does not run their tests). - Coverage by Package (statement %, merged profile): 88.1% (
shared), 87.1% (plugin/license), 80.3% (client/crypto), 73.2% (config), 64.6% (plugin/host), 58.0% (client/config), 52.5% (internal/doctor), 47.0% (plugin/store), 42.2% (cmd/license), 36.3% (server), 32.1% (plugin/manager), 24.1% (client/exthook), 23.1% (client), 13.7% (cmd/server) - Nested
plugin/sdkcoverage: 58.8% statements (run insideplugin/sdk; not part of the root merged profile). - Overall Coverage: 38.1% across main-module packages (regenerate with
go test -coverprofile=mergedcoverage ./...thengo tool cover -func=mergedcoverage; on PowerShell use a profile path without a.outsuffix, for examplemergedcoverage,ph, orsv, so-func=is not misparsed) - Lines of code (approx.): non-test
.golines per package directory, same totals as the Current Coverage Status table (e.g.server7215,client5555); re-count with:
python -c "import os; ..."walking the tree and skipping*_test.go, or equivalentfind+wc -l. - Execution Time: on the order of a few seconds for
go test ./...on a typical dev machine - Reliability: deterministic; use
go test -race ./...where supported (see CI)
This foundational test suite provides a solid base for testing core functionality, with room for significant expansion in the main application components.