1package daemonidentity
2
3import (
4 "errors"
5 "os"
6 "path/filepath"
7 "testing"
8)
9
10func TestLoadOrCreateStableAndIncarnationFresh(t *testing.T) {
11 root := t.TempDir()
12 first, err := LoadOrCreate(root)
13 if err != nil {
14 t.Fatal(err)
15 }
16 second, err := LoadOrCreate(root)
17 if err != nil {
18 t.Fatal(err)
19 }
20 if first != second {
21 t.Fatalf("identity changed: %q != %q", first, second)
22 }
23 a, err := NewIncarnation()
24 if err != nil {
25 t.Fatal(err)
26 }
27 b, err := NewIncarnation()
28 if err != nil {
29 t.Fatal(err)
30 }
31 if a.IsZero() || b.IsZero() || a == b {
32 t.Fatalf("incarnations not fresh: %x %x", a, b)
33 }
34}
35
36func TestLoadFailsClosed(t *testing.T) {
37 for _, tc := range []struct {
38 name string
39 prepare func(string) error
40 }{
41 {"corrupt", func(root string) error {
42 if err := os.Mkdir(filepath.Dir(Path(root)), 0o700); err != nil {
43 return err
44 }
45 return os.WriteFile(Path(root), []byte("bad"), 0o600)
46 }},
47 {"permissions", func(root string) error {
48 if err := os.Mkdir(filepath.Dir(Path(root)), 0o700); err != nil {
49 return err
50 }
51 return os.WriteFile(Path(root), []byte("00112233445566778899aabbccddeeff"), 0o644)
52 }},
53 {"symlink", func(root string) error {
54 if err := os.Mkdir(filepath.Dir(Path(root)), 0o700); err != nil {
55 return err
56 }
57 target := filepath.Join(root, "target")
58 if err := os.WriteFile(target, []byte("00112233445566778899aabbccddeeff"), 0o600); err != nil {
59 return err
60 }
61 return os.Symlink(target, Path(root))
62 }},
63 } {
64 t.Run(tc.name, func(t *testing.T) {
65 root := t.TempDir()
66 if err := tc.prepare(root); err != nil {
67 t.Fatal(err)
68 }
69 if _, err := Load(root); !errors.Is(err, ErrInvalid) {
70 t.Fatalf("error=%v, want ErrInvalid", err)
71 }
72 })
73 }
74}
75
76func TestLoadAbsentDoesNotCreate(t *testing.T) {
77 root := filepath.Join(t.TempDir(), "absent")
78 if _, err := Load(root); !errors.Is(err, os.ErrNotExist) {
79 t.Fatalf("error=%v", err)
80 }
81 if _, err := os.Stat(root); !errors.Is(err, os.ErrNotExist) {
82 t.Fatalf("read created state: %v", err)
83 }
84}