| 96 | } |
| 97 | |
| 98 | func TestFileReload(t *testing.T) { |
| 99 | t.Parallel() |
| 100 | |
| 101 | const file = `cat: dog` |
| 102 | |
| 103 | f, err := os.CreateTemp("", "maddy-tests-") |
| 104 | if err != nil { |
| 105 | t.Fatal(err) |
| 106 | } |
| 107 | defer func(name string) { |
| 108 | err := os.Remove(name) |
| 109 | if err != nil { |
| 110 | t.Log(err) |
| 111 | } |
| 112 | }(f.Name()) |
| 113 | if _, err := f.WriteString(file); err != nil { |
| 114 | _ = f.Close() |
| 115 | t.Fatal(err) |
| 116 | } |
| 117 | err = f.Close() |
| 118 | if err != nil { |
| 119 | t.Fatal(err) |
| 120 | } |
| 121 | |
| 122 | mod, err := NewFile(container.New(), "", "") |
| 123 | if err != nil { |
| 124 | t.Fatal(err) |
| 125 | } |
| 126 | m := mod.(*File) |
| 127 | if err := m.Start(); err != nil { |
| 128 | t.Fatal(err) |
| 129 | } |
| 130 | m.log = testutils.Logger(t, "file_map") |
| 131 | defer func() { |
| 132 | assert.NoError(t, m.Stop()) |
| 133 | }() |
| 134 | |
| 135 | if err := mod.Configure([]string{f.Name()}, &config.Map{Block: config.Node{}}); err != nil { |
| 136 | t.Fatal(err) |
| 137 | } |
| 138 | |
| 139 | // ensure it is correctly loaded at first time. |
| 140 | m.mLck.RLock() |
| 141 | if m.m["cat"] == nil { |
| 142 | t.Fatalf("wrong content loaded, new m were not loaded, %v", m.m) |
| 143 | } |
| 144 | m.mLck.RUnlock() |
| 145 | |
| 146 | for i := 0; i < 100; i++ { |
| 147 | // try to provoke race condition on file writing |
| 148 | if i%2 == 0 { |
| 149 | if err := os.WriteFile(f.Name(), []byte("dog: cat"), os.ModePerm); err != nil { |
| 150 | t.Fatal(err) |
| 151 | } |
| 152 | } |
| 153 | time.Sleep(reloadInterval + 5*time.Millisecond) |
| 154 | m.mLck.RLock() |
| 155 | if m.m["dog"] == nil { |