github.com/aclisp/heapster@v0.19.2-0.20160613100040-51756f899a96/metrics/api/v1/api_test.go (about)

     1  // Copyright 2015 Google Inc. All Rights Reserved.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package v1
    16  
    17  import (
    18  	"testing"
    19  	"time"
    20  
    21  	fuzz "github.com/google/gofuzz"
    22  	"github.com/stretchr/testify/assert"
    23  	"github.com/stretchr/testify/require"
    24  
    25  	"k8s.io/heapster/metrics/core"
    26  	metricsink "k8s.io/heapster/metrics/sinks/metric"
    27  )
    28  
    29  func TestApiFactory(t *testing.T) {
    30  	metricSink := metricsink.MetricSink{}
    31  	api := NewApi(false, &metricSink)
    32  	as := assert.New(t)
    33  	for _, metric := range core.StandardMetrics {
    34  		val, exists := api.gkeMetrics[metric.Name]
    35  		as.True(exists)
    36  		as.Equal(val, metric.MetricDescriptor)
    37  	}
    38  	for _, metric := range core.LabeledMetrics {
    39  		val, exists := api.gkeMetrics[metric.Name]
    40  		as.True(exists)
    41  		as.Equal(val, metric.MetricDescriptor)
    42  	}
    43  
    44  	for _, metric := range core.LabeledMetrics {
    45  		val, exists := api.gkeMetrics[metric.Name]
    46  		as.True(exists)
    47  		as.Equal(val, metric.MetricDescriptor)
    48  	}
    49  	labels := append(core.CommonLabels(), core.ContainerLabels()...)
    50  	labels = append(labels, core.PodLabels()...)
    51  	for _, label := range labels {
    52  		val, exists := api.gkeLabels[label.Key]
    53  		as.True(exists)
    54  		as.Equal(val, label)
    55  	}
    56  }
    57  
    58  func TestFuzzInput(t *testing.T) {
    59  	api := NewApi(false, nil)
    60  	data := []*core.DataBatch{}
    61  	fuzz.New().NilChance(0).Fuzz(&data)
    62  	_ = api.processMetricsRequest(data)
    63  }
    64  
    65  func generateMetricSet(objectType string, labels []core.LabelDescriptor) *core.MetricSet {
    66  	ms := &core.MetricSet{
    67  		CreateTime:     time.Now().Add(-time.Hour),
    68  		ScrapeTime:     time.Now(),
    69  		Labels:         make(map[string]string),
    70  		MetricValues:   make(map[string]core.MetricValue),
    71  		LabeledMetrics: make([]core.LabeledMetric, len(labels)),
    72  	}
    73  	// Add all necessary labels
    74  	for _, label := range labels {
    75  		ms.Labels[label.Key] = "test-value"
    76  	}
    77  	ms.Labels[core.LabelMetricSetType.Key] = objectType
    78  	// Add all standard metrics
    79  	for _, metric := range core.StandardMetrics {
    80  		ms.MetricValues[metric.Name] = core.MetricValue{
    81  			MetricType: core.MetricCumulative,
    82  			ValueType:  core.ValueInt64,
    83  			IntValue:   -1,
    84  		}
    85  	}
    86  	// Add all labeled metrics
    87  	for _, metric := range core.LabeledMetrics {
    88  		lm := core.LabeledMetric{
    89  			Name: metric.Name,
    90  			MetricValue: core.MetricValue{
    91  				MetricType: core.MetricCumulative,
    92  				ValueType:  core.ValueInt64,
    93  				IntValue:   -1,
    94  			},
    95  			Labels: make(map[string]string),
    96  		}
    97  		for _, label := range core.MetricLabels() {
    98  			lm.Labels[label.Key] = "test-value"
    99  		}
   100  		ms.LabeledMetrics = append(ms.LabeledMetrics, lm)
   101  	}
   102  	return ms
   103  }
   104  
   105  func TestRealInput(t *testing.T) {
   106  	api := NewApi(false, nil)
   107  	dataBatch := []*core.DataBatch{
   108  		{
   109  			Timestamp:  time.Now(),
   110  			MetricSets: map[string]*core.MetricSet{},
   111  		},
   112  		{
   113  			Timestamp:  time.Now().Add(-time.Minute),
   114  			MetricSets: map[string]*core.MetricSet{},
   115  		},
   116  	}
   117  	labels := append(core.CommonLabels(), core.ContainerLabels()...)
   118  	labels = append(labels, core.PodLabels()...)
   119  	for _, entry := range dataBatch {
   120  		// Add a pod, container, node, systemcontainer
   121  		entry.MetricSets[core.MetricSetTypePod] = generateMetricSet(core.MetricSetTypePod, labels)
   122  		entry.MetricSets[core.MetricSetTypeNode] = generateMetricSet(core.MetricSetTypeNode, labels)
   123  		entry.MetricSets[core.MetricSetTypePodContainer] = generateMetricSet(core.MetricSetTypePodContainer, labels)
   124  		entry.MetricSets[core.MetricSetTypeSystemContainer] = generateMetricSet(core.MetricSetTypeSystemContainer, labels)
   125  	}
   126  	ts := api.processMetricsRequest(dataBatch)
   127  	type expectation struct {
   128  		count       int
   129  		extraLabels bool
   130  	}
   131  	expectedMetrics := make(map[string]*expectation)
   132  	for _, metric := range core.StandardMetrics {
   133  		expectedMetrics[metric.Name] = &expectation{
   134  			count:       4,
   135  			extraLabels: false,
   136  		}
   137  	}
   138  	for _, metric := range core.LabeledMetrics {
   139  		expectedMetrics[metric.Name] = &expectation{
   140  			count:       4,
   141  			extraLabels: true,
   142  		}
   143  	}
   144  	as := assert.New(t)
   145  	for _, elem := range ts {
   146  		// validate labels
   147  		for _, label := range labels {
   148  			val, exists := elem.Labels[label.Key]
   149  			as.True(exists, "%q label does not exist", label.Key)
   150  			if label.Key == core.LabelMetricSetType.Key {
   151  				continue
   152  			}
   153  			if label.Key == core.LabelContainerName.Key && val != "machine" && val != "/pod" {
   154  				as.Equal(val, "test-value", "%q label's value is %q, expected 'test-value'", label.Key, val)
   155  			}
   156  		}
   157  		for mname, points := range elem.Metrics {
   158  			ex := expectedMetrics[mname]
   159  			require.NotNil(t, ex)
   160  			as.NotEqual(ex, 0)
   161  			ex.count--
   162  			for _, point := range points {
   163  				as.Equal(point.Value, -1)
   164  				if !ex.extraLabels {
   165  					continue
   166  				}
   167  				as.Equal(len(core.MetricLabels()), len(point.Labels))
   168  				for _, label := range core.MetricLabels() {
   169  					val, exists := point.Labels[label.Key]
   170  					as.True(exists, "expected label %q to be found - %+v", label.Key, point.Labels)
   171  					as.Equal(val, "test-value")
   172  				}
   173  			}
   174  		}
   175  
   176  	}
   177  }