github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/swarm/pss/handshake_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:48</date>
    10  //</624342677634158592>
    11  
    12  //
    13  //
    14  //
    15  //
    16  //
    17  //
    18  //
    19  //
    20  //
    21  //
    22  //
    23  //
    24  //
    25  //
    26  //
    27  
    28  //
    29  
    30  package pss
    31  
    32  import (
    33  	"strconv"
    34  	"strings"
    35  	"testing"
    36  	"time"
    37  
    38  	"github.com/ethereum/go-ethereum/swarm/log"
    39  )
    40  
    41  //
    42  //
    43  func TestHandshake(t *testing.T) {
    44  	t.Run("32", testHandshake)
    45  	t.Run("8", testHandshake)
    46  	t.Run("0", testHandshake)
    47  }
    48  
    49  func testHandshake(t *testing.T) {
    50  
    51  //
    52  	useHandshake = true
    53  	var addrsize int64
    54  	var err error
    55  	addrsizestring := strings.Split(t.Name(), "/")
    56  	addrsize, _ = strconv.ParseInt(addrsizestring[1], 10, 0)
    57  
    58  //
    59  //
    60  	clients, err := setupNetwork(2)
    61  	if err != nil {
    62  		t.Fatal(err)
    63  	}
    64  
    65  	var topic string
    66  	err = clients[0].Call(&topic, "pss_stringToTopic", "foo:42")
    67  	if err != nil {
    68  		t.Fatal(err)
    69  	}
    70  
    71  	var loaddr string
    72  	err = clients[0].Call(&loaddr, "pss_baseAddr")
    73  	if err != nil {
    74  		t.Fatalf("rpc get node 1 baseaddr fail: %v", err)
    75  	}
    76  //
    77  	loaddr = loaddr[:2+(addrsize*2)]
    78  	var roaddr string
    79  	err = clients[1].Call(&roaddr, "pss_baseAddr")
    80  	if err != nil {
    81  		t.Fatalf("rpc get node 2 baseaddr fail: %v", err)
    82  	}
    83  	roaddr = roaddr[:2+(addrsize*2)]
    84  	log.Debug("addresses", "left", loaddr, "right", roaddr)
    85  
    86  //
    87  //
    88  	var lpubkey string
    89  	err = clients[0].Call(&lpubkey, "pss_getPublicKey")
    90  	if err != nil {
    91  		t.Fatalf("rpc get node 1 pubkey fail: %v", err)
    92  	}
    93  	var rpubkey string
    94  	err = clients[1].Call(&rpubkey, "pss_getPublicKey")
    95  	if err != nil {
    96  		t.Fatalf("rpc get node 2 pubkey fail: %v", err)
    97  	}
    98  
    99  time.Sleep(time.Millisecond * 1000) //
   100  
   101  //
   102  	err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, roaddr)
   103  	if err != nil {
   104  		t.Fatal(err)
   105  	}
   106  	err = clients[1].Call(nil, "pss_setPeerPublicKey", lpubkey, topic, loaddr)
   107  	if err != nil {
   108  		t.Fatal(err)
   109  	}
   110  
   111  //
   112  //
   113  //
   114  //
   115  //
   116  //
   117  	err = clients[0].Call(nil, "pss_addHandshake", topic)
   118  	if err != nil {
   119  		t.Fatal(err)
   120  	}
   121  	err = clients[1].Call(nil, "pss_addHandshake", topic)
   122  	if err != nil {
   123  		t.Fatal(err)
   124  	}
   125  
   126  	var lhsendsymkeyids []string
   127  	err = clients[0].Call(&lhsendsymkeyids, "pss_handshake", rpubkey, topic, true, true)
   128  	if err != nil {
   129  		t.Fatal(err)
   130  	}
   131  
   132  //
   133  	time.Sleep(time.Second)
   134  
   135  //
   136  	var lsendsymkeyids []string
   137  	err = clients[0].Call(&lsendsymkeyids, "pss_getHandshakeKeys", rpubkey, topic, false, true)
   138  	if err != nil {
   139  		t.Fatal(err)
   140  	}
   141  	m := 0
   142  	for _, hid := range lhsendsymkeyids {
   143  		for _, lid := range lsendsymkeyids {
   144  			if lid == hid {
   145  				m++
   146  			}
   147  		}
   148  	}
   149  	if m != defaultSymKeyCapacity {
   150  		t.Fatalf("buffer size mismatch, expected %d, have %d: %v", defaultSymKeyCapacity, m, lsendsymkeyids)
   151  	}
   152  
   153  //
   154  	var rsendsymkeyids []string
   155  	err = clients[1].Call(&rsendsymkeyids, "pss_getHandshakeKeys", lpubkey, topic, false, true)
   156  	if err != nil {
   157  		t.Fatal(err)
   158  	}
   159  	var lrecvsymkeyids []string
   160  	err = clients[0].Call(&lrecvsymkeyids, "pss_getHandshakeKeys", rpubkey, topic, true, false)
   161  	if err != nil {
   162  		t.Fatal(err)
   163  	}
   164  	var rrecvsymkeyids []string
   165  	err = clients[1].Call(&rrecvsymkeyids, "pss_getHandshakeKeys", lpubkey, topic, true, false)
   166  	if err != nil {
   167  		t.Fatal(err)
   168  	}
   169  
   170  //
   171  	var lsendsymkeys []string
   172  	for _, id := range lsendsymkeyids {
   173  		var key string
   174  		err = clients[0].Call(&key, "pss_getSymmetricKey", id)
   175  		if err != nil {
   176  			t.Fatal(err)
   177  		}
   178  		lsendsymkeys = append(lsendsymkeys, key)
   179  	}
   180  	var rsendsymkeys []string
   181  	for _, id := range rsendsymkeyids {
   182  		var key string
   183  		err = clients[1].Call(&key, "pss_getSymmetricKey", id)
   184  		if err != nil {
   185  			t.Fatal(err)
   186  		}
   187  		rsendsymkeys = append(rsendsymkeys, key)
   188  	}
   189  
   190  //
   191  	var lrecvsymkeys []string
   192  	for _, id := range lrecvsymkeyids {
   193  		var key string
   194  		err = clients[0].Call(&key, "pss_getSymmetricKey", id)
   195  		if err != nil {
   196  			t.Fatal(err)
   197  		}
   198  		match := false
   199  		for _, otherkey := range rsendsymkeys {
   200  			if otherkey == key {
   201  				match = true
   202  			}
   203  		}
   204  		if !match {
   205  			t.Fatalf("no match right send for left recv key %s", id)
   206  		}
   207  		lrecvsymkeys = append(lrecvsymkeys, key)
   208  	}
   209  	var rrecvsymkeys []string
   210  	for _, id := range rrecvsymkeyids {
   211  		var key string
   212  		err = clients[1].Call(&key, "pss_getSymmetricKey", id)
   213  		if err != nil {
   214  			t.Fatal(err)
   215  		}
   216  		match := false
   217  		for _, otherkey := range lsendsymkeys {
   218  			if otherkey == key {
   219  				match = true
   220  			}
   221  		}
   222  		if !match {
   223  			t.Fatalf("no match left send for right recv key %s", id)
   224  		}
   225  		rrecvsymkeys = append(rrecvsymkeys, key)
   226  	}
   227  
   228  //
   229  	err = clients[0].Call(nil, "pss_handshake", rpubkey, topic, false)
   230  	if err == nil {
   231  		t.Fatal("expected full symkey buffer error")
   232  	}
   233  
   234  //
   235  	err = clients[0].Call(nil, "pss_releaseHandshakeKey", rpubkey, topic, lsendsymkeyids[0], true)
   236  	if err != nil {
   237  		t.Fatalf("release left send key %s fail: %v", lsendsymkeyids[0], err)
   238  	}
   239  
   240  	var newlhsendkeyids []string
   241  
   242  //
   243  //
   244  	err = clients[0].Call(&newlhsendkeyids, "pss_handshake", rpubkey, topic, true, false)
   245  	if err != nil {
   246  		t.Fatalf("handshake send fail: %v", err)
   247  	} else if len(newlhsendkeyids) != defaultSymKeyCapacity {
   248  		t.Fatalf("wrong receive count, expected 1, got %d", len(newlhsendkeyids))
   249  	}
   250  
   251  	var newlrecvsymkey string
   252  	err = clients[0].Call(&newlrecvsymkey, "pss_getSymmetricKey", newlhsendkeyids[0])
   253  	if err != nil {
   254  		t.Fatal(err)
   255  	}
   256  	var rmatchsymkeyid *string
   257  	for i, id := range rrecvsymkeyids {
   258  		var key string
   259  		err = clients[1].Call(&key, "pss_getSymmetricKey", id)
   260  		if err != nil {
   261  			t.Fatal(err)
   262  		}
   263  		if newlrecvsymkey == key {
   264  			rmatchsymkeyid = &rrecvsymkeyids[i]
   265  		}
   266  	}
   267  	if rmatchsymkeyid != nil {
   268  		t.Fatalf("right sent old key id %s in second handshake", *rmatchsymkeyid)
   269  	}
   270  
   271  //
   272  	var cleancount int
   273  	clients[0].Call(&cleancount, "psstest_clean")
   274  	if cleancount > 1 {
   275  		t.Fatalf("pss clean count mismatch; expected 1, got %d", cleancount)
   276  	}
   277  }
   278