github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/clients/pkg/promtail/positions/positions_test.go (about) 1 package positions 2 3 import ( 4 "io/ioutil" 5 "os" 6 "strings" 7 "testing" 8 "time" 9 10 "github.com/go-kit/log" 11 "github.com/stretchr/testify/require" 12 13 util_log "github.com/grafana/loki/pkg/util/log" 14 ) 15 16 func tempFilename(t *testing.T) string { 17 t.Helper() 18 19 temp, err := ioutil.TempFile("", "positions") 20 if err != nil { 21 t.Fatal("tempFilename:", err) 22 } 23 err = temp.Close() 24 if err != nil { 25 t.Fatal("tempFilename:", err) 26 } 27 28 name := temp.Name() 29 err = os.Remove(name) 30 if err != nil { 31 t.Fatal("tempFilename:", err) 32 } 33 34 return name 35 } 36 37 func TestReadPositionsOK(t *testing.T) { 38 temp := tempFilename(t) 39 defer func() { 40 _ = os.Remove(temp) 41 }() 42 43 yaml := []byte(`positions: 44 /tmp/random.log: "17623" 45 `) 46 err := ioutil.WriteFile(temp, yaml, 0644) 47 if err != nil { 48 t.Fatal(err) 49 } 50 51 pos, err := readPositionsFile(Config{ 52 PositionsFile: temp, 53 }, log.NewNopLogger()) 54 55 require.NoError(t, err) 56 require.Equal(t, "17623", pos["/tmp/random.log"]) 57 } 58 59 func TestReadPositionsEmptyFile(t *testing.T) { 60 temp := tempFilename(t) 61 defer func() { 62 _ = os.Remove(temp) 63 }() 64 65 yaml := []byte(``) 66 err := ioutil.WriteFile(temp, yaml, 0644) 67 if err != nil { 68 t.Fatal(err) 69 } 70 71 pos, err := readPositionsFile(Config{ 72 PositionsFile: temp, 73 }, log.NewNopLogger()) 74 75 require.NoError(t, err) 76 require.NotNil(t, pos) 77 } 78 79 func TestReadPositionsFromDir(t *testing.T) { 80 temp := tempFilename(t) 81 err := os.Mkdir(temp, 0644) 82 if err != nil { 83 t.Fatal(err) 84 } 85 86 defer func() { 87 _ = os.Remove(temp) 88 }() 89 90 _, err = readPositionsFile(Config{ 91 PositionsFile: temp, 92 }, log.NewNopLogger()) 93 94 require.Error(t, err) 95 require.True(t, strings.Contains(err.Error(), temp)) // error must contain filename 96 } 97 98 func TestReadPositionsFromBadYaml(t *testing.T) { 99 temp := tempFilename(t) 100 defer func() { 101 _ = os.Remove(temp) 102 }() 103 104 badYaml := []byte(`positions: 105 /tmp/random.log: "176 106 `) 107 err := ioutil.WriteFile(temp, badYaml, 0644) 108 if err != nil { 109 t.Fatal(err) 110 } 111 112 _, err = readPositionsFile(Config{ 113 PositionsFile: temp, 114 }, log.NewNopLogger()) 115 116 require.Error(t, err) 117 require.True(t, strings.Contains(err.Error(), temp)) // error must contain filename 118 } 119 120 func TestReadPositionsFromBadYamlIgnoreCorruption(t *testing.T) { 121 temp := tempFilename(t) 122 defer func() { 123 _ = os.Remove(temp) 124 }() 125 126 badYaml := []byte(`positions: 127 /tmp/random.log: "176 128 `) 129 err := ioutil.WriteFile(temp, badYaml, 0644) 130 if err != nil { 131 t.Fatal(err) 132 } 133 134 out, err := readPositionsFile(Config{ 135 PositionsFile: temp, 136 IgnoreInvalidYaml: true, 137 }, log.NewNopLogger()) 138 139 require.NoError(t, err) 140 require.Equal(t, map[string]string{}, out) 141 } 142 143 func Test_ReadOnly(t *testing.T) { 144 temp := tempFilename(t) 145 defer func() { 146 _ = os.Remove(temp) 147 }() 148 yaml := []byte(`positions: 149 /tmp/random.log: "17623" 150 `) 151 err := ioutil.WriteFile(temp, yaml, 0644) 152 if err != nil { 153 t.Fatal(err) 154 } 155 p, err := New(util_log.Logger, Config{ 156 SyncPeriod: 20 * time.Nanosecond, 157 PositionsFile: temp, 158 ReadOnly: true, 159 }) 160 if err != nil { 161 t.Fatal(err) 162 } 163 defer p.Stop() 164 p.Put("/foo/bar/f", 12132132) 165 p.PutString("/foo/f", "100") 166 pos, err := p.Get("/tmp/random.log") 167 if err != nil { 168 t.Fatal(err) 169 } 170 require.Equal(t, int64(17623), pos) 171 p.(*positions).save() 172 out, err := readPositionsFile(Config{ 173 PositionsFile: temp, 174 IgnoreInvalidYaml: true, 175 ReadOnly: true, 176 }, log.NewNopLogger()) 177 178 require.NoError(t, err) 179 require.Equal(t, map[string]string{ 180 "/tmp/random.log": "17623", 181 }, out) 182 183 }