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  }