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  }