maddy

Fork https://github.com/foxcpp/maddy

git clone git://git.lin.moe/go/maddy.git

 1/*
 2Maddy Mail Server - Composable all-in-one email server.
 3Copyright © 2019-2020 Max Mazurov <fox.cpp@disroot.org>, Maddy Mail Server contributors
 4
 5This program is free software: you can redistribute it and/or modify
 6it under the terms of the GNU General Public License as published by
 7the Free Software Foundation, either version 3 of the License, or
 8(at your option) any later version.
 9
10This program is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with this program.  If not, see <https://www.gnu.org/licenses/>.
17*/
18
19package testutils
20
21import (
22	"bufio"
23	"bytes"
24	"io"
25	"strings"
26	"testing"
27
28	"github.com/emersion/go-message/textproto"
29	"github.com/foxcpp/maddy/framework/buffer"
30)
31
32func BodyFromStr(t *testing.T, literal string) (textproto.Header, buffer.MemoryBuffer) {
33	t.Helper()
34
35	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	}
44
45	return hdr, buffer.MemoryBuffer{Slice: body}
46}
47
48type errorReader struct {
49	r   io.Reader
50	err error
51}
52
53func (r *errorReader) Read(b []byte) (int, error) {
54	n, err := r.r.Read(b)
55	if err == io.EOF {
56		return n, r.err
57	}
58	return n, err
59}
60
61type FailingBuffer struct {
62	Blob []byte
63
64	OpenError error
65	IOError   error
66}
67
68func (fb FailingBuffer) Open() (io.ReadCloser, error) {
69	r := io.NopCloser(bytes.NewReader(fb.Blob))
70
71	if fb.IOError != nil {
72		return io.NopCloser(&errorReader{r, fb.IOError}), fb.OpenError
73	}
74
75	return r, fb.OpenError
76}
77
78func (fb FailingBuffer) Len() int {
79	return len(fb.Blob)
80}
81
82func (fb FailingBuffer) Remove() error {
83	return nil
84}