Path: blob/main/component/discovery/file/file_test.go
4096 views
//go:build !windows12// This should run on windows but windows does not like the tight timing of file creation and deletion.3package file45import (6"os"7"path"8"strings"9"testing"10"time"1112"github.com/grafana/agent/component/discovery"1314"context"1516"github.com/grafana/agent/component"17"github.com/grafana/agent/pkg/util"18"github.com/prometheus/client_golang/prometheus"19"github.com/stretchr/testify/require"20)2122func TestFile(t *testing.T) {23dir := path.Join(os.TempDir(), "agent_testing", "t1")24err := os.MkdirAll(dir, 0755)25require.NoError(t, err)26writeFile(t, dir, "t1.txt")27t.Cleanup(func() {28os.RemoveAll(dir)29})30c := createComponent(t, dir, []string{path.Join(dir, "*.txt")}, nil)31ct := context.Background()32ct, ccl := context.WithTimeout(ct, 5*time.Second)33defer ccl()34c.args.SyncPeriod = 10 * time.Millisecond35go c.Run(ct)36time.Sleep(20 * time.Millisecond)37ct.Done()38foundFiles := c.getWatchedFiles()39require.Len(t, foundFiles, 1)40require.True(t, contains(foundFiles, "t1.txt"))41}4243func TestDirectoryFile(t *testing.T) {44dir := path.Join(os.TempDir(), "agent_testing", "t1")45subdir := path.Join(dir, "subdir")46err := os.MkdirAll(subdir, 0755)47require.NoError(t, err)48writeFile(t, subdir, "t1.txt")49t.Cleanup(func() {50os.RemoveAll(dir)51})52c := createComponent(t, dir, []string{path.Join(dir, "**/")}, nil)53ct := context.Background()54ct, ccl := context.WithTimeout(ct, 5*time.Second)55defer ccl()56c.args.SyncPeriod = 10 * time.Millisecond57go c.Run(ct)58time.Sleep(20 * time.Millisecond)59ct.Done()60foundFiles := c.getWatchedFiles()61require.Len(t, foundFiles, 1)62require.True(t, contains(foundFiles, "t1.txt"))63}6465func TestAddingFile(t *testing.T) {66dir := path.Join(os.TempDir(), "agent_testing", "t2")67err := os.MkdirAll(dir, 0755)68require.NoError(t, err)69writeFile(t, dir, "t1.txt")70t.Cleanup(func() {71os.RemoveAll(dir)72})73c := createComponent(t, dir, []string{path.Join(dir, "*.txt")}, nil)7475ct := context.Background()76ct, ccl := context.WithTimeout(ct, 40*time.Second)77defer ccl()78c.args.SyncPeriod = 10 * time.Millisecond79go c.Run(ct)80time.Sleep(20 * time.Millisecond)81writeFile(t, dir, "t2.txt")82ct.Done()83foundFiles := c.getWatchedFiles()84require.Len(t, foundFiles, 2)85require.True(t, contains(foundFiles, "t1.txt"))86require.True(t, contains(foundFiles, "t2.txt"))87}8889func TestAddingFileInSubDir(t *testing.T) {90dir := path.Join(os.TempDir(), "agent_testing", "t3")91os.MkdirAll(dir, 0755)92writeFile(t, dir, "t1.txt")93t.Cleanup(func() {94os.RemoveAll(dir)95})96c := createComponent(t, dir, []string{path.Join(dir, "**", "*.txt")}, nil)97ct := context.Background()98ct, ccl := context.WithTimeout(ct, 40*time.Second)99defer ccl()100c.args.SyncPeriod = 10 * time.Millisecond101go c.Run(ct)102time.Sleep(20 * time.Millisecond)103writeFile(t, dir, "t2.txt")104subdir := path.Join(dir, "subdir")105os.Mkdir(subdir, 0755)106time.Sleep(20 * time.Millisecond)107err := os.WriteFile(path.Join(subdir, "t3.txt"), []byte("asdf"), 0664)108require.NoError(t, err)109time.Sleep(20 * time.Millisecond)110ct.Done()111foundFiles := c.getWatchedFiles()112require.Len(t, foundFiles, 3)113require.True(t, contains(foundFiles, "t1.txt"))114require.True(t, contains(foundFiles, "t2.txt"))115require.True(t, contains(foundFiles, "t3.txt"))116}117118func TestAddingRemovingFileInSubDir(t *testing.T) {119dir := path.Join(os.TempDir(), "agent_testing", "t3")120os.MkdirAll(dir, 0755)121writeFile(t, dir, "t1.txt")122t.Cleanup(func() {123os.RemoveAll(dir)124})125c := createComponent(t, dir, []string{path.Join(dir, "**", "*.txt")}, nil)126127ct := context.Background()128ct, ccl := context.WithTimeout(ct, 40*time.Second)129defer ccl()130c.args.SyncPeriod = 10 * time.Millisecond131go c.Run(ct)132time.Sleep(20 * time.Millisecond)133writeFile(t, dir, "t2.txt")134subdir := path.Join(dir, "subdir")135os.Mkdir(subdir, 0755)136time.Sleep(100 * time.Millisecond)137err := os.WriteFile(path.Join(subdir, "t3.txt"), []byte("asdf"), 0664)138require.NoError(t, err)139time.Sleep(100 * time.Millisecond)140foundFiles := c.getWatchedFiles()141require.Len(t, foundFiles, 3)142require.True(t, contains(foundFiles, "t1.txt"))143require.True(t, contains(foundFiles, "t2.txt"))144require.True(t, contains(foundFiles, "t3.txt"))145146err = os.RemoveAll(subdir)147require.NoError(t, err)148time.Sleep(1000 * time.Millisecond)149foundFiles = c.getWatchedFiles()150require.Len(t, foundFiles, 2)151require.True(t, contains(foundFiles, "t1.txt"))152require.True(t, contains(foundFiles, "t2.txt"))153}154155func TestExclude(t *testing.T) {156dir := path.Join(os.TempDir(), "agent_testing", "t3")157os.MkdirAll(dir, 0755)158writeFile(t, dir, "t1.txt")159t.Cleanup(func() {160os.RemoveAll(dir)161})162c := createComponent(t, dir, []string{path.Join(dir, "**", "*.txt")}, []string{path.Join(dir, "**", "*.bad")})163ct := context.Background()164ct, ccl := context.WithTimeout(ct, 40*time.Second)165defer ccl()166c.args.SyncPeriod = 10 * time.Millisecond167go c.Run(ct)168time.Sleep(100 * time.Millisecond)169subdir := path.Join(dir, "subdir")170os.Mkdir(subdir, 0755)171writeFile(t, subdir, "t3.txt")172time.Sleep(100 * time.Millisecond)173foundFiles := c.getWatchedFiles()174require.Len(t, foundFiles, 2)175require.True(t, contains(foundFiles, "t1.txt"))176require.True(t, contains(foundFiles, "t3.txt"))177}178179func TestMultiLabels(t *testing.T) {180dir := path.Join(os.TempDir(), "agent_testing", "t3")181os.MkdirAll(dir, 0755)182writeFile(t, dir, "t1.txt")183t.Cleanup(func() {184os.RemoveAll(dir)185})186c := createComponentWithLabels(t, dir, []string{path.Join(dir, "**", "*.txt"), path.Join(dir, "**", "*.txt")}, nil, map[string]string{187"foo": "bar",188"fruit": "apple",189})190c.args.PathTargets[0]["newlabel"] = "test"191ct := context.Background()192ct, ccl := context.WithTimeout(ct, 40*time.Second)193defer ccl()194c.args.SyncPeriod = 10 * time.Millisecond195go c.Run(ct)196time.Sleep(100 * time.Millisecond)197foundFiles := c.getWatchedFiles()198require.Len(t, foundFiles, 2)199require.True(t, contains([]discovery.Target{foundFiles[0]}, "t1.txt"))200require.True(t, contains([]discovery.Target{foundFiles[1]}, "t1.txt"))201}202203func createComponent(t *testing.T, dir string, paths []string, excluded []string) *Component {204return createComponentWithLabels(t, dir, paths, excluded, nil)205}206207func createComponentWithLabels(t *testing.T, dir string, paths []string, excluded []string, labels map[string]string) *Component {208tPaths := make([]discovery.Target, 0)209for _, p := range paths {210tar := discovery.Target{"__path__": p}211for k, v := range labels {212tar[k] = v213}214tPaths = append(tPaths, tar)215}216for _, p := range excluded {217tar := discovery.Target{"__path_exclude__": p}218for k, v := range labels {219tar[k] = v220}221tPaths = append(tPaths, tar)222}223c, err := New(component.Options{224ID: "test",225Logger: util.TestFlowLogger(t),226DataPath: dir,227OnStateChange: func(e component.Exports) {228229},230Registerer: prometheus.DefaultRegisterer,231Tracer: nil,232HTTPListenAddr: "",233HTTPPath: "",234}, Arguments{235PathTargets: tPaths,236SyncPeriod: 1 * time.Second,237})238239require.NoError(t, err)240require.NotNil(t, c)241return c242}243244func contains(sources []discovery.Target, match string) bool {245for _, s := range sources {246p := s["__path__"]247if strings.Contains(p, match) {248return true249}250}251return false252}253254func writeFile(t *testing.T, dir string, name string) {255err := os.WriteFile(path.Join(dir, name), []byte("asdf"), 0664)256require.NoError(t, err)257time.Sleep(20 * time.Millisecond)258}259260261