github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/clients/cmd/docker-driver/config_test.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "reflect" 8 "testing" 9 10 "github.com/docker/docker/daemon/logger" 11 "github.com/prometheus/client_golang/prometheus" 12 "github.com/prometheus/common/model" 13 "github.com/stretchr/testify/require" 14 15 "github.com/grafana/loki/clients/pkg/logentry/stages" 16 17 util_log "github.com/grafana/loki/pkg/util/log" 18 ) 19 20 var jobRename = ` 21 - regex: (.*) 22 source_labels: [swarm_stack] 23 target_label: job 24 - regex: ^swarm_stack$ 25 action: labeldrop` 26 27 func Test_relabelConfig(t *testing.T) { 28 29 tests := []struct { 30 name string 31 config string 32 in model.LabelSet 33 out model.LabelSet 34 wantErr bool 35 }{ 36 { 37 "config err", 38 "foo", 39 nil, 40 nil, 41 true, 42 }, 43 { 44 "config err", 45 jobRename, 46 model.LabelSet{"swarm_stack": "foo", "bar": "buzz"}, 47 model.LabelSet{"job": "foo", "bar": "buzz"}, 48 false, 49 }, 50 } 51 for _, tt := range tests { 52 t.Run(tt.name, func(t *testing.T) { 53 got, err := relabelConfig(tt.config, tt.in) 54 if (err != nil) != tt.wantErr { 55 t.Errorf("relabelConfig() error = %v, wantErr %v", err, tt.wantErr) 56 return 57 } 58 require.True(t, got.Equal(tt.out)) 59 }) 60 } 61 } 62 63 var pipelineString = ` 64 - regex: 65 expression: '(level|lvl|severity)=(?P<level>\w+)' 66 - labels: 67 level: 68 ` 69 var pipeline = PipelineConfig{ 70 PipelineStages: []interface{}{ 71 map[interface{}]interface{}{ 72 "regex": map[interface{}]interface{}{ 73 "expression": "(level|lvl|severity)=(?P<level>\\w+)", 74 }, 75 }, 76 map[interface{}]interface{}{ 77 "labels": map[interface{}]interface{}{ 78 "level": nil, 79 }, 80 }, 81 }, 82 } 83 84 func Test_parsePipeline(t *testing.T) { 85 f, err := ioutil.TempFile("/tmp", "Test_parsePipeline") 86 if err != nil { 87 t.Fatal(err) 88 } 89 defer os.Remove(f.Name()) 90 91 _, err = f.Write([]byte(fmt.Sprintf("pipeline_stages:\n%s", pipelineString))) 92 if err != nil { 93 t.Fatal(err) 94 } 95 tests := []struct { 96 name string 97 logCtx logger.Info 98 want PipelineConfig 99 wantErr bool 100 }{ 101 {"no config", logger.Info{Config: map[string]string{}}, PipelineConfig{}, false}, 102 {"double config", logger.Info{Config: map[string]string{cfgPipelineStagesFileKey: "", cfgPipelineStagesKey: ""}}, PipelineConfig{}, true}, 103 {"string config", logger.Info{Config: map[string]string{cfgPipelineStagesKey: pipelineString}}, pipeline, false}, 104 {"string wrong", logger.Info{Config: map[string]string{cfgPipelineStagesKey: "pipelineString"}}, PipelineConfig{}, true}, 105 {"file config", logger.Info{Config: map[string]string{cfgPipelineStagesFileKey: f.Name()}}, pipeline, false}, 106 {"file wrong", logger.Info{Config: map[string]string{cfgPipelineStagesFileKey: "foo"}}, PipelineConfig{}, true}, 107 } 108 for _, tt := range tests { 109 t.Run(tt.name, func(t *testing.T) { 110 got, err := parsePipeline(tt.logCtx) 111 if (err != nil) != tt.wantErr { 112 t.Errorf("parsePipeline() error = %v, wantErr %v", err, tt.wantErr) 113 return 114 } 115 if !reflect.DeepEqual(got, tt.want) { 116 t.Errorf("parsePipeline() = %v, want %v", got, tt.want) 117 } 118 119 // all configs are supposed to be valid 120 name := "foo" 121 _, err = stages.NewPipeline(util_log.Logger, got.PipelineStages, &name, prometheus.DefaultRegisterer) 122 if err != nil { 123 t.Error(err) 124 } 125 126 }) 127 } 128 }