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  }