tstest/deptest: verify that tailscale.com BadDeps actually exist
Some checks are pending
checklocks / checklocks (push) Waiting to run
CodeQL / Analyze (go) (push) Waiting to run
Dockerfile build / deploy (push) Waiting to run
CI / race-root-integration (1/4) (push) Waiting to run
CI / race-root-integration (2/4) (push) Waiting to run
CI / race-root-integration (3/4) (push) Waiting to run
CI / race-root-integration (4/4) (push) Waiting to run
CI / test (-coverprofile=/tmp/coverage.out, amd64) (push) Waiting to run
CI / test (-race, amd64, 1/3) (push) Waiting to run
CI / test (-race, amd64, 2/3) (push) Waiting to run
CI / test (-race, amd64, 3/3) (push) Waiting to run
CI / test (386) (push) Waiting to run
CI / windows (push) Waiting to run
CI / privileged (push) Waiting to run
CI / vm (push) Waiting to run
CI / race-build (push) Waiting to run
CI / cross (386, linux) (push) Waiting to run
CI / cross (amd64, darwin) (push) Waiting to run
CI / cross (amd64, freebsd) (push) Waiting to run
CI / cross (amd64, openbsd) (push) Waiting to run
CI / cross (amd64, windows) (push) Waiting to run
CI / cross (arm, 5, linux) (push) Waiting to run
CI / cross (arm, 7, linux) (push) Waiting to run
CI / cross (arm64, darwin) (push) Waiting to run
CI / cross (arm64, linux) (push) Waiting to run
CI / cross (arm64, windows) (push) Waiting to run
CI / cross (loong64, linux) (push) Waiting to run
CI / ios (push) Waiting to run
CI / crossmin (amd64, illumos) (push) Waiting to run
CI / crossmin (amd64, plan9) (push) Waiting to run
CI / crossmin (amd64, solaris) (push) Waiting to run
CI / crossmin (ppc64, aix) (push) Waiting to run
CI / android (push) Waiting to run
CI / wasm (push) Waiting to run
CI / tailscale_go (push) Waiting to run
CI / fuzz (push) Waiting to run
CI / depaware (push) Waiting to run
CI / go_generate (push) Waiting to run
CI / go_mod_tidy (push) Waiting to run
CI / licenses (push) Waiting to run
CI / staticcheck (386, windows) (push) Waiting to run
CI / staticcheck (amd64, darwin) (push) Waiting to run
CI / staticcheck (amd64, linux) (push) Waiting to run
CI / staticcheck (amd64, windows) (push) Waiting to run
CI / notify_slack (push) Blocked by required conditions
CI / check_mergeability (push) Blocked by required conditions

This protects against rearranging packages and not catching that a BadDeps
package got moved. That would then effectively remove a test.

Updates #12614

Change-Id: I257f1eeda9e3569c867b7628d5bfb252d3354ba6
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
Brad Fitzpatrick 2025-01-26 18:12:46 +00:00 committed by Brad Fitzpatrick
parent e701fde6b3
commit 04029b857f

View File

@ -15,6 +15,7 @@
"runtime"
"slices"
"strings"
"sync"
"testing"
"tailscale.com/util/set"
@ -54,11 +55,35 @@ func (c DepChecker) Check(t *testing.T) {
t.Fatal(err)
}
tsRoot := sync.OnceValue(func() string {
out, err := exec.Command("go", "list", "-f", "{{.Dir}}", "tailscale.com").Output()
if err != nil {
t.Fatalf("failed to find tailscale.com root: %v", err)
}
return strings.TrimSpace(string(out))
})
for _, dep := range res.Deps {
if why, ok := c.BadDeps[dep]; ok {
t.Errorf("package %q is not allowed as a dependency (env: %q); reason: %s", dep, extraEnv, why)
}
}
// Make sure the BadDeps packages actually exists. If they got renamed or
// moved around, we should update the test referencing the old name.
// Doing this in the general case requires network access at runtime
// (resolving a package path to its module, possibly doing the ?go-get=1
// meta tag dance), so we just check the common case of
// "tailscale.com/*" packages for now, with the assumption that all
// "tailscale.com/*" packages are in the same module, which isn't
// necessarily true in the general case.
for dep := range c.BadDeps {
if suf, ok := strings.CutPrefix(dep, "tailscale.com/"); ok {
pkgDir := filepath.Join(tsRoot(), suf)
if _, err := os.Stat(pkgDir); err != nil {
t.Errorf("listed BadDep %q doesn't seem to exist anymore: %v", dep, err)
}
}
}
for dep := range c.WantDeps {
if !slices.Contains(res.Deps, dep) {
t.Errorf("expected package %q to be a dependency (env: %q)", dep, extraEnv)