package oae2 import ( "bytes" "io" "strings" "testing" ) func TestRoundTrip(t *testing.T) { t.Parallel() const ( msg = "Hello World!" key = "password123" blockSize = 1 ) buf := new(bytes.Buffer) w := NewWriter(buf, []byte(key), blockSize) if _, err := io.WriteString(w, msg); err != nil { t.Fatalf("Writer.Write failed: %s", err) } if err := w.Close(); err != nil { t.Fatalf("Writer.Close failed: %s", err) } got, err := io.ReadAll(NewReader(buf, []byte(key), blockSize)) if err != nil { t.Fatalf("Reader.Read failed: %s", err) } if string(got) != msg { t.Errorf("Message failed to round-trip, got %q, want %q", got, msg) } } func TestReadFromWriteTo(t *testing.T) { t.Parallel() const ( msg = "Hello World!" key = "asdf" blockSize = 2 ) buf := new(bytes.Buffer) w := NewWriter(buf, []byte(key), blockSize) if _, err := io.Copy(w, struct{ io.Reader }{strings.NewReader(msg)}); err != nil { t.Fatalf("Writer.WriteTo failed: %s", err) } if err := w.Close(); err != nil { t.Fatalf("Writer.Close failed: %s", err) } got := new(strings.Builder) if _, err := io.Copy(got, NewReader(buf, []byte(key), blockSize)); err != nil { t.Fatalf("Reader.Read failed: %s", err) } if got.String() != msg { t.Errorf("Message failed to round-trip, got %q, want %q", got, msg) } } func FuzzRoundTrip(f *testing.F) { f.Add(1, []byte("Hello World!")) f.Fuzz(func(t *testing.T, segmentSize int, msg []byte) { const password = "asdf" if segmentSize <= 0 { return } buf := new(bytes.Buffer) w := NewWriter(buf, []byte(password), segmentSize) n, err := w.Write(msg) if err != nil { t.Fatalf("Writer.Write(%q) failed: %s", msg, err) } if n != len(msg) { t.Errorf("Writer.Write(%q) = %d, want %d", msg, n, len(msg)) } if err := w.Close(); err != nil { t.Fatalf("Writer.Close failed: %s", err) } got, err := io.ReadAll(NewReader(buf, []byte(password), segmentSize)) if err != nil { t.Fatalf("Reader.Read failed: %s", err) } if !bytes.Equal(got, msg) { t.Errorf("Message failed to round-trip, got %q, want %q", got, msg) } }) } func FuzzReadFromWriteTo(f *testing.F) { f.Add(1, "Hello World!") f.Fuzz(func(t *testing.T, segmentSize int, msg string) { const password = "asdf" if segmentSize <= 0 { return } buf := new(bytes.Buffer) w := NewWriter(buf, []byte(password), segmentSize) n, err := w.ReadFrom(strings.NewReader(msg)) if err != nil { t.Fatalf("Writer.ReadFrom(%q) failed: %s", msg, err) } if n != int64(len(msg)) { t.Errorf("Writer.Write(%q) = %d, want %d", msg, n, len(msg)) } if err := w.Close(); err != nil { t.Fatalf("Writer.Close failed: %s", err) } got := new(strings.Builder) n, err = NewReader(buf, []byte(password), segmentSize).WriteTo(got) if err != nil { t.Fatalf("Reader.WriteTo failed: %s", err) } if n != int64(len(msg)) { t.Errorf("Reader.WriteTo returned %d bytes, want %d", n, len(msg)) } if got.String() != msg { t.Errorf("Message failed to round-trip, got %q, want %q", got, msg) } }) }