//go:build linux package hostexec import ( "errors" "os" "path/filepath" "testing" ) func TestPlan9CheckLocalNeverCreatesMissingLocks(t *testing.T) { for _, holdLifetime := range []bool{false, true} { cfg, _, clock, _, _ := fixture(t) cfg.Binding.ControllerID = "controller" if holdLifetime { unlock, err := tryAcquire(cfg.LockDir, cfg.Binding.Host) if err != nil { t.Fatal(err) } defer unlock() } before, err := os.ReadDir(cfg.LockDir) if err != nil { t.Fatal(err) } if err = CheckLocal(cfg.Guard.DataDir, cfg.Binding, clock, cfg.LockDir); err == nil { t.Fatal("missing locks granted authority") } after, err := os.ReadDir(cfg.LockDir) if err != nil { t.Fatal(err) } if len(after) != len(before) { t.Fatalf("probe created lock files: before=%v after=%v", before, after) } } } func TestPlan9CheckLocalDoesNotRepairLockModes(t *testing.T) { cfg, _, clock, _, _ := fixture(t) cfg.Binding.ControllerID = "controller" path := filepath.Join(cfg.LockDir, cfg.Binding.Host+".lock") if err := os.WriteFile(path, nil, 0600); err != nil { t.Fatal(err) } if err := CheckLocal(cfg.Guard.DataDir, cfg.Binding, clock, cfg.LockDir); !errors.Is(err, ErrLost) { t.Fatal(err) } info, err := os.Stat(path) if err != nil { t.Fatal(err) } if info.Mode().Perm() != 0600 { t.Fatalf("reader changed lock mode to %o", info.Mode().Perm()) } } func TestPlan9CheckLocalExistingLiveControllerRemainsAdmitted(t *testing.T) { cfg, _, clock, _, _ := fixture(t) controller, err := Open(t.Context(), cfg) if err != nil { t.Fatal(err) } t.Cleanup(func() { closeController(t, controller) }) state := ready(t, controller) if err = cfg.Guard.WithLocal(t.Context(), state.Host, func() error { return CheckLocal(cfg.Guard.DataDir, state.Binding, clock, cfg.LockDir) }); err != nil { t.Fatal(err) } }