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 }