1/*2Maddy Mail Server - Composable all-in-one email server.3Copyright © 2019-2020 Max Mazurov <fox.cpp@disroot.org>, Maddy Mail Server contributors45This program is free software: you can redistribute it and/or modify6it under the terms of the GNU General Public License as published by7the Free Software Foundation, either version 3 of the License, or8(at your option) any later version.910This program is distributed in the hope that it will be useful,11but WITHOUT ANY WARRANTY; without even the implied warranty of12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the13GNU General Public License for more details.1415You should have received a copy of the GNU General Public License16along with this program. If not, see <https://www.gnu.org/licenses/>.17*/1819package testutils2021import (22 "bufio"23 "bytes"24 "io"25 "strings"26 "testing"2728 "github.com/emersion/go-message/textproto"29 "github.com/foxcpp/maddy/framework/buffer"30)3132func BodyFromStr(t *testing.T, literal string) (textproto.Header, buffer.MemoryBuffer) {33 t.Helper()3435 bufr := bufio.NewReader(strings.NewReader(literal))36 hdr, err := textproto.ReadHeader(bufr)37 if err != nil {38 t.Fatal(err)39 }40 body, err := io.ReadAll(bufr)41 if err != nil {42 t.Fatal(err)43 }4445 return hdr, buffer.MemoryBuffer{Slice: body}46}4748type errorReader struct {49 r io.Reader50 err error51}5253func (r *errorReader) Read(b []byte) (int, error) {54 n, err := r.r.Read(b)55 if err == io.EOF {56 return n, r.err57 }58 return n, err59}6061type FailingBuffer struct {62 Blob []byte6364 OpenError error65 IOError error66}6768func (fb FailingBuffer) Open() (io.ReadCloser, error) {69 r := io.NopCloser(bytes.NewReader(fb.Blob))7071 if fb.IOError != nil {72 return io.NopCloser(&errorReader{r, fb.IOError}), fb.OpenError73 }7475 return r, fb.OpenError76}7778func (fb FailingBuffer) Len() int {79 return len(fb.Blob)80}8182func (fb FailingBuffer) Remove() error {83 return nil84}