github.com/Jeffail/benthos/v3@v3.65.0/lib/input/generate_test.go (about)

     1  package input
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/Jeffail/benthos/v3/lib/types"
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  func TestBloblangInterval(t *testing.T) {
    15  	ctx, done := context.WithTimeout(context.Background(), time.Millisecond*80)
    16  	defer done()
    17  
    18  	conf := NewBloblangConfig()
    19  	conf.Mapping = `root = "hello world"`
    20  	conf.Interval = "50ms"
    21  
    22  	b, err := newBloblang(types.NoopMgr(), conf)
    23  	require.NoError(t, err)
    24  
    25  	err = b.ConnectWithContext(ctx)
    26  	require.NoError(t, err)
    27  
    28  	// First read is immediate.
    29  	m, _, err := b.ReadWithContext(ctx)
    30  	require.NoError(t, err)
    31  	require.Equal(t, 1, m.Len())
    32  	assert.Equal(t, "hello world", string(m.Get(0).Get()))
    33  
    34  	// Second takes 50ms.
    35  	m, _, err = b.ReadWithContext(ctx)
    36  	require.NoError(t, err)
    37  	require.Equal(t, 1, m.Len())
    38  	assert.Equal(t, "hello world", string(m.Get(0).Get()))
    39  
    40  	// Third takes another 50ms and therefore times out.
    41  	_, _, err = b.ReadWithContext(ctx)
    42  	assert.EqualError(t, err, "action timed out")
    43  
    44  	b.CloseAsync()
    45  }
    46  
    47  func TestBloblangZeroInterval(t *testing.T) {
    48  	conf := NewBloblangConfig()
    49  	conf.Mapping = `root = "hello world"`
    50  	conf.Interval = "0s"
    51  	_, err := newBloblang(types.NoopMgr(), conf)
    52  	require.NoError(t, err)
    53  }
    54  
    55  func TestBloblangCron(t *testing.T) {
    56  	t.Skip()
    57  
    58  	ctx, done := context.WithTimeout(context.Background(), time.Millisecond*1100)
    59  	defer done()
    60  
    61  	conf := NewBloblangConfig()
    62  	conf.Mapping = `root = "hello world"`
    63  	conf.Interval = "@every 1s"
    64  
    65  	b, err := newBloblang(types.NoopMgr(), conf)
    66  	require.NoError(t, err)
    67  	assert.NotNil(t, b.schedule)
    68  	assert.NotNil(t, b.location)
    69  
    70  	err = b.ConnectWithContext(ctx)
    71  	require.NoError(t, err)
    72  
    73  	// First takes 1s so.
    74  	m, _, err := b.ReadWithContext(ctx)
    75  	require.NoError(t, err)
    76  	require.Equal(t, 1, m.Len())
    77  	assert.Equal(t, "hello world", string(m.Get(0).Get()))
    78  
    79  	// Second takes another 1s and therefore times out.
    80  	_, _, err = b.ReadWithContext(ctx)
    81  	assert.EqualError(t, err, "action timed out")
    82  
    83  	b.CloseAsync()
    84  }
    85  
    86  func TestBloblangMapping(t *testing.T) {
    87  	ctx, done := context.WithTimeout(context.Background(), time.Millisecond*100)
    88  	defer done()
    89  
    90  	conf := NewBloblangConfig()
    91  	conf.Mapping = `root = {
    92  		"id": count("docs")
    93  	}`
    94  	conf.Interval = "1ms"
    95  
    96  	b, err := newBloblang(types.NoopMgr(), conf)
    97  	require.NoError(t, err)
    98  
    99  	err = b.ConnectWithContext(ctx)
   100  	require.NoError(t, err)
   101  
   102  	for i := 0; i < 10; i++ {
   103  		m, _, err := b.ReadWithContext(ctx)
   104  		require.NoError(t, err)
   105  		require.Equal(t, 1, m.Len())
   106  		assert.Equal(t, fmt.Sprintf(`{"id":%v}`, i+1), string(m.Get(0).Get()))
   107  	}
   108  }
   109  
   110  func TestBloblangRemaining(t *testing.T) {
   111  	ctx, done := context.WithTimeout(context.Background(), time.Millisecond*100)
   112  	defer done()
   113  
   114  	conf := NewBloblangConfig()
   115  	conf.Mapping = `root = "foobar"`
   116  	conf.Interval = "1ms"
   117  	conf.Count = 10
   118  
   119  	b, err := newBloblang(types.NoopMgr(), conf)
   120  	require.NoError(t, err)
   121  
   122  	err = b.ConnectWithContext(ctx)
   123  	require.NoError(t, err)
   124  
   125  	for i := 0; i < 10; i++ {
   126  		m, _, err := b.ReadWithContext(ctx)
   127  		require.NoError(t, err)
   128  		require.Equal(t, 1, m.Len())
   129  		assert.Equal(t, "foobar", string(m.Get(0).Get()))
   130  	}
   131  
   132  	_, _, err = b.ReadWithContext(ctx)
   133  	assert.EqualError(t, err, "type was closed")
   134  
   135  	_, _, err = b.ReadWithContext(ctx)
   136  	assert.EqualError(t, err, "type was closed")
   137  
   138  	_, _, err = b.ReadWithContext(ctx)
   139  	assert.EqualError(t, err, "type was closed")
   140  }
   141  
   142  func TestBloblangUnbounded(t *testing.T) {
   143  	ctx, done := context.WithTimeout(context.Background(), time.Millisecond*100)
   144  	defer done()
   145  
   146  	conf := NewBloblangConfig()
   147  	conf.Mapping = `root = "foobar"`
   148  	conf.Interval = "0s"
   149  
   150  	b, err := newBloblang(types.NoopMgr(), conf)
   151  	require.NoError(t, err)
   152  
   153  	err = b.ConnectWithContext(ctx)
   154  	require.NoError(t, err)
   155  
   156  	for i := 0; i < 10; i++ {
   157  		m, _, err := b.ReadWithContext(ctx)
   158  		require.NoError(t, err)
   159  		require.Equal(t, 1, m.Len())
   160  		assert.Equal(t, "foobar", string(m.Get(0).Get()))
   161  	}
   162  
   163  	b.CloseAsync()
   164  	require.NoError(t, b.WaitForClose(time.Second))
   165  }
   166  
   167  func TestBloblangUnboundedEmpty(t *testing.T) {
   168  	ctx, done := context.WithTimeout(context.Background(), time.Millisecond*100)
   169  	defer done()
   170  
   171  	conf := NewBloblangConfig()
   172  	conf.Mapping = `root = "foobar"`
   173  	conf.Interval = ""
   174  
   175  	b, err := newBloblang(types.NoopMgr(), conf)
   176  	require.NoError(t, err)
   177  
   178  	err = b.ConnectWithContext(ctx)
   179  	require.NoError(t, err)
   180  
   181  	for i := 0; i < 10; i++ {
   182  		m, _, err := b.ReadWithContext(ctx)
   183  		require.NoError(t, err)
   184  		require.Equal(t, 1, m.Len())
   185  		assert.Equal(t, "foobar", string(m.Get(0).Get()))
   186  	}
   187  
   188  	b.CloseAsync()
   189  	require.NoError(t, b.WaitForClose(time.Second))
   190  }