github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/storage/feed/binaryserializer_test.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:44</date> 10 //</624450118640209920> 11 12 13 package feed 14 15 import ( 16 "encoding/json" 17 "reflect" 18 "testing" 19 20 "github.com/ethereum/go-ethereum/common/hexutil" 21 ) 22 23 //Kv模拟密钥值存储 24 type KV map[string]string 25 26 func (kv KV) Get(key string) string { 27 return kv[key] 28 } 29 func (kv KV) Set(key, value string) { 30 kv[key] = value 31 } 32 33 func compareByteSliceToExpectedHex(t *testing.T, variableName string, actualValue []byte, expectedHex string) { 34 if hexutil.Encode(actualValue) != expectedHex { 35 t.Fatalf("%s: Expected %s to be %s, got %s", t.Name(), variableName, expectedHex, hexutil.Encode(actualValue)) 36 } 37 } 38 39 func testBinarySerializerRecovery(t *testing.T, bin binarySerializer, expectedHex string) { 40 name := reflect.TypeOf(bin).Elem().Name() 41 serialized := make([]byte, bin.binaryLength()) 42 if err := bin.binaryPut(serialized); err != nil { 43 t.Fatalf("%s.binaryPut error when trying to serialize structure: %s", name, err) 44 } 45 46 compareByteSliceToExpectedHex(t, name, serialized, expectedHex) 47 48 recovered := reflect.New(reflect.TypeOf(bin).Elem()).Interface().(binarySerializer) 49 if err := recovered.binaryGet(serialized); err != nil { 50 t.Fatalf("%s.binaryGet error when trying to deserialize structure: %s", name, err) 51 } 52 53 if !reflect.DeepEqual(bin, recovered) { 54 t.Fatalf("Expected that the recovered %s equals the marshalled %s", name, name) 55 } 56 57 serializedWrongLength := make([]byte, 1) 58 copy(serializedWrongLength[:], serialized) 59 if err := recovered.binaryGet(serializedWrongLength); err == nil { 60 t.Fatalf("Expected %s.binaryGet to fail since data is too small", name) 61 } 62 } 63 64 func testBinarySerializerLengthCheck(t *testing.T, bin binarySerializer) { 65 name := reflect.TypeOf(bin).Elem().Name() 66 //使切片太小,无法包含元数据 67 serialized := make([]byte, bin.binaryLength()-1) 68 69 if err := bin.binaryPut(serialized); err == nil { 70 t.Fatalf("Expected %s.binaryPut to fail, since target slice is too small", name) 71 } 72 } 73 74 func testValueSerializer(t *testing.T, v valueSerializer, expected KV) { 75 name := reflect.TypeOf(v).Elem().Name() 76 kv := make(KV) 77 78 v.AppendValues(kv) 79 if !reflect.DeepEqual(expected, kv) { 80 expj, _ := json.Marshal(expected) 81 gotj, _ := json.Marshal(kv) 82 t.Fatalf("Expected %s.AppendValues to return %s, got %s", name, string(expj), string(gotj)) 83 } 84 85 recovered := reflect.New(reflect.TypeOf(v).Elem()).Interface().(valueSerializer) 86 err := recovered.FromValues(kv) 87 if err != nil { 88 t.Fatal(err) 89 } 90 91 if !reflect.DeepEqual(recovered, v) { 92 t.Fatalf("Expected recovered %s to be the same", name) 93 } 94 } 95