//go:build linux package host import ( "errors" "os" "path/filepath" "testing" "golang.org/x/sys/unix" ) // On a kernel without openat2 the removal refuses and leaves the tree: there // is no path-based fallback. func TestInstallChannelRemovalRefusesWithoutOpenat2(t *testing.T) { f := newChannelFixture(t, "v1.2.0") entry := filepath.Join(f.a.dataDir, "system", "router", "v1.4.0") if err := os.MkdirAll(entry, 0o755); err != nil { t.Fatal(err) } if err := os.WriteFile(filepath.Join(entry, "carlos"), []byte("x"), 0o755); err != nil { t.Fatal(err) } real := openat2 defer func() { openat2 = real }() for _, refuse := range []error{unix.ENOSYS, unix.EPERM, unix.EXDEV} { openat2 = func(int, string, *unix.OpenHow) (int, error) { return -1, refuse } if err := removeCacheEntry(f.a.dataDir, "v1.4.0"); !errors.Is(err, refuse) { t.Fatalf("removal with openat2 failing %v: %v", refuse, err) } if _, err := os.Stat(filepath.Join(entry, "carlos")); err != nil { t.Fatalf("the tree was removed without openat2: %v", err) } } }