github.com/Jeffail/benthos/v3@v3.65.0/lib/processor/archive_test.go (about) 1 package processor 2 3 import ( 4 "archive/tar" 5 "archive/zip" 6 "bytes" 7 "fmt" 8 "io" 9 "reflect" 10 "testing" 11 12 "github.com/Jeffail/benthos/v3/internal/batch" 13 "github.com/Jeffail/benthos/v3/lib/log" 14 "github.com/Jeffail/benthos/v3/lib/message" 15 "github.com/Jeffail/benthos/v3/lib/metrics" 16 "github.com/Jeffail/benthos/v3/lib/types" 17 "github.com/stretchr/testify/require" 18 ) 19 20 func TestArchiveBadAlgo(t *testing.T) { 21 conf := NewConfig() 22 conf.Archive.Format = "does not exist" 23 24 testLog := log.Noop() 25 26 _, err := NewArchive(conf, nil, testLog, metrics.Noop()) 27 if err == nil { 28 t.Error("Expected error from bad algo") 29 } 30 } 31 32 func TestArchiveTar(t *testing.T) { 33 conf := NewConfig() 34 conf.Archive.Format = "tar" 35 conf.Archive.Path = "foo-${!meta(\"path\")}" 36 37 testLog := log.Noop() 38 39 exp := [][]byte{ 40 []byte("hello world first part"), 41 []byte("hello world second part"), 42 []byte("third part"), 43 []byte("fourth"), 44 []byte("5"), 45 } 46 47 proc, err := NewArchive(conf, nil, testLog, metrics.Noop()) 48 if err != nil { 49 t.Fatal(err) 50 } 51 52 msg := message.New(exp) 53 msg.Iter(func(i int, p types.Part) error { 54 p.Metadata().Set("path", fmt.Sprintf("bar%v", i)) 55 return nil 56 }) 57 msgs, res := proc.ProcessMessage(msg) 58 if len(msgs) != 1 { 59 t.Error("Archive failed") 60 } else if res != nil { 61 t.Errorf("Expected nil response: %v", res) 62 } 63 if msgs[0].Len() != 1 { 64 t.Fatal("More parts than expected") 65 } 66 67 act := [][]byte{} 68 69 buf := bytes.NewBuffer(msgs[0].Get(0).Get()) 70 tr := tar.NewReader(buf) 71 i := 0 72 for { 73 var hdr *tar.Header 74 hdr, err = tr.Next() 75 if err == io.EOF { 76 // end of tar archive 77 break 78 } 79 if err != nil { 80 t.Fatal(err) 81 } 82 83 newPartBuf := bytes.Buffer{} 84 if _, err = newPartBuf.ReadFrom(tr); err != nil { 85 t.Fatal(err) 86 } 87 88 act = append(act, newPartBuf.Bytes()) 89 if exp, act := fmt.Sprintf("foo-bar%v", i), hdr.FileInfo().Name(); exp != act { 90 t.Errorf("Wrong filename: %v != %v", act, exp) 91 } 92 i++ 93 } 94 95 require.Equal(t, 5, batch.CollapsedCount(msgs[0].Get(0))) 96 if !reflect.DeepEqual(exp, act) { 97 t.Errorf("Unexpected output: %s != %s", act, exp) 98 } 99 } 100 101 func TestArchiveZip(t *testing.T) { 102 conf := NewConfig() 103 conf.Archive.Format = "zip" 104 105 testLog := log.Noop() 106 107 exp := [][]byte{ 108 []byte("hello world first part"), 109 []byte("hello world second part"), 110 []byte("third part"), 111 []byte("fourth"), 112 []byte("5"), 113 } 114 115 proc, err := NewArchive(conf, nil, testLog, metrics.Noop()) 116 if err != nil { 117 t.Fatal(err) 118 } 119 120 msgs, res := proc.ProcessMessage(message.New(exp)) 121 if len(msgs) != 1 { 122 t.Error("Archive failed") 123 } else if res != nil { 124 t.Errorf("Expected nil response: %v", res) 125 } 126 if msgs[0].Len() != 1 { 127 t.Fatal("More parts than expected") 128 } 129 130 act := [][]byte{} 131 132 buf := bytes.NewReader(msgs[0].Get(0).Get()) 133 zr, err := zip.NewReader(buf, int64(buf.Len())) 134 if err != nil { 135 t.Fatal(err) 136 } 137 for _, f := range zr.File { 138 fr, err := f.Open() 139 if err != nil { 140 t.Fatal(err) 141 } 142 143 newPartBuf := bytes.Buffer{} 144 if _, err = newPartBuf.ReadFrom(fr); err != nil { 145 t.Fatal(err) 146 } 147 148 act = append(act, newPartBuf.Bytes()) 149 } 150 151 require.Equal(t, 5, batch.CollapsedCount(msgs[0].Get(0))) 152 if !reflect.DeepEqual(exp, act) { 153 t.Errorf("Unexpected output: %s != %s", act, exp) 154 } 155 } 156 157 func TestArchiveLines(t *testing.T) { 158 conf := NewConfig() 159 conf.Archive.Format = "lines" 160 161 testLog := log.Noop() 162 163 proc, err := NewArchive(conf, nil, testLog, metrics.Noop()) 164 if err != nil { 165 t.Fatal(err) 166 } 167 168 msgs, res := proc.ProcessMessage(message.New([][]byte{ 169 []byte("hello world first part"), 170 []byte("hello world second part"), 171 []byte("third part"), 172 []byte("fourth"), 173 []byte("5"), 174 })) 175 if len(msgs) != 1 { 176 t.Error("Archive failed") 177 } else if res != nil { 178 t.Errorf("Expected nil response: %v", res) 179 } 180 if msgs[0].Len() != 1 { 181 t.Fatal("More parts than expected") 182 } 183 184 require.Equal(t, 5, batch.CollapsedCount(msgs[0].Get(0))) 185 exp := [][]byte{ 186 []byte(`hello world first part 187 hello world second part 188 third part 189 fourth 190 5`), 191 } 192 if act := message.GetAllBytes(msgs[0]); !reflect.DeepEqual(exp, act) { 193 t.Errorf("Unexpected output: %s != %s", act, exp) 194 } 195 } 196 197 func TestArchiveConcatenate(t *testing.T) { 198 conf := NewConfig() 199 conf.Archive.Format = "concatenate" 200 201 testLog := log.Noop() 202 203 proc, err := NewArchive(conf, nil, testLog, metrics.Noop()) 204 if err != nil { 205 t.Fatal(err) 206 } 207 208 msgs, res := proc.ProcessMessage(message.New([][]byte{ 209 {}, 210 {0}, 211 {1, 2}, 212 {3, 4, 5}, 213 {6}, 214 })) 215 if len(msgs) != 1 { 216 t.Error("Archive failed") 217 } else if res != nil { 218 t.Errorf("Expected nil response: %v", res) 219 } 220 if msgs[0].Len() != 1 { 221 t.Fatal("More parts than expected") 222 } 223 224 require.Equal(t, 5, batch.CollapsedCount(msgs[0].Get(0))) 225 exp := [][]byte{ 226 {0, 1, 2, 3, 4, 5, 6}, 227 } 228 if act := message.GetAllBytes(msgs[0]); !reflect.DeepEqual(exp, act) { 229 t.Errorf("Unexpected output: %s != %s", act, exp) 230 } 231 } 232 233 func TestArchiveJSONArray(t *testing.T) { 234 conf := NewConfig() 235 conf.Archive.Format = "json_array" 236 237 proc, err := NewArchive(conf, nil, log.Noop(), metrics.Noop()) 238 if err != nil { 239 t.Fatal(err) 240 } 241 242 msgs, res := proc.ProcessMessage(message.New([][]byte{ 243 []byte(`{"foo":"bar"}`), 244 []byte(`5`), 245 []byte(`"testing 123"`), 246 []byte(`["nested","array"]`), 247 []byte(`true`), 248 })) 249 if len(msgs) != 1 { 250 t.Error("Archive failed") 251 } else if res != nil { 252 t.Errorf("Expected nil response: %v", res) 253 } 254 if msgs[0].Len() != 1 { 255 t.Fatal("More parts than expected") 256 } 257 258 require.Equal(t, 5, batch.CollapsedCount(msgs[0].Get(0))) 259 exp := [][]byte{[]byte( 260 `[{"foo":"bar"},5,"testing 123",["nested","array"],true]`, 261 )} 262 if act := message.GetAllBytes(msgs[0]); !reflect.DeepEqual(exp, act) { 263 t.Errorf("Unexpected output: %s != %s", act, exp) 264 } 265 } 266 267 func TestArchiveBinary(t *testing.T) { 268 conf := NewConfig() 269 conf.Archive.Format = "binary" 270 271 testLog := log.Noop() 272 proc, err := NewArchive(conf, nil, testLog, metrics.Noop()) 273 if err != nil { 274 t.Error(err) 275 return 276 } 277 278 testMsg := message.New([][]byte{[]byte("hello"), []byte("world")}) 279 testMsgBlob := message.ToBytes(testMsg) 280 281 if msgs, _ := proc.ProcessMessage(testMsg); len(msgs) == 1 { 282 if lParts := msgs[0].Len(); lParts != 1 { 283 t.Errorf("Wrong number of parts returned: %v != %v", lParts, 1) 284 } 285 if !reflect.DeepEqual(testMsgBlob, msgs[0].Get(0).Get()) { 286 t.Errorf("Returned message did not match: %s != %s", msgs[0].Get(0).Get(), testMsgBlob) 287 } 288 } else { 289 t.Error("Failed on good message") 290 } 291 } 292 293 func TestArchiveEmpty(t *testing.T) { 294 conf := NewConfig() 295 296 testLog := log.Noop() 297 proc, err := NewArchive(conf, nil, testLog, metrics.Noop()) 298 if err != nil { 299 t.Error(err) 300 return 301 } 302 303 msgs, _ := proc.ProcessMessage(message.New([][]byte{})) 304 if len(msgs) != 0 { 305 t.Error("Expected failure with zero part message") 306 } 307 }