test(*):add network and consensus unit test
This commit is contained in:
parent
7f31e01cfe
commit
5ead8bad8a
2
go.mod
2
go.mod
|
@ -1,6 +1,7 @@
|
|||
module github.com/meshplus/bitxhub
|
||||
|
||||
require (
|
||||
code.cloudfoundry.org/clock v1.0.0 // indirect
|
||||
github.com/Rican7/retry v0.1.0
|
||||
github.com/cbergoon/merkletree v0.2.0
|
||||
github.com/common-nighthawk/go-figure v0.0.0-20190529165535-67e0ed34491a
|
||||
|
@ -37,6 +38,7 @@ require (
|
|||
github.com/urfave/cli v1.22.1
|
||||
github.com/wasmerio/go-ext-wasm v0.3.1
|
||||
github.com/willf/bloom v2.0.3+incompatible
|
||||
go.etcd.io/etcd v3.3.25+incompatible // indirect
|
||||
go.uber.org/atomic v1.6.0
|
||||
google.golang.org/grpc v1.27.1
|
||||
)
|
||||
|
|
19
go.sum
19
go.sum
|
@ -1,4 +1,6 @@
|
|||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
code.cloudfoundry.org/clock v1.0.0 h1:kFXWQM4bxYvdBw2X8BbBeXwQNgfoWv1vqAk2ZZyBN2o=
|
||||
code.cloudfoundry.org/clock v1.0.0/go.mod h1:QD9Lzhd/ux6eNQVUDVRJX/RKTigpewimNYBi7ivZKY8=
|
||||
github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
|
||||
github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
|
||||
github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4=
|
||||
|
@ -23,6 +25,7 @@ github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdII
|
|||
github.com/Rican7/retry v0.1.0 h1:FqK94z34ly8Baa6K+G8Mmza9rYWTKOJk+yckIBB5qVk=
|
||||
github.com/Rican7/retry v0.1.0/go.mod h1:FgOROf8P5bebcC1DS0PdOQiqGUridaZvikzUmkFW6gg=
|
||||
github.com/Shopify/sarama v1.26.1/go.mod h1:NbSGBSSndYaIhRcBtY9V0U7AyH+x71bG668AuWys/yU=
|
||||
github.com/Shopify/sarama v1.27.0 h1:tqo2zmyzPf1+gwTTwhI6W+EXDw4PVSczynpHKFtVAmo=
|
||||
github.com/Shopify/sarama v1.27.0/go.mod h1:aCdj6ymI8uyPEux1JJ9gcaDT6cinjGhNCAhs54taSUo=
|
||||
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
|
||||
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
|
||||
|
@ -117,8 +120,11 @@ github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55k
|
|||
github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||
github.com/dop251/goja v0.0.0-20200219165308-d1232e640a87/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA=
|
||||
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||
github.com/eapache/go-resiliency v1.2.0 h1:v7g92e/KSN71Rq7vSThKaWIq68fL4YHvWyiUKorFR1Q=
|
||||
github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
|
||||
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw=
|
||||
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
|
||||
github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc=
|
||||
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
|
||||
github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
|
||||
github.com/elastic/gosigar v0.8.1-0.20180330100440-37f05ff46ffa/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs=
|
||||
|
@ -212,6 +218,7 @@ github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad
|
|||
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
|
||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 h1:Iju5GlWwrvL6UBg4zJJt3btmonfrMlCDdsejg4CZE7c=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||
|
@ -224,8 +231,10 @@ github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/U
|
|||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||
github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=
|
||||
github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
|
||||
github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=
|
||||
github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||
github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
|
||||
github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=
|
||||
github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
|
||||
github.com/hashicorp/golang-lru v0.0.0-20160813221303-0a025b7e63ad/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
|
@ -304,6 +313,7 @@ github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsj
|
|||
github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4=
|
||||
github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o=
|
||||
github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4=
|
||||
github.com/jcmturner/gofork v1.0.0 h1:J7uCkflzTEhUZ64xqKnkDxq3kzc96ajM1Gli5ktUem8=
|
||||
github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
|
||||
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag=
|
||||
github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||
|
@ -328,6 +338,7 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o
|
|||
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
|
||||
github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||
github.com/klauspost/compress v1.10.1/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||
github.com/klauspost/compress v1.10.10 h1:a/y8CglcM7gLGYmlbP/stPE5sR3hbhFRUjCBfd/0B3I=
|
||||
github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||
github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||
github.com/klauspost/reedsolomon v1.9.3/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4=
|
||||
|
@ -648,6 +659,7 @@ github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181
|
|||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0=
|
||||
github.com/pierrec/lz4 v2.4.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
||||
github.com/pierrec/lz4 v2.5.2+incompatible h1:WCjObylUIOlKy/+7Abdn34TLIkXiA4UWUMhxq9m9ZXI=
|
||||
github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
|
@ -682,6 +694,7 @@ github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0
|
|||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
||||
github.com/rcrowley/go-metrics v0.0.0-20180503174638-e2704e165165/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||
github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||
github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ=
|
||||
github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 h1:mZHayPoR0lNmnHyvtYjDeq0zlVHn9K/ZXoy17ylucdo=
|
||||
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5/go.mod h1:GEXHk5HgEKCvEIIrSpFI3ozzG5xOKA2DVlEX/gGnewM=
|
||||
|
@ -806,6 +819,8 @@ github.com/xtaci/kcp-go v5.4.20+incompatible/go.mod h1:bN6vIwHQbfHaHtFpEssmWsN45
|
|||
github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE=
|
||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||
go.etcd.io/etcd v3.3.25+incompatible h1:V1RzkZJj9LqsJRy+TUBgpWSbZXITLB819lstuTFoZOY=
|
||||
go.etcd.io/etcd v3.3.25+incompatible/go.mod h1:yaeTdrJi5lOmYerz05bd8+V7KubZs8YSFZfzsF9A6aI=
|
||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||
go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA=
|
||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
|
@ -980,10 +995,14 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
|||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||
gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
|
||||
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/jcmturner/aescts.v1 v1.0.1 h1:cVVZBK2b1zY26haWB4vbBiZrfFQnfbTVrE3xZq6hrEw=
|
||||
gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo=
|
||||
gopkg.in/jcmturner/dnsutils.v1 v1.0.1 h1:cIuC1OLRGZrld+16ZJvvZxVJeKPsvd5eUIvxfoN5hSM=
|
||||
gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q=
|
||||
gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4=
|
||||
gopkg.in/jcmturner/gokrb5.v7 v7.5.0 h1:a9tsXlIDD9SKxotJMK3niV7rPZAJeX2aD/0yg3qlIrg=
|
||||
gopkg.in/jcmturner/gokrb5.v7 v7.5.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM=
|
||||
gopkg.in/jcmturner/rpc.v1 v1.1.0 h1:QHIUxTX1ISuAv9dD2wJ9HWQVuWDX/Zc0PfeC2tjc4rU=
|
||||
gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8=
|
||||
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c=
|
||||
gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200316214253-d7b0ff38cac9/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns=
|
||||
|
|
|
@ -370,6 +370,9 @@ func (n *Node) send(messages []raftpb.Message) {
|
|||
|
||||
err = n.peerMgr.AsyncSend(msg.To, p2pMsg)
|
||||
if err != nil {
|
||||
n.logger.WithFields(logrus.Fields{
|
||||
"from": msg.From,
|
||||
}).Error(err)
|
||||
n.node.ReportUnreachable(msg.To)
|
||||
status = raft.SnapshotFailure
|
||||
}
|
||||
|
|
|
@ -1,22 +1,32 @@
|
|||
package etcdraft
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/golang/mock/gomock"
|
||||
crypto2 "github.com/libp2p/go-libp2p-core/crypto"
|
||||
"github.com/libp2p/go-libp2p-core/peer"
|
||||
"github.com/meshplus/bitxhub-kit/crypto"
|
||||
"github.com/meshplus/bitxhub-kit/crypto/asym"
|
||||
"github.com/meshplus/bitxhub-kit/crypto/asym/ecdsa"
|
||||
"github.com/meshplus/bitxhub-kit/log"
|
||||
"github.com/meshplus/bitxhub-kit/types"
|
||||
"github.com/meshplus/bitxhub-model/pb"
|
||||
"github.com/meshplus/bitxhub/internal/ledger/mock_ledger"
|
||||
"github.com/meshplus/bitxhub/internal/model/events"
|
||||
"github.com/meshplus/bitxhub/internal/repo"
|
||||
"github.com/meshplus/bitxhub/pkg/cert"
|
||||
"github.com/meshplus/bitxhub/pkg/order"
|
||||
"github.com/meshplus/bitxhub/pkg/peermgr"
|
||||
"github.com/meshplus/bitxhub/pkg/peermgr/mock_peermgr"
|
||||
ma "github.com/multiformats/go-multiaddr"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
@ -38,6 +48,7 @@ func TestNode_Start(t *testing.T) {
|
|||
require.Nil(t, err)
|
||||
|
||||
mockCtl := gomock.NewController(t)
|
||||
|
||||
mockPeermgr := mock_peermgr.NewMockPeerManager(mockCtl)
|
||||
peers := make(map[uint64]*peer.AddrInfo)
|
||||
mockPeermgr.EXPECT().Peers().Return(peers).AnyTimes()
|
||||
|
@ -73,6 +84,75 @@ func TestNode_Start(t *testing.T) {
|
|||
order.Stop()
|
||||
}
|
||||
|
||||
func TestMulti_Node_Start(t *testing.T) {
|
||||
peerCnt := 4
|
||||
swarms, nodes := newSwarms(t, peerCnt)
|
||||
|
||||
//time.Sleep(3 * time.Second)
|
||||
repoRoot, err := ioutil.TempDir("", "nodes")
|
||||
defer os.RemoveAll(repoRoot)
|
||||
|
||||
fileData, err := ioutil.ReadFile("../../../config/order.toml")
|
||||
require.Nil(t, err)
|
||||
|
||||
orders := make([]order.Order, 0)
|
||||
for i := 0; i < peerCnt; i++ {
|
||||
nodePath := fmt.Sprintf("node%d", i)
|
||||
nodeRepo := filepath.Join(repoRoot, nodePath)
|
||||
err := os.Mkdir(nodeRepo, 0744)
|
||||
require.Nil(t, err)
|
||||
orderPath := filepath.Join(nodeRepo, "order.toml")
|
||||
err = ioutil.WriteFile(orderPath, fileData, 0744)
|
||||
require.Nil(t, err)
|
||||
|
||||
ID := i + 1
|
||||
order, err := NewNode(
|
||||
order.WithRepoRoot(nodeRepo),
|
||||
order.WithID(uint64(ID)),
|
||||
order.WithNodes(nodes),
|
||||
order.WithPeerManager(swarms[i]),
|
||||
order.WithStoragePath(repo.GetStoragePath(nodeRepo, "order")),
|
||||
order.WithLogger(log.NewWithModule("consensus")),
|
||||
order.WithApplied(1),
|
||||
)
|
||||
require.Nil(t, err)
|
||||
err = order.Start()
|
||||
require.Nil(t, err)
|
||||
orders = append(orders, order)
|
||||
go listen(t, order, swarms[i])
|
||||
}
|
||||
|
||||
for {
|
||||
time.Sleep(200 * time.Millisecond)
|
||||
if orders[0].Ready() {
|
||||
break
|
||||
}
|
||||
}
|
||||
tx := generateTx()
|
||||
err = orders[0].Prepare(tx)
|
||||
require.Nil(t, err)
|
||||
for i := 0; i < len(orders); i++ {
|
||||
block := <-orders[i].Commit()
|
||||
require.Equal(t, uint64(2), block.BlockHeader.Number)
|
||||
require.Equal(t, 1, len(block.Transactions))
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func listen(t *testing.T, order order.Order, swarm *peermgr.Swarm) {
|
||||
orderMsgCh := make(chan events.OrderMessageEvent)
|
||||
sub := swarm.SubscribeOrderMessage(orderMsgCh)
|
||||
defer sub.Unsubscribe()
|
||||
for {
|
||||
select {
|
||||
case ev := <-orderMsgCh:
|
||||
err := order.Step(context.Background(), ev.Data)
|
||||
require.Nil(t, err)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func generateTx() *pb.Transaction {
|
||||
privKey, _ := asym.GenerateKeyPair(crypto.Secp256k1)
|
||||
|
||||
|
@ -91,3 +171,118 @@ func generateTx() *pb.Transaction {
|
|||
tx.TransactionHash = tx.Hash()
|
||||
return tx
|
||||
}
|
||||
|
||||
func genKeysAndConfig(t *testing.T, peerCnt int) ([]crypto2.PrivKey, []crypto.PrivateKey, []string) {
|
||||
var nodeKeys []crypto2.PrivKey
|
||||
var privKeys []crypto.PrivateKey
|
||||
var peers []string
|
||||
|
||||
port := 7001
|
||||
|
||||
for i := 0; i < peerCnt; i++ {
|
||||
key, err := asym.GenerateKeyPair(crypto.ECDSA_P256)
|
||||
require.Nil(t, err)
|
||||
|
||||
libp2pKey, err := convertToLibp2pPrivKey(key)
|
||||
require.Nil(t, err)
|
||||
nodeKeys = append(nodeKeys, libp2pKey)
|
||||
id, err := peer.IDFromPublicKey(libp2pKey.GetPublic())
|
||||
require.Nil(t, err)
|
||||
|
||||
peer := fmt.Sprintf("/ip4/127.0.0.1/tcp/%d/p2p/%s", port, id)
|
||||
peers = append(peers, peer)
|
||||
port++
|
||||
|
||||
privKey, err := asym.GenerateKeyPair(crypto.Secp256k1)
|
||||
require.Nil(t, err)
|
||||
|
||||
privKeys = append(privKeys, privKey)
|
||||
}
|
||||
|
||||
return nodeKeys, privKeys, peers
|
||||
}
|
||||
|
||||
func convertToLibp2pPrivKey(privateKey crypto.PrivateKey) (crypto2.PrivKey, error) {
|
||||
ecdsaPrivKey, ok := privateKey.(*ecdsa.PrivateKey)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("convert to libp2p private key: not ecdsa private key")
|
||||
}
|
||||
|
||||
libp2pPrivKey, _, err := crypto2.ECDSAKeyPairFromKey(ecdsaPrivKey.K)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return libp2pPrivKey, nil
|
||||
}
|
||||
|
||||
func otherPeers(id uint64, addrs []string) map[uint64]*peer.AddrInfo {
|
||||
m := make(map[uint64]*peer.AddrInfo)
|
||||
for i, addr := range addrs {
|
||||
if uint64(i+1) == id {
|
||||
continue
|
||||
}
|
||||
addr, _ := ma.NewMultiaddr(addr)
|
||||
pAddr, _ := peer.AddrInfoFromP2pAddr(addr)
|
||||
m[uint64(i+1)] = pAddr
|
||||
}
|
||||
return m
|
||||
}
|
||||
|
||||
func newSwarms(t *testing.T, peerCnt int) ([]*peermgr.Swarm, map[uint64]types.Address) {
|
||||
var swarms []*peermgr.Swarm
|
||||
nodes := make(map[uint64]types.Address)
|
||||
nodeKeys, privKeys, addrs := genKeysAndConfig(t, peerCnt)
|
||||
mockCtl := gomock.NewController(t)
|
||||
mockLedger := mock_ledger.NewMockLedger(mockCtl)
|
||||
|
||||
agencyData, err := ioutil.ReadFile("testdata/agency.cert")
|
||||
require.Nil(t, err)
|
||||
|
||||
nodeData, err := ioutil.ReadFile("testdata/node.cert")
|
||||
require.Nil(t, err)
|
||||
|
||||
caData, err := ioutil.ReadFile("testdata/ca.cert")
|
||||
require.Nil(t, err)
|
||||
|
||||
cert, err := cert.ParseCert(caData)
|
||||
require.Nil(t, err)
|
||||
|
||||
for i := 0; i < peerCnt; i++ {
|
||||
ID := i + 1
|
||||
repo := &repo.Repo{
|
||||
Key: &repo.Key{},
|
||||
NetworkConfig: &repo.NetworkConfig{
|
||||
N: uint64(peerCnt),
|
||||
ID: uint64(ID),
|
||||
},
|
||||
Certs: &repo.Certs{
|
||||
NodeCertData: nodeData,
|
||||
AgencyCertData: agencyData,
|
||||
CACert: cert,
|
||||
},
|
||||
}
|
||||
var local string
|
||||
id, err := peer.IDFromPublicKey(nodeKeys[i].GetPublic())
|
||||
require.Nil(t, err)
|
||||
if strings.HasSuffix(addrs[i], id.String()) {
|
||||
idx := strings.LastIndex(addrs[i], "/p2p/")
|
||||
local = addrs[i][:idx]
|
||||
}
|
||||
|
||||
repo.NetworkConfig.LocalAddr = local
|
||||
repo.Key.Libp2pPrivKey = nodeKeys[i]
|
||||
repo.Key.PrivKey = privKeys[i]
|
||||
repo.NetworkConfig.OtherNodes = otherPeers(uint64(ID), addrs)
|
||||
|
||||
address, err := privKeys[i].PublicKey().Address()
|
||||
require.Nil(t, err)
|
||||
nodes[uint64(ID)] = address
|
||||
swarm, err := peermgr.New(repo, log.NewWithModule("p2p"), mockLedger)
|
||||
require.Nil(t, err)
|
||||
err = swarm.Start()
|
||||
require.Nil(t, err)
|
||||
swarms = append(swarms, swarm)
|
||||
}
|
||||
return swarms, nodes
|
||||
}
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIICkjCCAjegAwIBAgIDAoB1MAoGCCqGSM49BAMCMIGhMQswCQYDVQQGEwJDTjER
|
||||
MA8GA1UECBMIWmhlSmlhbmcxETAPBgNVBAcTCEhhbmdaaG91MR8wDQYDVQQJEwZz
|
||||
dHJlZXQwDgYDVQQJEwdhZGRyZXNzMQ8wDQYDVQQREwYzMjQwMDAxEzARBgNVBAoT
|
||||
Ckh5cGVyY2hhaW4xEDAOBgNVBAsTB0JpdFhIdWIxEzARBgNVBAMTCmJpdHhodWIu
|
||||
Y24wIBcNMjAwODExMDUwNzEzWhgPMjA3MDA3MzAwNTA3MTNaMIGaMQswCQYDVQQG
|
||||
EwJDTjERMA8GA1UECBMIWmhlSmlhbmcxETAPBgNVBAcTCEhhbmdaaG91MR8wDQYD
|
||||
VQQJEwZzdHJlZXQwDgYDVQQJEwdhZGRyZXNzMQ8wDQYDVQQREwYzMjQwMDAxDzAN
|
||||
BgNVBAoTBkFnZW5jeTEQMA4GA1UECxMHQml0WEh1YjEQMA4GA1UEAxMHQml0WEh1
|
||||
YjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABETCj+MAoveSsjSLGr3y8F5IEccL
|
||||
Afn8d9rmw3ON24Y6NzoqV72T+kvXP7lJlj+7bhYJRtXO3FiPDBp1fFQb1tyjYTBf
|
||||
MA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMB
|
||||
Af8wKwYDVR0jBCQwIoAgFjEjLDiDWrdUwpIcMxUaxWQSVMS7agCqo44QcOAMlYMw
|
||||
CgYIKoZIzj0EAwIDSQAwRgIhAJeZBApwY2BtYXK28Wa0gzJ8Nc9pjhtX2UFoc7cl
|
||||
YilwAiEA3m60eyYQj/BiSDZ8+kZbUJO2C7y0HaT1xwNdjSZBFhI=
|
||||
-----END CERTIFICATE-----
|
|
@ -0,0 +1,16 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIIClTCCAjygAwIBAgIDAKWTMAoGCCqGSM49BAMCMIGhMQswCQYDVQQGEwJDTjER
|
||||
MA8GA1UECBMIWmhlSmlhbmcxETAPBgNVBAcTCEhhbmdaaG91MR8wDQYDVQQJEwZz
|
||||
dHJlZXQwDgYDVQQJEwdhZGRyZXNzMQ8wDQYDVQQREwYzMjQwMDAxEzARBgNVBAoT
|
||||
Ckh5cGVyY2hhaW4xEDAOBgNVBAsTB0JpdFhIdWIxEzARBgNVBAMTCmJpdHhodWIu
|
||||
Y24wIBcNMjAwODExMDUwNzEyWhgPMjA3MDA3MzAwNTA3MTJaMIGhMQswCQYDVQQG
|
||||
EwJDTjERMA8GA1UECBMIWmhlSmlhbmcxETAPBgNVBAcTCEhhbmdaaG91MR8wDQYD
|
||||
VQQJEwZzdHJlZXQwDgYDVQQJEwdhZGRyZXNzMQ8wDQYDVQQREwYzMjQwMDAxEzAR
|
||||
BgNVBAoTCkh5cGVyY2hhaW4xEDAOBgNVBAsTB0JpdFhIdWIxEzARBgNVBAMTCmJp
|
||||
dHhodWIuY24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASznYuB78fMNqgooAnp
|
||||
YPUfWoQCDAM0nV5YwSj1Rz6RcWKuRAPQooPFb8K2WO6hfRUGtCba+l48FD34R/RP
|
||||
aajqo18wXTAOBgNVHQ8BAf8EBAMCAaYwDwYDVR0lBAgwBgYEVR0lADAPBgNVHRMB
|
||||
Af8EBTADAQH/MCkGA1UdDgQiBCAWMSMsOINat1TCkhwzFRrFZBJUxLtqAKqjjhBw
|
||||
4AyVgzAKBggqhkjOPQQDAgNHADBEAiAW5pb+b2aLuEBJCkaEXfukb/HwFsNm7zmx
|
||||
Ha6oyk0HYAIgXhsMYlIXKf5RmlBFiEWZZRJTyiubI7NDqN5+JlVBAog=
|
||||
-----END CERTIFICATE-----
|
|
@ -0,0 +1,15 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIICWjCCAf+gAwIBAgIDDhFLMAoGCCqGSM49BAMCMIGaMQswCQYDVQQGEwJDTjER
|
||||
MA8GA1UECBMIWmhlSmlhbmcxETAPBgNVBAcTCEhhbmdaaG91MR8wDQYDVQQJEwZz
|
||||
dHJlZXQwDgYDVQQJEwdhZGRyZXNzMQ8wDQYDVQQREwYzMjQwMDAxDzANBgNVBAoT
|
||||
BkFnZW5jeTEQMA4GA1UECxMHQml0WEh1YjEQMA4GA1UEAxMHQml0WEh1YjAgFw0y
|
||||
MDA4MTEwNTA3MTNaGA8yMDcwMDczMDA1MDcxM1owgZkxCzAJBgNVBAYTAkNOMREw
|
||||
DwYDVQQIEwhaaGVKaWFuZzERMA8GA1UEBxMISGFuZ1pob3UxHzANBgNVBAkTBnN0
|
||||
cmVldDAOBgNVBAkTB2FkZHJlc3MxDzANBgNVBBETBjMyNDAwMDEOMAwGA1UEChMF
|
||||
Tm9kZTExEDAOBgNVBAsTB0JpdFhIdWIxEDAOBgNVBAMTB0JpdFhIdWIwWTATBgcq
|
||||
hkjOPQIBBggqhkjOPQMBBwNCAATgjTYEnavxerFuEKJ8C39QUY12xh/TC2E5V7ni
|
||||
nmQcOgDDRv5HW4sskTSm/WX2D0BMzwb7XE5ATyoDeM9qcurDozEwLzAOBgNVHQ8B
|
||||
Af8EBAMCAaYwDwYDVR0lBAgwBgYEVR0lADAMBgNVHRMBAf8EAjAAMAoGCCqGSM49
|
||||
BAMCA0kAMEYCIQD5Oz1xJvFgzYm/lTzoaO/i0ayPVRgSdBwvK6hEICo5lAIhAMtG
|
||||
aswjd2wVA4zB5GPEmJ/tvPUnxrlOAU67AQMYR4zf
|
||||
-----END CERTIFICATE-----
|
|
@ -0,0 +1,269 @@
|
|||
package peermgr
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/meshplus/bitxhub/internal/model/events"
|
||||
|
||||
"github.com/meshplus/bitxhub/internal/executor/contracts"
|
||||
|
||||
"github.com/Rican7/retry"
|
||||
"github.com/Rican7/retry/strategy"
|
||||
|
||||
"github.com/meshplus/bitxhub/pkg/cert"
|
||||
|
||||
"github.com/golang/mock/gomock"
|
||||
crypto2 "github.com/libp2p/go-libp2p-core/crypto"
|
||||
"github.com/libp2p/go-libp2p-core/peer"
|
||||
"github.com/meshplus/bitxhub-kit/crypto"
|
||||
"github.com/meshplus/bitxhub-kit/crypto/asym"
|
||||
"github.com/meshplus/bitxhub-kit/crypto/asym/ecdsa"
|
||||
"github.com/meshplus/bitxhub-kit/log"
|
||||
"github.com/meshplus/bitxhub-model/pb"
|
||||
"github.com/meshplus/bitxhub/internal/ledger/mock_ledger"
|
||||
"github.com/meshplus/bitxhub/internal/repo"
|
||||
ma "github.com/multiformats/go-multiaddr"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func genKeysAndConfig(t *testing.T, peerCnt int) ([]crypto2.PrivKey, []crypto.PrivateKey, []string) {
|
||||
var nodeKeys []crypto2.PrivKey
|
||||
var privKeys []crypto.PrivateKey
|
||||
var peers []string
|
||||
|
||||
port := 5001
|
||||
|
||||
for i := 0; i < peerCnt; i++ {
|
||||
key, err := asym.GenerateKeyPair(crypto.ECDSA_P256)
|
||||
require.Nil(t, err)
|
||||
|
||||
libp2pKey, err := convertToLibp2pPrivKey(key)
|
||||
require.Nil(t, err)
|
||||
nodeKeys = append(nodeKeys, libp2pKey)
|
||||
id, err := peer.IDFromPublicKey(libp2pKey.GetPublic())
|
||||
require.Nil(t, err)
|
||||
|
||||
peer := fmt.Sprintf("/ip4/127.0.0.1/tcp/%d/p2p/%s", port, id)
|
||||
peers = append(peers, peer)
|
||||
port++
|
||||
|
||||
privKey, err := asym.GenerateKeyPair(crypto.Secp256k1)
|
||||
require.Nil(t, err)
|
||||
|
||||
privKeys = append(privKeys, privKey)
|
||||
}
|
||||
|
||||
return nodeKeys, privKeys, peers
|
||||
}
|
||||
|
||||
func convertToLibp2pPrivKey(privateKey crypto.PrivateKey) (crypto2.PrivKey, error) {
|
||||
ecdsaPrivKey, ok := privateKey.(*ecdsa.PrivateKey)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("convert to libp2p private key: not ecdsa private key")
|
||||
}
|
||||
|
||||
libp2pPrivKey, _, err := crypto2.ECDSAKeyPairFromKey(ecdsaPrivKey.K)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return libp2pPrivKey, nil
|
||||
}
|
||||
|
||||
func otherPeers(id uint64, addrs []string) map[uint64]*peer.AddrInfo {
|
||||
m := make(map[uint64]*peer.AddrInfo)
|
||||
for i, addr := range addrs {
|
||||
if uint64(i) == id {
|
||||
continue
|
||||
}
|
||||
addr, _ := ma.NewMultiaddr(addr)
|
||||
pAddr, _ := peer.AddrInfoFromP2pAddr(addr)
|
||||
m[uint64(i)] = pAddr
|
||||
}
|
||||
return m
|
||||
}
|
||||
|
||||
func NewSwarms(t *testing.T, peerCnt int) []*Swarm {
|
||||
var swarms []*Swarm
|
||||
nodeKeys, privKeys, addrs := genKeysAndConfig(t, peerCnt)
|
||||
mockCtl := gomock.NewController(t)
|
||||
mockLedger := mock_ledger.NewMockLedger(mockCtl)
|
||||
|
||||
mockLedger.EXPECT().GetBlock(gomock.Any()).Return(&pb.Block{
|
||||
BlockHeader: &pb.BlockHeader{
|
||||
Number: 1,
|
||||
},
|
||||
}, nil).AnyTimes()
|
||||
|
||||
aer := contracts.AssetExchangeRecord{
|
||||
Status: 0,
|
||||
}
|
||||
|
||||
data, err := json.Marshal(aer)
|
||||
require.Nil(t, err)
|
||||
|
||||
mockLedger.EXPECT().GetBlockSign(gomock.Any()).Return([]byte("sign"), nil).AnyTimes()
|
||||
mockLedger.EXPECT().GetState(gomock.Any(), gomock.Any()).Return(true, data).AnyTimes()
|
||||
|
||||
agencyData, err := ioutil.ReadFile("testdata/agency.cert")
|
||||
require.Nil(t, err)
|
||||
|
||||
nodeData, err := ioutil.ReadFile("testdata/node.cert")
|
||||
require.Nil(t, err)
|
||||
|
||||
caData, err := ioutil.ReadFile("testdata/ca.cert")
|
||||
require.Nil(t, err)
|
||||
|
||||
cert, err := cert.ParseCert(caData)
|
||||
require.Nil(t, err)
|
||||
|
||||
for i := 0; i < peerCnt; i++ {
|
||||
repo := &repo.Repo{
|
||||
Key: &repo.Key{},
|
||||
NetworkConfig: &repo.NetworkConfig{
|
||||
N: uint64(peerCnt),
|
||||
ID: uint64(i),
|
||||
},
|
||||
Certs: &repo.Certs{
|
||||
NodeCertData: nodeData,
|
||||
AgencyCertData: agencyData,
|
||||
CACert: cert,
|
||||
},
|
||||
}
|
||||
var local string
|
||||
id, err := peer.IDFromPublicKey(nodeKeys[i].GetPublic())
|
||||
require.Nil(t, err)
|
||||
if strings.HasSuffix(addrs[i], id.String()) {
|
||||
idx := strings.LastIndex(addrs[i], "/p2p/")
|
||||
local = addrs[i][:idx]
|
||||
}
|
||||
|
||||
repo.NetworkConfig.LocalAddr = local
|
||||
repo.Key.Libp2pPrivKey = nodeKeys[i]
|
||||
repo.Key.PrivKey = privKeys[i]
|
||||
repo.NetworkConfig.OtherNodes = otherPeers(uint64(i), addrs)
|
||||
|
||||
swarm, err := New(repo, log.NewWithModule("p2p"), mockLedger)
|
||||
require.Nil(t, err)
|
||||
err = swarm.Start()
|
||||
require.Nil(t, err)
|
||||
swarms = append(swarms, swarm)
|
||||
}
|
||||
return swarms
|
||||
}
|
||||
|
||||
func TestSwarm_Send(t *testing.T) {
|
||||
peerCnt := 4
|
||||
swarms := NewSwarms(t, peerCnt)
|
||||
|
||||
time.Sleep(2 * time.Second)
|
||||
|
||||
msg := &pb.Message{
|
||||
Type: pb.Message_GET_BLOCK,
|
||||
Data: []byte("1"),
|
||||
}
|
||||
var res *pb.Message
|
||||
var err error
|
||||
err = retry.Retry(func(attempt uint) error {
|
||||
res, err = swarms[0].Send(2, msg)
|
||||
if err != nil {
|
||||
swarms[0].logger.Errorf(err.Error())
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}, strategy.Wait(50*time.Millisecond))
|
||||
require.Nil(t, err)
|
||||
require.Equal(t, pb.Message_GET_BLOCK_ACK, res.Type)
|
||||
var block pb.Block
|
||||
err = block.Unmarshal(res.Data)
|
||||
require.Nil(t, err)
|
||||
require.Equal(t, uint64(1), block.BlockHeader.Number)
|
||||
|
||||
fetchBlockSignMsg := &pb.Message{
|
||||
Type: pb.Message_FETCH_BLOCK_SIGN,
|
||||
Data: []byte("1"),
|
||||
}
|
||||
|
||||
err = retry.Retry(func(attempt uint) error {
|
||||
res, err = swarms[0].Send(3, fetchBlockSignMsg)
|
||||
if err != nil {
|
||||
swarms[0].logger.Errorf(err.Error())
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}, strategy.Wait(50*time.Millisecond))
|
||||
require.Nil(t, err)
|
||||
require.Equal(t, pb.Message_FETCH_BLOCK_SIGN_ACK, res.Type)
|
||||
require.Nil(t, err)
|
||||
require.NotNil(t, res.Data)
|
||||
|
||||
fetchAESMsg := &pb.Message{
|
||||
Type: pb.Message_FETCH_ASSET_EXCHANEG_SIGN,
|
||||
Data: []byte("1"),
|
||||
}
|
||||
|
||||
err = retry.Retry(func(attempt uint) error {
|
||||
res, err = swarms[2].Send(3, fetchAESMsg)
|
||||
if err != nil {
|
||||
swarms[0].logger.Errorf(err.Error())
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}, strategy.Wait(50*time.Millisecond))
|
||||
require.Nil(t, err)
|
||||
require.Equal(t, pb.Message_FETCH_ASSET_EXCHANGE_SIGN_ACK, res.Type)
|
||||
require.Nil(t, err)
|
||||
require.NotNil(t, res.Data)
|
||||
|
||||
fetchIBTPSignMsg := &pb.Message{
|
||||
Type: pb.Message_FETCH_IBTP_SIGN,
|
||||
Data: []byte("1"),
|
||||
}
|
||||
|
||||
err = retry.Retry(func(attempt uint) error {
|
||||
res, err = swarms[3].Send(1, fetchIBTPSignMsg)
|
||||
if err != nil {
|
||||
swarms[0].logger.Errorf(err.Error())
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}, strategy.Wait(50*time.Millisecond))
|
||||
require.Nil(t, err)
|
||||
require.Equal(t, pb.Message_FETCH_IBTP_SIGN_ACK, res.Type)
|
||||
require.Nil(t, err)
|
||||
require.NotNil(t, res.Data)
|
||||
}
|
||||
|
||||
func TestSwarm_AsyncSend(t *testing.T) {
|
||||
peerCnt := 4
|
||||
swarms := NewSwarms(t, peerCnt)
|
||||
|
||||
time.Sleep(2 * time.Second)
|
||||
|
||||
orderMsgCh := make(chan events.OrderMessageEvent)
|
||||
orderMsgSub := swarms[2].SubscribeOrderMessage(orderMsgCh)
|
||||
|
||||
defer orderMsgSub.Unsubscribe()
|
||||
|
||||
msg := &pb.Message{
|
||||
Type: pb.Message_CONSENSUS,
|
||||
Data: []byte("1"),
|
||||
}
|
||||
var err error
|
||||
err = retry.Retry(func(attempt uint) error {
|
||||
err = swarms[0].AsyncSend(2, msg)
|
||||
if err != nil {
|
||||
swarms[0].logger.Errorf(err.Error())
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}, strategy.Wait(50*time.Millisecond))
|
||||
require.Nil(t, err)
|
||||
|
||||
require.NotNil(t, <-orderMsgCh)
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIICkjCCAjegAwIBAgIDAoB1MAoGCCqGSM49BAMCMIGhMQswCQYDVQQGEwJDTjER
|
||||
MA8GA1UECBMIWmhlSmlhbmcxETAPBgNVBAcTCEhhbmdaaG91MR8wDQYDVQQJEwZz
|
||||
dHJlZXQwDgYDVQQJEwdhZGRyZXNzMQ8wDQYDVQQREwYzMjQwMDAxEzARBgNVBAoT
|
||||
Ckh5cGVyY2hhaW4xEDAOBgNVBAsTB0JpdFhIdWIxEzARBgNVBAMTCmJpdHhodWIu
|
||||
Y24wIBcNMjAwODExMDUwNzEzWhgPMjA3MDA3MzAwNTA3MTNaMIGaMQswCQYDVQQG
|
||||
EwJDTjERMA8GA1UECBMIWmhlSmlhbmcxETAPBgNVBAcTCEhhbmdaaG91MR8wDQYD
|
||||
VQQJEwZzdHJlZXQwDgYDVQQJEwdhZGRyZXNzMQ8wDQYDVQQREwYzMjQwMDAxDzAN
|
||||
BgNVBAoTBkFnZW5jeTEQMA4GA1UECxMHQml0WEh1YjEQMA4GA1UEAxMHQml0WEh1
|
||||
YjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABETCj+MAoveSsjSLGr3y8F5IEccL
|
||||
Afn8d9rmw3ON24Y6NzoqV72T+kvXP7lJlj+7bhYJRtXO3FiPDBp1fFQb1tyjYTBf
|
||||
MA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMB
|
||||
Af8wKwYDVR0jBCQwIoAgFjEjLDiDWrdUwpIcMxUaxWQSVMS7agCqo44QcOAMlYMw
|
||||
CgYIKoZIzj0EAwIDSQAwRgIhAJeZBApwY2BtYXK28Wa0gzJ8Nc9pjhtX2UFoc7cl
|
||||
YilwAiEA3m60eyYQj/BiSDZ8+kZbUJO2C7y0HaT1xwNdjSZBFhI=
|
||||
-----END CERTIFICATE-----
|
|
@ -0,0 +1,16 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIIClTCCAjygAwIBAgIDAKWTMAoGCCqGSM49BAMCMIGhMQswCQYDVQQGEwJDTjER
|
||||
MA8GA1UECBMIWmhlSmlhbmcxETAPBgNVBAcTCEhhbmdaaG91MR8wDQYDVQQJEwZz
|
||||
dHJlZXQwDgYDVQQJEwdhZGRyZXNzMQ8wDQYDVQQREwYzMjQwMDAxEzARBgNVBAoT
|
||||
Ckh5cGVyY2hhaW4xEDAOBgNVBAsTB0JpdFhIdWIxEzARBgNVBAMTCmJpdHhodWIu
|
||||
Y24wIBcNMjAwODExMDUwNzEyWhgPMjA3MDA3MzAwNTA3MTJaMIGhMQswCQYDVQQG
|
||||
EwJDTjERMA8GA1UECBMIWmhlSmlhbmcxETAPBgNVBAcTCEhhbmdaaG91MR8wDQYD
|
||||
VQQJEwZzdHJlZXQwDgYDVQQJEwdhZGRyZXNzMQ8wDQYDVQQREwYzMjQwMDAxEzAR
|
||||
BgNVBAoTCkh5cGVyY2hhaW4xEDAOBgNVBAsTB0JpdFhIdWIxEzARBgNVBAMTCmJp
|
||||
dHhodWIuY24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASznYuB78fMNqgooAnp
|
||||
YPUfWoQCDAM0nV5YwSj1Rz6RcWKuRAPQooPFb8K2WO6hfRUGtCba+l48FD34R/RP
|
||||
aajqo18wXTAOBgNVHQ8BAf8EBAMCAaYwDwYDVR0lBAgwBgYEVR0lADAPBgNVHRMB
|
||||
Af8EBTADAQH/MCkGA1UdDgQiBCAWMSMsOINat1TCkhwzFRrFZBJUxLtqAKqjjhBw
|
||||
4AyVgzAKBggqhkjOPQQDAgNHADBEAiAW5pb+b2aLuEBJCkaEXfukb/HwFsNm7zmx
|
||||
Ha6oyk0HYAIgXhsMYlIXKf5RmlBFiEWZZRJTyiubI7NDqN5+JlVBAog=
|
||||
-----END CERTIFICATE-----
|
|
@ -0,0 +1,15 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIICWjCCAf+gAwIBAgIDDhFLMAoGCCqGSM49BAMCMIGaMQswCQYDVQQGEwJDTjER
|
||||
MA8GA1UECBMIWmhlSmlhbmcxETAPBgNVBAcTCEhhbmdaaG91MR8wDQYDVQQJEwZz
|
||||
dHJlZXQwDgYDVQQJEwdhZGRyZXNzMQ8wDQYDVQQREwYzMjQwMDAxDzANBgNVBAoT
|
||||
BkFnZW5jeTEQMA4GA1UECxMHQml0WEh1YjEQMA4GA1UEAxMHQml0WEh1YjAgFw0y
|
||||
MDA4MTEwNTA3MTNaGA8yMDcwMDczMDA1MDcxM1owgZkxCzAJBgNVBAYTAkNOMREw
|
||||
DwYDVQQIEwhaaGVKaWFuZzERMA8GA1UEBxMISGFuZ1pob3UxHzANBgNVBAkTBnN0
|
||||
cmVldDAOBgNVBAkTB2FkZHJlc3MxDzANBgNVBBETBjMyNDAwMDEOMAwGA1UEChMF
|
||||
Tm9kZTExEDAOBgNVBAsTB0JpdFhIdWIxEDAOBgNVBAMTB0JpdFhIdWIwWTATBgcq
|
||||
hkjOPQIBBggqhkjOPQMBBwNCAATgjTYEnavxerFuEKJ8C39QUY12xh/TC2E5V7ni
|
||||
nmQcOgDDRv5HW4sskTSm/WX2D0BMzwb7XE5ATyoDeM9qcurDozEwLzAOBgNVHQ8B
|
||||
Af8EBAMCAaYwDwYDVR0lBAgwBgYEVR0lADAMBgNVHRMBAf8EAjAAMAoGCCqGSM49
|
||||
BAMCA0kAMEYCIQD5Oz1xJvFgzYm/lTzoaO/i0ayPVRgSdBwvK6hEICo5lAIhAMtG
|
||||
aswjd2wVA4zB5GPEmJ/tvPUnxrlOAU67AQMYR4zf
|
||||
-----END CERTIFICATE-----
|
Loading…
Reference in New Issue