// Copyright 2011 The Go Authors. All rights reserved.// Use of this source code is governed by a BSD-style// license that can be found in the LICENSE file.packagexmppimport("bytes""encoding/xml""fmt""os""reflect""runtime""strings""testing")funcassertEquals(t*testing.T,expected,observedstring){ifexpected!=observed{file:="unknown"line:=0_,file,line,_=runtime.Caller(1)fmt.Fprintf(os.Stderr,"%s:%d: Expected:\n%s\nObserved:\n%s\n",file,line,expected,observed)t.Fail()}}funcTestJid(t*testing.T){str:="user@domain/res"jid:=&JID{}iferr:=jid.Set(str);err!=nil{t.Errorf("Set(%s) failed: %s",str,err)}assertEquals(t,"user",jid.Node)assertEquals(t,"domain",jid.Domain)assertEquals(t,"res",jid.Resource)assertEquals(t,str,jid.String())str="domain.tld"iferr:=jid.Set(str);err!=nil{t.Errorf("Set(%s) failed: %s",str,err)}ifjid.Node!=""{t.Errorf("Node: %v\n",jid.Node)}assertEquals(t,"domain.tld",jid.Domain)ifjid.Resource!=""{t.Errorf("Resource: %v\n",jid.Resource)}assertEquals(t,str,jid.String())}funcassertMarshal(t*testing.T,expectedstring,marshalinterface{}){varbufbytes.Bufferenc:=xml.NewEncoder(&buf)err:=enc.Encode(marshal)iferr!=nil{t.Errorf("Marshal error for %s: %s",marshal,err)}observed:=buf.String()ifexpected!=observed{file:="unknown"line:=0_,file,line,_=runtime.Caller(1)fmt.Fprintf(os.Stderr,"%s:%d: Expected:\n%s\nObserved:\n%s\n",file,line,expected,observed)t.Fail()}}funcTestStreamMarshal(t*testing.T){s:=&stream{To:"bob"}exp:=`<stream:stream xmlns="`+NsClient+`" xmlns:stream="`+NsStream+`" to="bob">`assertEquals(t,exp,s.String())s=&stream{To:"bob",From:"alice",Id:"#3",Version:"5.3"}exp=`<stream:stream xmlns="`+NsClient+`" xmlns:stream="`+NsStream+`" to="bob" from="alice"`+` id="#3" version="5.3">`assertEquals(t,exp,s.String())s=&stream{Lang:"en_US"}exp=`<stream:stream xmlns="`+NsClient+`" xmlns:stream="`+NsStream+`" xml:lang="en_US">`assertEquals(t,exp,s.String())}funcTestStreamErrorMarshal(t*testing.T){name:=xml.Name{Space:NsStreams,Local:"ack"}e:=&streamError{Any:Generic{XMLName:name}}exp:=`<error xmlns="`+NsStream+`"><ack xmlns="`+NsStreams+`"></ack></error>`assertMarshal(t,exp,e)txt:=errText{Lang:"pt",Text:"things happen"}e=&streamError{Any:Generic{XMLName:name},Text:&txt}exp=`<error xmlns="`+NsStream+`"><ack xmlns="`+NsStreams+`"></ack><text xmlns="`+NsStreams+`" xml:lang="pt">things happen</text></error>`assertMarshal(t,exp,e)}funcTestIqMarshal(t*testing.T){iq:=&Iq{Header:Header{Type:"set",Id:"3",Nested:[]interface{}{Generic{XMLName:xml.Name{Space:NsBind,Local:"bind"}}}}}exp:=`<iq id="3" type="set"><bind xmlns="`+NsBind+`"></bind></iq>`assertMarshal(t,exp,iq)}funcTestMarshalEscaping(t*testing.T){msg:=&Message{Body:&Generic{XMLName:xml.Name{Local:"body"},Chardata:`&<!-- "`}}exp:=`<message xmlns="jabber:client"><body>&<!-- "</body></message>`assertMarshal(t,exp,msg)}funcTestUnmarshalMessage(t*testing.T){str:=`<message to="a@b.c"><body>foo!</body></message>`r:=strings.NewReader(str)ch:=make(chaninterface{})goreadXml(r,ch,make(map[string]func(*xml.Name)interface{}))obs:=<-chexp:=&Message{XMLName:xml.Name{Local:"message",Space:"jabber:client"},Header:Header{To:"a@b.c",Innerxml:"<body>foo!</body>"},Body:&Generic{XMLName:xml.Name{Local:"body",Space:"jabber:client"},Chardata:"foo!"}}if!reflect.DeepEqual(obs,exp){t.Errorf("read %s\ngot: %#v\nwant: %#v\n",str,obs,exp)}obsMsg,ok:=obs.(*Message)if!ok{t.Fatalf("Not a Message: %T",obs)}obsBody:=obsMsg.BodyexpBody:=exp.Bodyif!reflect.DeepEqual(obsBody,expBody){t.Errorf("body\ngot: %#v\nwant: %#v\n",obsBody,expBody)}}