github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/swarm/storage/mru/request_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 12:09:50</date>
    10  //</624342683451658240>
    11  
    12  package mru
    13  
    14  import (
    15  	"encoding/binary"
    16  	"encoding/json"
    17  	"fmt"
    18  	"reflect"
    19  	"testing"
    20  )
    21  
    22  func areEqualJSON(s1, s2 string) (bool, error) {
    23  //
    24  	var o1 interface{}
    25  	var o2 interface{}
    26  
    27  	err := json.Unmarshal([]byte(s1), &o1)
    28  	if err != nil {
    29  		return false, fmt.Errorf("Error mashalling string 1 :: %s", err.Error())
    30  	}
    31  	err = json.Unmarshal([]byte(s2), &o2)
    32  	if err != nil {
    33  		return false, fmt.Errorf("Error mashalling string 2 :: %s", err.Error())
    34  	}
    35  
    36  	return reflect.DeepEqual(o1, o2), nil
    37  }
    38  
    39  //
    40  //
    41  func TestEncodingDecodingUpdateRequests(t *testing.T) {
    42  
    43  signer := newCharlieSigner()  //
    44  falseSigner := newBobSigner() //
    45  
    46  //
    47  	createRequest, err := NewCreateRequest(&ResourceMetadata{
    48  		Name:      "a good resource name",
    49  		Frequency: 300,
    50  		StartTime: Timestamp{Time: 1528900000},
    51  		Owner:     signer.Address()})
    52  
    53  	if err != nil {
    54  		t.Fatalf("Error creating resource name: %s", err)
    55  	}
    56  
    57  //
    58  	messageRawData, err := createRequest.MarshalJSON()
    59  	if err != nil {
    60  		t.Fatalf("Error encoding create resource request: %s", err)
    61  	}
    62  
    63  //
    64  	var recoveredCreateRequest Request
    65  	if err := recoveredCreateRequest.UnmarshalJSON(messageRawData); err != nil {
    66  		t.Fatalf("Error decoding create resource request: %s", err)
    67  	}
    68  
    69  //
    70  	if err := recoveredCreateRequest.Verify(); err == nil {
    71  		t.Fatal("Expected Verify to fail since the message is not signed")
    72  	}
    73  
    74  //
    75  //
    76  //
    77  
    78  	metaHash := createRequest.metaHash
    79  	rootAddr := createRequest.rootAddr
    80  	const expectedSignature = "0x1c2bab66dc4ed63783d62934e3a628e517888d6949aef0349f3bd677121db9aa09bbfb865904e6c50360e209e0fe6fe757f8a2474cf1b34169c99b95e3fd5a5101"
    81  	const expectedJSON = `{"rootAddr":"0x6e744a730f7ea0881528576f0354b6268b98e35a6981ef703153ff1b8d32bbef","metaHash":"0x0c0d5c18b89da503af92302a1a64fab6acb60f78e288eb9c3d541655cd359b60","version":1,"period":7,"data":"0x5468697320686f75722773207570646174653a20537761726d2039392e3020686173206265656e2072656c656173656421","multiHash":false}`
    82  
    83  //
    84  	data := []byte("This hour's update: Swarm 99.0 has been released!")
    85  	request := &Request{
    86  		SignedResourceUpdate: SignedResourceUpdate{
    87  			resourceUpdate: resourceUpdate{
    88  				updateHeader: updateHeader{
    89  					UpdateLookup: UpdateLookup{
    90  						period:   7,
    91  						version:  1,
    92  						rootAddr: rootAddr,
    93  					},
    94  					multihash: false,
    95  					metaHash:  metaHash,
    96  				},
    97  				data: data,
    98  			},
    99  		},
   100  	}
   101  
   102  	messageRawData, err = request.MarshalJSON()
   103  	if err != nil {
   104  		t.Fatalf("Error encoding update request: %s", err)
   105  	}
   106  
   107  	equalJSON, err := areEqualJSON(string(messageRawData), expectedJSON)
   108  	if err != nil {
   109  		t.Fatalf("Error decoding update request JSON: %s", err)
   110  	}
   111  	if !equalJSON {
   112  		t.Fatalf("Received a different JSON message. Expected %s, got %s", expectedJSON, string(messageRawData))
   113  	}
   114  
   115  //
   116  
   117  //
   118  	var recoveredRequest Request
   119  	if err := recoveredRequest.UnmarshalJSON(messageRawData); err != nil {
   120  		t.Fatalf("Error decoding update request: %s", err)
   121  	}
   122  
   123  //
   124  	if err := recoveredRequest.Sign(signer); err != nil {
   125  		t.Fatalf("Error signing request: %s", err)
   126  	}
   127  
   128  	compareByteSliceToExpectedHex(t, "signature", recoveredRequest.signature[:], expectedSignature)
   129  
   130  //
   131  //
   132  	var j updateRequestJSON
   133  	if err := json.Unmarshal([]byte(expectedJSON), &j); err != nil {
   134  		t.Fatal("Error unmarshalling test json, check expectedJSON constant")
   135  	}
   136  	j.Signature = "Certainly not a signature"
   137  corruptMessage, _ := json.Marshal(j) //
   138  	var corruptRequest Request
   139  	if err = corruptRequest.UnmarshalJSON(corruptMessage); err == nil {
   140  		t.Fatal("Expected DecodeUpdateRequest to fail when trying to interpret a corrupt message with an invalid signature")
   141  	}
   142  
   143  //
   144  //
   145  	if err := request.Sign(falseSigner); err != nil {
   146  		t.Fatalf("Error signing: %s", err)
   147  	}
   148  
   149  //
   150  	messageRawData, err = request.MarshalJSON()
   151  	if err != nil {
   152  		t.Fatalf("Error encoding message:%s", err)
   153  	}
   154  
   155  //
   156  	recoveredRequest = Request{}
   157  	if err := recoveredRequest.UnmarshalJSON(messageRawData); err != nil {
   158  		t.Fatalf("Error decoding message:%s", err)
   159  	}
   160  
   161  //
   162  //
   163  savedSignature := *recoveredRequest.signature                               //
   164  binary.LittleEndian.PutUint64(recoveredRequest.signature[5:], 556845463424) //
   165  	if err = recoveredRequest.Verify(); err == nil {
   166  		t.Fatal("Expected Verify to fail on corrupt signature")
   167  	}
   168  
   169  //
   170  	*recoveredRequest.signature = savedSignature
   171  
   172  //
   173  	if err = recoveredRequest.Verify(); err == nil {
   174  		t.Fatalf("Expected Verify to fail because this resource belongs to Charlie, not Bob the attacker:%s", err)
   175  	}
   176  
   177  //
   178  	if err := recoveredRequest.Sign(signer); err != nil {
   179  		t.Fatalf("Error signing with the correct private key: %s", err)
   180  	}
   181  
   182  //
   183  	if err = recoveredRequest.Verify(); err != nil {
   184  		t.Fatalf("Error verifying that Charlie, the good guy, can sign his resource:%s", err)
   185  	}
   186  }
   187