| 
									
										
										
										
											2019-09-27 22:18:24 +08:00
										 |  |  | package testdatasource | 
					
						
							| 
									
										
										
										
											2019-03-16 02:07:20 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 	"context" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2019-03-16 02:07:20 +08:00
										 |  |  | 	"testing" | 
					
						
							|  |  |  | 	"time" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 	"github.com/grafana/grafana-plugin-sdk-go/backend" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana-plugin-sdk-go/data" | 
					
						
							| 
									
										
										
										
											2019-03-16 02:07:20 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/components/simplejson" | 
					
						
							| 
									
										
										
										
											2021-03-08 14:02:49 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/plugins" | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 	"github.com/stretchr/testify/assert" | 
					
						
							| 
									
										
										
										
											2020-12-04 04:31:01 +08:00
										 |  |  | 	"github.com/stretchr/testify/require" | 
					
						
							| 
									
										
										
										
											2019-03-16 02:07:20 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestTestdataScenarios(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 	p := &testDataPlugin{} | 
					
						
							| 
									
										
										
										
											2019-03-16 03:33:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 	t.Run("random walk ", func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2020-12-04 04:31:01 +08:00
										 |  |  | 		t.Run("Should start at the requested value", func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2021-03-08 14:02:49 +08:00
										 |  |  | 			timeRange := plugins.DataTimeRange{From: "5m", To: "now", Now: time.Now()} | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			model := simplejson.New() | 
					
						
							|  |  |  | 			model.Set("startValue", 1.234) | 
					
						
							|  |  |  | 			modelBytes, err := model.MarshalJSON() | 
					
						
							|  |  |  | 			require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			query := backend.DataQuery{ | 
					
						
							|  |  |  | 				RefID: "A", | 
					
						
							|  |  |  | 				TimeRange: backend.TimeRange{ | 
					
						
							|  |  |  | 					From: timeRange.MustGetFrom(), | 
					
						
							|  |  |  | 					To:   timeRange.MustGetTo(), | 
					
						
							| 
									
										
										
										
											2019-03-16 03:33:45 +08:00
										 |  |  | 				}, | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 				Interval:      100 * time.Millisecond, | 
					
						
							|  |  |  | 				MaxDataPoints: 100, | 
					
						
							|  |  |  | 				JSON:          modelBytes, | 
					
						
							| 
									
										
										
										
											2019-03-16 03:33:45 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 			req := &backend.QueryDataRequest{ | 
					
						
							|  |  |  | 				PluginContext: backend.PluginContext{}, | 
					
						
							|  |  |  | 				Queries:       []backend.DataQuery{query}, | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-03-16 03:33:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 			resp, err := p.handleRandomWalkScenario(context.Background(), req) | 
					
						
							|  |  |  | 			require.NoError(t, err) | 
					
						
							|  |  |  | 			require.NotNil(t, resp) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			dResp, exists := resp.Responses[query.RefID] | 
					
						
							|  |  |  | 			require.True(t, exists) | 
					
						
							|  |  |  | 			require.NoError(t, dResp.Error) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			require.Len(t, dResp.Frames, 1) | 
					
						
							|  |  |  | 			frame := dResp.Frames[0] | 
					
						
							|  |  |  | 			require.Len(t, frame.Fields, 2) | 
					
						
							|  |  |  | 			require.Equal(t, "time", frame.Fields[0].Name) | 
					
						
							|  |  |  | 			require.Equal(t, "A-series", frame.Fields[1].Name) | 
					
						
							|  |  |  | 			val, ok := frame.Fields[1].ConcreteAt(0) | 
					
						
							|  |  |  | 			require.True(t, ok) | 
					
						
							|  |  |  | 			require.Equal(t, 1.234, val) | 
					
						
							| 
									
										
										
										
											2019-03-16 03:33:45 +08:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-04 04:31:01 +08:00
										 |  |  | 	t.Run("random walk table", func(t *testing.T) { | 
					
						
							|  |  |  | 		t.Run("Should return a table that looks like value/min/max", func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2021-03-08 14:02:49 +08:00
										 |  |  | 			timeRange := plugins.DataTimeRange{From: "5m", To: "now", Now: time.Now()} | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			model := simplejson.New() | 
					
						
							|  |  |  | 			modelBytes, err := model.MarshalJSON() | 
					
						
							|  |  |  | 			require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			query := backend.DataQuery{ | 
					
						
							|  |  |  | 				RefID: "A", | 
					
						
							|  |  |  | 				TimeRange: backend.TimeRange{ | 
					
						
							|  |  |  | 					From: timeRange.MustGetFrom(), | 
					
						
							|  |  |  | 					To:   timeRange.MustGetTo(), | 
					
						
							| 
									
										
										
										
											2019-03-16 03:33:45 +08:00
										 |  |  | 				}, | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 				Interval:      100 * time.Millisecond, | 
					
						
							|  |  |  | 				MaxDataPoints: 100, | 
					
						
							|  |  |  | 				JSON:          modelBytes, | 
					
						
							| 
									
										
										
										
											2019-03-16 03:33:45 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 			req := &backend.QueryDataRequest{ | 
					
						
							|  |  |  | 				PluginContext: backend.PluginContext{}, | 
					
						
							|  |  |  | 				Queries:       []backend.DataQuery{query}, | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-03-16 02:07:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 			resp, err := p.handleRandomWalkTableScenario(context.Background(), req) | 
					
						
							|  |  |  | 			require.NoError(t, err) | 
					
						
							|  |  |  | 			require.NotNil(t, resp) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			dResp, exists := resp.Responses[query.RefID] | 
					
						
							|  |  |  | 			require.True(t, exists) | 
					
						
							|  |  |  | 			require.NoError(t, dResp.Error) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			require.Len(t, dResp.Frames, 1) | 
					
						
							|  |  |  | 			frame := dResp.Frames[0] | 
					
						
							|  |  |  | 			require.Greater(t, frame.Rows(), 50) | 
					
						
							|  |  |  | 			require.Len(t, frame.Fields, 5) | 
					
						
							|  |  |  | 			require.Equal(t, "Time", frame.Fields[0].Name) | 
					
						
							|  |  |  | 			require.Equal(t, "Value", frame.Fields[1].Name) | 
					
						
							|  |  |  | 			require.Equal(t, "Min", frame.Fields[2].Name) | 
					
						
							|  |  |  | 			require.Equal(t, "Max", frame.Fields[3].Name) | 
					
						
							|  |  |  | 			require.Equal(t, "Info", frame.Fields[4].Name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			for i := 0; i < frame.Rows(); i++ { | 
					
						
							|  |  |  | 				value, ok := frame.ConcreteAt(1, i) | 
					
						
							|  |  |  | 				require.True(t, ok) | 
					
						
							|  |  |  | 				min, ok := frame.ConcreteAt(2, i) | 
					
						
							|  |  |  | 				require.True(t, ok) | 
					
						
							|  |  |  | 				max, ok := frame.ConcreteAt(3, i) | 
					
						
							|  |  |  | 				require.True(t, ok) | 
					
						
							| 
									
										
										
										
											2019-03-16 02:07:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-04 04:31:01 +08:00
										 |  |  | 				require.Less(t, min, value) | 
					
						
							|  |  |  | 				require.Greater(t, max, value) | 
					
						
							| 
									
										
										
										
											2019-03-16 03:33:45 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-04 04:31:01 +08:00
										 |  |  | 		t.Run("Should return a table with some nil values", func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2021-03-08 14:02:49 +08:00
										 |  |  | 			timeRange := plugins.DataTimeRange{From: "5m", To: "now", Now: time.Now()} | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			model := simplejson.New() | 
					
						
							|  |  |  | 			model.Set("withNil", true) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			modelBytes, err := model.MarshalJSON() | 
					
						
							|  |  |  | 			require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			query := backend.DataQuery{ | 
					
						
							|  |  |  | 				RefID: "A", | 
					
						
							|  |  |  | 				TimeRange: backend.TimeRange{ | 
					
						
							|  |  |  | 					From: timeRange.MustGetFrom(), | 
					
						
							|  |  |  | 					To:   timeRange.MustGetTo(), | 
					
						
							| 
									
										
										
										
											2019-03-16 03:33:45 +08:00
										 |  |  | 				}, | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 				Interval:      100 * time.Millisecond, | 
					
						
							|  |  |  | 				MaxDataPoints: 100, | 
					
						
							|  |  |  | 				JSON:          modelBytes, | 
					
						
							| 
									
										
										
										
											2019-03-16 03:33:45 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 			req := &backend.QueryDataRequest{ | 
					
						
							|  |  |  | 				PluginContext: backend.PluginContext{}, | 
					
						
							|  |  |  | 				Queries:       []backend.DataQuery{query}, | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-03-16 03:33:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 			resp, err := p.handleRandomWalkTableScenario(context.Background(), req) | 
					
						
							|  |  |  | 			require.NoError(t, err) | 
					
						
							|  |  |  | 			require.NotNil(t, resp) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			dResp, exists := resp.Responses[query.RefID] | 
					
						
							|  |  |  | 			require.True(t, exists) | 
					
						
							|  |  |  | 			require.NoError(t, dResp.Error) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			require.Len(t, dResp.Frames, 1) | 
					
						
							|  |  |  | 			frame := dResp.Frames[0] | 
					
						
							|  |  |  | 			require.Greater(t, frame.Rows(), 50) | 
					
						
							|  |  |  | 			require.Len(t, frame.Fields, 5) | 
					
						
							|  |  |  | 			require.Equal(t, "Time", frame.Fields[0].Name) | 
					
						
							|  |  |  | 			require.Equal(t, "Value", frame.Fields[1].Name) | 
					
						
							|  |  |  | 			require.Equal(t, "Min", frame.Fields[2].Name) | 
					
						
							|  |  |  | 			require.Equal(t, "Max", frame.Fields[3].Name) | 
					
						
							|  |  |  | 			require.Equal(t, "Info", frame.Fields[4].Name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			valNil := false | 
					
						
							|  |  |  | 			minNil := false | 
					
						
							|  |  |  | 			maxNil := false | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			for i := 0; i < frame.Rows(); i++ { | 
					
						
							|  |  |  | 				_, ok := frame.ConcreteAt(1, i) | 
					
						
							|  |  |  | 				if !ok { | 
					
						
							|  |  |  | 					valNil = true | 
					
						
							| 
									
										
										
										
											2019-03-16 03:33:45 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				_, ok = frame.ConcreteAt(2, i) | 
					
						
							|  |  |  | 				if !ok { | 
					
						
							|  |  |  | 					minNil = true | 
					
						
							| 
									
										
										
										
											2019-03-16 03:33:45 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				_, ok = frame.ConcreteAt(3, i) | 
					
						
							|  |  |  | 				if !ok { | 
					
						
							|  |  |  | 					maxNil = true | 
					
						
							| 
									
										
										
										
											2019-03-16 03:33:45 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-03-16 02:07:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 			require.True(t, valNil) | 
					
						
							|  |  |  | 			require.True(t, minNil) | 
					
						
							|  |  |  | 			require.True(t, maxNil) | 
					
						
							| 
									
										
										
										
											2019-03-16 03:33:45 +08:00
										 |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2019-03-16 02:07:20 +08:00
										 |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-08-21 22:50:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-04 04:31:01 +08:00
										 |  |  | func TestParseLabels(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 	expectedTags := data.Labels{ | 
					
						
							| 
									
										
										
										
											2020-12-04 04:31:01 +08:00
										 |  |  | 		"job":      "foo", | 
					
						
							|  |  |  | 		"instance": "bar", | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 	tcs := []struct { | 
					
						
							|  |  |  | 		model map[string]interface{} | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		{model: map[string]interface{}{ | 
					
						
							| 
									
										
										
										
											2020-12-04 04:31:01 +08:00
										 |  |  | 			"labels": `{job="foo", instance="bar"}`, | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 		}}, | 
					
						
							|  |  |  | 		{model: map[string]interface{}{ | 
					
						
							| 
									
										
										
										
											2020-12-04 04:31:01 +08:00
										 |  |  | 			"labels": `job=foo, instance=bar`, | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 		}}, | 
					
						
							|  |  |  | 		{model: map[string]interface{}{ | 
					
						
							|  |  |  | 			"labels": `job = foo,instance = bar`, | 
					
						
							|  |  |  | 		}}, | 
					
						
							| 
									
										
										
										
											2020-12-04 04:31:01 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-30 01:33:23 +08:00
										 |  |  | 	for i, tc := range tcs { | 
					
						
							|  |  |  | 		model := simplejson.NewFromAny(tc.model) | 
					
						
							|  |  |  | 		assert.Equal(t, expectedTags, parseLabels(model), fmt.Sprintf("Actual tags in test case %d doesn't match expected tags", i+1)) | 
					
						
							| 
									
										
										
										
											2020-12-04 04:31:01 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-08-21 22:50:13 +08:00
										 |  |  | } |