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 }