1// +build !js
2
3package stun
4
5import (
6	"encoding/base64"
7	"io"
8	"testing"
9)
10
11func BenchmarkErrorCode_AddTo(b *testing.B) {
12	m := New()
13	b.ReportAllocs()
14	for i := 0; i < b.N; i++ {
15		CodeStaleNonce.AddTo(m)
16		m.Reset()
17	}
18}
19
20func BenchmarkErrorCodeAttribute_AddTo(b *testing.B) {
21	m := New()
22	b.ReportAllocs()
23	a := &ErrorCodeAttribute{
24		Code:   404,
25		Reason: []byte("not found!"),
26	}
27	for i := 0; i < b.N; i++ {
28		a.AddTo(m)
29		m.Reset()
30	}
31}
32
33func BenchmarkErrorCodeAttribute_GetFrom(b *testing.B) {
34	m := New()
35	b.ReportAllocs()
36	a := &ErrorCodeAttribute{
37		Code:   404,
38		Reason: []byte("not found!"),
39	}
40	a.AddTo(m)
41	for i := 0; i < b.N; i++ {
42		a.GetFrom(m)
43	}
44}
45
46func TestErrorCodeAttribute_GetFrom(t *testing.T) {
47	m := New()
48	m.Add(AttrErrorCode, []byte{1})
49	c := new(ErrorCodeAttribute)
50	if err := c.GetFrom(m); err != io.ErrUnexpectedEOF {
51		t.Errorf("GetFrom should return <%s>, but got <%s>",
52			io.ErrUnexpectedEOF, err,
53		)
54	}
55}
56
57func TestMessage_AddErrorCode(t *testing.T) {
58	m := New()
59	transactionID, err := base64.StdEncoding.DecodeString("jxhBARZwX+rsC6er")
60	if err != nil {
61		t.Error(err)
62	}
63	copy(m.TransactionID[:], transactionID)
64	expectedCode := ErrorCode(438)
65	expectedReason := "Stale Nonce"
66	CodeStaleNonce.AddTo(m)
67	m.WriteHeader()
68
69	mRes := New()
70	if _, err = mRes.ReadFrom(m.reader()); err != nil {
71		t.Fatal(err)
72	}
73	errCodeAttr := new(ErrorCodeAttribute)
74	if err = errCodeAttr.GetFrom(mRes); err != nil {
75		t.Error(err)
76	}
77	code := errCodeAttr.Code
78	if err != nil {
79		t.Error(err)
80	}
81	if code != expectedCode {
82		t.Error("bad code", code)
83	}
84	if string(errCodeAttr.Reason) != expectedReason {
85		t.Error("bad reason", string(errCodeAttr.Reason))
86	}
87}
88
89func TestErrorCode(t *testing.T) {
90	a := &ErrorCodeAttribute{
91		Code:   404,
92		Reason: []byte("not found!"),
93	}
94	if a.String() != "404: not found!" {
95		t.Error("bad string", a)
96	}
97	m := New()
98	cod := ErrorCode(666)
99	if err := cod.AddTo(m); err != ErrNoDefaultReason {
100		t.Error("should be ErrNoDefaultReason", err)
101	}
102	if err := a.GetFrom(m); err == nil {
103		t.Error("attr should not be in message")
104	}
105	a.Reason = make([]byte, 2048)
106	if err := a.AddTo(m); err == nil {
107		t.Error("should error")
108	}
109}
110