github.com/google/cadvisor@v0.49.1/utils/timed_store_test.go (about)

     1  // Copyright 2014 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 utils
    16  
    17  import (
    18  	"testing"
    19  	"time"
    20  
    21  	"github.com/stretchr/testify/assert"
    22  )
    23  
    24  func createTime(id int) time.Time {
    25  	var zero time.Time
    26  	return zero.Add(time.Duration(id+1) * time.Second)
    27  }
    28  
    29  func expectSize(t *testing.T, sb *TimedStore, expectedSize int) {
    30  	if sb.Size() != expectedSize {
    31  		t.Errorf("Expected size %v, got %v", expectedSize, sb.Size())
    32  	}
    33  }
    34  
    35  func expectAllElements(t *testing.T, sb *TimedStore, expected []int) {
    36  	size := sb.Size()
    37  	els := make([]interface{}, size)
    38  	for i := 0; i < size; i++ {
    39  		els[i] = sb.Get(size - i - 1)
    40  	}
    41  	expectElements(t, []interface{}(els), expected)
    42  }
    43  
    44  func expectElements(t *testing.T, actual []interface{}, expected []int) {
    45  	if len(actual) != len(expected) {
    46  		t.Errorf("Expected elements %v, got %v", expected, actual)
    47  		return
    48  	}
    49  	for i, el := range actual {
    50  		if el.(int) != expected[i] {
    51  			t.Errorf("Expected elements %v, got %v", expected, actual)
    52  			return
    53  		}
    54  	}
    55  }
    56  
    57  func TestAdd(t *testing.T) {
    58  	sb := NewTimedStore(5*time.Second, 100)
    59  
    60  	// Add 1.
    61  	sb.Add(createTime(0), 0)
    62  	expectSize(t, sb, 1)
    63  	expectAllElements(t, sb, []int{0})
    64  
    65  	// Fill the buffer.
    66  	for i := 1; i <= 5; i++ {
    67  		expectSize(t, sb, i)
    68  		sb.Add(createTime(i), i)
    69  	}
    70  	expectSize(t, sb, 5)
    71  	expectAllElements(t, sb, []int{1, 2, 3, 4, 5})
    72  
    73  	// Add more than is available in the buffer
    74  	sb.Add(createTime(6), 6)
    75  	expectSize(t, sb, 5)
    76  	expectAllElements(t, sb, []int{2, 3, 4, 5, 6})
    77  
    78  	// Replace all elements.
    79  	for i := 7; i <= 10; i++ {
    80  		sb.Add(createTime(i), i)
    81  	}
    82  	expectSize(t, sb, 5)
    83  	expectAllElements(t, sb, []int{6, 7, 8, 9, 10})
    84  }
    85  
    86  func TestGet(t *testing.T) {
    87  	sb := NewTimedStore(5*time.Second, -1)
    88  	sb.Add(createTime(1), 1)
    89  	sb.Add(createTime(2), 2)
    90  	sb.Add(createTime(3), 3)
    91  	expectSize(t, sb, 3)
    92  
    93  	assert := assert.New(t)
    94  	assert.Equal(sb.Get(0).(int), 3)
    95  	assert.Equal(sb.Get(1).(int), 2)
    96  	assert.Equal(sb.Get(2).(int), 1)
    97  }
    98  
    99  func TestInTimeRange(t *testing.T) {
   100  	sb := NewTimedStore(5*time.Second, -1)
   101  	assert := assert.New(t)
   102  
   103  	var empty time.Time
   104  
   105  	// No elements.
   106  	assert.Empty(sb.InTimeRange(createTime(0), createTime(5), 10))
   107  	assert.Empty(sb.InTimeRange(createTime(0), empty, 10))
   108  	assert.Empty(sb.InTimeRange(empty, createTime(5), 10))
   109  	assert.Empty(sb.InTimeRange(empty, empty, 10))
   110  
   111  	// One element.
   112  	sb.Add(createTime(1), 1)
   113  	expectSize(t, sb, 1)
   114  	expectElements(t, sb.InTimeRange(createTime(0), createTime(5), 10), []int{1})
   115  	expectElements(t, sb.InTimeRange(createTime(1), createTime(5), 10), []int{1})
   116  	expectElements(t, sb.InTimeRange(createTime(0), createTime(1), 10), []int{1})
   117  	expectElements(t, sb.InTimeRange(createTime(1), createTime(1), 10), []int{1})
   118  	assert.Empty(sb.InTimeRange(createTime(2), createTime(5), 10))
   119  
   120  	// Two element.
   121  	sb.Add(createTime(2), 2)
   122  	expectSize(t, sb, 2)
   123  	expectElements(t, sb.InTimeRange(createTime(0), createTime(5), 10), []int{1, 2})
   124  	expectElements(t, sb.InTimeRange(createTime(1), createTime(5), 10), []int{1, 2})
   125  	expectElements(t, sb.InTimeRange(createTime(0), createTime(2), 10), []int{1, 2})
   126  	expectElements(t, sb.InTimeRange(createTime(1), createTime(2), 10), []int{1, 2})
   127  	expectElements(t, sb.InTimeRange(createTime(1), createTime(1), 10), []int{1})
   128  	expectElements(t, sb.InTimeRange(createTime(2), createTime(2), 10), []int{2})
   129  	assert.Empty(sb.InTimeRange(createTime(3), createTime(5), 10))
   130  
   131  	// Many elements.
   132  	sb.Add(createTime(3), 3)
   133  	sb.Add(createTime(4), 4)
   134  	expectSize(t, sb, 4)
   135  	expectElements(t, sb.InTimeRange(createTime(0), createTime(5), 10), []int{1, 2, 3, 4})
   136  	expectElements(t, sb.InTimeRange(createTime(0), createTime(5), 10), []int{1, 2, 3, 4})
   137  	expectElements(t, sb.InTimeRange(createTime(1), createTime(5), 10), []int{1, 2, 3, 4})
   138  	expectElements(t, sb.InTimeRange(createTime(0), createTime(4), 10), []int{1, 2, 3, 4})
   139  	expectElements(t, sb.InTimeRange(createTime(1), createTime(4), 10), []int{1, 2, 3, 4})
   140  	expectElements(t, sb.InTimeRange(createTime(0), createTime(2), 10), []int{1, 2})
   141  	expectElements(t, sb.InTimeRange(createTime(1), createTime(2), 10), []int{1, 2})
   142  	expectElements(t, sb.InTimeRange(createTime(2), createTime(3), 10), []int{2, 3})
   143  	expectElements(t, sb.InTimeRange(createTime(3), createTime(4), 10), []int{3, 4})
   144  	expectElements(t, sb.InTimeRange(createTime(3), createTime(5), 10), []int{3, 4})
   145  	assert.Empty(sb.InTimeRange(createTime(5), createTime(5), 10))
   146  
   147  	// Start and end time does't ignore maxResults.
   148  	expectElements(t, sb.InTimeRange(createTime(1), createTime(5), 1), []int{4})
   149  
   150  	// No start time.
   151  	expectElements(t, sb.InTimeRange(empty, createTime(5), 10), []int{1, 2, 3, 4})
   152  	expectElements(t, sb.InTimeRange(empty, createTime(4), 10), []int{1, 2, 3, 4})
   153  	expectElements(t, sb.InTimeRange(empty, createTime(3), 10), []int{1, 2, 3})
   154  	expectElements(t, sb.InTimeRange(empty, createTime(2), 10), []int{1, 2})
   155  	expectElements(t, sb.InTimeRange(empty, createTime(1), 10), []int{1})
   156  
   157  	// No end time.
   158  	expectElements(t, sb.InTimeRange(createTime(0), empty, 10), []int{1, 2, 3, 4})
   159  	expectElements(t, sb.InTimeRange(createTime(1), empty, 10), []int{1, 2, 3, 4})
   160  	expectElements(t, sb.InTimeRange(createTime(2), empty, 10), []int{2, 3, 4})
   161  	expectElements(t, sb.InTimeRange(createTime(3), empty, 10), []int{3, 4})
   162  	expectElements(t, sb.InTimeRange(createTime(4), empty, 10), []int{4})
   163  
   164  	// No start or end time.
   165  	expectElements(t, sb.InTimeRange(empty, empty, 10), []int{1, 2, 3, 4})
   166  
   167  	// Start after data.
   168  	assert.Empty(sb.InTimeRange(createTime(5), createTime(5), 10))
   169  	assert.Empty(sb.InTimeRange(createTime(5), empty, 10))
   170  
   171  	// End before data.
   172  	assert.Empty(sb.InTimeRange(createTime(0), createTime(0), 10))
   173  	assert.Empty(sb.InTimeRange(empty, createTime(0), 10))
   174  }
   175  
   176  func TestInTimeRangeWithLimit(t *testing.T) {
   177  	sb := NewTimedStore(5*time.Second, -1)
   178  	sb.Add(createTime(1), 1)
   179  	sb.Add(createTime(2), 2)
   180  	sb.Add(createTime(3), 3)
   181  	sb.Add(createTime(4), 4)
   182  	expectSize(t, sb, 4)
   183  
   184  	var empty time.Time
   185  
   186  	// Limit cuts off from latest timestamp.
   187  	expectElements(t, sb.InTimeRange(empty, empty, 4), []int{1, 2, 3, 4})
   188  	expectElements(t, sb.InTimeRange(empty, empty, 3), []int{2, 3, 4})
   189  	expectElements(t, sb.InTimeRange(empty, empty, 2), []int{3, 4})
   190  	expectElements(t, sb.InTimeRange(empty, empty, 1), []int{4})
   191  	assert.Empty(t, sb.InTimeRange(empty, empty, 0))
   192  }
   193  
   194  func TestLimitedSize(t *testing.T) {
   195  	sb := NewTimedStore(time.Hour, 5)
   196  
   197  	// Add 1.
   198  	sb.Add(createTime(0), 0)
   199  	expectSize(t, sb, 1)
   200  	expectAllElements(t, sb, []int{0})
   201  
   202  	// Fill the buffer.
   203  	for i := 1; i <= 5; i++ {
   204  		expectSize(t, sb, i)
   205  		sb.Add(createTime(i), i)
   206  	}
   207  	expectSize(t, sb, 5)
   208  	expectAllElements(t, sb, []int{1, 2, 3, 4, 5})
   209  
   210  	// Add more than is available in the buffer
   211  	sb.Add(createTime(6), 6)
   212  	expectSize(t, sb, 5)
   213  	expectAllElements(t, sb, []int{2, 3, 4, 5, 6})
   214  
   215  	// Replace all elements.
   216  	for i := 7; i <= 10; i++ {
   217  		sb.Add(createTime(i), i)
   218  	}
   219  	expectSize(t, sb, 5)
   220  	expectAllElements(t, sb, []int{6, 7, 8, 9, 10})
   221  }