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