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  }