1package imap_test
2
3import (
4	"bytes"
5	"io"
6	"net"
7	"testing"
8
9	"github.com/emersion/go-imap"
10)
11
12func TestNewConn(t *testing.T) {
13	b := &bytes.Buffer{}
14	c, s := net.Pipe()
15
16	done := make(chan error)
17	go (func() {
18		_, err := io.Copy(b, s)
19		done <- err
20	})()
21
22	r := imap.NewReader(nil)
23	w := imap.NewWriter(nil)
24
25	ic := imap.NewConn(c, r, w)
26
27	sent := []byte("hi")
28	ic.Write(sent)
29	ic.Flush()
30	ic.Close()
31
32	if err := <-done; err != nil {
33		t.Fatal(err)
34	}
35
36	s.Close()
37
38	received := b.Bytes()
39	if string(sent) != string(received) {
40		t.Errorf("Sent %v but received %v", sent, received)
41	}
42}
43
44func transform(b []byte) []byte {
45	bb := make([]byte, len(b))
46
47	for i, c := range b {
48		if rune(c) == 'c' {
49			bb[i] = byte('d')
50		} else {
51			bb[i] = c
52		}
53	}
54
55	return bb
56}
57
58type upgraded struct {
59	net.Conn
60}
61
62func (c *upgraded) Write(b []byte) (int, error) {
63	return c.Conn.Write(transform(b))
64}
65
66func TestConn_Upgrade(t *testing.T) {
67	b := &bytes.Buffer{}
68	c, s := net.Pipe()
69
70	done := make(chan error)
71	go (func() {
72		_, err := io.Copy(b, s)
73		done <- err
74	})()
75
76	r := imap.NewReader(nil)
77	w := imap.NewWriter(nil)
78
79	ic := imap.NewConn(c, r, w)
80
81	began := make(chan struct{})
82	go ic.Upgrade(func(conn net.Conn) (net.Conn, error) {
83		began <- struct{}{}
84		ic.WaitReady()
85		return &upgraded{conn}, nil
86	})
87	<-began
88
89	ic.Wait()
90
91	sent := []byte("abcd")
92	expected := transform(sent)
93	ic.Write(sent)
94	ic.Flush()
95	ic.Close()
96
97	if err := <-done; err != nil {
98		t.Fatal(err)
99	}
100
101	s.Close()
102
103	received := b.Bytes()
104	if string(expected) != string(received) {
105		t.Errorf("Expected %v but received %v", expected, received)
106	}
107}
108