Files
pulse/internal/api/reporting_boundary_test.go
T
pulse-triage[bot] 92eef9809b Attach subject report alerts with shared disk hardware ownership
Restore machine and other subject alert enrichment without path-based ownership. Reuse the existing PVE alert journal decision and cross-source hardware matching for serials, WWNs, placeholders, moved paths and ambiguous identities. Preserve machine isolation, handover counts, resolution windows and exact paid-boundary controls.

Adapt rcourtman's PR #2641 (de524e823d) and the boundary controls of rejected maintainer candidate b548e6dd3ae6d689a479254baf785d2bead7cf77. Correct its disk ownership defect against current main rather than retaining a parallel identity matcher. Imported and shared history is unchanged.

Change-source: pulse-maintainer
2026-10-07 12:36:24 +01:00

115 lines
3.7 KiB
Go

package api
import (
"context"
"io/fs"
"os"
"os/exec"
"path/filepath"
"strings"
"testing"
"time"
)
// Exercise the production Go classifiers, not a second copy of their patterns.
// The shell classifier is exercised in scripts/repo-boundary-regression.py,
// where the boundary workflow supplies its declared ripgrep dependency.
// An exact shared-pipeline exemption must not admit neighbouring implementation
// files or let the exempt helper import private licensing code.
func TestReportingSubjectBoundaryExemptionIsExact(t *testing.T) {
binary, err := os.Executable()
if err != nil {
t.Fatal(err)
}
repo := filepath.Join("..", "..")
for _, tc := range []struct {
name, file, content, goMarker string
}{
{name: "shared subject pipeline"},
{
name: "new reporting implementation", file: "reporting_subject_alerts_extra.go", content: "package api\n",
goMarker: "untracked paid-domain file reporting_subject_alerts_extra.go",
},
{
name: "exact path not prefix", file: "reporting_subject_alerts.go.extra.go", content: "package api\n",
goMarker: "untracked paid-domain file reporting_subject_alerts.go.extra.go",
},
{
name: "private root import still denied", file: "reporting_subject_alerts.go",
content: "package api\nimport _ \"github.com/rcourtman/pulse-go-rewrite/internal/license\"\n",
goMarker: "direct internal/license import",
},
{
name: "licensing bridge still required", file: "reporting_subject_alerts.go",
content: "package api\nimport _ \"github.com/rcourtman/pulse-go-rewrite/pkg/licensing\"\n",
goMarker: "reporting_subject_alerts.go",
},
} {
t.Run(tc.name, func(t *testing.T) {
root := t.TempDir()
for _, dir := range []string{"internal/api"} {
err := filepath.WalkDir(filepath.Join(repo, dir), func(path string, entry fs.DirEntry, err error) error {
if err != nil {
return err
}
if entry.IsDir() || !strings.HasSuffix(path, ".go") || strings.HasSuffix(path, "_test.go") {
return nil
}
rel, err := filepath.Rel(repo, path)
if err != nil {
return err
}
copyReportingBoundaryFile(t, path, filepath.Join(root, rel))
return nil
})
if err != nil {
t.Fatal(err)
}
}
apiDir := filepath.Join(root, "internal/api")
if tc.file != "" {
if err := os.WriteFile(filepath.Join(apiDir, tc.file), []byte(tc.content), 0600); err != nil {
t.Fatal(err)
}
}
// The running test binary scans fixture bytes; injected files are
// never compiled or executed. The anchored selector prevents recursion.
runReportingBoundaryCommand(t, apiDir, tc.goMarker, binary,
"-test.run=^(TestPaidDomainBoundaryAudit|TestNoInternalLicenseImportFromAPIProd|TestPkgLicensingImportBoundary)$", "-test.v")
})
}
}
func copyReportingBoundaryFile(t *testing.T, source, target string) {
t.Helper()
data, err := os.ReadFile(source)
if err != nil {
t.Fatal(err)
}
if err := os.MkdirAll(filepath.Dir(target), 0700); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(target, data, 0600); err != nil {
t.Fatal(err)
}
}
func runReportingBoundaryCommand(t *testing.T, dir, rejection, command string, args ...string) {
t.Helper()
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
cmd := exec.CommandContext(ctx, command, args...)
cmd.Dir = dir
output, err := cmd.CombinedOutput()
if rejection == "" {
if err != nil {
t.Fatalf("shared pipeline rejected by %s: %v\n%s", command, err, output)
}
return
}
exit, ok := err.(*exec.ExitError)
if !ok || exit.ExitCode() != 1 || !strings.Contains(string(output), rejection) {
t.Fatalf("%s rejection = %v / %s, want exit 1 containing %q", command, err, output, rejection)
}
}