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