mirror of
https://github.com/wneessen/go-mail.git
synced 2024-11-09 15:32:54 +01:00
Winni Neessen
b79374224c
Updated the Reader struct in reader.go to properly handle nil buffers. This prevents potential errors from nil pointer dereference. Also added the fmt package for debugging purposes. Correspondingly, additional tests in reader_test.go were also added to cover these edge cases and ensure the Reader struct correctly handles them.
85 lines
2 KiB
Go
85 lines
2 KiB
Go
// SPDX-FileCopyrightText: 2022-2023 The go-mail Authors
|
|
//
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package mail
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"testing"
|
|
)
|
|
|
|
// TestReader_Read tests the Reader.Read method that implements the io.Reader interface
|
|
func TestReader_Read(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
plen int
|
|
}{
|
|
{"P length is bigger than the mail", 3200000},
|
|
{"P length is smaller than the mail", 128},
|
|
}
|
|
|
|
m := NewMsg()
|
|
m.SetBodyString(TypeTextPlain, "TEST123")
|
|
wbuf := bytes.Buffer{}
|
|
_, err := m.Write(&wbuf)
|
|
if err != nil {
|
|
t.Errorf("failed to write message into temporary buffer: %s", err)
|
|
}
|
|
elen := wbuf.Len()
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
p := make([]byte, tt.plen)
|
|
mr := m.NewReader()
|
|
n, err := mr.Read(p)
|
|
if err != nil {
|
|
t.Errorf("failed to Read(): %s", err)
|
|
}
|
|
if n == 0 {
|
|
t.Errorf("failed to Read() - received 0 bytes of data")
|
|
}
|
|
if tt.plen >= elen && n != elen {
|
|
t.Errorf("failed to Read() - not all data received. Expected: %d, got: %d", elen, n)
|
|
}
|
|
if tt.plen < elen && n != tt.plen {
|
|
t.Errorf("failed to Read() - full length of p wasn't filled with data. Expected: %d, got: %d",
|
|
tt.plen, n)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
// TestReader_Read_error tests the Reader.Read method with an intentional error
|
|
func TestReader_Read_error(t *testing.T) {
|
|
r := Reader{err: fmt.Errorf("FAILED")}
|
|
var p []byte
|
|
_, err := r.Read(p)
|
|
if err == nil {
|
|
t.Errorf("Reader was supposed to fail, but didn't")
|
|
}
|
|
}
|
|
|
|
// TestReader_Read_empty tests the Reader.Read method with an empty buffer
|
|
func TestReader_Read_empty(t *testing.T) {
|
|
r := Reader{buf: []byte{}}
|
|
p := make([]byte, 1)
|
|
p[0] = 'a'
|
|
_, err := r.Read(p)
|
|
if err != nil && !errors.Is(err, io.EOF) {
|
|
t.Errorf("Reader failed: %s", err)
|
|
}
|
|
}
|
|
|
|
// TestReader_Read_nil tests the Reader.Read method with a nil buffer
|
|
func TestReader_Read_nil(t *testing.T) {
|
|
r := Reader{buf: nil, off: -10}
|
|
p := make([]byte, 0)
|
|
_, err := r.Read(p)
|
|
if err != nil && !errors.Is(err, io.EOF) {
|
|
t.Errorf("Reader failed: %s", err)
|
|
}
|
|
}
|