xmpp_test.go
author Chris Jones <chris@cjones.org>
Sun, 08 Jan 2012 13:04:50 -0700
branch20120108-close
changeset 70 bb629d22148a
parent 56 74686b8c9146
child 72 53f15893a1a7
permissions -rw-r--r--
Closing this branch.

// 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.

package xmpp

import (
	"bytes"
	"reflect"
	"strings"
	"sync"
	"testing"
	"xml"
)

func TestReadError(t *testing.T) {
	r := strings.NewReader(`<stream:error><bad-foo/></stream:error>`)
	ch := make(chan interface{})
	go readXml(r, ch, make(map[string] func(*xml.Name) interface{}))
	x := <- ch
	se, ok := x.(*streamError)
	if !ok {
		t.Fatalf("not StreamError: %v", reflect.TypeOf(x))
	}
	assertEquals(t, "bad-foo", se.Any.XMLName.Local)
	assertEquals(t, "", se.Any.XMLName.Space)
	if se.Text != nil {
		t.Errorf("text not nil: %v", se.Text)
	}

	r = strings.NewReader(`<stream:error><bad-foo/>` +
		`<text xml:lang="en" xmlns="` + NsStreams +
		`">Error text</text></stream:error>`)
	ch = make(chan interface{})
	go readXml(r, ch, make(map[string] func(*xml.Name) interface{}))
	x = <- ch
	se, ok = x.(*streamError)
	if !ok {
		t.Fatalf("not StreamError: %v", reflect.TypeOf(x))
	}
	assertEquals(t, "bad-foo", se.Any.XMLName.Local)
	assertEquals(t, "", se.Any.XMLName.Space)
	assertEquals(t, "Error text", se.Text.Text)
	assertEquals(t, "en", se.Text.Lang)
}

func TestReadStream(t *testing.T) {
	r := strings.NewReader(`<stream:stream to="foo.com" ` +
		`from="bar.org" id="42"` +
		`xmlns="jabber:client" xmlns:stream="` + NsStream +
		`" version="1.0">`)
	ch := make(chan interface{})
	go readXml(r, ch, make(map[string] func(*xml.Name) interface{}))
	x := <- ch
	ss, ok := x.(*stream)
	if !ok {
		t.Fatalf("not stream: %v", reflect.TypeOf(x))
	}
	assertEquals(t, "foo.com", ss.To)
	assertEquals(t, "bar.org", ss.From)
	assertEquals(t, "42", ss.Id)
	assertEquals(t, "1.0", ss.Version)
}

func testWrite(obj interface{}) string {
	w := bytes.NewBuffer(nil)
	ch := make(chan interface{})
	var wg sync.WaitGroup
	wg.Add(1)
	go func() {
		defer wg.Done()
		writeXml(w, ch)
	}()
	ch <- obj
	close(ch)
	wg.Wait()
	return w.String()
}

func TestWriteError(t *testing.T) {
	se := &streamError{Any: Generic{XMLName: xml.Name{Local:
				"blah"}}}
	str := testWrite(se)
	exp := `<stream:error><blah></blah></stream:error>`
	assertEquals(t, exp, str)

	se = &streamError{Any: Generic{XMLName: xml.Name{Space:
				NsStreams, Local: "foo"}}, Text:
		&errText{Lang: "ru", Text: "Пошёл ты"}}
	str = testWrite(se)
	exp = `<stream:error><foo xmlns="` + NsStreams +
		`"></foo><text xmlns="` + NsStreams +
		`" xml:lang="ru">Пошёл ты</text></stream:error>`
	assertEquals(t, exp, str)
}

func TestWriteStream(t *testing.T) {
	ss := &stream{To: "foo.org", From: "bar.com", Id: "42", Lang:
		"en", Version: "1.0"}
	str := testWrite(ss)
	exp := `<stream:stream xmlns="jabber:client"` +
		` xmlns:stream="` + NsStream + `" to="foo.org"` +
		` from="bar.com" id="42" xml:lang="en" version="1.0">`
	assertEquals(t, exp, str)
}