github.com/Jeffail/benthos/v3@v3.65.0/lib/buffer/parallel/memory_test.go (about)

     1  package parallel
     2  
     3  import (
     4  	"fmt"
     5  	"math/rand"
     6  	"sync"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/Jeffail/benthos/v3/lib/message"
    11  	"github.com/Jeffail/benthos/v3/lib/types"
    12  )
    13  
    14  func TestMemoryBasic(t *testing.T) {
    15  	n := 100
    16  
    17  	block := NewMemory(100000)
    18  
    19  	for i := 0; i < n; i++ {
    20  		if _, err := block.PushMessage(message.New(
    21  			[][]byte{
    22  				[]byte("hello"),
    23  				[]byte("world"),
    24  				[]byte("12345"),
    25  				[]byte(fmt.Sprintf("test%v", i)),
    26  			},
    27  		)); err != nil {
    28  			t.Error(err)
    29  		}
    30  	}
    31  
    32  	for i := 0; i < n; i++ {
    33  		m, ackFunc, err := block.NextMessage()
    34  		if err != nil {
    35  			t.Error(err)
    36  			return
    37  		}
    38  		if m.Len() != 4 {
    39  			t.Errorf("Wrong # parts, %v != %v", m.Len(), 4)
    40  		} else if expected, actual := fmt.Sprintf("test%v", i), string(m.Get(3).Get()); expected != actual {
    41  			t.Errorf("Wrong order of messages, %v != %v", expected, actual)
    42  		}
    43  		if _, err := ackFunc(true); err != nil {
    44  			t.Error(err)
    45  		}
    46  	}
    47  }
    48  
    49  func TestMemoryNearLimit(t *testing.T) {
    50  	n, iter := 50, 5
    51  
    52  	block := NewMemory(2285)
    53  
    54  	for j := 0; j < iter; j++ {
    55  		for i := 0; i < n; i++ {
    56  			if _, err := block.PushMessage(message.New(
    57  				[][]byte{
    58  					[]byte("hello"),
    59  					[]byte("world"),
    60  					[]byte("12345"),
    61  					[]byte(fmt.Sprintf("test%v", i)),
    62  				},
    63  			)); err != nil {
    64  				t.Error(err)
    65  				return
    66  			}
    67  		}
    68  
    69  		for i := 0; i < n; i++ {
    70  			m, ackFunc, err := block.NextMessage()
    71  			if err != nil {
    72  				t.Error(err)
    73  				return
    74  			}
    75  			if m.Len() != 4 {
    76  				t.Errorf("Wrong # parts, %v != %v", m.Len(), 4)
    77  			} else if expected, actual := fmt.Sprintf("test%v", i), string(m.Get(3).Get()); expected != actual {
    78  				t.Errorf("Wrong order of messages, %v != %v", expected, actual)
    79  			}
    80  			if _, err := ackFunc(true); err != nil {
    81  				t.Error(err)
    82  			}
    83  		}
    84  	}
    85  }
    86  
    87  func TestMemoryLoopingRandom(t *testing.T) {
    88  	n, iter := 50, 5
    89  
    90  	block := NewMemory(8000)
    91  
    92  	for j := 0; j < iter; j++ {
    93  		for i := 0; i < n; i++ {
    94  			b := make([]byte, rand.Int()%100)
    95  			for k := range b {
    96  				b[k] = '0'
    97  			}
    98  			if _, err := block.PushMessage(message.New(
    99  				[][]byte{
   100  					b,
   101  					[]byte(fmt.Sprintf("test%v", i)),
   102  				},
   103  			)); err != nil {
   104  				t.Error(err)
   105  			}
   106  		}
   107  
   108  		for i := 0; i < n; i++ {
   109  			m, ackFunc, err := block.NextMessage()
   110  			if err != nil {
   111  				t.Error(err)
   112  				return
   113  			}
   114  			if m.Len() != 2 {
   115  				t.Errorf("Wrong # parts, %v != %v", m.Len(), 4)
   116  				return
   117  			} else if expected, actual := fmt.Sprintf("test%v", i), string(m.Get(1).Get()); expected != actual {
   118  				t.Errorf("Wrong order of messages, %v != %v", expected, actual)
   119  				return
   120  			}
   121  			if _, err := ackFunc(true); err != nil {
   122  				t.Error(err)
   123  			}
   124  		}
   125  	}
   126  }
   127  
   128  func TestMemoryLockStep(t *testing.T) {
   129  	n := 10000
   130  
   131  	block := NewMemory(1000)
   132  
   133  	wg := sync.WaitGroup{}
   134  	wg.Add(1)
   135  
   136  	go func() {
   137  		defer wg.Done()
   138  		for i := 0; i < n; i++ {
   139  			m, ackFunc, err := block.NextMessage()
   140  			if err != nil {
   141  				t.Error(err)
   142  			}
   143  			if m.Len() != 4 {
   144  				t.Errorf("Wrong # parts, %v != %v", m.Len(), 4)
   145  				return
   146  			} else if expected, actual := fmt.Sprintf("test%v", i), string(m.Get(3).Get()); expected != actual {
   147  				t.Errorf("Wrong order of messages, %v != %v", expected, actual)
   148  				return
   149  			}
   150  			if _, err := ackFunc(true); err != nil {
   151  				t.Error(err)
   152  			}
   153  		}
   154  	}()
   155  
   156  	go func() {
   157  		for i := 0; i < n; i++ {
   158  			if _, err := block.PushMessage(message.New(
   159  				[][]byte{
   160  					[]byte("hello"),
   161  					[]byte("world"),
   162  					[]byte("12345"),
   163  					[]byte(fmt.Sprintf("test%v", i)),
   164  				},
   165  			)); err != nil {
   166  				t.Error(err)
   167  			}
   168  		}
   169  	}()
   170  
   171  	wg.Wait()
   172  }
   173  
   174  func TestMemoryAck(t *testing.T) {
   175  	block := NewMemory(1000)
   176  
   177  	block.PushMessage(message.New([][]byte{
   178  		[]byte("1"),
   179  	}))
   180  	block.PushMessage(message.New([][]byte{
   181  		[]byte("2"),
   182  	}))
   183  
   184  	m, ackFunc, err := block.NextMessage()
   185  	if err != nil {
   186  		t.Error(err)
   187  	} else {
   188  		if expected, actual := "1", string(m.Get(0).Get()); expected != actual {
   189  			t.Fatalf("Wrong message contents, %v != %v", expected, actual)
   190  		}
   191  		if _, err := ackFunc(false); err != nil {
   192  			t.Error(err)
   193  		}
   194  	}
   195  
   196  	m, ackFunc, err = block.NextMessage()
   197  	if err != nil {
   198  		t.Error(err)
   199  	} else {
   200  		if expected, actual := "1", string(m.Get(0).Get()); expected != actual {
   201  			t.Fatalf("Wrong message contents, %v != %v", expected, actual)
   202  		}
   203  		if _, err := ackFunc(true); err != nil {
   204  			t.Error(err)
   205  		}
   206  	}
   207  
   208  	m, ackFunc, err = block.NextMessage()
   209  	if err != nil {
   210  		t.Error(err)
   211  	} else {
   212  		if expected, actual := "2", string(m.Get(0).Get()); expected != actual {
   213  			t.Fatalf("Wrong message contents, %v != %v", expected, actual)
   214  		}
   215  		if _, err := ackFunc(true); err != nil {
   216  			t.Error(err)
   217  		}
   218  	}
   219  
   220  	block.Close()
   221  
   222  	if _, err = block.PushMessage(message.New(nil)); err != types.ErrTypeClosed {
   223  		t.Errorf("Wrong error returned: %v != %v", err, types.ErrTypeClosed)
   224  	}
   225  	if _, _, err = block.NextMessage(); err != types.ErrTypeClosed {
   226  		t.Errorf("Wrong error returned: %v != %v", err, types.ErrTypeClosed)
   227  	}
   228  }
   229  
   230  func TestMemoryClose(t *testing.T) {
   231  	block := NewMemory(1000)
   232  
   233  	for i := 0; i < 10; i++ {
   234  		block.PushMessage(message.New([][]byte{
   235  			[]byte("hello world"),
   236  		}))
   237  	}
   238  
   239  	wg := sync.WaitGroup{}
   240  	wg.Add(1)
   241  
   242  	go func() {
   243  		block.CloseOnceEmpty()
   244  		wg.Done()
   245  	}()
   246  
   247  	<-time.After(time.Millisecond * 100)
   248  	for i := 0; i < 10; i++ {
   249  		m, ackFunc, err := block.NextMessage()
   250  		if err != nil {
   251  			t.Error(err)
   252  		} else {
   253  			if expected, actual := "hello world", string(m.Get(0).Get()); expected != actual {
   254  				t.Errorf("Wrong message contents, %v != %v", expected, actual)
   255  			}
   256  			_, _ = ackFunc(true)
   257  			/*
   258  				// TODO: Fix up batched shutdown
   259  				if _, err := ackFunc(true); err != nil {
   260  					t.Error(err)
   261  				}
   262  			*/
   263  		}
   264  	}
   265  
   266  	if _, _, err := block.NextMessage(); err != types.ErrTypeClosed {
   267  		t.Errorf("Wrong error returned: %v != %v", err, types.ErrTypeClosed)
   268  	}
   269  
   270  	wg.Wait()
   271  }
   272  
   273  func TestMemoryCloseWithPending(t *testing.T) {
   274  	block := NewMemory(1000)
   275  
   276  	for i := 0; i < 10; i++ {
   277  		block.PushMessage(message.New([][]byte{
   278  			[]byte("hello world"),
   279  		}))
   280  	}
   281  
   282  	wg := sync.WaitGroup{}
   283  	wg.Add(1)
   284  
   285  	go func() {
   286  		block.CloseOnceEmpty()
   287  		wg.Done()
   288  	}()
   289  
   290  	<-time.After(time.Millisecond * 100)
   291  	for i := 0; i < 10; i++ {
   292  		m, ackFunc, err := block.NextMessage()
   293  		if err != nil {
   294  			t.Error(err)
   295  		} else {
   296  			if expected, actual := "hello world", string(m.Get(0).Get()); expected != actual {
   297  				t.Errorf("Wrong message contents, %v != %v", expected, actual)
   298  			}
   299  			if i < 9 {
   300  				if _, err := ackFunc(true); err != nil {
   301  					t.Error(err)
   302  				}
   303  			}
   304  		}
   305  	}
   306  
   307  	if _, _, err := block.NextMessage(); err != types.ErrTypeClosed {
   308  		t.Errorf("Wrong error returned: %v != %v", err, types.ErrTypeClosed)
   309  	}
   310  
   311  	wg.Wait()
   312  }
   313  
   314  func TestMemoryRejectLargeMessage(t *testing.T) {
   315  	tMsg := message.New(make([][]byte, 1))
   316  	tMsg.Get(0).Set([]byte("hello world this message is too long!"))
   317  
   318  	block := NewMemory(10)
   319  
   320  	_, err := block.PushMessage(tMsg)
   321  	if exp, actual := types.ErrMessageTooLarge, err; exp != actual {
   322  		t.Errorf("Unexpected error: %v != %v", exp, actual)
   323  	}
   324  }