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 }