From 595338dc22015263642770984ec00fb2bfdb6dae Mon Sep 17 00:00:00 2001 From: Jon Barber Date: Tue, 22 Dec 2015 15:44:32 +0000 Subject: [PATCH] Failing test for a request larger than 64Kb --- input_file.go | 2 +- input_file_test.go | 127 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 input_file_test.go diff --git a/input_file.go b/input_file.go index e7eb064..287c2f6 100644 --- a/input_file.go +++ b/input_file.go @@ -84,5 +84,5 @@ func (i *FileInput) emit() { i.data <- newBuf } - log.Printf("FileInput: end of file '%s'\n",i.path) + log.Printf("FileInput: end of file '%s'\n", i.path) } diff --git a/input_file_test.go b/input_file_test.go new file mode 100644 index 0000000..730a599 --- /dev/null +++ b/input_file_test.go @@ -0,0 +1,127 @@ +package main + +import ( + "bytes" + "errors" + "io" + "io/ioutil" + "os" + "sync" + "syscall" + "testing" + "time" +) + +func TestInputFileWithPayloadLargerThan64Kb(t *testing.T) { + + // Given a capture file with a request over 64Kb + expectedCaptureFile := CreateCaptureFileWithOneRequest() + defer expectedCaptureFile.TearDown() + + // When the request is read from the capture file + readCapture, err := ReadFromCaptureFile(expectedCaptureFile.file) + + // The read request should match the original request + if err != nil { + t.Error(err) + } else { + if !expectedCaptureFile.DataEquals(readCapture) { + t.Error("Request read back from file should match") + } + } + +} + +type CaptureFile struct { + data []byte + file *os.File +} + +func NewExpectedCaptureFile(data []byte, file *os.File) *CaptureFile { + ecf := new(CaptureFile) + ecf.file = file + ecf.data = data + return ecf +} + +func (expectedCaptureFile *CaptureFile) TearDown() { + if expectedCaptureFile.file != nil { + syscall.Unlink(expectedCaptureFile.file.Name()) + } +} + +func (expectedCaptureFile *CaptureFile) DataEquals(other []byte) bool { + return bytes.Equal(expectedCaptureFile.data, other) +} + +func CreateCaptureFileWithOneRequest() *CaptureFile { + + f, err := ioutil.TempFile("", "testmainconf") + if err != nil { + panic(err) + } + + wg := new(sync.WaitGroup) + quit := make(chan int) + + input := NewTestInput() + + var buffer bytes.Buffer + output := NewTestOutput(func(data []byte) { + buffer.Write(data) + wg.Done() + }) + + output_file := NewFileOutput(f.Name()) + + Plugins.Inputs = []io.Reader{input} + Plugins.Outputs = []io.Writer{output, output_file} + + wg.Add(1) + go Start(quit) + + input.EmitSizedPOST(64 * 1024) + wg.Wait() + + close(quit) + + return NewExpectedCaptureFile(buffer.Bytes(), f) + +} + +func ReadFromCaptureFile(captureFile *os.File) (read []byte, err error) { + + quit := make(chan int) + wg := new(sync.WaitGroup) + + var buffer2 bytes.Buffer + + input := NewFileInput(captureFile.Name()) + output := NewTestOutput(func(data []byte) { + buffer2.Write(data) + wg.Done() + }) + + Plugins.Inputs = []io.Reader{input} + Plugins.Outputs = []io.Writer{output} + + wg.Add(1) + go Start(quit) + + done := make(chan int, 1) + go func() { + wg.Wait() + done <- 1 + }() + + select { + case <-done: + read = buffer2.Bytes() + case <-time.After(2 * time.Second): + err = errors.New("Timed out") + } + close(quit) + + return + +}