1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
package xmpp
import (
"errors"
"io"
"reflect"
"github.com/twstrike/coyim/xmpp/data"
. "gopkg.in/check.v1"
)
type IqXmppSuite struct{}
var _ = Suite(&IqXmppSuite{})
func (s *IqXmppSuite) Test_SendIQReply_returnsErrorIfOneIsEncounteredWhenWriting(c *C) {
mockIn := &mockConnIOReaderWriter{err: errors.New("some error")}
conn := conn{
out: mockIn,
jid: "somewhat@foo.com/somewhere",
}
err := conn.SendIQReply("fo", "bar", "baz", nil)
c.Assert(err.Error(), Equals, "some error")
}
func (s *IqXmppSuite) Test_SendIQReply_writesAnEmptyReplyIfEmptyIsGiven(c *C) {
mockIn := &mockConnIOReaderWriter{}
conn := conn{
out: mockIn,
jid: "som'ewhat@foo.com/somewhere",
}
err := conn.SendIQReply("f&o", "b\"ar", "b<az", data.EmptyReply{})
c.Assert(err, IsNil)
c.Assert(string(mockIn.write), Equals, "<iq to='f&o' from='som'ewhat@foo.com/somewhere' type='b"ar' id='b<az'></iq>")
}
func (s *IqXmppSuite) Test_SendIQReply_returnsErrorIfAnUnXMLableEntryIsGiven(c *C) {
mockIn := &mockConnIOReaderWriter{}
conn := conn{
out: mockIn,
jid: "som'ewhat@foo.com/somewhere",
}
err := conn.SendIQReply("f&o", "b\"ar", "b<az", func() int { return 42 })
c.Assert(err.Error(), Equals, "xml: unsupported type: func() int")
}
func (s *IqXmppSuite) Test_SendIQ_returnsErrorIfWritingDataFails(c *C) {
mockIn := &mockConnIOReaderWriter{err: errors.New("this also fails")}
conn := conn{
out: mockIn,
jid: "som'ewhat@foo.com/somewhere",
}
_, _, err := conn.SendIQ("", "", nil)
c.Assert(err.Error(), Equals, "this also fails")
}
func (s *IqXmppSuite) Test_Send_returnsErrorIfAnUnXMLableEntryIsGiven(c *C) {
mockIn := &mockConnIOReaderWriter{}
conn := conn{
out: mockIn,
jid: "som'ewhat@foo.com/somewhere",
}
_, _, err := conn.SendIQ("", "", func() int { return 42 })
c.Assert(err.Error(), Equals, "xml: unsupported type: func() int")
}
func (s *IqXmppSuite) Test_SendIQ_returnsErrorIfWritingDataFailsTheSecondTime(c *C) {
mockIn := &mockConnIOReaderWriter{err: errors.New("this also fails again"), errCount: 1}
conn := conn{
out: mockIn,
jid: "som'ewhat@foo.com/somewhere",
}
_, _, err := conn.SendIQ("", "", nil)
c.Assert(err.Error(), Equals, "this also fails again")
c.Assert(string(mockIn.write), Matches, "<iq from='som'ewhat@foo.com/somewhere' type='' id='.*?'></iq>")
}
func (s *IqXmppSuite) TestConnSendIQReplyAndTyp(c *C) {
mockOut := mockConnIOReaderWriter{}
conn := conn{
out: &mockOut,
jid: "jid",
}
conn.inflights = make(map[data.Cookie]inflight)
reply, cookie, err := conn.SendIQ("example@xmpp.com", "typ", nil)
c.Assert(string(mockOut.write), Matches, "<iq to='example@xmpp.com' from='jid' type='typ' id='.*'></iq>")
c.Assert(reply, NotNil)
c.Assert(cookie, NotNil)
c.Assert(err, IsNil)
}
func (s *IqXmppSuite) TestConnSendIQRaw(c *C) {
mockOut := mockConnIOReaderWriter{}
conn := conn{
out: &mockOut,
jid: "jid",
}
conn.inflights = make(map[data.Cookie]inflight)
reply, cookie, err := conn.SendIQ("example@xmpp.com", "typ", rawXML("<foo param='bar' />"))
c.Assert(string(mockOut.write), Matches, "<iq to='example@xmpp.com' from='jid' type='typ' id='.*'><foo param='bar' /></iq>")
c.Assert(reply, NotNil)
c.Assert(cookie, NotNil)
c.Assert(err, IsNil)
}
func (s *IqXmppSuite) TestConnSendIQErr(c *C) {
mockOut := mockConnIOReaderWriter{err: io.EOF}
conn := conn{
out: &mockOut,
jid: "jid",
}
reply, cookie, err := conn.SendIQ("example@xmpp.com", "typ", nil)
c.Assert(string(mockOut.write), Matches, "<iq to='example@xmpp.com' from='jid' type='typ' id='.*'>$")
c.Assert(reply, NotNil)
c.Assert(cookie, NotNil)
c.Assert(err, Equals, io.EOF)
}
func (s *IqXmppSuite) TestConnSendIQEmptyReply(c *C) {
mockOut := mockConnIOReaderWriter{}
conn := conn{
out: &mockOut,
jid: "jid",
}
conn.inflights = make(map[data.Cookie]inflight)
reply, cookie, err := conn.SendIQ("example@xmpp.com", "typ", reflect.ValueOf(data.EmptyReply{}))
c.Assert(string(mockOut.write), Matches, "<iq to='example@xmpp.com' from='jid' type='typ' id='.*'><Value><flag>.*</flag></Value></iq>")
c.Assert(reply, NotNil)
c.Assert(cookie, NotNil)
c.Assert(err, IsNil)
}
func (s *IqXmppSuite) TestConnSendIQReply(c *C) {
mockOut := mockConnIOReaderWriter{}
conn := conn{
out: &mockOut,
jid: "jid",
}
err := conn.SendIQReply("example@xmpp.com", "typ", "id", nil)
c.Assert(string(mockOut.write), Matches, "<iq to='example@xmpp.com' from='jid' type='typ' id='id'></iq>")
c.Assert(err, IsNil)
}
|