github.com/google/cadvisor@v0.49.1/events/handler_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 events 16 17 import ( 18 "testing" 19 "time" 20 21 info "github.com/google/cadvisor/info/v1" 22 23 "github.com/stretchr/testify/assert" 24 ) 25 26 func createOldTime(t *testing.T) time.Time { 27 const longForm = "Jan 2, 2006 at 3:04pm (MST)" 28 linetime, err := time.Parse(longForm, "Feb 3, 2013 at 7:54pm (PST)") 29 if err != nil { 30 t.Fatalf("could not format time.Time object") 31 } else { 32 return linetime 33 } 34 return time.Now() 35 } 36 37 // used to convert an OomInstance to an Event object 38 func makeEvent(inTime time.Time, containerName string) *info.Event { 39 return &info.Event{ 40 ContainerName: containerName, 41 Timestamp: inTime, 42 EventType: info.EventOom, 43 } 44 } 45 46 // returns EventManager and Request to use in tests 47 func initializeScenario(t *testing.T) (EventManager, *Request, *info.Event, *info.Event) { 48 fakeEvent := makeEvent(createOldTime(t), "/") 49 fakeEvent2 := makeEvent(time.Now(), "/") 50 51 manager := NewEventManager(DefaultStoragePolicy()) 52 return manager, NewRequest(), fakeEvent, fakeEvent2 53 } 54 55 func TestIsSubcontainer(t *testing.T) { 56 myRequest := NewRequest() 57 myRequest.ContainerName = "/root" 58 rootRequest := NewRequest() 59 rootRequest.ContainerName = "/" 60 61 sameContainerEvent := &info.Event{ 62 ContainerName: "/root", 63 } 64 subContainerEvent := &info.Event{ 65 ContainerName: "/root/subdir", 66 } 67 differentContainerEvent := &info.Event{ 68 ContainerName: "/root-completely-different-container", 69 } 70 71 if isSubcontainer(rootRequest, sameContainerEvent) { 72 t.Errorf("should not have found %v to be a subcontainer of %v", 73 sameContainerEvent, rootRequest) 74 } 75 if !isSubcontainer(myRequest, sameContainerEvent) { 76 t.Errorf("should have found %v and %v had the same container name", 77 myRequest, sameContainerEvent) 78 } 79 if isSubcontainer(myRequest, subContainerEvent) { 80 t.Errorf("should have found %v and %v had different containers", 81 myRequest, subContainerEvent) 82 } 83 84 rootRequest.IncludeSubcontainers = true 85 myRequest.IncludeSubcontainers = true 86 87 if !isSubcontainer(rootRequest, sameContainerEvent) { 88 t.Errorf("should have found %v to be a subcontainer of %v", 89 sameContainerEvent.ContainerName, rootRequest.ContainerName) 90 } 91 if !isSubcontainer(myRequest, sameContainerEvent) { 92 t.Errorf("should have found %v and %v had the same container", 93 myRequest.ContainerName, sameContainerEvent.ContainerName) 94 } 95 if !isSubcontainer(myRequest, subContainerEvent) { 96 t.Errorf("should have found %v was a subcontainer of %v", 97 subContainerEvent.ContainerName, myRequest.ContainerName) 98 } 99 if isSubcontainer(myRequest, differentContainerEvent) { 100 t.Errorf("should have found %v and %v had different containers", 101 myRequest.ContainerName, differentContainerEvent.ContainerName) 102 } 103 } 104 105 func TestWatchEventsDetectsNewEvents(t *testing.T) { 106 myEventHolder, myRequest, fakeEvent, fakeEvent2 := initializeScenario(t) 107 myRequest.EventType[info.EventOom] = true 108 returnEventChannel, err := myEventHolder.WatchEvents(myRequest) 109 assert.NoError(t, err) 110 111 err = myEventHolder.AddEvent(fakeEvent) 112 assert.NoError(t, err) 113 err = myEventHolder.AddEvent(fakeEvent2) 114 assert.NoError(t, err) 115 116 startTime := time.Now() 117 go func() { 118 time.Sleep(5 * time.Second) 119 if time.Since(startTime) > (5 * time.Second) { 120 t.Errorf("Took too long to receive all the events") 121 } 122 }() 123 124 eventsFound := 0 125 go func() { 126 for event := range returnEventChannel.GetChannel() { 127 eventsFound++ 128 if eventsFound == 1 { 129 assert.Equal(t, fakeEvent, event) 130 } else if eventsFound == 2 { 131 assert.Equal(t, fakeEvent2, event) 132 break 133 } 134 } 135 }() 136 } 137 138 func TestAddEventAddsEventsToEventManager(t *testing.T) { 139 myEventHolder, _, fakeEvent, _ := initializeScenario(t) 140 141 err := myEventHolder.AddEvent(fakeEvent) 142 assert.NoError(t, err) 143 144 events, err := myEventHolder.GetEvents(&Request{ 145 EventType: map[info.EventType]bool{info.EventOom: true}, 146 MaxEventsReturned: -1, 147 }) 148 149 assert.NoError(t, err) 150 assert.Len(t, events, 1) 151 assert.Equal(t, fakeEvent, events[0]) 152 } 153 154 func TestGetEventsForOneEvent(t *testing.T) { 155 myEventHolder, myRequest, fakeEvent, fakeEvent2 := initializeScenario(t) 156 myRequest.MaxEventsReturned = 1 157 myRequest.EventType[info.EventOom] = true 158 159 err := myEventHolder.AddEvent(fakeEvent) 160 assert.NoError(t, err) 161 err = myEventHolder.AddEvent(fakeEvent2) 162 assert.NoError(t, err) 163 164 receivedEvents, err := myEventHolder.GetEvents(myRequest) 165 assert.NoError(t, err) 166 assert.Len(t, receivedEvents, 1) 167 assert.Equal(t, fakeEvent2, receivedEvents[0]) 168 } 169 170 func TestGetEventsForTimePeriod(t *testing.T) { 171 myEventHolder, myRequest, fakeEvent, fakeEvent2 := initializeScenario(t) 172 myRequest.StartTime = time.Now().Add(-1 * time.Second * 10) 173 myRequest.EndTime = time.Now().Add(time.Second * 10) 174 myRequest.EventType[info.EventOom] = true 175 176 err := myEventHolder.AddEvent(fakeEvent) 177 assert.NoError(t, err) 178 err = myEventHolder.AddEvent(fakeEvent2) 179 assert.NoError(t, err) 180 181 receivedEvents, err := myEventHolder.GetEvents(myRequest) 182 assert.NoError(t, err) 183 assert.Len(t, receivedEvents, 1) 184 assert.Equal(t, fakeEvent2, receivedEvents[0]) 185 } 186 187 func TestGetEventsForNoTypeRequested(t *testing.T) { 188 myEventHolder, myRequest, fakeEvent, fakeEvent2 := initializeScenario(t) 189 190 err := myEventHolder.AddEvent(fakeEvent) 191 assert.NoError(t, err) 192 err = myEventHolder.AddEvent(fakeEvent2) 193 assert.NoError(t, err) 194 195 receivedEvents, err := myEventHolder.GetEvents(myRequest) 196 assert.NoError(t, err) 197 assert.Len(t, receivedEvents, 0) 198 }