github.com/mongodb/grip@v0.0.0-20240213223901-f906268d82b9/send/inmemory_test.go (about) 1 package send 2 3 import ( 4 "fmt" 5 "io" 6 "testing" 7 8 "github.com/mongodb/grip/level" 9 "github.com/mongodb/grip/message" 10 "github.com/stretchr/testify/suite" 11 ) 12 13 type InMemorySuite struct { 14 maxCap int 15 msgs []message.Composer 16 sender *InMemorySender 17 suite.Suite 18 } 19 20 func (s *InMemorySuite) msgsToString(msgs []message.Composer) []string { 21 strs := make([]string, 0, len(msgs)) 22 for _, msg := range msgs { 23 str, err := s.sender.Formatter()(msg) 24 s.Require().NoError(err) 25 strs = append(strs, str) 26 } 27 return strs 28 } 29 30 func (s *InMemorySuite) msgsToRaw(msgs []message.Composer) []interface{} { 31 raw := make([]interface{}, 0, len(msgs)) 32 for _, msg := range msgs { 33 raw = append(raw, msg.Raw()) 34 } 35 return raw 36 } 37 38 func TestInMemorySuite(t *testing.T) { 39 suite.Run(t, new(InMemorySuite)) 40 } 41 42 func (s *InMemorySuite) SetupTest() { 43 s.maxCap = 10 44 info := LevelInfo{Default: level.Debug, Threshold: level.Debug} 45 sender, err := NewInMemorySender("inmemory", info, s.maxCap) 46 s.Require().NoError(err) 47 s.Require().NotNil(sender) 48 s.sender = sender.(*InMemorySender) 49 s.Require().Empty(s.sender.buffer) 50 s.Require().Equal(readHeadNone, s.sender.readHead) 51 s.Require().False(s.sender.readHeadCaughtUp) 52 s.Require().Equal(0, s.sender.writeHead) 53 s.Require().Zero(s.sender.totalBytesSent) 54 55 s.msgs = make([]message.Composer, 2*s.maxCap) 56 for i := range s.msgs { 57 s.msgs[i] = message.NewDefaultMessage(info.Default, fmt.Sprint(i)) 58 } 59 } 60 61 func (s *InMemorySuite) TestInvalidCapacityErrors() { 62 badCap := -1 63 sender, err := NewInMemorySender("inmemory", LevelInfo{Default: level.Debug, Threshold: level.Debug}, badCap) 64 s.Require().Error(err) 65 s.Require().Nil(sender) 66 } 67 68 func (s *InMemorySuite) TestSendIgnoresMessagesWithPrioritiesBelowThreshold() { 69 msg := message.NewDefaultMessage(level.Trace, "foo") 70 s.sender.Send(msg) 71 s.Assert().Equal(0, len(s.sender.buffer)) 72 } 73 74 func (s *InMemorySuite) TestGetEmptyBuffer() { 75 s.Assert().Empty(s.sender.Get()) 76 } 77 78 func (s *InMemorySuite) TestGetCountInvalidCount() { 79 msgs, n, err := s.sender.GetCount(-1) 80 s.Error(err) 81 s.Zero(n) 82 s.Nil(msgs) 83 84 msgs, n, err = s.sender.GetCount(0) 85 s.Error(err) 86 s.Zero(n) 87 s.Nil(msgs) 88 } 89 90 func (s *InMemorySuite) TestGetCountOne() { 91 for i := 0; i < s.maxCap-1; i++ { 92 s.sender.Send(s.msgs[i]) 93 } 94 for i := 0; i < s.maxCap-1; i++ { 95 msgs, n, err := s.sender.GetCount(1) 96 s.Require().NoError(err) 97 s.Require().Equal(1, n) 98 s.Equal(s.msgs[i], msgs[0]) 99 } 100 101 s.sender.Send(s.msgs[s.maxCap]) 102 103 msgs, n, err := s.sender.GetCount(1) 104 s.Require().NoError(err) 105 s.Require().Equal(1, n) 106 s.Equal(s.msgs[s.maxCap], msgs[0]) 107 108 msgs, n, err = s.sender.GetCount(1) 109 s.Require().Error(io.EOF, err) 110 s.Require().Equal(0, n) 111 s.Empty(msgs) 112 } 113 114 func (s *InMemorySuite) TestGetCountMultiple() { 115 for i := 0; i < s.maxCap; i++ { 116 s.sender.Send(s.msgs[i]) 117 } 118 119 for count := 1; count <= s.maxCap; count++ { 120 s.sender.ResetRead() 121 for i := 0; i < s.maxCap; i += count { 122 msgs, n, err := s.sender.GetCount(count) 123 s.Require().NoError(err) 124 remaining := count 125 start := i 126 end := start + count 127 if end > s.maxCap { 128 end = s.maxCap 129 remaining = end - start 130 } 131 s.Equal(remaining, n) 132 s.Equal(s.msgs[start:end], msgs) 133 } 134 s.True(s.sender.readHeadCaughtUp) 135 136 _, _, err := s.sender.GetCount(count) 137 s.Require().Equal(io.EOF, err) 138 } 139 } 140 141 func (s *InMemorySuite) TestGetCountMultipleWithOverflow() { 142 for _, msg := range s.msgs { 143 s.sender.Send(msg) 144 } 145 146 for count := 1; count <= s.maxCap; count++ { 147 s.sender.ResetRead() 148 for i := 0; i < s.maxCap; i += count { 149 msgs, n, err := s.sender.GetCount(count) 150 s.Require().NoError(err) 151 remaining := count 152 start := len(s.msgs) - s.maxCap + i 153 end := start + count 154 if end > len(s.msgs) { 155 end = len(s.msgs) 156 remaining = end - start 157 } 158 s.Equal(remaining, n) 159 s.Equal(s.msgs[start:end], msgs) 160 } 161 s.True(s.sender.readHeadCaughtUp) 162 163 _, _, err := s.sender.GetCount(count) 164 s.Require().Equal(io.EOF, err) 165 } 166 } 167 168 func (s *InMemorySuite) TestGetCountTruncated() { 169 s.sender.Send(s.msgs[0]) 170 s.sender.Send(s.msgs[1]) 171 172 msgs, n, err := s.sender.GetCount(1) 173 s.Require().NoError(err) 174 s.Equal(1, n) 175 s.Equal(s.msgs[0], msgs[0]) 176 s.Require().False(s.sender.readHeadCaughtUp) 177 178 for i := 0; i < s.maxCap; i++ { 179 s.Require().NotEqual(readHeadTruncated, s.sender.readHead) 180 s.sender.Send(s.msgs[i]) 181 } 182 s.Require().Equal(readHeadTruncated, s.sender.readHead) 183 _, _, err = s.sender.GetCount(1) 184 s.Require().Equal(ErrorTruncated, err) 185 } 186 187 func (s *InMemorySuite) TestGetCountWithCatchupTruncated() { 188 s.sender.Send(s.msgs[0]) 189 msgs, n, err := s.sender.GetCount(1) 190 s.Require().NoError(err) 191 s.Equal(1, n) 192 s.Equal(s.msgs[0], msgs[0]) 193 s.True(s.sender.readHeadCaughtUp) 194 195 for i := 0; i < s.maxCap; i++ { 196 s.Require().NotEqual(readHeadTruncated, s.sender.readHead) 197 s.sender.Send(s.msgs[i]) 198 s.Require().False(s.sender.readHeadCaughtUp) 199 } 200 s.Require().False(s.sender.readHeadCaughtUp) 201 s.Require().NotEqual(readHeadTruncated, s.sender.readHead) 202 203 s.sender.Send(s.msgs[0]) 204 s.Require().False(s.sender.readHeadCaughtUp) 205 s.Require().Equal(readHeadTruncated, s.sender.readHead) 206 207 _, _, err = s.sender.GetCount(1) 208 s.Equal(ErrorTruncated, err) 209 } 210 211 func (s *InMemorySuite) TestGetCountWithCatchupWithOverflowTruncated() { 212 for i := 0; i < s.maxCap; i++ { 213 s.sender.Send(s.msgs[i]) 214 } 215 for i := 0; i < s.maxCap; i++ { 216 msgs, n, err := s.sender.GetCount(1) 217 s.Require().NoError(err) 218 s.Equal(1, n) 219 s.Equal(s.msgs[i], msgs[0]) 220 } 221 s.Require().True(s.sender.readHeadCaughtUp) 222 223 for i := 0; i < s.maxCap+1; i++ { 224 s.Require().NotEqual(readHeadTruncated, s.sender.readHead) 225 s.sender.Send(s.msgs[i]) 226 s.Require().False(s.sender.readHeadCaughtUp) 227 } 228 s.Require().Equal(readHeadTruncated, s.sender.readHead) 229 230 _, _, err := s.sender.GetCount(1) 231 s.Equal(ErrorTruncated, err) 232 } 233 234 func (s *InMemorySuite) TestGetCountWithOverflowTruncated() { 235 for i := 0; i < s.maxCap; i++ { 236 s.sender.Send(s.msgs[i]) 237 } 238 for i := 0; i < s.maxCap; i++ { 239 msgs, n, err := s.sender.GetCount(1) 240 s.Require().NoError(err) 241 s.Equal(1, n) 242 s.Equal(s.msgs[i], msgs[0]) 243 } 244 s.Require().True(s.sender.readHeadCaughtUp) 245 246 for i := 0; i < s.maxCap+1; i++ { 247 s.Require().NotEqual(readHeadTruncated, s.sender.readHead) 248 s.sender.Send(s.msgs[i]) 249 s.Require().False(s.sender.readHeadCaughtUp) 250 } 251 s.Require().Equal(readHeadTruncated, s.sender.readHead) 252 253 _, _, err := s.sender.GetCount(1) 254 s.Equal(ErrorTruncated, err) 255 } 256 257 func (s *InMemorySuite) TestGetCountWithWritesAfterEOF() { 258 s.sender.Send(s.msgs[0]) 259 msgs, n, err := s.sender.GetCount(1) 260 s.Require().NoError(err) 261 s.Equal(1, n) 262 s.Equal(s.msgs[0], msgs[0]) 263 s.True(s.sender.readHeadCaughtUp) 264 _, _, err = s.sender.GetCount(1) 265 s.Equal(io.EOF, err) 266 267 s.sender.Send(s.msgs[1]) 268 s.False(s.sender.readHeadCaughtUp) 269 msgs, n, err = s.sender.GetCount(1) 270 s.Require().NoError(err) 271 s.Equal(1, n) 272 s.Equal(s.msgs[1], msgs[0]) 273 s.True(s.sender.readHeadCaughtUp) 274 _, _, err = s.sender.GetCount(1) 275 s.Equal(io.EOF, err) 276 } 277 278 func (s *InMemorySuite) TestResetRead() { 279 for i := 0; i < s.maxCap-1; i++ { 280 s.sender.Send(s.msgs[i]) 281 } 282 283 var err error 284 var n int 285 var msgs []message.Composer 286 for i := 0; i < s.maxCap-1; i++ { 287 msgs, n, err = s.sender.GetCount(1) 288 s.Require().NoError(err) 289 s.Require().Equal(1, n) 290 s.Equal(s.msgs[i], msgs[0]) 291 } 292 s.True(s.sender.readHeadCaughtUp) 293 294 _, _, err = s.sender.GetCount(1) 295 s.Equal(io.EOF, err) 296 297 s.sender.ResetRead() 298 s.Equal(readHeadNone, s.sender.readHead) 299 s.False(s.sender.readHeadCaughtUp) 300 301 for i := 0; i < s.maxCap-1; i++ { 302 msgs, n, err = s.sender.GetCount(1) 303 s.Require().NoError(err) 304 s.Require().Equal(1, n) 305 s.Equal(s.msgs[i], msgs[0]) 306 } 307 308 _, _, err = s.sender.GetCount(1) 309 s.Require().Error(io.EOF, err) 310 } 311 312 func (s *InMemorySuite) TestGetCountEmptyBuffer() { 313 msgs, n, err := s.sender.GetCount(1) 314 s.Require().Equal(io.EOF, err) 315 s.Zero(n) 316 s.Empty(msgs) 317 } 318 319 func (s *InMemorySuite) TestGetWithOverflow() { 320 for i, msg := range s.msgs { 321 s.sender.Send(msg) 322 found := s.sender.Get() 323 324 if i < s.maxCap { 325 for j := 0; j < i+1; j++ { 326 s.Assert().Equal(s.msgs[j], found[j]) 327 } 328 } else { 329 for j := 0; j < s.maxCap; j++ { 330 s.Assert().Equal(s.msgs[i+1-s.maxCap+j], found[j]) 331 } 332 } 333 } 334 } 335 336 func (s *InMemorySuite) TestGetStringEmptyBuffer() { 337 str, err := s.sender.GetString() 338 s.Assert().NoError(err) 339 s.Assert().Empty(str) 340 } 341 342 func (s *InMemorySuite) TestGetStringWithOverflow() { 343 for i, msg := range s.msgs { 344 s.sender.Send(msg) 345 found, err := s.sender.GetString() 346 s.Require().NoError(err) 347 348 var expected []string 349 if i+1 < s.maxCap { 350 s.Require().Equal(i+1, len(found)) 351 expected = s.msgsToString(s.msgs[:i+1]) 352 } else { 353 s.Require().Equal(s.maxCap, len(found)) 354 expected = s.msgsToString(s.msgs[i+1-s.maxCap : i+1]) 355 } 356 s.Require().Equal(len(expected), len(found)) 357 358 for j := 0; j < len(found); j++ { 359 s.Assert().Equal(expected[j], found[j]) 360 } 361 } 362 } 363 364 func (s *InMemorySuite) TestGetRawEmptyBuffer() { 365 s.Assert().Empty(s.sender.GetRaw()) 366 } 367 368 func (s *InMemorySuite) TestGetRawWithOverflow() { 369 for i, msg := range s.msgs { 370 s.sender.Send(msg) 371 found := s.sender.GetRaw() 372 var expected []interface{} 373 374 if i+1 < s.maxCap { 375 s.Require().Equal(i+1, len(found)) 376 expected = s.msgsToRaw(s.msgs[:i+1]) 377 } else { 378 s.Require().Equal(s.maxCap, len(found)) 379 expected = s.msgsToRaw(s.msgs[i+1-s.maxCap : i+1]) 380 } 381 382 s.Assert().Equal(len(expected), len(found)) 383 for j := 0; j < len(found); j++ { 384 s.Assert().Equal(expected[j], found[j]) 385 } 386 } 387 } 388 389 func (s *InMemorySuite) TestTotalBytes() { 390 var totalBytes int64 391 for _, msg := range s.msgs { 392 s.sender.Send(msg) 393 totalBytes += int64(len(msg.String())) 394 s.Assert().Equal(totalBytes, s.sender.TotalBytesSent()) 395 } 396 }