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  }