github.com/jonaz/heapster@v1.3.0-beta.0.0.20170208112634-cd3c15ca3d29/events/sinks/elasticsearch/driver_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 elasticsearch
    16  
    17  import (
    18  	"encoding/json"
    19  	"fmt"
    20  	"testing"
    21  	"time"
    22  
    23  	"github.com/stretchr/testify/assert"
    24  	"gopkg.in/olivere/elastic.v3"
    25  	esCommon "k8s.io/heapster/common/elasticsearch"
    26  	"k8s.io/heapster/events/core"
    27  	kube_api "k8s.io/kubernetes/pkg/api"
    28  	kube_api_unversioned "k8s.io/kubernetes/pkg/api/unversioned"
    29  )
    30  
    31  type dataSavedToES struct {
    32  	data string
    33  }
    34  
    35  type fakeESSink struct {
    36  	core.EventSink
    37  	savedData []dataSavedToES
    38  }
    39  
    40  var FakeESSink fakeESSink
    41  
    42  func SaveDataIntoES_Stub(date time.Time, sinkData []interface{}) error {
    43  	for _, data := range sinkData {
    44  		jsonItems, err := json.Marshal(data)
    45  		if err != nil {
    46  			return fmt.Errorf("failed to transform the items to json : %s", err)
    47  		}
    48  		FakeESSink.savedData = append(FakeESSink.savedData, dataSavedToES{string(jsonItems)})
    49  	}
    50  	return nil
    51  }
    52  
    53  // Returns a fake ES sink.
    54  func NewFakeSink() fakeESSink {
    55  	savedData := make([]dataSavedToES, 0)
    56  	return fakeESSink{
    57  		&elasticSearchSink{
    58  			saveData:  SaveDataIntoES_Stub,
    59  			flushData: func() error { return nil },
    60  			esSvc: esCommon.ElasticSearchService{
    61  				EsClient:    &elastic.Client{},
    62  				ClusterName: esCommon.ESClusterName,
    63  			},
    64  		},
    65  		savedData,
    66  	}
    67  }
    68  
    69  func TestStoreDataEmptyInput(t *testing.T) {
    70  	fakeSink := NewFakeSink()
    71  	dataBatch := core.EventBatch{}
    72  	fakeSink.ExportEvents(&dataBatch)
    73  	assert.Equal(t, 0, len(fakeSink.savedData))
    74  }
    75  
    76  func TestStoreMultipleDataInput(t *testing.T) {
    77  	fakeSink := NewFakeSink()
    78  	timestamp := time.Now()
    79  	now := time.Now()
    80  	event1 := kube_api.Event{
    81  		Message:        "event1",
    82  		Count:          100,
    83  		LastTimestamp:  kube_api_unversioned.NewTime(now),
    84  		FirstTimestamp: kube_api_unversioned.NewTime(now),
    85  	}
    86  	event2 := kube_api.Event{
    87  		Message:        "event2",
    88  		Count:          101,
    89  		LastTimestamp:  kube_api_unversioned.NewTime(now),
    90  		FirstTimestamp: kube_api_unversioned.NewTime(now),
    91  	}
    92  	data := core.EventBatch{
    93  		Timestamp: timestamp,
    94  		Events: []*kube_api.Event{
    95  			&event1,
    96  			&event2,
    97  		},
    98  	}
    99  	fakeSink.ExportEvents(&data)
   100  	// expect msg string
   101  	assert.Equal(t, 2, len(FakeESSink.savedData))
   102  
   103  	var expectMsgTemplate = [2]string{
   104  		`{"Count":100,"Metadata":{"creationTimestamp":null},"InvolvedObject":{},"Source":{},"FirstOccurrenceTimestamp":%s,"LastOccurrenceTimestamp":%s,"Message":"event1","Reason":"","Type":"","EventTags":{"cluster_name":"default","eventID":"","hostname":""}}`,
   105  		`{"Count":101,"Metadata":{"creationTimestamp":null},"InvolvedObject":{},"Source":{},"FirstOccurrenceTimestamp":%s,"LastOccurrenceTimestamp":%s,"Message":"event2","Reason":"","Type":"","EventTags":{"cluster_name":"default","eventID":"","hostname":""}}`,
   106  	}
   107  
   108  	msgsString := fmt.Sprintf("%s", FakeESSink.savedData)
   109  	ts, _ := json.Marshal(kube_api_unversioned.NewTime(now).Time.UTC())
   110  
   111  	for _, mgsTemplate := range expectMsgTemplate {
   112  		expectMsg := fmt.Sprintf(mgsTemplate, ts, ts)
   113  		assert.Contains(t, msgsString, expectMsg)
   114  	}
   115  
   116  	FakeESSink = fakeESSink{}
   117  }