github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/swarm/storage/mru/request_test.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 package mru 10 11 import ( 12 "encoding/binary" 13 "encoding/json" 14 "fmt" 15 "reflect" 16 "testing" 17 ) 18 19 func areEqualJSON(s1, s2 string) (bool, error) { 20 // 21 var o1 interface{} 22 var o2 interface{} 23 24 err := json.Unmarshal([]byte(s1), &o1) 25 if err != nil { 26 return false, fmt.Errorf("Error mashalling string 1 :: %s", err.Error()) 27 } 28 err = json.Unmarshal([]byte(s2), &o2) 29 if err != nil { 30 return false, fmt.Errorf("Error mashalling string 2 :: %s", err.Error()) 31 } 32 33 return reflect.DeepEqual(o1, o2), nil 34 } 35 36 // 37 // 38 func TestEncodingDecodingUpdateRequests(t *testing.T) { 39 40 signer := newCharlieSigner() // 41 falseSigner := newBobSigner() // 42 43 // 44 createRequest, err := NewCreateRequest(&ResourceMetadata{ 45 Name: "a good resource name", 46 Frequency: 300, 47 StartTime: Timestamp{Time: 1528900000}, 48 Owner: signer.Address()}) 49 50 if err != nil { 51 t.Fatalf("Error creating resource name: %s", err) 52 } 53 54 // 55 messageRawData, err := createRequest.MarshalJSON() 56 if err != nil { 57 t.Fatalf("Error encoding create resource request: %s", err) 58 } 59 60 // 61 var recoveredCreateRequest Request 62 if err := recoveredCreateRequest.UnmarshalJSON(messageRawData); err != nil { 63 t.Fatalf("Error decoding create resource request: %s", err) 64 } 65 66 // 67 if err := recoveredCreateRequest.Verify(); err == nil { 68 t.Fatal("Expected Verify to fail since the message is not signed") 69 } 70 71 // 72 // 73 // 74 75 metaHash := createRequest.metaHash 76 rootAddr := createRequest.rootAddr 77 const expectedSignature = "0x1c2bab66dc4ed63783d62934e3a628e517888d6949aef0349f3bd677121db9aa09bbfb865904e6c50360e209e0fe6fe757f8a2474cf1b34169c99b95e3fd5a5101" 78 const expectedJSON = `{"rootAddr":"0x6e744a730f7ea0881528576f0354b6268b98e35a6981ef703153ff1b8d32bbef","metaHash":"0x0c0d5c18b89da503af92302a1a64fab6acb60f78e288eb9c3d541655cd359b60","version":1,"period":7,"data":"0x5468697320686f75722773207570646174653a20537761726d2039392e3020686173206265656e2072656c656173656421","multiHash":false}` 79 80 // 81 data := []byte("This hour's update: Swarm 99.0 has been released!") 82 request := &Request{ 83 SignedResourceUpdate: SignedResourceUpdate{ 84 resourceUpdate: resourceUpdate{ 85 updateHeader: updateHeader{ 86 UpdateLookup: UpdateLookup{ 87 period: 7, 88 version: 1, 89 rootAddr: rootAddr, 90 }, 91 multihash: false, 92 metaHash: metaHash, 93 }, 94 data: data, 95 }, 96 }, 97 } 98 99 messageRawData, err = request.MarshalJSON() 100 if err != nil { 101 t.Fatalf("Error encoding update request: %s", err) 102 } 103 104 equalJSON, err := areEqualJSON(string(messageRawData), expectedJSON) 105 if err != nil { 106 t.Fatalf("Error decoding update request JSON: %s", err) 107 } 108 if !equalJSON { 109 t.Fatalf("Received a different JSON message. Expected %s, got %s", expectedJSON, string(messageRawData)) 110 } 111 112 // 113 114 // 115 var recoveredRequest Request 116 if err := recoveredRequest.UnmarshalJSON(messageRawData); err != nil { 117 t.Fatalf("Error decoding update request: %s", err) 118 } 119 120 // 121 if err := recoveredRequest.Sign(signer); err != nil { 122 t.Fatalf("Error signing request: %s", err) 123 } 124 125 compareByteSliceToExpectedHex(t, "signature", recoveredRequest.signature[:], expectedSignature) 126 127 // 128 // 129 var j updateRequestJSON 130 if err := json.Unmarshal([]byte(expectedJSON), &j); err != nil { 131 t.Fatal("Error unmarshalling test json, check expectedJSON constant") 132 } 133 j.Signature = "Certainly not a signature" 134 corruptMessage, _ := json.Marshal(j) // 135 var corruptRequest Request 136 if err = corruptRequest.UnmarshalJSON(corruptMessage); err == nil { 137 t.Fatal("Expected DecodeUpdateRequest to fail when trying to interpret a corrupt message with an invalid signature") 138 } 139 140 // 141 // 142 if err := request.Sign(falseSigner); err != nil { 143 t.Fatalf("Error signing: %s", err) 144 } 145 146 // 147 messageRawData, err = request.MarshalJSON() 148 if err != nil { 149 t.Fatalf("Error encoding message:%s", err) 150 } 151 152 // 153 recoveredRequest = Request{} 154 if err := recoveredRequest.UnmarshalJSON(messageRawData); err != nil { 155 t.Fatalf("Error decoding message:%s", err) 156 } 157 158 // 159 // 160 savedSignature := *recoveredRequest.signature // 161 binary.LittleEndian.PutUint64(recoveredRequest.signature[5:], 556845463424) // 162 if err = recoveredRequest.Verify(); err == nil { 163 t.Fatal("Expected Verify to fail on corrupt signature") 164 } 165 166 // 167 *recoveredRequest.signature = savedSignature 168 169 // 170 if err = recoveredRequest.Verify(); err == nil { 171 t.Fatalf("Expected Verify to fail because this resource belongs to Charlie, not Bob the attacker:%s", err) 172 } 173 174 // 175 if err := recoveredRequest.Sign(signer); err != nil { 176 t.Fatalf("Error signing with the correct private key: %s", err) 177 } 178 179 // 180 if err = recoveredRequest.Verify(); err != nil { 181 t.Fatalf("Error verifying that Charlie, the good guy, can sign his resource:%s", err) 182 } 183 }