mirror of https://github.com/gwuhaolin/livego.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
205 lines
4.5 KiB
205 lines
4.5 KiB
package amf |
|
|
|
import ( |
|
"bytes" |
|
"fmt" |
|
"reflect" |
|
"testing" |
|
"time" |
|
) |
|
|
|
func EncodeAndDecode(val interface{}, ver Version) (result interface{}, err error) { |
|
enc := new(Encoder) |
|
dec := new(Decoder) |
|
|
|
buf := new(bytes.Buffer) |
|
|
|
_, err = enc.Encode(buf, val, ver) |
|
if err != nil { |
|
return nil, fmt.Errorf("error in encode: %s", err) |
|
} |
|
|
|
result, err = dec.Decode(buf, ver) |
|
if err != nil { |
|
return nil, fmt.Errorf("error in decode: %s", err) |
|
} |
|
|
|
return |
|
} |
|
|
|
func Compare(val interface{}, ver Version, name string, t *testing.T) { |
|
result, err := EncodeAndDecode(val, ver) |
|
if err != nil { |
|
t.Errorf("%s: %s", name, err) |
|
} |
|
|
|
if !reflect.DeepEqual(val, result) { |
|
val_v := reflect.ValueOf(val) |
|
result_v := reflect.ValueOf(result) |
|
|
|
t.Errorf("%s: comparison failed between %+v (%s) and %+v (%s)", name, val, val_v.Type(), result, result_v.Type()) |
|
|
|
Dump("expected", val) |
|
Dump("got", result) |
|
} |
|
|
|
// if val != result { |
|
// t.Errorf("%s: comparison failed between %+v and %+v", name, val, result) |
|
// } |
|
} |
|
|
|
func TestAmf0Number(t *testing.T) { |
|
Compare(float64(3.14159), 0, "amf0 number float", t) |
|
Compare(float64(124567890), 0, "amf0 number high", t) |
|
Compare(float64(-34.2), 0, "amf0 number negative", t) |
|
} |
|
|
|
func TestAmf0String(t *testing.T) { |
|
Compare("a pup!", 0, "amf0 string simple", t) |
|
Compare("日本語", 0, "amf0 string utf8", t) |
|
} |
|
|
|
func TestAmf0Boolean(t *testing.T) { |
|
Compare(true, 0, "amf0 boolean true", t) |
|
Compare(false, 0, "amf0 boolean false", t) |
|
} |
|
|
|
func TestAmf0Null(t *testing.T) { |
|
Compare(nil, 0, "amf0 boolean nil", t) |
|
} |
|
|
|
func TestAmf0Object(t *testing.T) { |
|
obj := make(Object) |
|
obj["dog"] = "alfie" |
|
obj["coffee"] = true |
|
obj["drugs"] = false |
|
obj["pi"] = 3.14159 |
|
|
|
res, err := EncodeAndDecode(obj, 0) |
|
if err != nil { |
|
t.Errorf("amf0 object: %s", err) |
|
} |
|
|
|
result, ok := res.(Object) |
|
if ok != true { |
|
t.Errorf("amf0 object conversion failed") |
|
} |
|
|
|
if result["dog"] != "alfie" { |
|
t.Errorf("amf0 object string: comparison failed") |
|
} |
|
|
|
if result["coffee"] != true { |
|
t.Errorf("amf0 object true: comparison failed") |
|
} |
|
|
|
if result["drugs"] != false { |
|
t.Errorf("amf0 object false: comparison failed") |
|
} |
|
|
|
if result["pi"] != float64(3.14159) { |
|
t.Errorf("amf0 object float: comparison failed") |
|
} |
|
} |
|
|
|
func TestAmf0Array(t *testing.T) { |
|
arr := [5]float64{1, 2, 3, 4, 5} |
|
|
|
res, err := EncodeAndDecode(arr, 0) |
|
if err != nil { |
|
t.Errorf("amf0 object: %s", err) |
|
} |
|
|
|
result, ok := res.(Array) |
|
if ok != true { |
|
t.Errorf("amf0 array conversion failed") |
|
} |
|
|
|
for i := 0; i < len(arr); i++ { |
|
if arr[i] != result[i] { |
|
t.Errorf("amf0 array %d comparison failed: %v / %v", i, arr[i], result[i]) |
|
} |
|
} |
|
} |
|
|
|
func TestAmf3Integer(t *testing.T) { |
|
Compare(int32(0), 3, "amf3 integer zero", t) |
|
Compare(int32(1245), 3, "amf3 integer low", t) |
|
Compare(int32(123456), 3, "amf3 integer high", t) |
|
} |
|
|
|
func TestAmf3Double(t *testing.T) { |
|
Compare(float64(3.14159), 3, "amf3 double float", t) |
|
Compare(float64(1234567890), 3, "amf3 double high", t) |
|
Compare(float64(-12345), 3, "amf3 double negative", t) |
|
} |
|
|
|
func TestAmf3String(t *testing.T) { |
|
Compare("a pup!", 0, "amf0 string simple", t) |
|
Compare("日本語", 0, "amf0 string utf8", t) |
|
} |
|
|
|
func TestAmf3Boolean(t *testing.T) { |
|
Compare(true, 3, "amf3 boolean true", t) |
|
Compare(false, 3, "amf3 boolean false", t) |
|
} |
|
|
|
func TestAmf3Null(t *testing.T) { |
|
Compare(nil, 3, "amf3 boolean nil", t) |
|
} |
|
|
|
func TestAmf3Date(t *testing.T) { |
|
t1 := time.Unix(time.Now().Unix(), 0).UTC() // nanoseconds discarded |
|
t2 := time.Date(1983, 9, 4, 12, 4, 8, 0, time.UTC) |
|
|
|
Compare(t1, 3, "amf3 date now", t) |
|
Compare(t2, 3, "amf3 date earlier", t) |
|
} |
|
|
|
func TestAmf3Array(t *testing.T) { |
|
obj := make(Object) |
|
obj["key"] = "val" |
|
|
|
var arr Array |
|
arr = append(arr, "amf") |
|
arr = append(arr, float64(2)) |
|
arr = append(arr, -34.95) |
|
arr = append(arr, true) |
|
arr = append(arr, false) |
|
|
|
res, err := EncodeAndDecode(arr, 3) |
|
if err != nil { |
|
t.Errorf("amf3 object: %s", err) |
|
} |
|
|
|
result, ok := res.(Array) |
|
if ok != true { |
|
t.Errorf("amf3 array conversion failed: %+v", res) |
|
} |
|
|
|
for i := 0; i < len(arr); i++ { |
|
if arr[i] != result[i] { |
|
t.Errorf("amf3 array %d comparison failed: %v / %v", i, arr[i], result[i]) |
|
} |
|
} |
|
} |
|
|
|
func TestAmf3ByteArray(t *testing.T) { |
|
enc := new(Encoder) |
|
dec := new(Decoder) |
|
|
|
buf := new(bytes.Buffer) |
|
|
|
expect := []byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x00} |
|
|
|
enc.EncodeAmf3ByteArray(buf, expect, true) |
|
|
|
result, err := dec.DecodeAmf3ByteArray(buf, true) |
|
if err != nil { |
|
t.Errorf("err: %s", err) |
|
} |
|
|
|
if bytes.Compare(result, expect) != 0 { |
|
t.Errorf("expected: %+v, got %+v", expect, buf) |
|
} |
|
}
|
|
|