aboutsummaryrefslogtreecommitdiff
path: root/warc/warc_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'warc/warc_test.go')
-rw-r--r--warc/warc_test.go138
1 files changed, 138 insertions, 0 deletions
diff --git a/warc/warc_test.go b/warc/warc_test.go
new file mode 100644
index 0000000..5e2de2f
--- /dev/null
+++ b/warc/warc_test.go
@@ -0,0 +1,138 @@
+package warc
+
+import (
+ "fmt"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "sync"
+ "testing"
+)
+
+var testData = []byte("this is some very interesting test data of non-zero size")
+
+func writeRecords(w *Writer, n int) error {
+ for i := 0; i < n; i++ {
+ hdr := NewHeader()
+ rec, err := w.NewRecord(hdr)
+ if err != nil {
+ return fmt.Errorf("NewRecord: %v", err)
+ }
+ _, err = rec.Write(testData)
+ if err != nil {
+ return fmt.Errorf("record Write: %v", err)
+ }
+ if err := rec.Close(); err != nil {
+ return fmt.Errorf("record Close: %v", err)
+ }
+ }
+ return nil
+}
+
+func writeManyRecords(t testing.TB, w *Writer, n int) {
+ if err := writeRecords(w, n); err != nil {
+ t.Fatal(err)
+ }
+}
+
+func writeManyRecordsConcurrently(t testing.TB, w *Writer, n, nproc int) {
+ startCh := make(chan struct{})
+ errCh := make(chan error, nproc+1)
+ var wg sync.WaitGroup
+
+ for i := 0; i < nproc; i++ {
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ <-startCh
+ if err := writeRecords(w, n); err != nil {
+ errCh <- err
+ }
+ }()
+ }
+ go func() {
+ wg.Wait()
+ errCh <- nil
+ }()
+ close(startCh)
+ if err := <-errCh; err != nil {
+ t.Fatalf("a worker got an error: %v", err)
+ }
+}
+
+func TestWARC_WriteSingleFile(t *testing.T) {
+ dir, err := ioutil.TempDir("", "")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(dir)
+
+ f, err := os.Create(filepath.Join(dir, "out.warc.gz"))
+ if err != nil {
+ t.Fatal(err)
+ }
+ w := NewWriter(f)
+
+ writeManyRecords(t, w, 1000)
+ if err := w.Close(); err != nil {
+ t.Fatalf("Close: %v", err)
+ }
+}
+
+func TestWARC_WriteMulti(t *testing.T) {
+ dir, err := ioutil.TempDir("", "")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(dir)
+
+ var targetSize int64 = 10240
+ w, err := NewMultiWriter(filepath.Join(dir, "out.%s.warc.gz"), uint64(targetSize))
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ writeManyRecords(t, w, 1000)
+ if err := w.Close(); err != nil {
+ t.Fatalf("Close: %v", err)
+ }
+
+ files, _ := ioutil.ReadDir(dir)
+ if len(files) < 2 {
+ t.Fatalf("MultiWriter didn't create enough files (%d)", len(files))
+ }
+ for _, f := range files[:len(files)-1] {
+ if f.Size() < targetSize {
+ t.Errorf("output file %s is too small (%d bytes)", f.Name(), f.Size())
+ }
+ }
+}
+
+func TestWARC_WriteMulti_Concurrent(t *testing.T) {
+ dir, err := ioutil.TempDir("", "")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(dir)
+
+ var targetSize int64 = 100000
+ w, err := NewMultiWriter(filepath.Join(dir, "out.%s.warc.gz"), uint64(targetSize))
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ writeManyRecordsConcurrently(t, w, 1000, 10)
+ if err := w.Close(); err != nil {
+ t.Fatalf("Close: %v", err)
+ }
+
+ files, _ := ioutil.ReadDir(dir)
+ if len(files) < 2 {
+ t.Fatalf("MultiWriter didn't create enough files (%d)", len(files))
+ }
+ for _, f := range files[:len(files)-1] {
+ if f.Size() < targetSize {
+ t.Errorf("output file %s is too small (%d bytes)", f.Name(), f.Size())
+ }
+ }
+}