diff --git a/docs/go-graphsync.puml b/docs/go-graphsync.puml index 2cba2581..a665fc66 100644 --- a/docs/go-graphsync.puml +++ b/docs/go-graphsync.puml @@ -14,19 +14,16 @@ package "go-ipld-prime" { package selector { interface Selector { } - object "PackagePublicFunctions" as goSelectorPF { - ReifySelector(cidRootedSelector Node) (Selector, error) - } } interface AdvVisitFn { } - class TraversalConfig { + class Config { } - class TraversalProgress { - TraverseInformatively(Node, Selector, AdvVisitFn) + class Progress { + WalkAdv(Node, Selector, AdvVisitFn) } - TraversalProgress *-- TraversalConfig + Progress *-- Config } interface Storer { @@ -40,7 +37,6 @@ package "go-ipld-prime" { package "go-graphsync" { interface Cid2BlockFn { - } class GraphSync { Request(ctx context.Context, p peer.ID, rootedSelector Node) (chan ResponseProgress, chan error) @@ -219,7 +215,7 @@ package "go-graphsync" { ProcessResponses(peer.ID, []GraphSyncResponse, []blocks.Block) } object "Package Public Functions" as goRequestManagerPF { - New(ctx context.Context, asyncLoader AsyncLoader, ipldBridge ipldbridge.IPLDBridge) *RequestManager + New(ctx context.Context, asyncLoader AsyncLoader) *RequestManager } RequestManager *-- AsyncLoader RequestManager *-- PeerManager @@ -301,7 +297,7 @@ package "go-graphsync" { AddLink(GraphSyncRequestID, Link, bool) AddCompletedRequest(GraphSyncRequestID, graphsync.ResponseStatusCode) Empty() bool - Build(IPLDBridge) ([]GraphSyncResponse, []Block, error) + Build() ([]GraphSyncResponse, []Block, error) } object "Package Public Functions" as goResponseBuilderPF { New() *ResponseBuilder @@ -322,7 +318,7 @@ package "go-graphsync" { object "Package Public Functions" as goPeerResponseManagerPF { New(Context, func(Context, peer.ID) PeerResponseSender) *PeerResponseManager - NewResponseSender(Context, peer.ID, PeerMessageManager, IPLDBridge) PeerResponseSender + NewResponseSender(Context, peer.ID, PeerMessageManager) PeerResponseSender } PeerResponseManager *-- PeerResponseSender @@ -339,7 +335,7 @@ package "go-graphsync" { } object "Package Public Functions" as goResponseManagerPF { - New(Context, Loader, IPLDBridge, PeerResponseManager, PeerTaskQueue) *ResponseManager + New(Context, Loader, PeerResponseManager, PeerTaskQueue) *ResponseManager } GraphSync *-- ResponseManager ResponseManager *-- Loader @@ -393,38 +389,18 @@ package "go-graphsync" { } - package ipldbridge { - interface IPLDBridge { - EncodeNode(ipld.Node) ([]byte, error) - DecodeNode([]byte) (ipld.Node, error) - ParseSelector(selector ipld.Node) (Selector, error) - Traverse(ctx context.Context, loader Loader, root ipld.Node, s Selector, fn AdvVisitFn) error - } - - GraphSync *-- IPLDBridge - RequestManager *-- IPLDBridge - ResponseManager *-- IPLDBridge - PeerResponseSender *-- IPLDBridge + package ipldutil { + object "Package Public Functions" as goIpldutilPF { - class ipldBridge { + EncodeNode(ipld.Node) ([]byte, error) + DecodeNode([]byte) (ipld.Node, error) + ParseSelector(selector ipld.Node) (Selector, error) + Traverse(ctx context.Context, loader Loader, root ipld.Node, s Selector, fn AdvVisitFn) error } - - object "PackagePublicFunctions" as goIPLDBridge { - NewIPLDBridge() IPLDBridge - } - - IPLDBridge <|-- ipldBridge - goIPLDBridge .. ipldBridge - ipldBridge *-- MulticodecDecodeTable - ipldBridge *-- NodeBuilderChooser - ipldBridge .. TraversalProgress - ipldBridge .. goSelectorPF - ipldBridge .. goIPLDReposePf } + object "PackagePublicFunctions" as goGraphsyncPf { - New(ctx context.Context, network GraphSyncNetwork, ipldBridge IPLDBridge, loader Loader) GraphSync - LoaderFromCid2BlockFn(cid2BlockFn Cid2BlockFn) Loader - SelectorSpecFromCidAndPath(lnk cid.Cid, pathSegments []string) (ipld.Node, error) + New(ctx context.Context, network GraphSyncNetwork, loader Loader, storer Storer) GraphSync } } @@ -435,7 +411,6 @@ package "go-filecoin" { "go-filecoin" *-- GraphSync "go-filecoin" .. goGraphsyncPf "go-filecoin" .. goGraphSyncNetworkPF - "go-filecoin" .. goIPLDBridge "go-filecoin" *-- RawLoader "go-filecoin" *-- MulticodecDecodeTable "go-filecoin" *-- NodeBuilderChooser diff --git a/docs/responder-sequence.png b/docs/responder-sequence.png index 37d7782b..a0251a73 100644 Binary files a/docs/responder-sequence.png and b/docs/responder-sequence.png differ diff --git a/docs/responder-sequence.puml b/docs/responder-sequence.puml index ff93e55a..ec7fc868 100644 --- a/docs/responder-sequence.puml +++ b/docs/responder-sequence.puml @@ -8,7 +8,7 @@ participant PeerResponseManager participant PeerResponseSender participant LinkTracker participant ResponseBuilder -participant IPLDBridge +participant IPLD participant "Intercepted Loader" as ILoader participant Loader participant "Message Sending\nLayer" as Message @@ -44,23 +44,23 @@ QW -> PeerTaskQueue : Pop Request PeerTaskQueue -> PeerTracker : Pop Request PeerTracker -> PeerTaskQueue : Next Request\nTo Process PeerTaskQueue -> QW : Next Request\nTo Process -QW -> IPLDBridge : DecodeNode -IPLDBridge -> QW : Selector Spec Node -QW -> IPLDBridge : ParseSelector -IPLDBridge -> QW : Root Node, IPLD Selector +QW -> IPLD : DecodeNode +IPLD -> QW : Selector Spec Node +QW -> IPLD : ParseSelector +IPLD -> QW : Root Node, IPLD Selector QW -> PeerResponseManager : SenderForPeer PeerResponseManager -> PeerResponseSender ** : Create for peer\nas neccesary PeerResponseSender -> LinkTracker ** : Create PeerResponseSender -> QW : PeerResponseSender activate PeerResponseSender QW -> ILoader ** : Create w/ RequestID, PeerResponseSender, Loader -QW -> IPLDBridge : Start Traversal Of Selector +QW -> IPLD : Start Traversal Of Selector loop until traversal complete or request context cancelled note over PeerResponseSender: Selector Traversal Loop -IPLDBridge -> ILoader : Request to load blocks\nto perform traversal +IPLD -> ILoader : Request to load blocks\nto perform traversal ILoader -> Loader : Load blocks\nfrom local storage Loader -> ILoader : Blocks From\nlocal storage or error -ILoader -> IPLDBridge : Blocks to continue\n traversal or error +ILoader -> IPLD : Blocks to continue\n traversal or error ILoader -> PeerResponseSender : Block or error to Send Back activate PeerResponseSender PeerResponseSender -> LinkTracker : Notify block or\n error, ask whether\n block is duplicate @@ -70,7 +70,7 @@ PeerResponseSender -> ResponseBuilder : Aggregate Response Metadata & Block PeerResponseSender -> PeerResponseSender : Signal Work To Do deactivate PeerResponseSender end -IPLDBridge -> QW : Traversal Complete +IPLD -> QW : Traversal Complete QW -> PeerResponseSender : Request Finished activate PeerResponseSender PeerResponseSender -> LinkTracker : Query If Errors\n Were Present diff --git a/docs/top-level-sequence.png b/docs/top-level-sequence.png index 6ba3c880..55feee66 100644 Binary files a/docs/top-level-sequence.png and b/docs/top-level-sequence.png differ diff --git a/docs/top-level-sequence.puml b/docs/top-level-sequence.puml index 645c8ca8..60f832b1 100644 --- a/docs/top-level-sequence.puml +++ b/docs/top-level-sequence.puml @@ -3,7 +3,7 @@ participant Client participant "GraphSync\nTop Level\nInterface" as TLI participant "Requestor\nImplementation" as Requestor participant "Responder\nImplementation" as Responder -participant IPLDBridge +participant IPLD participant "Intercepted Loader" as ILoader participant Loader participant Storer @@ -12,7 +12,7 @@ participant Network == Initialization == -Client -> TLI ** : Create With\nNetwork, Bridge,\nLoader/Storer +Client -> TLI ** : Create With\nNetwork\nLoader/Storer TLI -> Requestor ** : Setup TLI -> Responder ** : Setup TLI -> Message ** : Setup @@ -27,13 +27,13 @@ Message -> Network : Encode and Send\nRequest Network -> TLI : Network receives message calls top level interface to process TLI -> Responder : Send new request for processing -Responder -> IPLDBridge : Start a traversal\nof the selector -IPLDBridge -> ILoader : Request to load blocks\nto perform traversal +Responder -> IPLD : Start a traversal\nof the selector +IPLD -> ILoader : Request to load blocks\nto perform traversal ILoader -> Loader : Load blocks\nfrom local storage Loader -> ILoader : Blocks From\nlocal storage par -ILoader -> IPLDBridge : Blocks to\ncontinue traversal -IPLDBridge -> Responder : Traversal completes to\nnotify response is done +ILoader -> IPLD : Blocks to\ncontinue traversal +IPLD -> Responder : Traversal completes to\nnotify response is done else ILoader -> Responder : Blocks+Responses To Send Back end @@ -44,15 +44,15 @@ Message -> Network : Encode and Send\nResponses+Blocks Network -> TLI : Network receives message calls top level interface to process TLI -> Requestor : Send Responses+Blocks\nfor Processing par -Requestor -> IPLDBridge : Kick of selector traversal to verify response -IPLDBridge -> ILoader : Request to load blocks\nto perform traversal +Requestor -> IPLD : Kick of selector traversal to verify response +IPLD -> ILoader : Request to load blocks\nto perform traversal else Requestor -> ILoader : Blocks To Feed Back To Selector Verfication end ILoader -> Storer : Save blocks as they are verified Storer -> ILoader : Blocks Were Stored -ILoader -> IPLDBridge : Blocks To Continue\n Ongoing Verification -IPLDBridge -> Requestor : New IPLD Nodes Visited +ILoader -> IPLD : Blocks To Continue\n Ongoing Verification +IPLD -> Requestor : New IPLD Nodes Visited Requestor -> TLI : Stream Of\nNew IPLD Nodes TLI -> Client: Stream Of\nNew IPLD Nodes @enduml \ No newline at end of file diff --git a/go.mod b/go.mod index ad6cd55a..bc962a29 100644 --- a/go.mod +++ b/go.mod @@ -3,38 +3,30 @@ module github.com/ipfs/go-graphsync go 1.12 require ( - github.com/btcsuite/btcd v0.0.0-20190629003639-c26ffa870fd8 // indirect - github.com/gogo/protobuf v1.2.1 - github.com/golang/protobuf v1.3.2 // indirect + github.com/filecoin-project/go-data-transfer v0.0.0-20191219005021-4accf56bd2ce + github.com/gogo/protobuf v1.3.1 + github.com/ipfs/go-bitswap v0.1.8 github.com/ipfs/go-block-format v0.0.2 - github.com/ipfs/go-blockservice v0.1.0 - github.com/ipfs/go-cid v0.0.3 - github.com/ipfs/go-datastore v0.0.5 - github.com/ipfs/go-ipfs-blockstore v0.0.1 + github.com/ipfs/go-blockservice v0.1.3-0.20190908200855-f22eea50656c + github.com/ipfs/go-cid v0.0.4-0.20191112011718-79e75dffeb10 + github.com/ipfs/go-datastore v0.1.0 + github.com/ipfs/go-ipfs-blockstore v0.1.0 github.com/ipfs/go-ipfs-blocksutil v0.0.1 github.com/ipfs/go-ipfs-chunker v0.0.1 github.com/ipfs/go-ipfs-exchange-offline v0.0.1 github.com/ipfs/go-ipfs-files v0.0.4 + github.com/ipfs/go-ipfs-util v0.0.1 github.com/ipfs/go-ipld-format v0.0.2 - github.com/ipfs/go-log v0.0.1 - github.com/ipfs/go-merkledag v0.2.3 + github.com/ipfs/go-log v1.0.0 + github.com/ipfs/go-merkledag v0.2.4 github.com/ipfs/go-peertaskqueue v0.2.0 github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785 github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5 github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c - github.com/libp2p/go-eventbus v0.0.3 // indirect - github.com/libp2p/go-libp2p v0.2.1 - github.com/libp2p/go-libp2p-core v0.0.9 + github.com/libp2p/go-libp2p v0.3.0 + github.com/libp2p/go-libp2p-core v0.2.4 github.com/libp2p/go-libp2p-peer v0.2.0 - github.com/libp2p/go-libp2p-secio v0.1.1 // indirect - github.com/libp2p/go-msgio v0.0.4 // indirect - github.com/multiformats/go-multiaddr v0.0.4 - github.com/multiformats/go-multiaddr-dns v0.0.3 // indirect - github.com/multiformats/go-multihash v0.0.6 - github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945 // indirect - go.opencensus.io v0.22.0 // indirect - golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 // indirect - golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 // indirect - golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e // indirect + github.com/multiformats/go-multiaddr v0.1.1 + github.com/multiformats/go-multihash v0.0.9 ) diff --git a/go.sum b/go.sum index b9baba1d..cda1ad60 100644 --- a/go.sum +++ b/go.sum @@ -14,6 +14,8 @@ github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcug github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.0.0-20190629003639-c26ffa870fd8 h1:mOg8/RgDSHTQ1R0IR+LMDuW4TDShPv+JzYHuR4GLoNA= github.com/btcsuite/btcd v0.0.0-20190629003639-c26ffa870fd8/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= +github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3 h1:A/EVblehb75cUgXA5njHPn0kLAsykn6mJGz7rnmW5W0= +github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= @@ -30,6 +32,7 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -41,13 +44,19 @@ github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhY github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/filecoin-project/go-data-transfer v0.0.0-20191219005021-4accf56bd2ce h1:Jdejrx6XVSTRy2PiX08HCU5y68p3wx2hNMJJc/J7kZY= +github.com/filecoin-project/go-data-transfer v0.0.0-20191219005021-4accf56bd2ce/go.mod h1:b14UWxhxVCAjrQUYvVGrQRRsjAh79wXYejw9RbUcAww= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= @@ -58,21 +67,26 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c h1:7lF+Vz0LqiRidnzC1Oq86fpX1q/iEv2KJdrCtttYjT4= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= +github.com/hannahhoward/cbor-gen-for v0.0.0-20191216214420-3e450425c40c/go.mod h1:WVPCl0HO/0RAL5+vBH2GMxBomlxBF70MAS78+Lu1//k= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk= +github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -82,31 +96,45 @@ github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/ipfs/bbloom v0.0.1 h1:s7KkiBPfxCeDVo47KySjK0ACPc5GJRUxFpdyWEuDjhw= github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= +github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= +github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2 h1:IkhOPiifc6b2LWTi/vp8TXwNT0eGCsizI1JFbZ08IQQ= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= +github.com/ipfs/go-bitswap v0.1.3/go.mod h1:YEQlFy0kkxops5Vy+OxWdRSEZIoS7I7KDIwoa5Chkps= +github.com/ipfs/go-bitswap v0.1.8 h1:38X1mKXkiU6Nzw4TOSWD8eTVY5eX3slQunv3QEWfXKg= +github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2 h1:qPDvcP19izTjU8rgo6p7gTXZlkMkF5bz5G3fqIsSCPE= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-blockservice v0.1.0 h1:dh2i7xjMbCtf0ZSMyQAF2qpV/pEEmM7yVpQ00+gik6U= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= +github.com/ipfs/go-blockservice v0.1.3-0.20190908200855-f22eea50656c h1:lN5IQA07VtLiTLAp/Scezp1ljFhXErC6yq4O1cu+yJ0= +github.com/ipfs/go-blockservice v0.1.3-0.20190908200855-f22eea50656c/go.mod h1:t+411r7psEUhLueM8C7aPA7cxCclv4O3VsUVxt9kz2I= github.com/ipfs/go-cid v0.0.1 h1:GBjWPktLnNyX0JiQCNFpUuUSoMw5KMyqrsejHYlILBE= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.2 h1:tuuKaZPU1M6HcejsO3AcYWW8sZ8MTvyxfc4uqB4eFE8= github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.3 h1:UIAh32wymBpStoe83YCzwVQQ5Oy/H0FdxvUS6DJDzms= github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-cid v0.0.4-0.20191112011718-79e75dffeb10 h1:5mRf2p8Bv2iKiuPsGrQUrx38rdBm2T/03JCM6VWzoMc= +github.com/ipfs/go-cid v0.0.4-0.20191112011718-79e75dffeb10/go.mod h1:/BYOuUoxkE+0f6tGzlzMvycuN+5l35VOR4Bpg2sCmds= github.com/ipfs/go-datastore v0.0.1 h1:AW/KZCScnBWlSb5JbnEnLKFWXL224LBEh/9KXXOrUms= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.0.5 h1:q3OfiOZV5rlsK1H5V8benjeUApRfMGs4Mrhmr6NriQo= github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= +github.com/ipfs/go-datastore v0.1.0 h1:TOxI04l8CmO4zGtesENhzm4PwkFwJXY3rKiYaaMf9fI= +github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= +github.com/ipfs/go-graphsync v0.0.4/go.mod h1:6UACBjfOXEa8rQL3Q/JpZpWS0nZDCLx134WUkjrmFpQ= github.com/ipfs/go-ipfs-blockstore v0.0.1 h1:O9n3PbmTYZoNhkgkEyrXTznbmktIXif62xLX+8dPHzc= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= +github.com/ipfs/go-ipfs-blockstore v0.1.0 h1:V1GZorHFUIB6YgTJQdq7mcaIpUfCM3fCyVi+MTo9O88= +github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= github.com/ipfs/go-ipfs-chunker v0.0.1 h1:cHUUxKFQ99pozdahi+uSC/3Y6HeRpi9oTeUHbE27SEw= @@ -135,23 +163,32 @@ github.com/ipfs/go-ipfs-util v0.0.1 h1:Wz9bL2wB2YBJqggkA4dD7oSmqB4cAnpNbGrlHJulv github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-ipld-cbor v0.0.2 h1:amzFztBQQQ69UA5+f7JRfoXF/z2l//MGfEDHVkS20+s= github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= +github.com/ipfs/go-ipld-cbor v0.0.3 h1:ENsxvybwkmke7Z/QJOmeJfoguj6GH3Y0YOaGrfy9Q0I= +github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2 h1:OVAGlyYT6JPZ0pEfGntFPS40lfrDmaDbQwNHEY2G9Zs= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/ipfs/go-log v1.0.0 h1:BW3LQIiZzpNyolt84yvKNCd3FU+AK4VDw1hnHR+1aiI= +github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= github.com/ipfs/go-merkledag v0.2.3 h1:aMdkK9G1hEeNvn3VXfiEMLY0iJnbiQQUHnM0HFJREsE= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= +github.com/ipfs/go-merkledag v0.2.4 h1:ZSHQSe9BENfixUjT+MaLeHEeZGxrZQfgo3KT3SLosF8= +github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-peertaskqueue v0.1.0 h1:bpRbgv76eT4avutNPDFZuCPOQus6qTgurEYxfulgZW4= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= +github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.2.0 h1:2cSr7exUGKYyDeUyQ7P/nHPs9P7Ht/B+ROrpN1EJOjc= github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb h1:tmWYgjltxwM7PDmFJgWgLuy5qx24csUvRoIiO+F/zQ4= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= +github.com/ipld/go-ipld v0.0.0-20180828191754-6087c7cf40c9 h1:SYoeCWs7C3O8Fx2YAaGMLXb8rMLkvKNgmIoDYwqqahk= +github.com/ipld/go-ipld-prime v0.0.1 h1:ZTjkYODUmJAca7w5hfzP9emyJfUxTy/Xi4zsUoqHggQ= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785 h1:fASnkvtR+SmB2y453RxmDD3Uvd4LonVUgFGk9JoDaZs= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5 h1:lSip43rAdyGA+yRQuy6ju0ucZkWpYc1F2CTQtZTVW/4= @@ -172,13 +209,17 @@ github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsj github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b h1:wxtKgYHEncAU00muMD06dzLiahtGM1eouRNOzVV7tdQ= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= @@ -196,19 +237,25 @@ github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2h github.com/libp2p/go-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= github.com/libp2p/go-eventbus v0.0.3 h1:4sB0NrwnWr6qGeq2RWUp/JG1wNajf6gyILInId72hrw= github.com/libp2p/go-eventbus v0.0.3/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= +github.com/libp2p/go-eventbus v0.1.0 h1:mlawomSAjjkk97QnYiEmHsLu7E136+2oCWSHRUvMfzQ= +github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= github.com/libp2p/go-libp2p v0.2.1 h1:Z6po5cdEj+SvSppsPxeZIlKVVl0REA915fEa4YlcBNM= github.com/libp2p/go-libp2p v0.2.1/go.mod h1:HZbtEOrgZN4F1fGZVvkV+930Wx3DkqlpBlO8dIoZWds= +github.com/libp2p/go-libp2p v0.3.0 h1:XhYEJKmIdi4U4Zbie/ym9k6lqgg3PHM2stGS/cOUDWk= +github.com/libp2p/go-libp2p v0.3.0/go.mod h1:J7DPB1+zB5VLc8v/kKSD8+u2cbyIGI0Dh/Pf3Wprt+0= github.com/libp2p/go-libp2p-autonat v0.1.0 h1:aCWAu43Ri4nU0ZPO7NyLzUvvfqd0nE3dX0R/ZGYVgOU= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= github.com/libp2p/go-libp2p-blankhost v0.1.3 h1:0KycuXvPDhmehw0ASsg+s1o3IfXgCUDqfzAl94KEBOg= github.com/libp2p/go-libp2p-blankhost v0.1.3/go.mod h1:KML1//wiKR8vuuJO0y3LUd1uLv+tlkGTAr3jC0S5cLg= +github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= github.com/libp2p/go-libp2p-circuit v0.1.0 h1:eniLL3Y9aq/sryfyV1IAHj5rlvuyj3b7iz8tSiZpdhY= github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= +github.com/libp2p/go-libp2p-circuit v0.1.1/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= @@ -216,6 +263,10 @@ github.com/libp2p/go-libp2p-core v0.0.4/go.mod h1:jyuCQP356gzfCFtRKyvAbNkyeuxb7O github.com/libp2p/go-libp2p-core v0.0.6/go.mod h1:0d9xmaYAVY5qmbp/fcgxHT3ZJsLjYeYPMJAUKpaCHrE= github.com/libp2p/go-libp2p-core v0.0.9 h1:Dt0Glhajkwj1zMYRoY0nbVBI7pyRYNLDaKCwss2Jd4I= github.com/libp2p/go-libp2p-core v0.0.9/go.mod h1:0d9xmaYAVY5qmbp/fcgxHT3ZJsLjYeYPMJAUKpaCHrE= +github.com/libp2p/go-libp2p-core v0.2.0/go.mod h1:X0eyB0Gy93v0DZtSYbEM7RnMChm9Uv3j7yRXjO77xSI= +github.com/libp2p/go-libp2p-core v0.2.2/go.mod h1:8fcwTbsG2B+lTgRJ1ICZtiM5GWCWZVoVrLaDRvIRng0= +github.com/libp2p/go-libp2p-core v0.2.4 h1:Et6ykkTwI6PU44tr8qUF9k43vP0aduMNniShAbUJJw8= +github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g= github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= github.com/libp2p/go-libp2p-discovery v0.1.0 h1:j+R6cokKcGbnZLf4kcNwpx6mDEUPF3N6SrqMymQhmvs= @@ -234,18 +285,27 @@ github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMg github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= github.com/libp2p/go-libp2p-peerstore v0.1.2 h1:MamqRA9OU9U/hbpeiowG3q3QNrWI+omKX8n9erT6aeE= github.com/libp2p/go-libp2p-peerstore v0.1.2/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= +github.com/libp2p/go-libp2p-peerstore v0.1.3 h1:wMgajt1uM2tMiqf4M+4qWKVyyFc8SfA+84VV9glZq1M= +github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= github.com/libp2p/go-libp2p-record v0.1.0 h1:wHwBGbFzymoIl69BpgwIu0O6ta3TXGcMPvHUAcodzRc= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= +github.com/libp2p/go-libp2p-record v0.1.1 h1:ZJK2bHXYUBqObHX+rHLSNrM3M8fmJUlUHrodDPPATmY= +github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg= github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= github.com/libp2p/go-libp2p-secio v0.1.1 h1:NQ9nTGmyf7/pgiVdThRrZylPsOQObVMyhT1XG9sEyOQ= github.com/libp2p/go-libp2p-secio v0.1.1/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g= github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= github.com/libp2p/go-libp2p-swarm v0.1.1 h1:QW7pjyTRIxt9yyBid52YmMRGtkFXUE/rbEVWsQ0ae+w= github.com/libp2p/go-libp2p-swarm v0.1.1/go.mod h1:4NVJaLwq/dr5kEq79Jo6pMin7ZFwLx73ln1FTefR91Q= +github.com/libp2p/go-libp2p-swarm v0.2.0/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+74Jjio7xGvsTgU= +github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.4 h1:Qev57UR47GcLPXWjrunv5aLIQGO4n9mhI/8/EIrEEFc= github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.1.0 h1:WaFRj/t3HdMZGNZqnU2pS7pDRBmMeoDx7/HDNpeyT9U= +github.com/libp2p/go-libp2p-testing v0.1.0/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw= github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= @@ -263,6 +323,8 @@ github.com/libp2p/go-msgio v0.0.4 h1:agEFehY3zWJFUHK6SEMR7UYmk2z6kC3oeCM7ybLhguA github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-nat v0.0.3 h1:l6fKV+p0Xa354EqQOQP+d8CivdLM4kl5GxC1hSc/UeI= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= +github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= +github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4= @@ -273,6 +335,7 @@ github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROm github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= github.com/libp2p/go-tcp-transport v0.1.0 h1:IGhowvEqyMFknOar4FWCKSWE0zL36UFKQtiRQD60/8o= github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= +github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= github.com/libp2p/go-ws-transport v0.1.0 h1:F+0OvvdmPTDsVc4AjPHjV7L7Pk1B7D5QwtDcKE2oag4= github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= @@ -280,14 +343,18 @@ github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ github.com/libp2p/go-yamux v1.2.3 h1:xX8A36vpXb59frIzWFdEgptLMsOANMFq2K7fPRlunYI= github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= @@ -297,6 +364,9 @@ github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5 h1:l16XLUUJ34wIz github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM= github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= +github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= @@ -311,15 +381,23 @@ github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lg github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.1.1 h1:rVAztJYMhCQ7vEFr8FvxW3mS+HF2eY/oPbOMeS0ZDnE= +github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.3 h1:P19q/k9jwmtgh+qXFkKfgFM7rCg/9l5AVqh7VNxSXhs= github.com/multiformats/go-multiaddr-dns v0.0.3/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-dns v0.2.0 h1:YWJoIDwLePniH7OU5hBnDZV6SWuvJqJ0YtN6pLeH9zA= +github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= github.com/multiformats/go-multiaddr-fmt v0.0.1 h1:5YjeOIzbX8OTKVaN72aOzGIYW7PnrZrnkDyOfAWRSMA= github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= +github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= +github.com/multiformats/go-multiaddr-net v0.1.0 h1:ZepO8Ezwovd+7b5XPPDhQhayk1yt0AJpzQBpq9fejx4= +github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmrJR+ubhT9qA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= @@ -328,15 +406,20 @@ github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.6 h1:cAVKO4epVd+SSpYJQD6d3vbdqQJvsrtGbTGzsp+V094= github.com/multiformats/go-multihash v0.0.6/go.mod h1:XuKXPp8VHcTygube3OWZC+aZrA+H1IhmjoCDtJc7PXM= +github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= +github.com/multiformats/go-multihash v0.0.9 h1:aoijQXYYl7Xtb2pUUP68R+ys1TlnlR3eX6wmozr0Hp4= +github.com/multiformats/go-multihash v0.0.9/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.9.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.6.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= @@ -349,15 +432,23 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14 h1:2m16U/rLwVaRdz7ANkHtHTodP3zTP3N451MADg64x5k= github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a h1:hjZfReYVLbqFkAtr2us7vdy04YWz3LVAirzP7reh8+M= +github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.0 h1:UVQPSSmc3qtTi+zPPkCXvZX9VvW/xT/NsRvKfwY81a8= github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945 h1:N8Bg45zpk/UcpNGnfJt2y/3lRWASHNTUET8owPYCgYI= github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= @@ -370,15 +461,20 @@ github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tL github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830 h1:8kxMKmKzXXL4Ru1nyhvdms/JjWt+3YLpvRb/bAjO/y0= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/whyrusleeping/cbor-gen v0.0.0-20191212224538-d370462a7e8a/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= @@ -391,11 +487,20 @@ github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvX github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= +github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= +go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= @@ -410,10 +515,13 @@ golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443 h1:IcSOAf4PyMp3U3XbIEj1/x golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -434,7 +542,9 @@ golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAG golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -452,16 +562,24 @@ golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e h1:D5TXcfTk7xF7hvieo4QErS3qqCB4teTffacDWr7CI+0= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456 h1:ng0gs1AKnRRuEMZoTLLlbOd+C17zUDepwGQBb/n+JVg= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898 h1:/atklqdjdhuosWIl6AIbOeHJjicWYPqR9bpxqxYG2pA= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -473,11 +591,15 @@ google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiq gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= +gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/graphsync.go b/graphsync.go index 06d34c10..651d627c 100644 --- a/graphsync.go +++ b/graphsync.go @@ -108,7 +108,7 @@ type RequestData interface { Root() cid.Cid // Selector returns the byte representation of the selector for this request - Selector() []byte + Selector() ipld.Node // Priority returns the priority of this request Priority() Priority diff --git a/impl/graphsync.go b/impl/graphsync.go index d7c36cd9..26aac3eb 100644 --- a/impl/graphsync.go +++ b/impl/graphsync.go @@ -6,7 +6,6 @@ import ( "github.com/ipfs/go-graphsync" "github.com/ipfs/go-graphsync/requestmanager/asyncloader" - "github.com/ipfs/go-graphsync/ipldbridge" gsmsg "github.com/ipfs/go-graphsync/message" "github.com/ipfs/go-graphsync/messagequeue" gsnet "github.com/ipfs/go-graphsync/network" @@ -25,10 +24,9 @@ var log = logging.Logger("graphsync") // GraphSync is an instance of a GraphSync exchange that implements // the graphsync protocol. type GraphSync struct { - ipldBridge ipldbridge.IPLDBridge network gsnet.GraphSyncNetwork - loader ipldbridge.Loader - storer ipldbridge.Storer + loader ipld.Loader + storer ipld.Storer requestManager *requestmanager.RequestManager responseManager *responsemanager.ResponseManager asyncLoader *asyncloader.AsyncLoader @@ -40,10 +38,9 @@ type GraphSync struct { } // New creates a new GraphSync Exchange on the given network, -// using the given bridge to IPLD and the given link loader. +// and the given link loader+storer. func New(parent context.Context, network gsnet.GraphSyncNetwork, - ipldBridge ipldbridge.IPLDBridge, loader ipldbridge.Loader, - storer ipldbridge.Storer) graphsync.GraphExchange { + loader ipld.Loader, storer ipld.Storer) graphsync.GraphExchange { ctx, cancel := context.WithCancel(parent) createMessageQueue := func(ctx context.Context, p peer.ID) peermanager.PeerQueue { @@ -51,15 +48,14 @@ func New(parent context.Context, network gsnet.GraphSyncNetwork, } peerManager := peermanager.NewMessageManager(ctx, createMessageQueue) asyncLoader := asyncloader.New(ctx, loader, storer) - requestManager := requestmanager.New(ctx, asyncLoader, ipldBridge) + requestManager := requestmanager.New(ctx, asyncLoader) peerTaskQueue := peertaskqueue.New() createdResponseQueue := func(ctx context.Context, p peer.ID) peerresponsemanager.PeerResponseSender { - return peerresponsemanager.NewResponseSender(ctx, p, peerManager, ipldBridge) + return peerresponsemanager.NewResponseSender(ctx, p, peerManager) } peerResponseManager := peerresponsemanager.New(ctx, createdResponseQueue) - responseManager := responsemanager.New(ctx, loader, ipldBridge, peerResponseManager, peerTaskQueue) + responseManager := responsemanager.New(ctx, loader, peerResponseManager, peerTaskQueue) graphSync := &GraphSync{ - ipldBridge: ipldBridge, network: network, loader: loader, storer: storer, diff --git a/impl/graphsync_test.go b/impl/graphsync_test.go index a188663d..11d6ad33 100644 --- a/impl/graphsync_test.go +++ b/impl/graphsync_test.go @@ -14,14 +14,12 @@ import ( "testing" "time" - "github.com/ipld/go-ipld-prime/fluent" ipldfree "github.com/ipld/go-ipld-prime/impl/free" cidlink "github.com/ipld/go-ipld-prime/linking/cid" blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-blockservice" - cid "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" dss "github.com/ipfs/go-datastore/sync" bstore "github.com/ipfs/go-ipfs-blockstore" @@ -36,10 +34,9 @@ import ( "github.com/ipfs/go-graphsync" - "github.com/ipfs/go-graphsync/ipldbridge" + "github.com/ipfs/go-graphsync/ipldutil" gsmsg "github.com/ipfs/go-graphsync/message" gsnet "github.com/ipfs/go-graphsync/network" - "github.com/ipfs/go-graphsync/testbridge" "github.com/ipfs/go-graphsync/testutil" ipld "github.com/ipld/go-ipld-prime" ipldselector "github.com/ipld/go-ipld-prime/traversal/selector" @@ -47,7 +44,6 @@ import ( "github.com/libp2p/go-libp2p-core/host" "github.com/libp2p/go-libp2p-core/peer" mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" - mh "github.com/multiformats/go-multihash" ) func TestMakeRequestToNetwork(t *testing.T) { @@ -63,13 +59,11 @@ func TestMakeRequestToNetwork(t *testing.T) { graphSync := td.GraphSyncHost1() blockChainLength := 100 - blockChain := setupBlockChain(ctx, t, td.storer1, td.bridge, 100, blockChainLength) - - spec := blockChainSelector(blockChainLength) + blockChain := testutil.SetupBlockChain(ctx, t, td.loader1, td.storer1, 100, blockChainLength) requestCtx, requestCancel := context.WithCancel(ctx) defer requestCancel() - graphSync.Request(requestCtx, td.host2.ID(), blockChain.tipLink, spec, td.extension) + graphSync.Request(requestCtx, td.host2.ID(), blockChain.TipLink, blockChain.Selector(), td.extension) var message receivedMessage select { @@ -89,14 +83,11 @@ func TestMakeRequestToNetwork(t *testing.T) { t.Fatal("Did not add request to received message") } receivedRequest := receivedRequests[0] - receivedSpec, err := td.bridge.DecodeNode(receivedRequest.Selector()) - if err != nil { - t.Fatal("unable to decode transmitted selector") - } - if !reflect.DeepEqual(spec, receivedSpec) { + receivedSpec := receivedRequest.Selector() + if !reflect.DeepEqual(blockChain.Selector(), receivedSpec) { t.Fatal("did not transmit selector spec correctly") } - _, err = td.bridge.ParseSelector(receivedSpec) + _, err := ipldutil.ParseSelector(receivedSpec) if err != nil { t.Fatal("did not receive parsible selector on other side") } @@ -136,18 +127,12 @@ func TestSendResponseToIncomingRequest(t *testing.T) { } blockChainLength := 100 - blockChain := setupBlockChain(ctx, t, td.storer2, td.bridge, 100, blockChainLength) - - spec := blockChainSelector(blockChainLength) + blockChain := testutil.SetupBlockChain(ctx, t, td.loader2, td.storer2, 100, blockChainLength) - selectorData, err := td.bridge.EncodeNode(spec) - if err != nil { - t.Fatal("could not encode selector spec") - } requestID := graphsync.RequestID(rand.Int31()) message := gsmsg.New() - message.AddRequest(gsmsg.NewRequest(requestID, blockChain.tipLink.(cidlink.Link).Cid, selectorData, graphsync.Priority(math.MaxInt32), td.extension)) + message.AddRequest(gsmsg.NewRequest(requestID, blockChain.TipLink.(cidlink.Link).Cid, blockChain.Selector(), graphsync.Priority(math.MaxInt32), td.extension)) // send request across network td.gsnet1.SendMessage(ctx, td.host2.ID(), message) // read the values sent back to requestor @@ -213,7 +198,7 @@ func TestGraphsyncRoundTrip(t *testing.T) { // setup receiving peer to just record message coming in blockChainLength := 100 - blockChain := setupBlockChain(ctx, t, td.storer2, td.bridge, 100, blockChainLength) + blockChain := testutil.SetupBlockChain(ctx, t, td.loader2, td.storer2, 100, blockChainLength) // initialize graphsync on second node to response to requests responder := td.GraphSyncHost2() @@ -247,9 +232,7 @@ func TestGraphsyncRoundTrip(t *testing.T) { t.Fatal("Error setting up extension") } - spec := blockChainSelector(blockChainLength) - - progressChan, errChan := requestor.Request(ctx, td.host2.ID(), blockChain.tipLink, spec, td.extension) + progressChan, errChan := requestor.Request(ctx, td.host2.ID(), blockChain.TipLink, blockChain.Selector(), td.extension) responses := testutil.CollectResponses(ctx, t, progressChan) errs := testutil.CollectErrors(ctx, t, errChan) @@ -314,13 +297,12 @@ func TestRoundTripLargeBlocksSlowNetwork(t *testing.T) { // setup receiving peer to just record message coming in blockChainLength := 40 - blockChain := setupBlockChain(ctx, t, td.storer2, td.bridge, 200000, blockChainLength) + blockChain := testutil.SetupBlockChain(ctx, t, td.loader1, td.storer2, 200000, blockChainLength) // initialize graphsync on second node to response to requests td.GraphSyncHost2() - spec := blockChainSelector(blockChainLength) - progressChan, errChan := requestor.Request(ctx, td.host2.ID(), blockChain.tipLink, spec) + progressChan, errChan := requestor.Request(ctx, td.host2.ID(), blockChain.TipLink, blockChain.Selector()) responses := testutil.CollectResponses(ctx, t, progressChan) errs := testutil.CollectErrors(ctx, t, errChan) @@ -442,8 +424,8 @@ func TestUnixFSFetch(t *testing.T) { storer2 := makeStorer(bs2) td := newGsTestData(ctx, t) - requestor := New(ctx, td.gsnet1, td.bridge, loader1, storer1) - responder := New(ctx, td.gsnet2, td.bridge, loader2, storer2) + requestor := New(ctx, td.gsnet1, loader1, storer1) + responder := New(ctx, td.gsnet2, loader2, storer2) extensionName := graphsync.ExtensionName("Free for all") responder.RegisterRequestReceivedHook(func(p peer.ID, requestData graphsync.RequestData, hookActions graphsync.RequestReceivedHookActions) { hookActions.ValidateRequest() @@ -519,7 +501,6 @@ type gsTestData struct { blockStore1, blockStore2 map[ipld.Link][]byte loader1, loader2 ipld.Loader storer1, storer2 ipld.Storer - bridge ipldbridge.IPLDBridge extensionData []byte extensionName graphsync.ExtensionName extension graphsync.ExtensionData @@ -548,10 +529,9 @@ func newGsTestData(ctx context.Context, t *testing.T) *gsTestData { td.gsnet1 = gsnet.NewFromLibp2pHost(td.host1) td.gsnet2 = gsnet.NewFromLibp2pHost(td.host2) td.blockStore1 = make(map[ipld.Link][]byte) - td.loader1, td.storer1 = testbridge.NewMockStore(td.blockStore1) + td.loader1, td.storer1 = testutil.NewTestStore(td.blockStore1) td.blockStore2 = make(map[ipld.Link][]byte) - td.loader2, td.storer2 = testbridge.NewMockStore(td.blockStore2) - td.bridge = ipldbridge.NewIPLDBridge() + td.loader2, td.storer2 = testutil.NewTestStore(td.blockStore2) // setup extension handlers td.extensionData = testutil.RandomBytes(100) td.extensionName = graphsync.ExtensionName("AppleSauce/McGee") @@ -569,12 +549,12 @@ func newGsTestData(ctx context.Context, t *testing.T) *gsTestData { } func (td *gsTestData) GraphSyncHost1() graphsync.GraphExchange { - return New(td.ctx, td.gsnet1, td.bridge, td.loader1, td.storer1) + return New(td.ctx, td.gsnet1, td.loader1, td.storer1) } func (td *gsTestData) GraphSyncHost2() graphsync.GraphExchange { - return New(td.ctx, td.gsnet2, td.bridge, td.loader2, td.storer2) + return New(td.ctx, td.gsnet2, td.loader2, td.storer2) } type receivedMessage struct { @@ -606,89 +586,3 @@ func (r *receiver) Connected(p peer.ID) { func (r *receiver) Disconnected(p peer.ID) { } - -type blockChain struct { - genisisNode ipld.Node - genisisLink ipld.Link - middleNodes []ipld.Node - middleLinks []ipld.Link - tipNode ipld.Node - tipLink ipld.Link -} - -func createBlock(nb ipldbridge.NodeBuilder, parents []ipld.Link, size int64) ipld.Node { - return nb.CreateMap(func(mb ipldbridge.MapBuilder, knb ipldbridge.NodeBuilder, vnb ipldbridge.NodeBuilder) { - mb.Insert(knb.CreateString("Parents"), vnb.CreateList(func(lb ipldbridge.ListBuilder, vnb ipldbridge.NodeBuilder) { - for _, parent := range parents { - lb.Append(vnb.CreateLink(parent)) - } - })) - mb.Insert(knb.CreateString("Messages"), vnb.CreateList(func(lb ipldbridge.ListBuilder, vnb ipldbridge.NodeBuilder) { - lb.Append(vnb.CreateBytes(testutil.RandomBytes(size))) - })) - }) -} - -func setupBlockChain( - ctx context.Context, - t *testing.T, - storer ipldbridge.Storer, - bridge ipldbridge.IPLDBridge, - size int64, - blockChainLength int) *blockChain { - linkBuilder := cidlink.LinkBuilder{Prefix: cid.NewPrefixV1(cid.DagCBOR, mh.SHA2_256)} - var genisisNode ipld.Node - err := fluent.Recover(func() { - nb := fluent.WrapNodeBuilder(ipldfree.NodeBuilder()) - genisisNode = createBlock(nb, []ipld.Link{}, size) - }) - if err != nil { - t.Fatal("Error creating genesis block") - } - genesisLink, err := linkBuilder.Build(ctx, ipldbridge.LinkContext{}, genisisNode, storer) - if err != nil { - t.Fatal("Error creating link to genesis block") - } - parent := genesisLink - middleNodes := make([]ipld.Node, 0, blockChainLength-2) - middleLinks := make([]ipld.Link, 0, blockChainLength-2) - for i := 0; i < blockChainLength-2; i++ { - var node ipld.Node - err := fluent.Recover(func() { - nb := fluent.WrapNodeBuilder(ipldfree.NodeBuilder()) - node = createBlock(nb, []ipld.Link{parent}, size) - }) - if err != nil { - t.Fatal("Error creating middle block") - } - middleNodes = append(middleNodes, node) - link, err := linkBuilder.Build(ctx, ipldbridge.LinkContext{}, node, storer) - if err != nil { - t.Fatal("Error creating link to middle block") - } - middleLinks = append(middleLinks, link) - parent = link - } - var tipNode ipld.Node - err = fluent.Recover(func() { - nb := fluent.WrapNodeBuilder(ipldfree.NodeBuilder()) - tipNode = createBlock(nb, []ipld.Link{parent}, size) - }) - if err != nil { - t.Fatal("Error creating tip block") - } - tipLink, err := linkBuilder.Build(ctx, ipldbridge.LinkContext{}, tipNode, storer) - if err != nil { - t.Fatal("Error creating link to tip block") - } - return &blockChain{genisisNode, genesisLink, middleNodes, middleLinks, tipNode, tipLink} -} - -func blockChainSelector(blockChainLength int) ipld.Node { - ssb := builder.NewSelectorSpecBuilder(ipldfree.NodeBuilder()) - return ssb.ExploreRecursive(ipldselector.RecursionLimitDepth(blockChainLength), - ssb.ExploreFields(func(efsb ipldbridge.ExploreFieldsSpecBuilder) { - efsb.Insert("Parents", ssb.ExploreAll( - ssb.ExploreRecursiveEdge())) - })).Node() -} diff --git a/ipldbridge/ipldbridge.go b/ipldbridge/ipldbridge.go deleted file mode 100644 index 6c85d752..00000000 --- a/ipldbridge/ipldbridge.go +++ /dev/null @@ -1,92 +0,0 @@ -package ipldbridge - -import ( - "context" - "errors" - - "github.com/ipld/go-ipld-prime/fluent" - - ipld "github.com/ipld/go-ipld-prime" - ipldtraversal "github.com/ipld/go-ipld-prime/traversal" - ipldselector "github.com/ipld/go-ipld-prime/traversal/selector" - selectorbuilder "github.com/ipld/go-ipld-prime/traversal/selector/builder" -) - -var errDoNotFollow = errors.New("Dont Follow Me") - -// ErrDoNotFollow is just a wrapper for whatever IPLD's ErrDoNotFollow ends up looking like -func ErrDoNotFollow() error { - return errDoNotFollow -} - -// Loader is an alias from ipld, in case it's renamed/moved. -type Loader = ipld.Loader - -// Storer is an alias from ipld, in case it's renamed/moved. -type Storer = ipld.Storer - -// StoreCommitter is an alias from ipld, in case it's renamed/moved. -type StoreCommitter = ipld.StoreCommitter - -// VisitFn is an alias from ipld, in case it's renamed/moved -type VisitFn = ipldtraversal.VisitFn - -// AdvVisitFn is an alias from ipld, in case it's renamed/moved. -type AdvVisitFn = ipldtraversal.AdvVisitFn - -// Selector is an alias from ipld, in case it's renamed/moved. -type Selector = ipldselector.Selector - -// SelectorSpec is alias from ipld, in case it's renamed/moved. -type SelectorSpec = selectorbuilder.SelectorSpec - -// SelectorSpecBuilder is alias from ipld, in case it's renamed/moved. -type SelectorSpecBuilder = selectorbuilder.SelectorSpecBuilder - -// ExploreFieldsSpecBuilder is alias from ipld, in case it's renamed/moved. -type ExploreFieldsSpecBuilder = selectorbuilder.ExploreFieldsSpecBuilder - -// LinkContext is an alias from ipld, in case it's renamed/moved. -type LinkContext = ipld.LinkContext - -// TraversalProgress is an alias from ipld, in case it's renamed/moved. -type TraversalProgress = ipldtraversal.Progress - -// TraversalReason is an alias from ipld, in case it's renamed/moved. -type TraversalReason = ipldtraversal.VisitReason - -// NodeBuilder is an alias from the ipld fluent nodebuilder, in case it's moved -type NodeBuilder = fluent.NodeBuilder - -// ListBuilder is an alias from ipld fluent, in case it's moved -type ListBuilder = fluent.ListBuilder - -// MapBuilder is an alias from ipld fluent, in case it's moved -type MapBuilder = fluent.MapBuilder - -// SimpleNode is an alias from ipld fluent, to refer to its non error based -// node struct -type SimpleNode = fluent.Node - -// IPLDBridge is an interface for making calls to IPLD, which can be -// replaced with alternative implementations -type IPLDBridge interface { - - // EncodeNode encodes an IPLD Node to bytes for network transfer. - EncodeNode(ipld.Node) ([]byte, error) - - // DecodeNode decodes bytes crossing a network to an IPLD Node. - DecodeNode([]byte) (ipld.Node, error) - - // ParseSelector checks if a generic IPLD node is a selector spec, - // and if so, a go-ipld-prime Selector. - ParseSelector(selector ipld.Node) (Selector, error) - - // Traverse performs a selector traversal, starting at a given root, using the given selector, - // and the given link loader. The given visit function will be called for each node - // visited. - Traverse(ctx context.Context, loader Loader, root ipld.Link, s Selector, fn AdvVisitFn) error - - // WalkMatching is a wrapper around direct selector traversal - WalkMatching(node ipld.Node, s Selector, fn VisitFn) error -} diff --git a/ipldbridge/ipld_impl.go b/ipldutil/ipldutil.go similarity index 55% rename from ipldbridge/ipld_impl.go rename to ipldutil/ipldutil.go index f3ab86d3..79eabdd5 100644 --- a/ipldbridge/ipld_impl.go +++ b/ipldutil/ipldutil.go @@ -1,8 +1,9 @@ -package ipldbridge +package ipldutil import ( "bytes" "context" + "errors" ipld "github.com/ipld/go-ipld-prime" dagpb "github.com/ipld/go-ipld-prime-proto" @@ -10,18 +11,15 @@ import ( free "github.com/ipld/go-ipld-prime/impl/free" "github.com/ipld/go-ipld-prime/traversal" ipldtraversal "github.com/ipld/go-ipld-prime/traversal" + "github.com/ipld/go-ipld-prime/traversal/selector" ipldselector "github.com/ipld/go-ipld-prime/traversal/selector" ) -// TraversalConfig is an alias from ipld, in case it's renamed/moved. -type TraversalConfig = ipldtraversal.Config +var errDoNotFollow = errors.New("Dont Follow Me") -type ipldBridge struct { -} - -// NewIPLDBridge returns an IPLD Bridge. -func NewIPLDBridge() IPLDBridge { - return &ipldBridge{} +// ErrDoNotFollow is just a wrapper for whatever IPLD's ErrDoNotFollow ends up looking like +func ErrDoNotFollow() error { + return errDoNotFollow } var ( @@ -30,14 +28,14 @@ var ( }) ) -func (rb *ipldBridge) Traverse(ctx context.Context, loader Loader, root ipld.Link, s Selector, fn AdvVisitFn) error { - builder := defaultChooser(root, LinkContext{}) - node, err := root.Load(ctx, LinkContext{}, builder, loader) +func Traverse(ctx context.Context, loader ipld.Loader, root ipld.Link, s selector.Selector, fn traversal.AdvVisitFn) error { + builder := defaultChooser(root, ipld.LinkContext{}) + node, err := root.Load(ctx, ipld.LinkContext{}, builder, loader) if err != nil { return err } - return TraversalProgress{ - Cfg: &TraversalConfig{ + return traversal.Progress{ + Cfg: &traversal.Config{ Ctx: ctx, LinkLoader: loader, LinkNodeBuilderChooser: defaultChooser, @@ -45,11 +43,11 @@ func (rb *ipldBridge) Traverse(ctx context.Context, loader Loader, root ipld.Lin }.WalkAdv(node, s, fn) } -func (rb *ipldBridge) WalkMatching(node ipld.Node, s Selector, fn VisitFn) error { +func WalkMatching(node ipld.Node, s selector.Selector, fn traversal.VisitFn) error { return ipldtraversal.WalkMatching(node, s, fn) } -func (rb *ipldBridge) EncodeNode(node ipld.Node) ([]byte, error) { +func EncodeNode(node ipld.Node) ([]byte, error) { var buffer bytes.Buffer err := dagcbor.Encoder(node, &buffer) if err != nil { @@ -58,11 +56,11 @@ func (rb *ipldBridge) EncodeNode(node ipld.Node) ([]byte, error) { return buffer.Bytes(), nil } -func (rb *ipldBridge) DecodeNode(encoded []byte) (ipld.Node, error) { +func DecodeNode(encoded []byte) (ipld.Node, error) { reader := bytes.NewReader(encoded) return dagcbor.Decoder(free.NodeBuilder(), reader) } -func (rb *ipldBridge) ParseSelector(selector ipld.Node) (Selector, error) { +func ParseSelector(selector ipld.Node) (selector.Selector, error) { return ipldselector.ParseSelector(selector) } diff --git a/linktracker/linktracker_test.go b/linktracker/linktracker_test.go index ebf93607..d687a5ef 100644 --- a/linktracker/linktracker_test.go +++ b/linktracker/linktracker_test.go @@ -5,13 +5,13 @@ import ( "testing" "github.com/ipfs/go-graphsync" - "github.com/ipfs/go-graphsync/testbridge" + "github.com/ipfs/go-graphsync/testutil" ) func TestBlockRefCount(t *testing.T) { linkTracker := New() - link1 := testbridge.NewMockLink() - link2 := testbridge.NewMockLink() + link1 := testutil.NewTestLink() + link2 := testutil.NewTestLink() if linkTracker.BlockRefCount(link1) != 0 || linkTracker.BlockRefCount(link2) != 0 { t.Fatal("Links not traversed should have refcount 0") } @@ -34,8 +34,8 @@ func TestBlockRefCount(t *testing.T) { func TestHasAllBlocks(t *testing.T) { linkTracker := New() - link1 := testbridge.NewMockLink() - link2 := testbridge.NewMockLink() + link1 := testutil.NewTestLink() + link2 := testutil.NewTestLink() requestID1 := graphsync.RequestID(rand.Int31()) requestID2 := graphsync.RequestID(rand.Int31()) @@ -52,7 +52,7 @@ func TestHasAllBlocks(t *testing.T) { func TestBlockBecomesAvailable(t *testing.T) { linkTracker := New() - link1 := testbridge.NewMockLink() + link1 := testutil.NewTestLink() if linkTracker.BlockRefCount(link1) != 0 { t.Fatal("Links not traversed should send blocks") } @@ -83,8 +83,8 @@ func TestBlockBecomesAvailable(t *testing.T) { func TestMissingLink(t *testing.T) { linkTracker := New() - link1 := testbridge.NewMockLink() - link2 := testbridge.NewMockLink() + link1 := testutil.NewTestLink() + link2 := testutil.NewTestLink() requestID1 := graphsync.RequestID(rand.Int31()) requestID2 := graphsync.RequestID(rand.Int31()) diff --git a/message/message.go b/message/message.go index f67ca737..d3ddb375 100644 --- a/message/message.go +++ b/message/message.go @@ -6,9 +6,11 @@ import ( blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-graphsync" + "github.com/ipld/go-ipld-prime" ggio "github.com/gogo/protobuf/io" cid "github.com/ipfs/go-cid" + "github.com/ipfs/go-graphsync/ipldutil" pb "github.com/ipfs/go-graphsync/message/pb" "github.com/libp2p/go-libp2p-core/network" ) @@ -59,7 +61,7 @@ type GraphSyncMessage interface { // Exportable is an interface that can serialize to a protobuf type Exportable interface { - ToProto() *pb.Message + ToProto() (*pb.Message, error) ToNet(w io.Writer) error } @@ -67,7 +69,7 @@ type Exportable interface { // GraphSyncMessage. type GraphSyncRequest struct { root cid.Cid - selector []byte + selector ipld.Node priority graphsync.Priority id graphsync.RequestID extensions map[string][]byte @@ -104,7 +106,7 @@ func newMsg() *graphSyncMessage { // NewRequest builds a new Graphsync request func NewRequest(id graphsync.RequestID, root cid.Cid, - selector []byte, + selector ipld.Node, priority graphsync.Priority, extensions ...graphsync.ExtensionData) GraphSyncRequest { @@ -128,7 +130,7 @@ func toExtensionsMap(extensions []graphsync.ExtensionData) (extensionsMap map[st func newRequest(id graphsync.RequestID, root cid.Cid, - selector []byte, + selector ipld.Node, priority graphsync.Priority, isCancel bool, extensions map[string][]byte) GraphSyncRequest { @@ -164,7 +166,11 @@ func newMessageFromProto(pbm pb.Message) (GraphSyncMessage, error) { if err != nil { return nil, err } - gsm.AddRequest(newRequest(graphsync.RequestID(req.Id), root, req.Selector, graphsync.Priority(req.Priority), req.Cancel, req.GetExtensions())) + selector, err := ipldutil.DecodeNode(req.Selector) + if err != nil { + return nil, err + } + gsm.AddRequest(newRequest(graphsync.RequestID(req.Id), root, selector, graphsync.Priority(req.Priority), req.Cancel, req.GetExtensions())) } for _, res := range pbm.Responses { @@ -249,14 +255,22 @@ func FromPBReader(pbr ggio.Reader) (GraphSyncMessage, error) { return newMessageFromProto(*pb) } -func (gsm *graphSyncMessage) ToProto() *pb.Message { +func (gsm *graphSyncMessage) ToProto() (*pb.Message, error) { pbm := new(pb.Message) pbm.Requests = make([]pb.Message_Request, 0, len(gsm.requests)) for _, request := range gsm.requests { + var selector []byte + var err error + if request.selector != nil { + selector, err = ipldutil.EncodeNode(request.selector) + if err != nil { + return nil, err + } + } pbm.Requests = append(pbm.Requests, pb.Message_Request{ Id: int32(request.id), Root: request.root.Bytes(), - Selector: request.selector, + Selector: selector, Priority: int32(request.priority), Cancel: request.isCancel, Extensions: request.extensions, @@ -280,13 +294,16 @@ func (gsm *graphSyncMessage) ToProto() *pb.Message { Prefix: b.Cid().Prefix().Bytes(), }) } - return pbm + return pbm, nil } func (gsm *graphSyncMessage) ToNet(w io.Writer) error { pbw := ggio.NewDelimitedWriter(w) - - return pbw.WriteMsg(gsm.ToProto()) + msg, err := gsm.ToProto() + if err != nil { + return err + } + return pbw.WriteMsg(msg) } func (gsm *graphSyncMessage) Loggable() map[string]interface{} { @@ -311,7 +328,7 @@ func (gsr GraphSyncRequest) ID() graphsync.RequestID { return gsr.id } func (gsr GraphSyncRequest) Root() cid.Cid { return gsr.root } // Selector returns the byte representation of the selector for this request -func (gsr GraphSyncRequest) Selector() []byte { return gsr.selector } +func (gsr GraphSyncRequest) Selector() ipld.Node { return gsr.selector } // Priority returns the priority of this request func (gsr GraphSyncRequest) Priority() graphsync.Priority { return gsr.priority } diff --git a/message/message_test.go b/message/message_test.go index 347871fc..a5b3d53b 100644 --- a/message/message_test.go +++ b/message/message_test.go @@ -8,8 +8,11 @@ import ( blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-graphsync" + ipldfree "github.com/ipld/go-ipld-prime/impl/free" + "github.com/ipld/go-ipld-prime/traversal/selector/builder" cid "github.com/ipfs/go-cid" + "github.com/ipfs/go-graphsync/ipldutil" "github.com/ipfs/go-graphsync/testutil" ) @@ -20,7 +23,8 @@ func TestAppendingRequests(t *testing.T) { Data: testutil.RandomBytes(100), } root := testutil.GenerateCids(1)[0] - selector := testutil.RandomBytes(100) + ssb := builder.NewSelectorSpecBuilder(ipldfree.NodeBuilder()) + selector := ssb.Matcher().Node() id := graphsync.RequestID(rand.Int31()) priority := graphsync.Priority(rand.Int31()) @@ -42,13 +46,20 @@ func TestAppendingRequests(t *testing.T) { t.Fatal("Did not properly add request to message") } - pbMessage := gsm.ToProto() + pbMessage, err := gsm.ToProto() + if err != nil { + t.Fatal("Did not serialize to protobuf correctly") + } + selectorEncoded, err := ipldutil.EncodeNode(selector) + if err != nil { + t.Fatal("selector did not encode") + } pbRequest := pbMessage.Requests[0] if pbRequest.Id != int32(id) || pbRequest.Priority != int32(priority) || pbRequest.Cancel != false || !reflect.DeepEqual(pbRequest.Root, root.Bytes()) || - !reflect.DeepEqual(pbRequest.Selector, selector) || + !reflect.DeepEqual(pbRequest.Selector, selectorEncoded) || !reflect.DeepEqual(pbRequest.Extensions, map[string][]byte{"graphsync/awesome": extension.Data}) { t.Fatal("Did not properly serialize message to protobuf") } @@ -98,7 +109,10 @@ func TestAppendingResponses(t *testing.T) { t.Fatal("Did not properly add response to message") } - pbMessage := gsm.ToProto() + pbMessage, err := gsm.ToProto() + if err != nil { + t.Fatal("Did not serialize to protobuf correctly") + } pbResponse := pbMessage.Responses[0] if pbResponse.Id != int32(requestID) || pbResponse.Status != int32(status) || @@ -136,8 +150,13 @@ func TestAppendBlock(t *testing.T) { m.AddBlock(block) } + pbMessage, err := m.ToProto() + if err != nil { + t.Fatal("Did not serialize to protobuf correctly") + } + // assert strings are in proto message - for _, block := range m.ToProto().GetData() { + for _, block := range pbMessage.GetData() { s := bytes.NewBuffer(block.GetData()).String() if !contains(strs, s) { t.Fail() @@ -155,7 +174,8 @@ func contains(strs []string, x string) bool { } func TestRequestCancel(t *testing.T) { - selector := testutil.RandomBytes(100) + ssb := builder.NewSelectorSpecBuilder(ipldfree.NodeBuilder()) + selector := ssb.Matcher().Node() id := graphsync.RequestID(rand.Int31()) priority := graphsync.Priority(rand.Int31()) root := testutil.GenerateCids(1)[0] @@ -178,7 +198,8 @@ func TestRequestCancel(t *testing.T) { func TestToNetFromNetEquivalency(t *testing.T) { root := testutil.GenerateCids(1)[0] - selector := testutil.RandomBytes(100) + ssb := builder.NewSelectorSpecBuilder(ipldfree.NodeBuilder()) + selector := ssb.Matcher().Node() extensionName := graphsync.ExtensionName("graphsync/awesome") extension := graphsync.ExtensionData{ Name: extensionName, diff --git a/messagequeue/messagequeue_test.go b/messagequeue/messagequeue_test.go index bf395913..85b8e0ed 100644 --- a/messagequeue/messagequeue_test.go +++ b/messagequeue/messagequeue_test.go @@ -11,10 +11,11 @@ import ( "github.com/ipfs/go-graphsync" "github.com/ipfs/go-graphsync/testutil" + "github.com/ipld/go-ipld-prime/traversal/selector/builder" gsmsg "github.com/ipfs/go-graphsync/message" gsnet "github.com/ipfs/go-graphsync/network" - + ipldfree "github.com/ipld/go-ipld-prime/impl/free" "github.com/libp2p/go-libp2p-core/peer" ) @@ -68,7 +69,8 @@ func TestStartupAndShutdown(t *testing.T) { messageQueue.Startup() id := graphsync.RequestID(rand.Int31()) priority := graphsync.Priority(rand.Int31()) - selector := testutil.RandomBytes(100) + ssb := builder.NewSelectorSpecBuilder(ipldfree.NodeBuilder()) + selector := ssb.Matcher().Node() root := testutil.GenerateCids(1)[0] waitGroup.Add(1) @@ -112,7 +114,8 @@ func TestShutdownDuringMessageSend(t *testing.T) { messageQueue.Startup() id := graphsync.RequestID(rand.Int31()) priority := graphsync.Priority(rand.Int31()) - selector := testutil.RandomBytes(100) + ssb := builder.NewSelectorSpecBuilder(ipldfree.NodeBuilder()) + selector := ssb.Matcher().Node() root := testutil.GenerateCids(1)[0] // setup a message and advance as far as beginning to send it @@ -238,7 +241,8 @@ func TestDedupingMessages(t *testing.T) { waitGroup.Add(1) id := graphsync.RequestID(rand.Int31()) priority := graphsync.Priority(rand.Int31()) - selector := testutil.RandomBytes(100) + ssb := builder.NewSelectorSpecBuilder(ipldfree.NodeBuilder()) + selector := ssb.Matcher().Node() root := testutil.GenerateCids(1)[0] messageQueue.AddRequest(gsmsg.NewRequest(id, root, selector, priority)) @@ -246,11 +250,11 @@ func TestDedupingMessages(t *testing.T) { waitGroup.Wait() id2 := graphsync.RequestID(rand.Int31()) priority2 := graphsync.Priority(rand.Int31()) - selector2 := testutil.RandomBytes(100) + selector2 := ssb.ExploreAll(ssb.Matcher()).Node() root2 := testutil.GenerateCids(1)[0] id3 := graphsync.RequestID(rand.Int31()) priority3 := graphsync.Priority(rand.Int31()) - selector3 := testutil.RandomBytes(100) + selector3 := ssb.ExploreIndex(0, ssb.Matcher()).Node() root3 := testutil.GenerateCids(1)[0] messageQueue.AddRequest(gsmsg.NewRequest(id2, root2, selector2, priority2)) diff --git a/metadata/metadata.go b/metadata/metadata.go index 84ce28a1..27cd5814 100644 --- a/metadata/metadata.go +++ b/metadata/metadata.go @@ -1,7 +1,7 @@ package metadata import ( - "github.com/ipfs/go-graphsync/ipldbridge" + "github.com/ipfs/go-graphsync/ipldutil" "github.com/ipld/go-ipld-prime" "github.com/ipld/go-ipld-prime/fluent" ipldfree "github.com/ipld/go-ipld-prime/impl/free" @@ -19,8 +19,8 @@ type Metadata []Item // DecodeMetadata assembles metadata from a raw byte array, first deserializing // as a node and then assembling into a metadata struct. -func DecodeMetadata(data []byte, ipldBridge ipldbridge.IPLDBridge) (Metadata, error) { - node, err := ipldBridge.DecodeNode(data) +func DecodeMetadata(data []byte) (Metadata, error) { + node, err := ipldutil.DecodeNode(data) if err != nil { return nil, err } @@ -48,14 +48,14 @@ func DecodeMetadata(data []byte, ipldBridge ipldbridge.IPLDBridge) (Metadata, er } // EncodeMetadata encodes metadata to an IPLD node then serializes to raw bytes -func EncodeMetadata(entries Metadata, ipldBridge ipldbridge.IPLDBridge) ([]byte, error) { +func EncodeMetadata(entries Metadata) ([]byte, error) { var node ipld.Node err := fluent.Recover(func() { nb := fluent.WrapNodeBuilder(ipldfree.NodeBuilder()) - node = nb.CreateList(func(lb ipldbridge.ListBuilder, nb ipldbridge.NodeBuilder) { + node = nb.CreateList(func(lb fluent.ListBuilder, nb fluent.NodeBuilder) { for _, item := range entries { lb.Append( - nb.CreateMap(func(mb ipldbridge.MapBuilder, knb ipldbridge.NodeBuilder, vnb ipldbridge.NodeBuilder) { + nb.CreateMap(func(mb fluent.MapBuilder, knb fluent.NodeBuilder, vnb fluent.NodeBuilder) { mb.Insert(knb.CreateString("link"), vnb.CreateLink(item.Link)) mb.Insert(knb.CreateString("blockPresent"), vnb.CreateBool(item.BlockPresent)) }), @@ -66,5 +66,5 @@ func EncodeMetadata(entries Metadata, ipldBridge ipldbridge.IPLDBridge) ([]byte, if err != nil { return nil, err } - return ipldBridge.EncodeNode(node) + return ipldutil.EncodeNode(node) } diff --git a/metadata/metadata_test.go b/metadata/metadata_test.go index a3a2a005..a3399191 100644 --- a/metadata/metadata_test.go +++ b/metadata/metadata_test.go @@ -5,9 +5,7 @@ import ( "reflect" "testing" - "github.com/ipfs/go-graphsync/testbridge" - - "github.com/ipld/go-ipld-prime/linking/cid" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" "github.com/ipfs/go-graphsync/testutil" ) @@ -20,12 +18,11 @@ func TestDecodeEncodeMetadata(t *testing.T) { blockPresent := rand.Int31()%2 == 0 initialMetadata = append(initialMetadata, Item{link, blockPresent}) } - bridge := testbridge.NewMockIPLDBridge() - encoded, err := EncodeMetadata(initialMetadata, bridge) + encoded, err := EncodeMetadata(initialMetadata) if err != nil { t.Fatal("Error encoding") } - decodedMetadata, err := DecodeMetadata(encoded, bridge) + decodedMetadata, err := DecodeMetadata(encoded) if err != nil { t.Fatal("Error decoding") } diff --git a/network/libp2p_impl_test.go b/network/libp2p_impl_test.go index ecede89a..72478f8b 100644 --- a/network/libp2p_impl_test.go +++ b/network/libp2p_impl_test.go @@ -10,6 +10,8 @@ import ( "github.com/ipfs/go-graphsync" gsmsg "github.com/ipfs/go-graphsync/message" "github.com/ipfs/go-graphsync/testutil" + ipldfree "github.com/ipld/go-ipld-prime/impl/free" + "github.com/ipld/go-ipld-prime/traversal/selector/builder" "github.com/libp2p/go-libp2p-core/peer" mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" ) @@ -73,7 +75,8 @@ func TestMessageSendAndReceive(t *testing.T) { gsnet2.SetDelegate(r) root := testutil.GenerateCids(1)[0] - selector := testutil.RandomBytes(100) + ssb := builder.NewSelectorSpecBuilder(ipldfree.NodeBuilder()) + selector := ssb.Matcher().Node() extensionName := graphsync.ExtensionName("graphsync/awesome") extension := graphsync.ExtensionData{ Name: extensionName, diff --git a/peermanager/peermessagemanager_test.go b/peermanager/peermessagemanager_test.go index 43db64ab..3b46f10e 100644 --- a/peermanager/peermessagemanager_test.go +++ b/peermanager/peermessagemanager_test.go @@ -9,9 +9,10 @@ import ( blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-graphsync" - gsmsg "github.com/ipfs/go-graphsync/message" "github.com/ipfs/go-graphsync/testutil" + ipldfree "github.com/ipld/go-ipld-prime/impl/free" + "github.com/ipld/go-ipld-prime/traversal/selector/builder" "github.com/libp2p/go-libp2p-core/peer" ) @@ -59,7 +60,8 @@ func TestSendingMessagesToPeers(t *testing.T) { id := graphsync.RequestID(rand.Int31()) priority := graphsync.Priority(rand.Int31()) root := testutil.GenerateCids(1)[0] - selector := testutil.RandomBytes(100) + ssb := builder.NewSelectorSpecBuilder(ipldfree.NodeBuilder()) + selector := ssb.Matcher().Node() peerManager := NewMessageManager(ctx, peerQueueFactory) diff --git a/requestmanager/asyncloader/asyncloader.go b/requestmanager/asyncloader/asyncloader.go index cf38c0a0..d04faf56 100644 --- a/requestmanager/asyncloader/asyncloader.go +++ b/requestmanager/asyncloader/asyncloader.go @@ -8,7 +8,6 @@ import ( blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-graphsync" - "github.com/ipfs/go-graphsync/ipldbridge" "github.com/ipfs/go-graphsync/metadata" "github.com/ipfs/go-graphsync/requestmanager/asyncloader/loadattemptqueue" "github.com/ipfs/go-graphsync/requestmanager/asyncloader/responsecache" @@ -44,7 +43,7 @@ func New(ctx context.Context, loader ipld.Loader, storer ipld.Storer) *AsyncLoad data, err := responseCache.AttemptLoad(requestID, link) if data == nil && err == nil { // fall back to local store - stream, loadErr := loader(link, ipldbridge.LinkContext{}) + stream, loadErr := loader(link, ipld.LinkContext{}) if stream != nil && loadErr == nil { localData, loadErr := ioutil.ReadAll(stream) if loadErr == nil && localData != nil { diff --git a/requestmanager/asyncloader/asyncloader_test.go b/requestmanager/asyncloader/asyncloader_test.go index acb746c3..9dc6bef3 100644 --- a/requestmanager/asyncloader/asyncloader_test.go +++ b/requestmanager/asyncloader/asyncloader_test.go @@ -9,11 +9,9 @@ import ( "time" "github.com/ipfs/go-graphsync" - "github.com/ipfs/go-graphsync/ipldbridge" "github.com/ipfs/go-graphsync/metadata" cidlink "github.com/ipld/go-ipld-prime/linking/cid" - "github.com/ipfs/go-graphsync/testbridge" "github.com/ipfs/go-graphsync/testutil" ipld "github.com/ipld/go-ipld-prime" ) @@ -24,9 +22,9 @@ func TestAsyncLoadInitialLoadSucceedsLocallyPresent(t *testing.T) { defer cancel() callCount := 0 blockStore := make(map[ipld.Link][]byte) - loader, storer := testbridge.NewMockStore(blockStore) + loader, storer := testutil.NewTestStore(blockStore) block := testutil.GenerateBlocksOfSize(1, 100)[0] - writer, commit, err := storer(ipldbridge.LinkContext{}) + writer, commit, err := storer(ipld.LinkContext{}) _, err = writer.Write(block.RawData()) if err != nil { t.Fatal("could not seed block store") @@ -37,7 +35,7 @@ func TestAsyncLoadInitialLoadSucceedsLocallyPresent(t *testing.T) { t.Fatal("could not seed block store") } - wrappedLoader := func(link ipld.Link, linkContext ipldbridge.LinkContext) (io.Reader, error) { + wrappedLoader := func(link ipld.Link, linkContext ipld.LinkContext) (io.Reader, error) { callCount++ return loader(link, linkContext) } @@ -71,13 +69,13 @@ func TestAsyncLoadInitialLoadSucceedsResponsePresent(t *testing.T) { defer cancel() callCount := 0 blockStore := make(map[ipld.Link][]byte) - loader, storer := testbridge.NewMockStore(blockStore) + loader, storer := testutil.NewTestStore(blockStore) blocks := testutil.GenerateBlocksOfSize(1, 100) block := blocks[0] link := cidlink.Link{Cid: block.Cid()} - wrappedLoader := func(link ipld.Link, linkContext ipldbridge.LinkContext) (io.Reader, error) { + wrappedLoader := func(link ipld.Link, linkContext ipld.LinkContext) (io.Reader, error) { callCount++ return loader(link, linkContext) } @@ -124,9 +122,9 @@ func TestAsyncLoadInitialLoadFails(t *testing.T) { defer cancel() callCount := 0 blockStore := make(map[ipld.Link][]byte) - loader, storer := testbridge.NewMockStore(blockStore) + loader, storer := testutil.NewTestStore(blockStore) - wrappedLoader := func(link ipld.Link, linkContext ipldbridge.LinkContext) (io.Reader, error) { + wrappedLoader := func(link ipld.Link, linkContext ipld.LinkContext) (io.Reader, error) { callCount++ return loader(link, linkContext) } @@ -134,7 +132,7 @@ func TestAsyncLoadInitialLoadFails(t *testing.T) { asyncLoader := New(ctx, wrappedLoader, storer) asyncLoader.Startup() - link := testbridge.NewMockLink() + link := testutil.NewTestLink() requestID := graphsync.RequestID(rand.Int31()) responses := map[graphsync.RequestID]metadata.Metadata{ @@ -172,9 +170,9 @@ func TestAsyncLoadInitialLoadIndeterminateWhenRequestNotInProgress(t *testing.T) defer cancel() callCount := 0 blockStore := make(map[ipld.Link][]byte) - loader, storer := testbridge.NewMockStore(blockStore) + loader, storer := testutil.NewTestStore(blockStore) - wrappedLoader := func(link ipld.Link, linkContext ipldbridge.LinkContext) (io.Reader, error) { + wrappedLoader := func(link ipld.Link, linkContext ipld.LinkContext) (io.Reader, error) { callCount++ return loader(link, linkContext) } @@ -182,7 +180,7 @@ func TestAsyncLoadInitialLoadIndeterminateWhenRequestNotInProgress(t *testing.T) asyncLoader := New(ctx, wrappedLoader, storer) asyncLoader.Startup() - link := testbridge.NewMockLink() + link := testutil.NewTestLink() requestID := graphsync.RequestID(rand.Int31()) resultChan := asyncLoader.AsyncLoad(requestID, link) @@ -209,13 +207,13 @@ func TestAsyncLoadInitialLoadIndeterminateThenSucceeds(t *testing.T) { defer cancel() callCount := 0 blockStore := make(map[ipld.Link][]byte) - loader, storer := testbridge.NewMockStore(blockStore) + loader, storer := testutil.NewTestStore(blockStore) blocks := testutil.GenerateBlocksOfSize(1, 100) block := blocks[0] link := cidlink.Link{Cid: block.Cid()} called := make(chan struct{}, 2) - wrappedLoader := func(link ipld.Link, linkContext ipldbridge.LinkContext) (io.Reader, error) { + wrappedLoader := func(link ipld.Link, linkContext ipld.LinkContext) (io.Reader, error) { called <- struct{}{} callCount++ return loader(link, linkContext) @@ -273,11 +271,11 @@ func TestAsyncLoadInitialLoadIndeterminateThenFails(t *testing.T) { defer cancel() callCount := 0 blockStore := make(map[ipld.Link][]byte) - loader, storer := testbridge.NewMockStore(blockStore) + loader, storer := testutil.NewTestStore(blockStore) - link := testbridge.NewMockLink() + link := testutil.NewTestLink() called := make(chan struct{}, 2) - wrappedLoader := func(link ipld.Link, linkContext ipldbridge.LinkContext) (io.Reader, error) { + wrappedLoader := func(link ipld.Link, linkContext ipld.LinkContext) (io.Reader, error) { called <- struct{}{} callCount++ return loader(link, linkContext) @@ -330,11 +328,11 @@ func TestAsyncLoadInitialLoadIndeterminateThenRequestFinishes(t *testing.T) { defer cancel() callCount := 0 blockStore := make(map[ipld.Link][]byte) - loader, storer := testbridge.NewMockStore(blockStore) + loader, storer := testutil.NewTestStore(blockStore) - link := testbridge.NewMockLink() + link := testutil.NewTestLink() called := make(chan struct{}, 2) - wrappedLoader := func(link ipld.Link, linkContext ipldbridge.LinkContext) (io.Reader, error) { + wrappedLoader := func(link ipld.Link, linkContext ipld.LinkContext) (io.Reader, error) { called <- struct{}{} callCount++ return loader(link, linkContext) @@ -379,13 +377,13 @@ func TestAsyncLoadTwiceLoadsLocallySecondTime(t *testing.T) { defer cancel() callCount := 0 blockStore := make(map[ipld.Link][]byte) - loader, storer := testbridge.NewMockStore(blockStore) + loader, storer := testutil.NewTestStore(blockStore) blocks := testutil.GenerateBlocksOfSize(1, 100) block := blocks[0] link := cidlink.Link{Cid: block.Cid()} - wrappedLoader := func(link ipld.Link, linkContext ipldbridge.LinkContext) (io.Reader, error) { + wrappedLoader := func(link ipld.Link, linkContext ipld.LinkContext) (io.Reader, error) { callCount++ return loader(link, linkContext) } diff --git a/requestmanager/asyncloader/loadattemptqueue/loadattemptqueue_test.go b/requestmanager/asyncloader/loadattemptqueue/loadattemptqueue_test.go index 92de784f..1545db5f 100644 --- a/requestmanager/asyncloader/loadattemptqueue/loadattemptqueue_test.go +++ b/requestmanager/asyncloader/loadattemptqueue/loadattemptqueue_test.go @@ -9,7 +9,6 @@ import ( "github.com/ipfs/go-graphsync" "github.com/ipfs/go-graphsync/requestmanager/types" - "github.com/ipfs/go-graphsync/testbridge" "github.com/ipfs/go-graphsync/testutil" ipld "github.com/ipld/go-ipld-prime" ) @@ -25,7 +24,7 @@ func TestAsyncLoadInitialLoadSucceeds(t *testing.T) { } loadAttemptQueue := New(loadAttempter) - link := testbridge.NewMockLink() + link := testutil.NewTestLink() requestID := graphsync.RequestID(rand.Int31()) resultChan := make(chan types.AsyncLoadResult, 1) @@ -60,7 +59,7 @@ func TestAsyncLoadInitialLoadFails(t *testing.T) { } loadAttemptQueue := New(loadAttempter) - link := testbridge.NewMockLink() + link := testutil.NewTestLink() requestID := graphsync.RequestID(rand.Int31()) resultChan := make(chan types.AsyncLoadResult, 1) lr := NewLoadRequest(requestID, link, resultChan) @@ -100,7 +99,7 @@ func TestAsyncLoadInitialLoadIndeterminateRetryFalse(t *testing.T) { loadAttemptQueue := New(loadAttempter) - link := testbridge.NewMockLink() + link := testutil.NewTestLink() requestID := graphsync.RequestID(rand.Int31()) resultChan := make(chan types.AsyncLoadResult, 1) lr := NewLoadRequest(requestID, link, resultChan) @@ -141,7 +140,7 @@ func TestAsyncLoadInitialLoadIndeterminateRetryTrueThenRetriedSuccess(t *testing } loadAttemptQueue := New(loadAttempter) - link := testbridge.NewMockLink() + link := testutil.NewTestLink() requestID := graphsync.RequestID(rand.Int31()) resultChan := make(chan types.AsyncLoadResult, 1) lr := NewLoadRequest(requestID, link, resultChan) @@ -190,7 +189,7 @@ func TestAsyncLoadInitialLoadIndeterminateThenRequestFinishes(t *testing.T) { } loadAttemptQueue := New(loadAttempter) - link := testbridge.NewMockLink() + link := testutil.NewTestLink() requestID := graphsync.RequestID(rand.Int31()) resultChan := make(chan types.AsyncLoadResult, 1) lr := NewLoadRequest(requestID, link, resultChan) diff --git a/requestmanager/asyncloader/unverifiedblockstore/unverifiedblockstore.go b/requestmanager/asyncloader/unverifiedblockstore/unverifiedblockstore.go index 2b582954..5250cee9 100644 --- a/requestmanager/asyncloader/unverifiedblockstore/unverifiedblockstore.go +++ b/requestmanager/asyncloader/unverifiedblockstore/unverifiedblockstore.go @@ -3,7 +3,6 @@ package unverifiedblockstore import ( "fmt" - "github.com/ipfs/go-graphsync/ipldbridge" ipld "github.com/ipld/go-ipld-prime" ) @@ -11,12 +10,12 @@ import ( // that have not been verified to be part of a traversal type UnverifiedBlockStore struct { inMemoryBlocks map[ipld.Link][]byte - storer ipldbridge.Storer + storer ipld.Storer } // New initializes a new unverified store with the given storer function for writing // to permaneant storage if the block is verified -func New(storer ipldbridge.Storer) *UnverifiedBlockStore { +func New(storer ipld.Storer) *UnverifiedBlockStore { return &UnverifiedBlockStore{ inMemoryBlocks: make(map[ipld.Link][]byte), storer: storer, @@ -47,7 +46,7 @@ func (ubs *UnverifiedBlockStore) VerifyBlock(lnk ipld.Link) ([]byte, error) { return nil, fmt.Errorf("Block not found") } delete(ubs.inMemoryBlocks, lnk) - buffer, committer, err := ubs.storer(ipldbridge.LinkContext{}) + buffer, committer, err := ubs.storer(ipld.LinkContext{}) if err != nil { return nil, err } diff --git a/requestmanager/asyncloader/unverifiedblockstore/unverifiedblockstore_test.go b/requestmanager/asyncloader/unverifiedblockstore/unverifiedblockstore_test.go index 8837ffd8..454d6f0b 100644 --- a/requestmanager/asyncloader/unverifiedblockstore/unverifiedblockstore_test.go +++ b/requestmanager/asyncloader/unverifiedblockstore/unverifiedblockstore_test.go @@ -6,22 +6,19 @@ import ( "reflect" "testing" - "github.com/ipfs/go-graphsync/ipldbridge" - "github.com/ipld/go-ipld-prime" - "github.com/ipfs/go-graphsync/testbridge" "github.com/ipfs/go-graphsync/testutil" - "github.com/ipld/go-ipld-prime/linking/cid" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" ) func TestVerifyBlockPresent(t *testing.T) { blocksWritten := make(map[ipld.Link][]byte) - loader, storer := testbridge.NewMockStore(blocksWritten) + loader, storer := testutil.NewTestStore(blocksWritten) unverifiedBlockStore := New(storer) block := testutil.GenerateBlocksOfSize(1, 100)[0] - reader, err := loader(cidlink.Link{Cid: block.Cid()}, ipldbridge.LinkContext{}) + reader, err := loader(cidlink.Link{Cid: block.Cid()}, ipld.LinkContext{}) if reader != nil || err == nil { t.Fatal("block should not be loadable till it's verified and stored") } @@ -30,7 +27,7 @@ func TestVerifyBlockPresent(t *testing.T) { t.Fatal("block should not be verifiable till it's added as an unverifiable block") } unverifiedBlockStore.AddUnverifiedBlock(cidlink.Link{Cid: block.Cid()}, block.RawData()) - reader, err = loader(cidlink.Link{Cid: block.Cid()}, ipldbridge.LinkContext{}) + reader, err = loader(cidlink.Link{Cid: block.Cid()}, ipld.LinkContext{}) if reader != nil || err == nil { t.Fatal("block should not be loadable till it's verified and stored") } @@ -38,7 +35,7 @@ func TestVerifyBlockPresent(t *testing.T) { if !reflect.DeepEqual(data, block.RawData()) || err != nil { t.Fatal("block should be returned on verification if added") } - reader, err = loader(cidlink.Link{Cid: block.Cid()}, ipldbridge.LinkContext{}) + reader, err = loader(cidlink.Link{Cid: block.Cid()}, ipld.LinkContext{}) var buffer bytes.Buffer io.Copy(&buffer, reader) if !reflect.DeepEqual(buffer.Bytes(), block.RawData()) || err != nil { diff --git a/requestmanager/loader/loader.go b/requestmanager/loader/loader.go index 5b29a54e..3100882e 100644 --- a/requestmanager/loader/loader.go +++ b/requestmanager/loader/loader.go @@ -7,7 +7,7 @@ import ( "io" "github.com/ipfs/go-graphsync" - "github.com/ipfs/go-graphsync/ipldbridge" + "github.com/ipfs/go-graphsync/ipldutil" "github.com/ipfs/go-graphsync/requestmanager/types" ipld "github.com/ipld/go-ipld-prime" ) @@ -24,7 +24,7 @@ func WrapAsyncLoader( asyncLoadFn AsyncLoadFn, requestID graphsync.RequestID, errorChan chan error) ipld.Loader { - return func(link ipld.Link, linkContext ipldbridge.LinkContext) (io.Reader, error) { + return func(link ipld.Link, linkContext ipld.LinkContext) (io.Reader, error) { resultChan := asyncLoadFn(requestID, link) select { case <-ctx.Done(): @@ -35,7 +35,7 @@ func WrapAsyncLoader( case <-ctx.Done(): return nil, fmt.Errorf("request finished") case errorChan <- result.Err: - return nil, ipldbridge.ErrDoNotFollow() + return nil, ipldutil.ErrDoNotFollow() } } return bytes.NewReader(result.Data), nil diff --git a/requestmanager/loader/loader_test.go b/requestmanager/loader/loader_test.go index 3128b12a..efc779d6 100644 --- a/requestmanager/loader/loader_test.go +++ b/requestmanager/loader/loader_test.go @@ -11,10 +11,9 @@ import ( "time" "github.com/ipfs/go-graphsync" - "github.com/ipfs/go-graphsync/ipldbridge" + "github.com/ipfs/go-graphsync/ipldutil" "github.com/ipfs/go-graphsync/requestmanager/types" - "github.com/ipfs/go-graphsync/testbridge" "github.com/ipfs/go-graphsync/testutil" "github.com/ipld/go-ipld-prime" ) @@ -42,10 +41,11 @@ func TestWrappedAsyncLoaderReturnsValues(t *testing.T) { requestID := graphsync.RequestID(rand.Int31()) loader := WrapAsyncLoader(ctx, asyncLoadFn, requestID, errChan) - link := testbridge.NewMockLink() + link := testutil.NewTestLink() + data := testutil.RandomBytes(100) responseChan <- types.AsyncLoadResult{Data: data, Err: nil} - stream, err := loader(link, ipldbridge.LinkContext{}) + stream, err := loader(link, ipld.LinkContext{}) if err != nil { t.Fatal("Should not have errored on load") } @@ -69,11 +69,11 @@ func TestWrappedAsyncLoaderSideChannelsErrors(t *testing.T) { requestID := graphsync.RequestID(rand.Int31()) loader := WrapAsyncLoader(ctx, asyncLoadFn, requestID, errChan) - link := testbridge.NewMockLink() + link := testutil.NewTestLink() err := errors.New("something went wrong") responseChan <- types.AsyncLoadResult{Data: nil, Err: err} - stream, loadErr := loader(link, ipldbridge.LinkContext{}) - if stream != nil || loadErr != ipldbridge.ErrDoNotFollow() { + stream, loadErr := loader(link, ipld.LinkContext{}) + if stream != nil || loadErr != ipldutil.ErrDoNotFollow() { t.Fatal("Should have errored on load") } select { @@ -97,13 +97,13 @@ func TestWrappedAsyncLoaderContextCancels(t *testing.T) { errChan := make(chan error, 1) requestID := graphsync.RequestID(rand.Int31()) loader := WrapAsyncLoader(subCtx, asyncLoadFn, requestID, errChan) - link := testbridge.NewMockLink() + link := testutil.NewTestLink() resultsChan := make(chan struct { io.Reader error }) go func() { - stream, err := loader(link, ipldbridge.LinkContext{}) + stream, err := loader(link, ipld.LinkContext{}) resultsChan <- struct { io.Reader error diff --git a/requestmanager/requestmanager.go b/requestmanager/requestmanager.go index 4590265f..5e9e7886 100644 --- a/requestmanager/requestmanager.go +++ b/requestmanager/requestmanager.go @@ -7,7 +7,7 @@ import ( blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-graphsync" - ipldbridge "github.com/ipfs/go-graphsync/ipldbridge" + ipldutil "github.com/ipfs/go-graphsync/ipldutil" gsmsg "github.com/ipfs/go-graphsync/message" "github.com/ipfs/go-graphsync/metadata" "github.com/ipfs/go-graphsync/requestmanager/loader" @@ -15,6 +15,7 @@ import ( logging "github.com/ipfs/go-log" "github.com/ipld/go-ipld-prime" cidlink "github.com/ipld/go-ipld-prime/linking/cid" + "github.com/ipld/go-ipld-prime/traversal/selector" "github.com/libp2p/go-libp2p-core/peer" ) @@ -58,7 +59,6 @@ type RequestManager struct { ctx context.Context cancel func() messages chan requestManagerMessage - ipldBridge ipldbridge.IPLDBridge peerHandler PeerHandler rc *responseCollector asyncLoader AsyncLoader @@ -73,12 +73,11 @@ type requestManagerMessage interface { } // New generates a new request manager from a context, network, and selectorQuerier -func New(ctx context.Context, asyncLoader AsyncLoader, ipldBridge ipldbridge.IPLDBridge) *RequestManager { +func New(ctx context.Context, asyncLoader AsyncLoader) *RequestManager { ctx, cancel := context.WithCancel(ctx) return &RequestManager{ ctx: ctx, cancel: cancel, - ipldBridge: ipldBridge, asyncLoader: asyncLoader, rc: newResponseCollector(ctx), messages: make(chan requestManagerMessage, 16), @@ -111,7 +110,7 @@ func (rm *RequestManager) SendRequest(ctx context.Context, root ipld.Link, selector ipld.Node, extensions ...graphsync.ExtensionData) (<-chan graphsync.ResponseProgress, <-chan error) { - if _, err := rm.ipldBridge.ParseSelector(selector); err != nil { + if _, err := ipldutil.ParseSelector(selector); err != nil { return rm.singleErrorResponse(fmt.Errorf("Invalid Selector Spec")) } @@ -281,7 +280,7 @@ func (crm *cancelRequestMessage) handle(rm *RequestManager) { func (prm *processResponseMessage) handle(rm *RequestManager) { filteredResponses := rm.filterResponsesForPeer(prm.responses, prm.p) filteredResponses = rm.processExtensions(filteredResponses, prm.p) - responseMetadata := metadataForResponses(filteredResponses, rm.ipldBridge) + responseMetadata := metadataForResponses(filteredResponses) rm.asyncLoader.ProcessResponse(responseMetadata, prm.blks) rm.processTerminations(filteredResponses) } @@ -364,11 +363,11 @@ func (rm *RequestManager) generateResponseErrorFromStatus(status graphsync.Respo } func (rm *RequestManager) setupRequest(requestID graphsync.RequestID, p peer.ID, root ipld.Link, selectorSpec ipld.Node, extensions []graphsync.ExtensionData) (chan graphsync.ResponseProgress, chan error) { - selectorBytes, err := rm.ipldBridge.EncodeNode(selectorSpec) + _, err := ipldutil.EncodeNode(selectorSpec) if err != nil { return rm.singleErrorResponse(err) } - selector, err := rm.ipldBridge.ParseSelector(selectorSpec) + selector, err := ipldutil.ParseSelector(selectorSpec) if err != nil { return rm.singleErrorResponse(err) } @@ -382,7 +381,7 @@ func (rm *RequestManager) setupRequest(requestID graphsync.RequestID, p peer.ID, ctx, cancel, p, networkErrorChan, } rm.asyncLoader.StartRequest(requestID) - rm.peerHandler.SendRequest(p, gsmsg.NewRequest(requestID, asCidLink.Cid, selectorBytes, maxPriority, extensions...)) + rm.peerHandler.SendRequest(p, gsmsg.NewRequest(requestID, asCidLink.Cid, selectorSpec, maxPriority, extensions...)) return rm.executeTraversal(ctx, requestID, root, selector, networkErrorChan) } @@ -390,7 +389,7 @@ func (rm *RequestManager) executeTraversal( ctx context.Context, requestID graphsync.RequestID, root ipld.Link, - selector ipldbridge.Selector, + selector selector.Selector, networkErrorChan chan error, ) (chan graphsync.ResponseProgress, chan error) { inProgressChan := make(chan graphsync.ResponseProgress) @@ -398,7 +397,7 @@ func (rm *RequestManager) executeTraversal( loaderFn := loader.WrapAsyncLoader(ctx, rm.asyncLoader.AsyncLoad, requestID, inProgressErr) visitor := visitToChannel(ctx, inProgressChan) go func() { - rm.ipldBridge.Traverse(ctx, loaderFn, root, selector, visitor) + ipldutil.Traverse(ctx, loaderFn, root, selector, visitor) select { case networkError := <-networkErrorChan: select { diff --git a/requestmanager/requestmanager_test.go b/requestmanager/requestmanager_test.go index 926cd747..e08d0d86 100644 --- a/requestmanager/requestmanager_test.go +++ b/requestmanager/requestmanager_test.go @@ -10,7 +10,6 @@ import ( "time" "github.com/ipfs/go-graphsync" - "github.com/ipfs/go-graphsync/ipldbridge" "github.com/ipfs/go-graphsync/requestmanager/types" "github.com/libp2p/go-libp2p-core/peer" @@ -23,7 +22,6 @@ import ( blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" gsmsg "github.com/ipfs/go-graphsync/message" - "github.com/ipfs/go-graphsync/testbridge" "github.com/ipfs/go-graphsync/testutil" ) @@ -163,25 +161,6 @@ func readNNetworkRequests(ctx context.Context, return requestRecords } -func verifyMatchedResponses(t *testing.T, actualResponse []graphsync.ResponseProgress, expectedBlocks []blocks.Block) { - if len(actualResponse) != len(expectedBlocks) { - t.Fatal("wrong number of responses sent") - } - for _, responseProgress := range actualResponse { - data, err := responseProgress.Node.AsBytes() - if err != nil { - t.Fatal("Node was not a block") - } - blk, err := blocks.NewBlockWithCid(data, responseProgress.LastBlock.Link.(cidlink.Link).Cid) - if err != nil { - t.Fatal("block did not verify") - } - if !testutil.ContainsBlock(expectedBlocks, blk) { - t.Fatal("wrong block sent") - } - } -} - func metadataForBlocks(blks []blocks.Block, present bool) metadata.Metadata { md := make(metadata.Metadata, 0, len(blks)) for _, block := range blks { @@ -193,9 +172,9 @@ func metadataForBlocks(blks []blocks.Block, present bool) metadata.Metadata { return md } -func encodedMetadataForBlocks(t *testing.T, ipldBridge ipldbridge.IPLDBridge, blks []blocks.Block, present bool) graphsync.ExtensionData { +func encodedMetadataForBlocks(t *testing.T, blks []blocks.Block, present bool) graphsync.ExtensionData { md := metadataForBlocks(blks, present) - metadataEncoded, err := metadata.EncodeMetadata(md, ipldBridge) + metadataEncoded, err := metadata.EncodeMetadata(md) if err != nil { t.Fatal("did not encode metadata") } @@ -208,10 +187,9 @@ func encodedMetadataForBlocks(t *testing.T, ipldBridge ipldbridge.IPLDBridge, bl func TestNormalSimultaneousFetch(t *testing.T) { requestRecordChan := make(chan requestRecord, 2) fph := &fakePeerHandler{requestRecordChan} - fakeIPLDBridge := testbridge.NewMockIPLDBridge() ctx := context.Background() fal := newFakeAsyncLoader() - requestManager := New(ctx, fal, fakeIPLDBridge) + requestManager := New(ctx, fal) requestManager.SetDelegate(fph) requestManager.Startup() @@ -219,15 +197,13 @@ func TestNormalSimultaneousFetch(t *testing.T) { defer cancel() peers := testutil.GeneratePeers(1) - blocks1 := testutil.GenerateBlocksOfSize(5, 100) - blocks2 := testutil.GenerateBlocksOfSize(5, 100) - r1 := cidlink.Link{Cid: blocks1[0].Cid()} - r2 := cidlink.Link{Cid: blocks2[0].Cid()} - s1 := testbridge.NewMockSelectorSpec(cidsForBlocks(blocks1)) - s2 := testbridge.NewMockSelectorSpec(cidsForBlocks(blocks2)) + blockStore := make(map[ipld.Link][]byte) + loader, storer := testutil.NewTestStore(blockStore) + blockChain1 := testutil.SetupBlockChain(ctx, t, loader, storer, 100, 5) + blockChain2 := testutil.SetupBlockChain(ctx, t, loader, storer, 100, 5) - returnedResponseChan1, returnedErrorChan1 := requestManager.SendRequest(requestCtx, peers[0], r1, s1) - returnedResponseChan2, returnedErrorChan2 := requestManager.SendRequest(requestCtx, peers[0], r2, s2) + returnedResponseChan1, returnedErrorChan1 := requestManager.SendRequest(requestCtx, peers[0], blockChain1.TipLink, blockChain1.Selector()) + returnedResponseChan2, returnedErrorChan2 := requestManager.SendRequest(requestCtx, peers[0], blockChain2.TipLink, blockChain2.Selector()) requestRecords := readNNetworkRequests(requestCtx, t, requestRecordChan, 2) @@ -238,23 +214,21 @@ func TestNormalSimultaneousFetch(t *testing.T) { t.Fatal("did not send correct requests") } - returnedS1, err := fakeIPLDBridge.DecodeNode(requestRecords[0].gsr.Selector()) - if err != nil || !reflect.DeepEqual(s1, returnedS1) { + if !reflect.DeepEqual(blockChain1.Selector(), requestRecords[0].gsr.Selector()) { t.Fatal("did not encode selector properly") } - returnedS2, err := fakeIPLDBridge.DecodeNode(requestRecords[1].gsr.Selector()) - if err != nil || !reflect.DeepEqual(s2, returnedS2) { + if !reflect.DeepEqual(blockChain2.Selector(), requestRecords[1].gsr.Selector()) { t.Fatal("did not encode selector properly") } - firstBlocks := append(blocks1, blocks2[:3]...) - firstMetadata1 := metadataForBlocks(blocks1, true) - firstMetadataEncoded1, err := metadata.EncodeMetadata(firstMetadata1, fakeIPLDBridge) + firstBlocks := append(blockChain1.AllBlocks(), blockChain2.Blocks(0, 3)...) + firstMetadata1 := metadataForBlocks(blockChain1.AllBlocks(), true) + firstMetadataEncoded1, err := metadata.EncodeMetadata(firstMetadata1) if err != nil { t.Fatal("did not encode metadata") } - firstMetadata2 := metadataForBlocks(blocks2[:3], true) - firstMetadataEncoded2, err := metadata.EncodeMetadata(firstMetadata2, fakeIPLDBridge) + firstMetadata2 := metadataForBlocks(blockChain2.Blocks(0, 3), true) + firstMetadataEncoded2, err := metadata.EncodeMetadata(firstMetadata2) if err != nil { t.Fatal("did not encode metadata") } @@ -275,17 +249,15 @@ func TestNormalSimultaneousFetch(t *testing.T) { requestRecords[0].gsr.ID(): firstMetadata1, requestRecords[1].gsr.ID(): firstMetadata2, }) - fal.successResponseOn(requestRecords[0].gsr.ID(), blocks1) - fal.successResponseOn(requestRecords[1].gsr.ID(), blocks2[:3]) + fal.successResponseOn(requestRecords[0].gsr.ID(), blockChain1.AllBlocks()) + fal.successResponseOn(requestRecords[1].gsr.ID(), blockChain2.Blocks(0, 3)) - responses1 := testutil.CollectResponses(requestCtx, t, returnedResponseChan1) - verifyMatchedResponses(t, responses1, blocks1) - responses2 := testutil.ReadNResponses(requestCtx, t, returnedResponseChan2, 3) - verifyMatchedResponses(t, responses2, blocks2[:3]) + blockChain1.VerifyWholeChain(requestCtx, returnedResponseChan1) + blockChain2.VerifyResponseRange(requestCtx, returnedResponseChan2, 0, 3) - moreBlocks := blocks2[3:] + moreBlocks := blockChain2.RemainderBlocks(3) moreMetadata := metadataForBlocks(moreBlocks, true) - moreMetadataEncoded, err := metadata.EncodeMetadata(moreMetadata, fakeIPLDBridge) + moreMetadataEncoded, err := metadata.EncodeMetadata(moreMetadata) if err != nil { t.Fatal("did not encode metadata") } @@ -304,8 +276,7 @@ func TestNormalSimultaneousFetch(t *testing.T) { fal.successResponseOn(requestRecords[1].gsr.ID(), moreBlocks) - responses2 = testutil.CollectResponses(requestCtx, t, returnedResponseChan2) - verifyMatchedResponses(t, responses2, moreBlocks) + blockChain2.VerifyRemainder(requestCtx, returnedResponseChan2, 3) testutil.VerifyEmptyErrors(requestCtx, t, returnedErrorChan1) testutil.VerifyEmptyErrors(requestCtx, t, returnedErrorChan2) } @@ -313,10 +284,9 @@ func TestNormalSimultaneousFetch(t *testing.T) { func TestCancelRequestInProgress(t *testing.T) { requestRecordChan := make(chan requestRecord, 2) fph := &fakePeerHandler{requestRecordChan} - fakeIPLDBridge := testbridge.NewMockIPLDBridge() ctx := context.Background() fal := newFakeAsyncLoader() - requestManager := New(ctx, fal, fakeIPLDBridge) + requestManager := New(ctx, fal) requestManager.SetDelegate(fph) requestManager.Startup() requestCtx, cancel := context.WithTimeout(ctx, time.Second) @@ -326,17 +296,17 @@ func TestCancelRequestInProgress(t *testing.T) { defer cancel2() peers := testutil.GeneratePeers(1) - blocks1 := testutil.GenerateBlocksOfSize(5, 100) - s1 := testbridge.NewMockSelectorSpec(cidsForBlocks(blocks1)) - r1 := cidlink.Link{Cid: blocks1[0].Cid()} + blockStore := make(map[ipld.Link][]byte) + loader, storer := testutil.NewTestStore(blockStore) + blockChain := testutil.SetupBlockChain(ctx, t, loader, storer, 100, 5) - returnedResponseChan1, returnedErrorChan1 := requestManager.SendRequest(requestCtx1, peers[0], r1, s1) - returnedResponseChan2, returnedErrorChan2 := requestManager.SendRequest(requestCtx2, peers[0], r1, s1) + returnedResponseChan1, returnedErrorChan1 := requestManager.SendRequest(requestCtx1, peers[0], blockChain.TipLink, blockChain.Selector()) + returnedResponseChan2, returnedErrorChan2 := requestManager.SendRequest(requestCtx2, peers[0], blockChain.TipLink, blockChain.Selector()) requestRecords := readNNetworkRequests(requestCtx, t, requestRecordChan, 2) - firstBlocks := blocks1[:3] - firstMetadata := encodedMetadataForBlocks(t, fakeIPLDBridge, blocks1[:3], true) + firstBlocks := blockChain.Blocks(0, 3) + firstMetadata := encodedMetadataForBlocks(t, firstBlocks, true) firstResponses := []gsmsg.GraphSyncResponse{ gsmsg.NewResponse(requestRecords[0].gsr.ID(), graphsync.PartialResponse, firstMetadata), gsmsg.NewResponse(requestRecords[1].gsr.ID(), graphsync.PartialResponse, firstMetadata), @@ -344,30 +314,27 @@ func TestCancelRequestInProgress(t *testing.T) { requestManager.ProcessResponses(peers[0], firstResponses, firstBlocks) - fal.successResponseOn(requestRecords[0].gsr.ID(), blocks1[:3]) - fal.successResponseOn(requestRecords[1].gsr.ID(), blocks1[:3]) - responses1 := testutil.ReadNResponses(requestCtx, t, returnedResponseChan1, 3) - + fal.successResponseOn(requestRecords[0].gsr.ID(), firstBlocks) + fal.successResponseOn(requestRecords[1].gsr.ID(), firstBlocks) + blockChain.VerifyResponseRange(requestCtx1, returnedResponseChan1, 0, 3) cancel1() rr := readNNetworkRequests(requestCtx, t, requestRecordChan, 1)[0] if rr.gsr.IsCancel() != true || rr.gsr.ID() != requestRecords[0].gsr.ID() { t.Fatal("did not send correct cancel message over network") } - moreBlocks := blocks1[3:] - moreMetadata := encodedMetadataForBlocks(t, fakeIPLDBridge, blocks1[3:], true) + moreBlocks := blockChain.RemainderBlocks(3) + moreMetadata := encodedMetadataForBlocks(t, moreBlocks, true) moreResponses := []gsmsg.GraphSyncResponse{ gsmsg.NewResponse(requestRecords[0].gsr.ID(), graphsync.RequestCompletedFull, moreMetadata), gsmsg.NewResponse(requestRecords[1].gsr.ID(), graphsync.RequestCompletedFull, moreMetadata), } requestManager.ProcessResponses(peers[0], moreResponses, moreBlocks) - fal.successResponseOn(requestRecords[0].gsr.ID(), blocks1[3:]) - fal.successResponseOn(requestRecords[1].gsr.ID(), blocks1[3:]) + fal.successResponseOn(requestRecords[0].gsr.ID(), moreBlocks) + fal.successResponseOn(requestRecords[1].gsr.ID(), moreBlocks) - responses1 = append(responses1, testutil.CollectResponses(requestCtx, t, returnedResponseChan1)...) - verifyMatchedResponses(t, responses1, blocks1[:3]) - responses2 := testutil.CollectResponses(requestCtx, t, returnedResponseChan2) - verifyMatchedResponses(t, responses2, blocks1) + testutil.VerifyEmptyResponse(requestCtx, t, returnedResponseChan1) + blockChain.VerifyWholeChain(requestCtx, returnedResponseChan2) testutil.VerifyEmptyErrors(requestCtx, t, returnedErrorChan1) testutil.VerifyEmptyErrors(requestCtx, t, returnedErrorChan2) } @@ -375,77 +342,51 @@ func TestCancelRequestInProgress(t *testing.T) { func TestCancelManagerExitsGracefully(t *testing.T) { requestRecordChan := make(chan requestRecord, 2) fph := &fakePeerHandler{requestRecordChan} - fakeIPLDBridge := testbridge.NewMockIPLDBridge() ctx := context.Background() managerCtx, managerCancel := context.WithCancel(ctx) fal := newFakeAsyncLoader() - requestManager := New(managerCtx, fal, fakeIPLDBridge) + requestManager := New(managerCtx, fal) requestManager.SetDelegate(fph) requestManager.Startup() requestCtx, cancel := context.WithTimeout(ctx, time.Second) defer cancel() peers := testutil.GeneratePeers(1) - blocks := testutil.GenerateBlocksOfSize(5, 100) - s := testbridge.NewMockSelectorSpec(cidsForBlocks(blocks)) - r := cidlink.Link{Cid: blocks[0].Cid()} + blockStore := make(map[ipld.Link][]byte) + loader, storer := testutil.NewTestStore(blockStore) + blockChain := testutil.SetupBlockChain(ctx, t, loader, storer, 100, 5) - returnedResponseChan, returnedErrorChan := requestManager.SendRequest(requestCtx, peers[0], r, s) + returnedResponseChan, returnedErrorChan := requestManager.SendRequest(requestCtx, peers[0], blockChain.TipLink, blockChain.Selector()) rr := readNNetworkRequests(requestCtx, t, requestRecordChan, 1)[0] - firstBlocks := blocks[:3] - firstMetadata := encodedMetadataForBlocks(t, fakeIPLDBridge, firstBlocks, true) + firstBlocks := blockChain.Blocks(0, 3) + firstMetadata := encodedMetadataForBlocks(t, firstBlocks, true) firstResponses := []gsmsg.GraphSyncResponse{ gsmsg.NewResponse(rr.gsr.ID(), graphsync.PartialResponse, firstMetadata), } requestManager.ProcessResponses(peers[0], firstResponses, firstBlocks) fal.successResponseOn(rr.gsr.ID(), firstBlocks) - responses := testutil.ReadNResponses(requestCtx, t, returnedResponseChan, 3) + blockChain.VerifyResponseRange(ctx, returnedResponseChan, 0, 3) managerCancel() - moreBlocks := blocks[3:] - moreMetadata := encodedMetadataForBlocks(t, fakeIPLDBridge, moreBlocks, true) + moreBlocks := blockChain.RemainderBlocks(3) + moreMetadata := encodedMetadataForBlocks(t, moreBlocks, true) moreResponses := []gsmsg.GraphSyncResponse{ gsmsg.NewResponse(rr.gsr.ID(), graphsync.RequestCompletedFull, moreMetadata), } requestManager.ProcessResponses(peers[0], moreResponses, moreBlocks) fal.successResponseOn(rr.gsr.ID(), moreBlocks) - responses = append(responses, testutil.CollectResponses(requestCtx, t, returnedResponseChan)...) - verifyMatchedResponses(t, responses, firstBlocks) - testutil.VerifyEmptyErrors(requestCtx, t, returnedErrorChan) -} - -func TestInvalidSelector(t *testing.T) { - requestRecordChan := make(chan requestRecord, 2) - fph := &fakePeerHandler{requestRecordChan} - fakeIPLDBridge := testbridge.NewMockIPLDBridge() - ctx := context.Background() - fal := newFakeAsyncLoader() - requestManager := New(ctx, fal, fakeIPLDBridge) - requestManager.SetDelegate(fph) - requestManager.Startup() - - requestCtx, cancel := context.WithTimeout(ctx, time.Second) - defer cancel() - peers := testutil.GeneratePeers(1) - - cids := testutil.GenerateCids(5) - s := testbridge.NewUnencodableSelectorSpec(cids) - r := cidlink.Link{Cid: cids[0]} - returnedResponseChan, returnedErrorChan := requestManager.SendRequest(requestCtx, peers[0], r, s) - - testutil.VerifySingleTerminalError(requestCtx, t, returnedErrorChan) testutil.VerifyEmptyResponse(requestCtx, t, returnedResponseChan) + testutil.VerifyEmptyErrors(requestCtx, t, returnedErrorChan) } func TestUnencodableSelector(t *testing.T) { requestRecordChan := make(chan requestRecord, 2) fph := &fakePeerHandler{requestRecordChan} - fakeIPLDBridge := testbridge.NewMockIPLDBridge() ctx := context.Background() fal := newFakeAsyncLoader() - requestManager := New(ctx, fal, fakeIPLDBridge) + requestManager := New(ctx, fal) requestManager.SetDelegate(fph) requestManager.Startup() @@ -453,9 +394,8 @@ func TestUnencodableSelector(t *testing.T) { defer cancel() peers := testutil.GeneratePeers(1) - cids := testutil.GenerateCids(5) - s := testbridge.NewUnencodableSelectorSpec(cids) - r := cidlink.Link{Cid: cids[0]} + s := testutil.NewUnencodableSelectorSpec() + r := cidlink.Link{Cid: testutil.GenerateCids(1)[0]} returnedResponseChan, returnedErrorChan := requestManager.SendRequest(requestCtx, peers[0], r, s) testutil.VerifySingleTerminalError(requestCtx, t, returnedErrorChan) @@ -465,10 +405,9 @@ func TestUnencodableSelector(t *testing.T) { func TestFailedRequest(t *testing.T) { requestRecordChan := make(chan requestRecord, 2) fph := &fakePeerHandler{requestRecordChan} - fakeIPLDBridge := testbridge.NewMockIPLDBridge() ctx := context.Background() fal := newFakeAsyncLoader() - requestManager := New(ctx, fal, fakeIPLDBridge) + requestManager := New(ctx, fal) requestManager.SetDelegate(fph) requestManager.Startup() @@ -476,10 +415,11 @@ func TestFailedRequest(t *testing.T) { defer cancel() peers := testutil.GeneratePeers(1) - blocks := testutil.GenerateBlocksOfSize(5, 100) - s := testbridge.NewMockSelectorSpec(cidsForBlocks(blocks)) - r := cidlink.Link{Cid: blocks[0].Cid()} - returnedResponseChan, returnedErrorChan := requestManager.SendRequest(requestCtx, peers[0], r, s) + blockStore := make(map[ipld.Link][]byte) + loader, storer := testutil.NewTestStore(blockStore) + blockChain := testutil.SetupBlockChain(ctx, t, loader, storer, 100, 5) + + returnedResponseChan, returnedErrorChan := requestManager.SendRequest(requestCtx, peers[0], blockChain.TipLink, blockChain.Selector()) rr := readNNetworkRequests(requestCtx, t, requestRecordChan, 1)[0] failedResponses := []gsmsg.GraphSyncResponse{ @@ -494,10 +434,9 @@ func TestFailedRequest(t *testing.T) { func TestLocallyFulfilledFirstRequestFailsLater(t *testing.T) { requestRecordChan := make(chan requestRecord, 2) fph := &fakePeerHandler{requestRecordChan} - fakeIPLDBridge := testbridge.NewMockIPLDBridge() ctx := context.Background() fal := newFakeAsyncLoader() - requestManager := New(ctx, fal, fakeIPLDBridge) + requestManager := New(ctx, fal) requestManager.SetDelegate(fph) requestManager.Startup() @@ -505,18 +444,18 @@ func TestLocallyFulfilledFirstRequestFailsLater(t *testing.T) { defer cancel() peers := testutil.GeneratePeers(1) - blocks := testutil.GenerateBlocksOfSize(5, 100) - s := testbridge.NewMockSelectorSpec(cidsForBlocks(blocks)) - r := cidlink.Link{Cid: blocks[0].Cid()} - returnedResponseChan, returnedErrorChan := requestManager.SendRequest(requestCtx, peers[0], r, s) + blockStore := make(map[ipld.Link][]byte) + loader, storer := testutil.NewTestStore(blockStore) + blockChain := testutil.SetupBlockChain(ctx, t, loader, storer, 100, 5) + + returnedResponseChan, returnedErrorChan := requestManager.SendRequest(requestCtx, peers[0], blockChain.TipLink, blockChain.Selector()) rr := readNNetworkRequests(requestCtx, t, requestRecordChan, 1)[0] // async loaded response responds immediately - fal.successResponseOn(rr.gsr.ID(), blocks) + fal.successResponseOn(rr.gsr.ID(), blockChain.AllBlocks()) - responses := testutil.CollectResponses(requestCtx, t, returnedResponseChan) - verifyMatchedResponses(t, responses, blocks) + blockChain.VerifyWholeChain(requestCtx, returnedResponseChan) // failure comes in later over network failedResponses := []gsmsg.GraphSyncResponse{ @@ -531,10 +470,9 @@ func TestLocallyFulfilledFirstRequestFailsLater(t *testing.T) { func TestLocallyFulfilledFirstRequestSucceedsLater(t *testing.T) { requestRecordChan := make(chan requestRecord, 2) fph := &fakePeerHandler{requestRecordChan} - fakeIPLDBridge := testbridge.NewMockIPLDBridge() ctx := context.Background() fal := newFakeAsyncLoader() - requestManager := New(ctx, fal, fakeIPLDBridge) + requestManager := New(ctx, fal) requestManager.SetDelegate(fph) requestManager.Startup() @@ -542,24 +480,23 @@ func TestLocallyFulfilledFirstRequestSucceedsLater(t *testing.T) { defer cancel() peers := testutil.GeneratePeers(1) - blocks := testutil.GenerateBlocksOfSize(5, 100) - s := testbridge.NewMockSelectorSpec(cidsForBlocks(blocks)) - r := cidlink.Link{Cid: blocks[0].Cid()} - returnedResponseChan, returnedErrorChan := requestManager.SendRequest(requestCtx, peers[0], r, s) + blockStore := make(map[ipld.Link][]byte) + loader, storer := testutil.NewTestStore(blockStore) + blockChain := testutil.SetupBlockChain(ctx, t, loader, storer, 100, 5) + returnedResponseChan, returnedErrorChan := requestManager.SendRequest(requestCtx, peers[0], blockChain.TipLink, blockChain.Selector()) rr := readNNetworkRequests(requestCtx, t, requestRecordChan, 1)[0] // async loaded response responds immediately - fal.successResponseOn(rr.gsr.ID(), blocks) + fal.successResponseOn(rr.gsr.ID(), blockChain.AllBlocks()) - responses := testutil.CollectResponses(requestCtx, t, returnedResponseChan) - verifyMatchedResponses(t, responses, blocks) + blockChain.VerifyWholeChain(requestCtx, returnedResponseChan) - md := encodedMetadataForBlocks(t, fakeIPLDBridge, blocks, true) + md := encodedMetadataForBlocks(t, blockChain.AllBlocks(), true) firstResponses := []gsmsg.GraphSyncResponse{ gsmsg.NewResponse(rr.gsr.ID(), graphsync.RequestCompletedFull, md), } - requestManager.ProcessResponses(peers[0], firstResponses, blocks) + requestManager.ProcessResponses(peers[0], firstResponses, blockChain.AllBlocks()) fal.verifyNoRemainingData(t, rr.gsr.ID()) testutil.VerifyEmptyErrors(ctx, t, returnedErrorChan) @@ -568,10 +505,9 @@ func TestLocallyFulfilledFirstRequestSucceedsLater(t *testing.T) { func TestRequestReturnsMissingBlocks(t *testing.T) { requestRecordChan := make(chan requestRecord, 2) fph := &fakePeerHandler{requestRecordChan} - fakeIPLDBridge := testbridge.NewMockIPLDBridge() ctx := context.Background() fal := newFakeAsyncLoader() - requestManager := New(ctx, fal, fakeIPLDBridge) + requestManager := New(ctx, fal) requestManager.SetDelegate(fph) requestManager.Startup() @@ -579,25 +515,25 @@ func TestRequestReturnsMissingBlocks(t *testing.T) { defer cancel() peers := testutil.GeneratePeers(1) - blocks := testutil.GenerateBlocksOfSize(5, 100) - s := testbridge.NewMockSelectorSpec(cidsForBlocks(blocks)) - r := cidlink.Link{Cid: blocks[0].Cid()} - returnedResponseChan, returnedErrorChan := requestManager.SendRequest(requestCtx, peers[0], r, s) + blockStore := make(map[ipld.Link][]byte) + loader, storer := testutil.NewTestStore(blockStore) + blockChain := testutil.SetupBlockChain(ctx, t, loader, storer, 100, 5) + returnedResponseChan, returnedErrorChan := requestManager.SendRequest(requestCtx, peers[0], blockChain.TipLink, blockChain.Selector()) rr := readNNetworkRequests(requestCtx, t, requestRecordChan, 1)[0] - md := encodedMetadataForBlocks(t, fakeIPLDBridge, blocks, false) + md := encodedMetadataForBlocks(t, blockChain.AllBlocks(), false) firstResponses := []gsmsg.GraphSyncResponse{ gsmsg.NewResponse(rr.gsr.ID(), graphsync.RequestCompletedPartial, md), } requestManager.ProcessResponses(peers[0], firstResponses, nil) - for _, block := range blocks { + for _, block := range blockChain.AllBlocks() { fal.responseOn(rr.gsr.ID(), cidlink.Link{Cid: block.Cid()}, types.AsyncLoadResult{Data: nil, Err: fmt.Errorf("Terrible Thing")}) } testutil.VerifyEmptyResponse(ctx, t, returnedResponseChan) errs := testutil.CollectErrors(ctx, t, returnedErrorChan) - if len(errs) != len(blocks) { - t.Fatal("did not send all errors") + if len(errs) == 0 { + t.Fatal("did not send errors") } } @@ -605,10 +541,9 @@ func TestRequestReturnsMissingBlocks(t *testing.T) { func TestEncodingExtensions(t *testing.T) { requestRecordChan := make(chan requestRecord, 2) fph := &fakePeerHandler{requestRecordChan} - fakeIPLDBridge := testbridge.NewMockIPLDBridge() ctx := context.Background() fal := newFakeAsyncLoader() - requestManager := New(ctx, fal, fakeIPLDBridge) + requestManager := New(ctx, fal) requestManager.SetDelegate(fph) requestManager.Startup() @@ -616,9 +551,9 @@ func TestEncodingExtensions(t *testing.T) { defer cancel() peers := testutil.GeneratePeers(1) - cids := testutil.GenerateCids(1) - root := cidlink.Link{Cid: cids[0]} - selector := testbridge.NewMockSelectorSpec(cids) + blockStore := make(map[ipld.Link][]byte) + loader, storer := testutil.NewTestStore(blockStore) + blockChain := testutil.SetupBlockChain(ctx, t, loader, storer, 100, 5) extensionData1 := testutil.RandomBytes(100) extensionName1 := graphsync.ExtensionName("AppleSauce/McGee") @@ -644,7 +579,7 @@ func TestEncodingExtensions(t *testing.T) { return <-expectedError } requestManager.RegisterHook(hook) - returnedResponseChan, returnedErrorChan := requestManager.SendRequest(requestCtx, peers[0], root, selector, extension1, extension2) + returnedResponseChan, returnedErrorChan := requestManager.SendRequest(requestCtx, peers[0], blockChain.TipLink, blockChain.Selector(), extension1, extension2) rr := readNNetworkRequests(requestCtx, t, requestRecordChan, 1)[0] diff --git a/requestmanager/responsecollector_test.go b/requestmanager/responsecollector_test.go index 5ac2cb24..e259dd8b 100644 --- a/requestmanager/responsecollector_test.go +++ b/requestmanager/responsecollector_test.go @@ -8,11 +8,9 @@ import ( "time" "github.com/ipfs/go-graphsync" - "github.com/ipfs/go-graphsync/testbridge" + "github.com/ipfs/go-graphsync/testutil" ipld "github.com/ipld/go-ipld-prime" cidlink "github.com/ipld/go-ipld-prime/linking/cid" - - "github.com/ipfs/go-graphsync/testutil" ) func TestBufferingResponseProgress(t *testing.T) { @@ -29,14 +27,17 @@ func TestBufferingResponseProgress(t *testing.T) { outgoingResponses, outgoingErrors := rc.collectResponses( requestCtx, incomingResponses, incomingErrors, cancelRequest) - blocks := testutil.GenerateBlocksOfSize(10, 100) + blockStore := make(map[ipld.Link][]byte) + loader, storer := testutil.NewTestStore(blockStore) + blockChain := testutil.SetupBlockChain(ctx, t, loader, storer, 100, 10) + blocks := blockChain.AllBlocks() - for _, block := range blocks { + for i, block := range blocks { select { case <-ctx.Done(): t.Fatal("should have written to channel but couldn't") case incomingResponses <- graphsync.ResponseProgress{ - Node: testbridge.NewMockBlockNode(block.RawData()), + Node: blockChain.NodeTipIndex(i), LastBlock: struct { Path ipld.Path Link ipld.Link diff --git a/requestmanager/utils.go b/requestmanager/utils.go index 20909468..69f9477f 100644 --- a/requestmanager/utils.go +++ b/requestmanager/utils.go @@ -4,14 +4,14 @@ import ( "context" "github.com/ipfs/go-graphsync" - "github.com/ipfs/go-graphsync/ipldbridge" gsmsg "github.com/ipfs/go-graphsync/message" "github.com/ipfs/go-graphsync/metadata" ipld "github.com/ipld/go-ipld-prime" + "github.com/ipld/go-ipld-prime/traversal" ) -func visitToChannel(ctx context.Context, inProgressChan chan graphsync.ResponseProgress) ipldbridge.AdvVisitFn { - return func(tp ipldbridge.TraversalProgress, node ipld.Node, tr ipldbridge.TraversalReason) error { +func visitToChannel(ctx context.Context, inProgressChan chan graphsync.ResponseProgress) traversal.AdvVisitFn { + return func(tp traversal.Progress, node ipld.Node, tr traversal.VisitReason) error { select { case <-ctx.Done(): case inProgressChan <- graphsync.ResponseProgress{ @@ -24,7 +24,7 @@ func visitToChannel(ctx context.Context, inProgressChan chan graphsync.ResponseP } } -func metadataForResponses(responses []gsmsg.GraphSyncResponse, ipldBridge ipldbridge.IPLDBridge) map[graphsync.RequestID]metadata.Metadata { +func metadataForResponses(responses []gsmsg.GraphSyncResponse) map[graphsync.RequestID]metadata.Metadata { responseMetadata := make(map[graphsync.RequestID]metadata.Metadata, len(responses)) for _, response := range responses { mdRaw, found := response.Extension(graphsync.ExtensionMetadata) @@ -32,7 +32,7 @@ func metadataForResponses(responses []gsmsg.GraphSyncResponse, ipldBridge ipldbr log.Warningf("Unable to decode metadata in response for request id: %d", response.RequestID()) continue } - md, err := metadata.DecodeMetadata(mdRaw, ipldBridge) + md, err := metadata.DecodeMetadata(mdRaw) if err != nil { log.Warningf("Unable to decode metadata in response for request id: %d", response.RequestID()) continue diff --git a/responsemanager/loader/loader.go b/responsemanager/loader/loader.go index b8652094..8c45f285 100644 --- a/responsemanager/loader/loader.go +++ b/responsemanager/loader/loader.go @@ -2,10 +2,12 @@ package loader import ( "bytes" + "context" + "errors" "io" "github.com/ipfs/go-graphsync" - "github.com/ipfs/go-graphsync/ipldbridge" + "github.com/ipfs/go-graphsync/ipldutil" ipld "github.com/ipld/go-ipld-prime" ) @@ -20,10 +22,11 @@ type ResponseSender interface { // WrapLoader wraps a given loader with an interceptor that sends loaded // blocks out to the network with the given response sender. -func WrapLoader(loader ipldbridge.Loader, +func WrapLoader(ctx context.Context, + loader ipld.Loader, requestID graphsync.RequestID, - responseSender ResponseSender) ipldbridge.Loader { - return func(lnk ipld.Link, lnkCtx ipldbridge.LinkContext) (io.Reader, error) { + responseSender ResponseSender) ipld.Loader { + return func(lnk ipld.Link, lnkCtx ipld.LinkContext) (io.Reader, error) { result, err := loader(lnk, lnkCtx) var data []byte var blockBuffer bytes.Buffer @@ -36,7 +39,12 @@ func WrapLoader(loader ipldbridge.Loader, } responseSender.SendResponse(requestID, lnk, data) if data == nil { - err = ipldbridge.ErrDoNotFollow() + err = ipldutil.ErrDoNotFollow() + } + select { + case <-ctx.Done(): + return nil, errors.New("context cancelled") + default: } return result, err } diff --git a/responsemanager/loader/loader_test.go b/responsemanager/loader/loader_test.go index a398509e..c1a9156e 100644 --- a/responsemanager/loader/loader_test.go +++ b/responsemanager/loader/loader_test.go @@ -2,6 +2,7 @@ package loader import ( "bytes" + "context" "fmt" "io" "io/ioutil" @@ -10,10 +11,9 @@ import ( "testing" "github.com/ipfs/go-graphsync" - "github.com/ipfs/go-graphsync/testbridge" + "github.com/ipfs/go-graphsync/ipldutil" "github.com/ipfs/go-graphsync/testutil" - "github.com/ipfs/go-graphsync/ipldbridge" ipld "github.com/ipld/go-ipld-prime" ) @@ -34,22 +34,23 @@ func (frs *fakeResponseSender) SendResponse( } func TestWrappedLoaderSendsResponses(t *testing.T) { + ctx := context.Background() frs := &fakeResponseSender{} - link1 := testbridge.NewMockLink() - link2 := testbridge.NewMockLink() + link1 := testutil.NewTestLink() + link2 := testutil.NewTestLink() sourceBytes := testutil.RandomBytes(100) byteBuffer := bytes.NewReader(sourceBytes) - loader := func(ipldLink ipld.Link, lnkCtx ipldbridge.LinkContext) (io.Reader, error) { + loader := func(ipldLink ipld.Link, lnkCtx ipld.LinkContext) (io.Reader, error) { if ipldLink == link1 { return byteBuffer, nil } return nil, fmt.Errorf("unable to load block") } requestID := graphsync.RequestID(rand.Int31()) - wrappedLoader := WrapLoader(loader, requestID, frs) + wrappedLoader := WrapLoader(ctx, loader, requestID, frs) - reader, err := wrappedLoader(link1, ipldbridge.LinkContext{}) + reader, err := wrappedLoader(link1, ipld.LinkContext{}) if err != nil { t.Fatal("Should not have error if underlying loader returns valid buffer and no error") } @@ -63,13 +64,13 @@ func TestWrappedLoaderSendsResponses(t *testing.T) { t.Fatal("Should have sent block to response sender with correct params but did not") } - reader, err = wrappedLoader(link2, ipldbridge.LinkContext{}) + reader, err = wrappedLoader(link2, ipld.LinkContext{}) if reader != nil || err == nil { t.Fatal("Should return an error and empty reader if underlying loader does") } - if err != ipldbridge.ErrDoNotFollow() { + if err != ipldutil.ErrDoNotFollow() { t.Fatal("Should convert error to a do not follow error") } diff --git a/responsemanager/peerresponsemanager/peerresponsesender.go b/responsemanager/peerresponsemanager/peerresponsesender.go index bb5d9b72..6321fd8f 100644 --- a/responsemanager/peerresponsemanager/peerresponsesender.go +++ b/responsemanager/peerresponsemanager/peerresponsesender.go @@ -9,8 +9,6 @@ import ( cidlink "github.com/ipld/go-ipld-prime/linking/cid" - "github.com/ipfs/go-graphsync/ipldbridge" - logging "github.com/ipfs/go-log" "github.com/ipld/go-ipld-prime" @@ -39,7 +37,6 @@ type peerResponseSender struct { ctx context.Context cancel context.CancelFunc peerHandler PeerMessageHandler - ipldBridge ipldbridge.IPLDBridge outgoingWork chan struct{} linkTrackerLk sync.RWMutex @@ -63,15 +60,14 @@ type PeerResponseSender interface { } // NewResponseSender generates a new PeerResponseSender for the given context, peer ID, -// using the given peer message handler and bridge to IPLD. -func NewResponseSender(ctx context.Context, p peer.ID, peerHandler PeerMessageHandler, ipldBridge ipldbridge.IPLDBridge) PeerResponseSender { +// using the given peer message handler. +func NewResponseSender(ctx context.Context, p peer.ID, peerHandler PeerMessageHandler) PeerResponseSender { ctx, cancel := context.WithCancel(ctx) return &peerResponseSender{ p: p, ctx: ctx, cancel: cancel, peerHandler: peerHandler, - ipldBridge: ipldBridge, outgoingWork: make(chan struct{}, 1), linkTracker: linktracker.New(), } @@ -207,7 +203,7 @@ func (prm *peerResponseSender) sendResponseMessages() { if builder.Empty() { continue } - responses, blks, err := builder.Build(prm.ipldBridge) + responses, blks, err := builder.Build() if err != nil { log.Errorf("Unable to assemble GraphSync response: %s", err.Error()) } diff --git a/responsemanager/peerresponsemanager/peerresponsesender_test.go b/responsemanager/peerresponsemanager/peerresponsesender_test.go index 0e060013..20aa8e86 100644 --- a/responsemanager/peerresponsemanager/peerresponsesender_test.go +++ b/responsemanager/peerresponsemanager/peerresponsesender_test.go @@ -9,7 +9,6 @@ import ( "time" "github.com/ipfs/go-graphsync" - "github.com/ipfs/go-graphsync/testbridge" blocks "github.com/ipfs/go-block-format" gsmsg "github.com/ipfs/go-graphsync/message" @@ -52,8 +51,7 @@ func TestPeerResponseManagerSendsResponses(t *testing.T) { done: done, sent: sent, } - ipldBridge := testbridge.NewMockIPLDBridge() - peerResponseManager := NewResponseSender(ctx, p, fph, ipldBridge) + peerResponseManager := NewResponseSender(ctx, p, fph) peerResponseManager.Startup() peerResponseManager.SendResponse(requestID1, links[0], blks[0].RawData()) @@ -187,8 +185,7 @@ func TestPeerResponseManagerSendsVeryLargeBlocksResponses(t *testing.T) { done: done, sent: sent, } - ipldBridge := testbridge.NewMockIPLDBridge() - peerResponseManager := NewResponseSender(ctx, p, fph, ipldBridge) + peerResponseManager := NewResponseSender(ctx, p, fph) peerResponseManager.Startup() peerResponseManager.SendResponse(requestID1, links[0], blks[0].RawData()) @@ -312,8 +309,7 @@ func TestPeerResponseManagerSendsExtensionData(t *testing.T) { done: done, sent: sent, } - ipldBridge := testbridge.NewMockIPLDBridge() - peerResponseManager := NewResponseSender(ctx, p, fph, ipldBridge) + peerResponseManager := NewResponseSender(ctx, p, fph) peerResponseManager.Startup() peerResponseManager.SendResponse(requestID1, links[0], blks[0].RawData()) diff --git a/responsemanager/responsebuilder/responsebuilder.go b/responsemanager/responsebuilder/responsebuilder.go index c84273ec..dea8b5fa 100644 --- a/responsemanager/responsebuilder/responsebuilder.go +++ b/responsemanager/responsebuilder/responsebuilder.go @@ -3,7 +3,6 @@ package responsebuilder import ( blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-graphsync" - "github.com/ipfs/go-graphsync/ipldbridge" gsmsg "github.com/ipfs/go-graphsync/message" "github.com/ipfs/go-graphsync/metadata" "github.com/ipld/go-ipld-prime" @@ -69,10 +68,10 @@ func (rb *ResponseBuilder) Empty() bool { } // Build assembles and encodes response data from the added requests, links, and blocks. -func (rb *ResponseBuilder) Build(ipldBridge ipldbridge.IPLDBridge) ([]gsmsg.GraphSyncResponse, []blocks.Block, error) { +func (rb *ResponseBuilder) Build() ([]gsmsg.GraphSyncResponse, []blocks.Block, error) { responses := make([]gsmsg.GraphSyncResponse, 0, len(rb.outgoingResponses)) for requestID, linkMap := range rb.outgoingResponses { - mdRaw, err := metadata.EncodeMetadata(linkMap, ipldBridge) + mdRaw, err := metadata.EncodeMetadata(linkMap) if err != nil { return nil, nil, err } diff --git a/responsemanager/responsebuilder/responsebuilder_test.go b/responsemanager/responsebuilder/responsebuilder_test.go index 2013401d..b5df2dc5 100644 --- a/responsemanager/responsebuilder/responsebuilder_test.go +++ b/responsemanager/responsebuilder/responsebuilder_test.go @@ -9,14 +9,12 @@ import ( "github.com/ipfs/go-graphsync" gsmsg "github.com/ipfs/go-graphsync/message" "github.com/ipfs/go-graphsync/metadata" - "github.com/ipfs/go-graphsync/testbridge" "github.com/ipfs/go-graphsync/testutil" "github.com/ipld/go-ipld-prime" cidlink "github.com/ipld/go-ipld-prime/linking/cid" ) func TestMessageBuilding(t *testing.T) { - ipldBridge := testbridge.NewMockIPLDBridge() rb := New() blocks := testutil.GenerateBlocksOfSize(3, 100) links := make([]ipld.Link, 0, len(blocks)) @@ -68,7 +66,7 @@ func TestMessageBuilding(t *testing.T) { rb.AddExtensionData(requestID1, extension1) rb.AddExtensionData(requestID3, extension2) - responses, sentBlocks, err := rb.Build(ipldBridge) + responses, sentBlocks, err := rb.Build() if err != nil { t.Fatal("Error building responses") @@ -87,7 +85,7 @@ func TestMessageBuilding(t *testing.T) { if !found { t.Fatal("Metadata not included in response") } - response1Metadata, err := metadata.DecodeMetadata(response1MetadataRaw, ipldBridge) + response1Metadata, err := metadata.DecodeMetadata(response1MetadataRaw) if err != nil || !reflect.DeepEqual(response1Metadata, metadata.Metadata{ metadata.Item{Link: links[0], BlockPresent: true}, metadata.Item{Link: links[1], BlockPresent: false}, @@ -109,7 +107,7 @@ func TestMessageBuilding(t *testing.T) { if !found { t.Fatal("Metadata not included in response") } - response2Metadata, err := metadata.DecodeMetadata(response2MetadataRaw, ipldBridge) + response2Metadata, err := metadata.DecodeMetadata(response2MetadataRaw) if err != nil || !reflect.DeepEqual(response2Metadata, metadata.Metadata{ metadata.Item{Link: links[1], BlockPresent: true}, metadata.Item{Link: links[2], BlockPresent: true}, @@ -126,7 +124,7 @@ func TestMessageBuilding(t *testing.T) { if !found { t.Fatal("Metadata not included in response") } - response3Metadata, err := metadata.DecodeMetadata(response3MetadataRaw, ipldBridge) + response3Metadata, err := metadata.DecodeMetadata(response3MetadataRaw) if err != nil || !reflect.DeepEqual(response3Metadata, metadata.Metadata{ metadata.Item{Link: links[0], BlockPresent: true}, metadata.Item{Link: links[1], BlockPresent: true}, diff --git a/responsemanager/responsemanager.go b/responsemanager/responsemanager.go index 548da191..8ef9e34c 100644 --- a/responsemanager/responsemanager.go +++ b/responsemanager/responsemanager.go @@ -5,7 +5,7 @@ import ( "time" "github.com/ipfs/go-graphsync" - "github.com/ipfs/go-graphsync/ipldbridge" + "github.com/ipfs/go-graphsync/ipldutil" gsmsg "github.com/ipfs/go-graphsync/message" "github.com/ipfs/go-graphsync/responsemanager/loader" "github.com/ipfs/go-graphsync/responsemanager/peerresponsemanager" @@ -13,6 +13,7 @@ import ( "github.com/ipfs/go-peertaskqueue/peertask" ipld "github.com/ipld/go-ipld-prime" cidlink "github.com/ipld/go-ipld-prime/linking/cid" + "github.com/ipld/go-ipld-prime/traversal" "github.com/libp2p/go-libp2p-core/peer" ) @@ -66,8 +67,7 @@ type responseManagerMessage interface { type ResponseManager struct { ctx context.Context cancelFn context.CancelFunc - loader ipldbridge.Loader - ipldBridge ipldbridge.IPLDBridge + loader ipld.Loader peerManager PeerManager queryQueue QueryQueue @@ -81,8 +81,7 @@ type ResponseManager struct { // New creates a new response manager from the given context, loader, // bridge to IPLD interface, peerManager, and queryQueue. func New(ctx context.Context, - loader ipldbridge.Loader, - ipldBridge ipldbridge.IPLDBridge, + loader ipld.Loader, peerManager PeerManager, queryQueue QueryQueue) *ResponseManager { ctx, cancelFn := context.WithCancel(ctx) @@ -90,7 +89,6 @@ func New(ctx context.Context, ctx: ctx, cancelFn: cancelFn, loader: loader, - ipldBridge: ipldBridge, peerManager: peerManager, queryQueue: queryQueue, messages: make(chan responseManagerMessage, 16), @@ -189,7 +187,7 @@ func (rm *ResponseManager) processQueriesWorker() { } -func noopVisitor(tp ipldbridge.TraversalProgress, n ipld.Node, tr ipldbridge.TraversalReason) error { +func noopVisitor(tp traversal.Progress, n ipld.Node, tr traversal.VisitReason) error { return nil } @@ -217,11 +215,7 @@ func (rm *ResponseManager) executeQuery(ctx context.Context, p peer.ID, request gsmsg.GraphSyncRequest) { peerResponseSender := rm.peerManager.SenderForPeer(p) - selectorSpec, err := rm.ipldBridge.DecodeNode(request.Selector()) - if err != nil { - peerResponseSender.FinishWithError(request.ID(), graphsync.RequestFailedUnknown) - return - } + selectorSpec := request.Selector() ha := &hookActions{false, request.ID(), peerResponseSender, nil} for _, requestHook := range rm.requestHooks { requestHook.hook(p, request, ha) @@ -230,20 +224,20 @@ func (rm *ResponseManager) executeQuery(ctx context.Context, } } if !ha.isValidated { - err = selectorvalidator.ValidateSelector(rm.ipldBridge, selectorSpec, maxRecursionDepth) + err := selectorvalidator.ValidateSelector(selectorSpec, maxRecursionDepth) if err != nil { peerResponseSender.FinishWithError(request.ID(), graphsync.RequestFailedUnknown) return } } - selector, err := rm.ipldBridge.ParseSelector(selectorSpec) + selector, err := ipldutil.ParseSelector(selectorSpec) if err != nil { peerResponseSender.FinishWithError(request.ID(), graphsync.RequestFailedUnknown) return } rootLink := cidlink.Link{Cid: request.Root()} - wrappedLoader := loader.WrapLoader(rm.loader, request.ID(), peerResponseSender) - err = rm.ipldBridge.Traverse(ctx, wrappedLoader, rootLink, selector, noopVisitor) + wrappedLoader := loader.WrapLoader(ctx, rm.loader, request.ID(), peerResponseSender) + err = ipldutil.Traverse(ctx, wrappedLoader, rootLink, selector, noopVisitor) if err != nil { peerResponseSender.FinishWithError(request.ID(), graphsync.RequestFailedUnknown) return diff --git a/responsemanager/responsemanager_test.go b/responsemanager/responsemanager_test.go index f40ff8cc..efa03f90 100644 --- a/responsemanager/responsemanager_test.go +++ b/responsemanager/responsemanager_test.go @@ -10,11 +10,9 @@ import ( "testing" "time" - cid "github.com/ipfs/go-cid" "github.com/ipfs/go-graphsync" gsmsg "github.com/ipfs/go-graphsync/message" "github.com/ipfs/go-graphsync/responsemanager/peerresponsemanager" - "github.com/ipfs/go-graphsync/testbridge" "github.com/ipfs/go-graphsync/testutil" "github.com/ipfs/go-peertaskqueue/peertask" ipld "github.com/ipld/go-ipld-prime" @@ -131,30 +129,24 @@ func TestIncomingQuery(t *testing.T) { ctx := context.Background() ctx, cancel := context.WithTimeout(ctx, 40*time.Millisecond) defer cancel() - blks := testutil.GenerateBlocksOfSize(5, 20) - loader := testbridge.NewMockLoader(blks) - ipldBridge := testbridge.NewMockIPLDBridge() + + blockStore := make(map[ipld.Link][]byte) + loader, storer := testutil.NewTestStore(blockStore) + blockChain := testutil.SetupBlockChain(ctx, t, loader, storer, 100, 5) + blks := blockChain.AllBlocks() + requestIDChan := make(chan completedRequest, 1) sentResponses := make(chan sentResponse, len(blks)) sentExtensions := make(chan sentExtension, 1) fprs := &fakePeerResponseSender{lastCompletedRequest: requestIDChan, sentResponses: sentResponses, sentExtensions: sentExtensions} peerManager := &fakePeerManager{peerResponseSender: fprs} queryQueue := &fakeQueryQueue{} - responseManager := New(ctx, loader, ipldBridge, peerManager, queryQueue) + responseManager := New(ctx, loader, peerManager, queryQueue) responseManager.Startup() - cids := make([]cid.Cid, 0, 5) - for _, block := range blks { - cids = append(cids, block.Cid()) - } - selectorSpec := testbridge.NewMockSelectorSpec(cids) - selector, err := ipldBridge.EncodeNode(selectorSpec) - if err != nil { - t.Fatal("error encoding selector") - } requestID := graphsync.RequestID(rand.Int31()) requests := []gsmsg.GraphSyncRequest{ - gsmsg.NewRequest(requestID, cids[0], selector, graphsync.Priority(math.MaxInt32)), + gsmsg.NewRequest(requestID, blockChain.TipLink.(cidlink.Link).Cid, blockChain.Selector(), graphsync.Priority(math.MaxInt32)), } p := testutil.GeneratePeers(1)[0] responseManager.ProcessRequests(ctx, p, requests) @@ -187,30 +179,24 @@ func TestCancellationQueryInProgress(t *testing.T) { ctx := context.Background() ctx, cancel := context.WithTimeout(ctx, 40*time.Millisecond) defer cancel() - blks := testutil.GenerateBlocksOfSize(5, 20) - loader := testbridge.NewMockLoader(blks) - ipldBridge := testbridge.NewMockIPLDBridge() + + blockStore := make(map[ipld.Link][]byte) + loader, storer := testutil.NewTestStore(blockStore) + blockChain := testutil.SetupBlockChain(ctx, t, loader, storer, 100, 5) + blks := blockChain.AllBlocks() + requestIDChan := make(chan completedRequest) sentResponses := make(chan sentResponse) sentExtensions := make(chan sentExtension, 1) fprs := &fakePeerResponseSender{lastCompletedRequest: requestIDChan, sentResponses: sentResponses, sentExtensions: sentExtensions} peerManager := &fakePeerManager{peerResponseSender: fprs} queryQueue := &fakeQueryQueue{} - responseManager := New(ctx, loader, ipldBridge, peerManager, queryQueue) + responseManager := New(ctx, loader, peerManager, queryQueue) responseManager.Startup() - cids := make([]cid.Cid, 0, 5) - for _, block := range blks { - cids = append(cids, block.Cid()) - } - selectorSpec := testbridge.NewMockSelectorSpec(cids) - selector, err := ipldBridge.EncodeNode(selectorSpec) - if err != nil { - t.Fatal("error encoding selector") - } requestID := graphsync.RequestID(rand.Int31()) requests := []gsmsg.GraphSyncRequest{ - gsmsg.NewRequest(requestID, cids[0], selector, graphsync.Priority(math.MaxInt32)), + gsmsg.NewRequest(requestID, blockChain.TipLink.(cidlink.Link).Cid, blockChain.Selector(), graphsync.Priority(math.MaxInt32)), } p := testutil.GeneratePeers(1)[0] responseManager.ProcessRequests(ctx, p, requests) @@ -275,9 +261,11 @@ func TestEarlyCancellation(t *testing.T) { ctx := context.Background() ctx, cancel := context.WithTimeout(ctx, 40*time.Millisecond) defer cancel() - blks := testutil.GenerateBlocksOfSize(5, 20) - loader := testbridge.NewMockLoader(blks) - ipldBridge := testbridge.NewMockIPLDBridge() + + blockStore := make(map[ipld.Link][]byte) + loader, storer := testutil.NewTestStore(blockStore) + blockChain := testutil.SetupBlockChain(ctx, t, loader, storer, 100, 5) + requestIDChan := make(chan completedRequest) sentResponses := make(chan sentResponse) sentExtensions := make(chan sentExtension, 1) @@ -285,21 +273,12 @@ func TestEarlyCancellation(t *testing.T) { peerManager := &fakePeerManager{peerResponseSender: fprs} queryQueue := &fakeQueryQueue{} queryQueue.popWait.Add(1) - responseManager := New(ctx, loader, ipldBridge, peerManager, queryQueue) + responseManager := New(ctx, loader, peerManager, queryQueue) responseManager.Startup() - cids := make([]cid.Cid, 0, 5) - for _, block := range blks { - cids = append(cids, block.Cid()) - } - selectorSpec := testbridge.NewMockSelectorSpec(cids) - selector, err := ipldBridge.EncodeNode(selectorSpec) - if err != nil { - t.Fatal("error encoding selector") - } requestID := graphsync.RequestID(rand.Int31()) requests := []gsmsg.GraphSyncRequest{ - gsmsg.NewRequest(requestID, cids[0], selector, graphsync.Priority(math.MaxInt32)), + gsmsg.NewRequest(requestID, blockChain.TipLink.(cidlink.Link).Cid, blockChain.Selector(), graphsync.Priority(math.MaxInt32)), } p := testutil.GeneratePeers(1)[0] responseManager.ProcessRequests(ctx, p, requests) @@ -329,9 +308,11 @@ func TestValidationAndExtensions(t *testing.T) { ctx := context.Background() ctx, cancel := context.WithTimeout(ctx, 40*time.Millisecond) defer cancel() - blks := testutil.GenerateBlocksOfSize(5, 20) - loader := testbridge.NewMockLoader(blks) - ipldBridge := testbridge.NewMockIPLDBridge() + + blockStore := make(map[ipld.Link][]byte) + loader, storer := testutil.NewTestStore(blockStore) + blockChain := testutil.SetupBlockChain(ctx, t, loader, storer, 100, 5) + completedRequestChan := make(chan completedRequest, 1) sentResponses := make(chan sentResponse, 100) sentExtensions := make(chan sentExtension, 1) @@ -339,11 +320,6 @@ func TestValidationAndExtensions(t *testing.T) { peerManager := &fakePeerManager{peerResponseSender: fprs} queryQueue := &fakeQueryQueue{} - cids := make([]cid.Cid, 0, 5) - for _, block := range blks { - cids = append(cids, block.Cid()) - } - extensionData := testutil.RandomBytes(100) extensionName := graphsync.ExtensionName("AppleSauce/McGee") extension := graphsync.ExtensionData{ @@ -357,19 +333,15 @@ func TestValidationAndExtensions(t *testing.T) { } t.Run("with invalid selector", func(t *testing.T) { - selectorSpec := testbridge.NewInvalidSelectorSpec(cids) - selector, err := ipldBridge.EncodeNode(selectorSpec) - if err != nil { - t.Fatal("error encoding selector") - } + selectorSpec := testutil.NewInvalidSelectorSpec() requestID := graphsync.RequestID(rand.Int31()) requests := []gsmsg.GraphSyncRequest{ - gsmsg.NewRequest(requestID, cids[0], selector, graphsync.Priority(math.MaxInt32), extension), + gsmsg.NewRequest(requestID, blockChain.TipLink.(cidlink.Link).Cid, selectorSpec, graphsync.Priority(math.MaxInt32), extension), } p := testutil.GeneratePeers(1)[0] t.Run("on its own, should fail validation", func(t *testing.T) { - responseManager := New(ctx, loader, ipldBridge, peerManager, queryQueue) + responseManager := New(ctx, loader, peerManager, queryQueue) responseManager.Startup() responseManager.ProcessRequests(ctx, p, requests) select { @@ -383,7 +355,7 @@ func TestValidationAndExtensions(t *testing.T) { }) t.Run("if non validating hook succeeds, does not pass validation", func(t *testing.T) { - responseManager := New(ctx, loader, ipldBridge, peerManager, queryQueue) + responseManager := New(ctx, loader, peerManager, queryQueue) responseManager.Startup() responseManager.RegisterHook(func(p peer.ID, requestData graphsync.RequestData, hookActions graphsync.RequestReceivedHookActions) { hookActions.SendExtensionData(extensionResponse) @@ -408,7 +380,7 @@ func TestValidationAndExtensions(t *testing.T) { }) t.Run("if validating hook succeeds, should pass validation", func(t *testing.T) { - responseManager := New(ctx, loader, ipldBridge, peerManager, queryQueue) + responseManager := New(ctx, loader, peerManager, queryQueue) responseManager.Startup() responseManager.RegisterHook(func(p peer.ID, requestData graphsync.RequestData, hookActions graphsync.RequestReceivedHookActions) { hookActions.ValidateRequest() @@ -435,19 +407,14 @@ func TestValidationAndExtensions(t *testing.T) { }) t.Run("with valid selector", func(t *testing.T) { - selectorSpec := testbridge.NewMockSelectorSpec(cids) - selector, err := ipldBridge.EncodeNode(selectorSpec) - if err != nil { - t.Fatal("error encoding selector") - } requestID := graphsync.RequestID(rand.Int31()) requests := []gsmsg.GraphSyncRequest{ - gsmsg.NewRequest(requestID, cids[0], selector, graphsync.Priority(math.MaxInt32), extension), + gsmsg.NewRequest(requestID, blockChain.TipLink.(cidlink.Link).Cid, blockChain.Selector(), graphsync.Priority(math.MaxInt32), extension), } p := testutil.GeneratePeers(1)[0] t.Run("on its own, should pass validation", func(t *testing.T) { - responseManager := New(ctx, loader, ipldBridge, peerManager, queryQueue) + responseManager := New(ctx, loader, peerManager, queryQueue) responseManager.Startup() responseManager.ProcessRequests(ctx, p, requests) select { @@ -461,7 +428,7 @@ func TestValidationAndExtensions(t *testing.T) { }) t.Run("if any hook fails, should fail", func(t *testing.T) { - responseManager := New(ctx, loader, ipldBridge, peerManager, queryQueue) + responseManager := New(ctx, loader, peerManager, queryQueue) responseManager.Startup() responseManager.RegisterHook(func(p peer.ID, requestData graphsync.RequestData, hookActions graphsync.RequestReceivedHookActions) { hookActions.SendExtensionData(extensionResponse) diff --git a/responsemanager/selectorvalidator/selectorvalidator.go b/responsemanager/selectorvalidator/selectorvalidator.go index 1ba0c3f9..516db21b 100644 --- a/responsemanager/selectorvalidator/selectorvalidator.go +++ b/responsemanager/selectorvalidator/selectorvalidator.go @@ -3,7 +3,6 @@ package selectorvalidator import ( "errors" - "github.com/ipfs/go-graphsync/ipldbridge" ipld "github.com/ipld/go-ipld-prime" ipldfree "github.com/ipld/go-ipld-prime/impl/free" "github.com/ipld/go-ipld-prime/traversal" @@ -20,7 +19,7 @@ var ( // ValidateSelector applies the default selector validation policy to a selector // on an incoming request -- which by default is to limit recursive selectors // to a fixed depth -func ValidateSelector(bridge ipldbridge.IPLDBridge, node ipld.Node, maxAcceptedDepth int) error { +func ValidateSelector(node ipld.Node, maxAcceptedDepth int) error { ssb := builder.NewSelectorSpecBuilder(ipldfree.NodeBuilder()) // this selector is a selector for traversing selectors... @@ -53,7 +52,7 @@ func ValidateSelector(bridge ipldbridge.IPLDBridge, node ipld.Node, maxAcceptedD return err } - return bridge.WalkMatching(node, s, func(progress traversal.Progress, visited ipld.Node) error { + return traversal.WalkMatching(node, s, func(progress traversal.Progress, visited ipld.Node) error { if visited.ReprKind() != ipld.ReprKind_Map || visited.Length() != 1 { return ErrInvalidLimit } diff --git a/responsemanager/selectorvalidator/selectorvalidator_test.go b/responsemanager/selectorvalidator/selectorvalidator_test.go index 4d400785..4d9f1957 100644 --- a/responsemanager/selectorvalidator/selectorvalidator_test.go +++ b/responsemanager/selectorvalidator/selectorvalidator_test.go @@ -6,13 +6,11 @@ import ( ipld "github.com/ipld/go-ipld-prime" ipldfree "github.com/ipld/go-ipld-prime/impl/free" - "github.com/ipfs/go-graphsync/ipldbridge" "github.com/ipld/go-ipld-prime/traversal/selector" "github.com/ipld/go-ipld-prime/traversal/selector/builder" ) func TestValidateSelector(t *testing.T) { - bridge := ipldbridge.NewIPLDBridge() ssb := builder.NewSelectorSpecBuilder(ipldfree.NodeBuilder()) successBase := ssb.ExploreRecursive(selector.RecursionLimitDepth(80), ssb.ExploreRecursiveEdge()) @@ -20,15 +18,15 @@ func TestValidateSelector(t *testing.T) { failNoneBase := ssb.ExploreRecursive(selector.RecursionLimitNone(), ssb.ExploreRecursiveEdge()) verifyOutcomes := func(t *testing.T, success ipld.Node, fail ipld.Node, failNone ipld.Node) { - err := ValidateSelector(bridge, success, 100) + err := ValidateSelector(success, 100) if err != nil { t.Fatal("valid selector returned error") } - err = ValidateSelector(bridge, fail, 100) + err = ValidateSelector(fail, 100) if err != ErrInvalidLimit { t.Fatal("selector should have failed on invalid limit") } - err = ValidateSelector(bridge, failNone, 100) + err = ValidateSelector(failNone, 100) if err != ErrInvalidLimit { t.Fatal("selector should have failed on invalid limit") } diff --git a/storeutil/storeutil_test.go b/storeutil/storeutil_test.go index 05f70200..12349922 100644 --- a/storeutil/storeutil_test.go +++ b/storeutil/storeutil_test.go @@ -30,8 +30,8 @@ func TestLoader(t *testing.T) { if err != nil { t.Fatal("Unable to read bytes from reader returned by loader") } - returnedBlock := blocks.NewBlock(bytes) - if returnedBlock.Cid() != blk.Cid() { + _, err = blocks.NewBlockWithCid(bytes, blk.Cid()) + if err != nil { t.Fatal("Did not return correct block with loader") } } diff --git a/testbridge/mockLoader.go b/testbridge/mockLoader.go deleted file mode 100644 index 3ec62049..00000000 --- a/testbridge/mockLoader.go +++ /dev/null @@ -1,26 +0,0 @@ -package testbridge - -import ( - "bytes" - "fmt" - "io" - - "github.com/ipfs/go-block-format" - - ipldbridge "github.com/ipfs/go-graphsync/ipldbridge" - ipld "github.com/ipld/go-ipld-prime" - cidlink "github.com/ipld/go-ipld-prime/linking/cid" -) - -// NewMockLoader returns a new loader function that loads only the given blocks -func NewMockLoader(blks []blocks.Block) ipldbridge.Loader { - return func(ipldLink ipld.Link, lnkCtx ipldbridge.LinkContext) (io.Reader, error) { - lnk := ipldLink.(cidlink.Link).Cid - for _, block := range blks { - if block.Cid() == lnk { - return bytes.NewReader(block.RawData()), nil - } - } - return nil, fmt.Errorf("unable to load block") - } -} diff --git a/testbridge/mockbuilder.go b/testbridge/mockbuilder.go deleted file mode 100644 index a830e41f..00000000 --- a/testbridge/mockbuilder.go +++ /dev/null @@ -1,21 +0,0 @@ -package testbridge - -import ( - "fmt" - - ipld "github.com/ipld/go-ipld-prime" -) - -type mockBuilder struct{} - -func (m *mockBuilder) CreateMap() (ipld.MapBuilder, error) { return nil, fmt.Errorf("Invalid") } -func (m *mockBuilder) AmendMap() (ipld.MapBuilder, error) { return nil, fmt.Errorf("Invalid") } -func (m *mockBuilder) CreateList() (ipld.ListBuilder, error) { return nil, fmt.Errorf("Invalid") } -func (m *mockBuilder) AmendList() (ipld.ListBuilder, error) { return nil, fmt.Errorf("Invalid") } -func (m *mockBuilder) CreateNull() (ipld.Node, error) { return nil, fmt.Errorf("Invalid") } -func (m *mockBuilder) CreateBool(bool) (ipld.Node, error) { return nil, fmt.Errorf("Invalid") } -func (m *mockBuilder) CreateInt(int) (ipld.Node, error) { return nil, fmt.Errorf("Invalid") } -func (m *mockBuilder) CreateFloat(float64) (ipld.Node, error) { return nil, fmt.Errorf("Invalid") } -func (m *mockBuilder) CreateString(string) (ipld.Node, error) { return nil, fmt.Errorf("Invalid") } -func (m *mockBuilder) CreateBytes([]byte) (ipld.Node, error) { return nil, fmt.Errorf("Invalid") } -func (m *mockBuilder) CreateLink(ipld.Link) (ipld.Node, error) { return nil, fmt.Errorf("Invalid") } diff --git a/testbridge/mocklink.go b/testbridge/mocklink.go deleted file mode 100644 index 0840665e..00000000 --- a/testbridge/mocklink.go +++ /dev/null @@ -1,30 +0,0 @@ -package testbridge - -import ( - "context" - "fmt" - - ipldbridge "github.com/ipfs/go-graphsync/ipldbridge" - ipld "github.com/ipld/go-ipld-prime" -) - -type mockLink struct { - index int -} - -var nextIndex int - -// NewMockLink produces an object that conforms to the ipld Link interface. -func NewMockLink() ipld.Link { - nextIndex++ - return &mockLink{index: nextIndex} -} -func (ml *mockLink) Load(context.Context, ipldbridge.LinkContext, ipld.NodeBuilder, ipldbridge.Loader) (ipld.Node, error) { - return nil, fmt.Errorf("Cannot load mock link") -} - -func (ml *mockLink) LinkBuilder() ipld.LinkBuilder { - return nil -} - -func (ml *mockLink) String() string { return "" } diff --git a/testbridge/mocknodes.go b/testbridge/mocknodes.go deleted file mode 100644 index 631fd13f..00000000 --- a/testbridge/mocknodes.go +++ /dev/null @@ -1,102 +0,0 @@ -package testbridge - -import ( - "fmt" - - cid "github.com/ipfs/go-cid" - ipld "github.com/ipld/go-ipld-prime" -) - -type mockSelectorSpec struct { - CidsVisited []cid.Cid - FalseParse bool - FailEncode bool - FailValidation bool -} - -// NewMockSelectorSpec returns a new mock selector that will visit the given -// cids. -func NewMockSelectorSpec(cidsVisited []cid.Cid) ipld.Node { - return &mockSelectorSpec{cidsVisited, false, false, false} -} - -// NewUnparsableSelectorSpec returns a spec that will fail when you attempt to -// validate it or decompose to a node + selector. -func NewUnparsableSelectorSpec(cidsVisited []cid.Cid) ipld.Node { - return &mockSelectorSpec{cidsVisited, true, false, false} -} - -// NewInvalidSelectorSpec returns a spec that will fail when you attempt to -// encode it. -func NewInvalidSelectorSpec(cidsVisited []cid.Cid) ipld.Node { - return &mockSelectorSpec{cidsVisited, false, false, true} -} - -// NewUnencodableSelectorSpec returns a spec that will fail when you attempt to -// encode it. -func NewUnencodableSelectorSpec(cidsVisited []cid.Cid) ipld.Node { - return &mockSelectorSpec{cidsVisited, false, true, false} -} -func (mss *mockSelectorSpec) ReprKind() ipld.ReprKind { return ipld.ReprKind_Null } -func (mss *mockSelectorSpec) Lookup(key ipld.Node) (ipld.Node, error) { - return nil, fmt.Errorf("404") -} -func (mss *mockSelectorSpec) LookupString(key string) (ipld.Node, error) { - return nil, fmt.Errorf("404") -} -func (mss *mockSelectorSpec) LookupIndex(idx int) (ipld.Node, error) { - return nil, fmt.Errorf("404") -} -func (mss *mockSelectorSpec) LookupSegment(seg ipld.PathSegment) (ipld.Node, error) { - return nil, fmt.Errorf("404") -} -func (mss *mockSelectorSpec) ListIterator() ipld.ListIterator { return nil } -func (mss *mockSelectorSpec) MapIterator() ipld.MapIterator { return nil } - -func (mss *mockSelectorSpec) Length() int { return 0 } -func (mss *mockSelectorSpec) IsUndefined() bool { return true } -func (mss *mockSelectorSpec) IsNull() bool { return true } -func (mss *mockSelectorSpec) AsBool() (bool, error) { return false, fmt.Errorf("404") } -func (mss *mockSelectorSpec) AsInt() (int, error) { return 0, fmt.Errorf("404") } -func (mss *mockSelectorSpec) AsFloat() (float64, error) { return 0.0, fmt.Errorf("404") } -func (mss *mockSelectorSpec) AsString() (string, error) { return "", fmt.Errorf("404") } -func (mss *mockSelectorSpec) AsBytes() ([]byte, error) { return nil, fmt.Errorf("404") } -func (mss *mockSelectorSpec) AsLink() (ipld.Link, error) { return nil, fmt.Errorf("404") } -func (mss *mockSelectorSpec) NodeBuilder() ipld.NodeBuilder { return &mockBuilder{} } - -type mockBlockNode struct { - data []byte -} - -// NewMockBlockNode returns a new node for a byte array -func NewMockBlockNode(data []byte) ipld.Node { - return &mockBlockNode{data} -} - -func (mbn *mockBlockNode) ReprKind() ipld.ReprKind { return ipld.ReprKind_Bytes } -func (mbn *mockBlockNode) Lookup(key ipld.Node) (ipld.Node, error) { - return nil, fmt.Errorf("404") -} -func (mbn *mockBlockNode) LookupString(key string) (ipld.Node, error) { - return nil, fmt.Errorf("404") -} -func (mbn *mockBlockNode) LookupIndex(idx int) (ipld.Node, error) { - return nil, fmt.Errorf("404") -} -func (mbn *mockBlockNode) LookupSegment(seg ipld.PathSegment) (ipld.Node, error) { - return nil, fmt.Errorf("404") -} - -func (mbn *mockBlockNode) ListIterator() ipld.ListIterator { return nil } -func (mbn *mockBlockNode) MapIterator() ipld.MapIterator { return nil } - -func (mbn *mockBlockNode) Length() int { return 0 } -func (mbn *mockBlockNode) IsUndefined() bool { return false } -func (mbn *mockBlockNode) IsNull() bool { return false } -func (mbn *mockBlockNode) AsBool() (bool, error) { return false, fmt.Errorf("404") } -func (mbn *mockBlockNode) AsInt() (int, error) { return 0, fmt.Errorf("404") } -func (mbn *mockBlockNode) AsFloat() (float64, error) { return 0.0, fmt.Errorf("404") } -func (mbn *mockBlockNode) AsString() (string, error) { return "", fmt.Errorf("404") } -func (mbn *mockBlockNode) AsBytes() ([]byte, error) { return mbn.data, nil } -func (mbn *mockBlockNode) AsLink() (ipld.Link, error) { return nil, fmt.Errorf("404") } -func (mbn *mockBlockNode) NodeBuilder() ipld.NodeBuilder { return &mockBuilder{} } diff --git a/testbridge/mockselector.go b/testbridge/mockselector.go deleted file mode 100644 index 65c09cd5..00000000 --- a/testbridge/mockselector.go +++ /dev/null @@ -1,25 +0,0 @@ -package testbridge - -import ( - cid "github.com/ipfs/go-cid" - ipldbridge "github.com/ipfs/go-graphsync/ipldbridge" - ipld "github.com/ipld/go-ipld-prime" -) - -type mockSelector struct { - cidsVisited []cid.Cid -} - -func newMockSelector(mss *mockSelectorSpec) ipldbridge.Selector { - return &mockSelector{mss.CidsVisited} -} - -func (ms *mockSelector) Explore(ipld.Node, ipld.PathSegment) ipldbridge.Selector { - return ms -} - -func (ms *mockSelector) Interests() []ipld.PathSegment { - return []ipld.PathSegment{} -} - -func (ms *mockSelector) Decide(ipld.Node) bool { return false } diff --git a/testbridge/testbridge.go b/testbridge/testbridge.go deleted file mode 100644 index c1e5cb03..00000000 --- a/testbridge/testbridge.go +++ /dev/null @@ -1,112 +0,0 @@ -package testbridge - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "io" - - cid "github.com/ipfs/go-cid" - ipldbridge "github.com/ipfs/go-graphsync/ipldbridge" - ipld "github.com/ipld/go-ipld-prime" - "github.com/ipld/go-ipld-prime/encoding/dagjson" - free "github.com/ipld/go-ipld-prime/impl/free" - cidlink "github.com/ipld/go-ipld-prime/linking/cid" - multihash "github.com/multiformats/go-multihash" -) - -type mockIPLDBridge struct { -} - -// NewMockIPLDBridge returns an ipld bridge with mocked behavior -func NewMockIPLDBridge() ipldbridge.IPLDBridge { - return &mockIPLDBridge{} -} - -func (mb *mockIPLDBridge) EncodeNode(node ipld.Node) ([]byte, error) { - spec, ok := node.(*mockSelectorSpec) - if ok { - if !spec.FailEncode { - data, err := json.Marshal(*spec) - if err != nil { - return nil, err - } - return data, nil - } - return nil, fmt.Errorf("format not supported") - } - var buffer bytes.Buffer - err := dagjson.Encoder(node, &buffer) - if err != nil { - return nil, err - } - return buffer.Bytes(), nil -} - -func (mb *mockIPLDBridge) DecodeNode(data []byte) (ipld.Node, error) { - var spec mockSelectorSpec - err := json.Unmarshal(data, &spec) - if err == nil { - return &spec, nil - } - reader := bytes.NewReader(data) - return dagjson.Decoder(free.NodeBuilder(), reader) -} - -func (mb *mockIPLDBridge) ParseSelector(selectorSpec ipld.Node) (ipldbridge.Selector, error) { - spec, ok := selectorSpec.(*mockSelectorSpec) - if !ok || spec.FalseParse { - return nil, fmt.Errorf("not a selector") - } - return newMockSelector(spec), nil -} - -func (mb *mockIPLDBridge) Traverse(ctx context.Context, loader ipldbridge.Loader, root ipld.Link, s ipldbridge.Selector, fn ipldbridge.AdvVisitFn) error { - ms, ok := s.(*mockSelector) - if !ok { - return fmt.Errorf("not supported") - } - for _, lnk := range ms.cidsVisited { - - node, err := loadNode(lnk, loader) - if err == nil { - fn(ipldbridge.TraversalProgress{LastBlock: struct { - Path ipld.Path - Link ipld.Link - }{ipld.Path{}, cidlink.Link{Cid: lnk}}}, node, 0) - } - select { - case <-ctx.Done(): - return nil - default: - } - } - return nil -} - -func (mb *mockIPLDBridge) WalkMatching(node ipld.Node, s ipldbridge.Selector, fn ipldbridge.VisitFn) error { - spec, ok := node.(*mockSelectorSpec) - if ok && spec.FailValidation { - return fmt.Errorf("not a valid kind of selector") - } - return nil -} - -func loadNode(lnk cid.Cid, loader ipldbridge.Loader) (ipld.Node, error) { - r, err := loader(cidlink.Link{Cid: lnk}, ipldbridge.LinkContext{}) - if err != nil { - return nil, err - } - var buffer bytes.Buffer - io.Copy(&buffer, r) - data := buffer.Bytes() - hash, err := multihash.Sum(data, lnk.Prefix().MhType, lnk.Prefix().MhLength) - if err != nil { - return nil, err - } - if hash.B58String() != lnk.Hash().B58String() { - return nil, fmt.Errorf("hash mismatch") - } - return NewMockBlockNode(data), nil -} diff --git a/testbridge/testbridge_test.go b/testbridge/testbridge_test.go deleted file mode 100644 index b1df5e4a..00000000 --- a/testbridge/testbridge_test.go +++ /dev/null @@ -1,106 +0,0 @@ -package testbridge - -import ( - "bytes" - "context" - "fmt" - "io" - "reflect" - "testing" - - cidlink "github.com/ipld/go-ipld-prime/linking/cid" - - blocks "github.com/ipfs/go-block-format" - - "github.com/ipld/go-ipld-prime" - - "github.com/ipfs/go-cid" - "github.com/ipfs/go-graphsync/ipldbridge" - "github.com/ipfs/go-graphsync/testutil" -) - -func TestSelectorTraversal(t *testing.T) { - blks := testutil.GenerateBlocksOfSize(5, 20) - cids := make([]cid.Cid, 0, 5) - for _, block := range blks { - cids = append(cids, block.Cid()) - } - var uniqueBlocksVisited []blocks.Block - loader := func(ipldLink ipld.Link, lnkCtx ipldbridge.LinkContext) (io.Reader, error) { - lnk := ipldLink.(cidlink.Link).Cid - for _, block := range blks { - if block.Cid() == lnk { - if testutil.ContainsBlock(uniqueBlocksVisited, block) { - return nil, fmt.Errorf("loaded block twice") - } - uniqueBlocksVisited = append(uniqueBlocksVisited, block) - return bytes.NewReader(block.RawData()), nil - } - } - return nil, fmt.Errorf("unable to load block") - } - bridge := NewMockIPLDBridge() - root := cidlink.Link{Cid: cids[0]} - mockSelectorSpec := NewMockSelectorSpec(cids) - selector, err := bridge.ParseSelector(mockSelectorSpec) - if err != nil { - t.Fatal("unable to decode selector") - } - var traversalFn ipldbridge.AdvVisitFn - traversalFn = func(tp ipldbridge.TraversalProgress, node ipld.Node, traversalReason ipldbridge.TraversalReason) error { - return nil - } - ctx := context.Background() - err = bridge.Traverse(ctx, loader, root, selector, traversalFn) - if err != nil { - t.Fatal(err.Error()) - } - if len(uniqueBlocksVisited) != 5 { - t.Fatal("did not visit all blocks") - } -} - -func TestEncodeParseSelector(t *testing.T) { - cids := testutil.GenerateCids(5) - spec := NewMockSelectorSpec(cids) - bridge := NewMockIPLDBridge() - data, err := bridge.EncodeNode(spec) - fmt.Println(string(data)) - if err != nil { - t.Fatal("error encoding selector spec") - } - node, err := bridge.DecodeNode(data) - if err != nil { - t.Fatal("error decoding data") - } - returnedSpec, ok := node.(*mockSelectorSpec) - if !ok { - t.Fatal("did not decode a selector") - } - if len(returnedSpec.CidsVisited) != 5 { - t.Fatal("did not decode enough cids") - } - if !reflect.DeepEqual(cids, returnedSpec.CidsVisited) { - t.Fatal("did not decode correct cids") - } -} - -func TestFailParseSelectorSpec(t *testing.T) { - cids := testutil.GenerateCids(5) - spec := NewUnparsableSelectorSpec(cids) - bridge := NewMockIPLDBridge() - _, err := bridge.ParseSelector(spec) - if err == nil { - t.Fatal("Spec should not decompose to node and selector") - } -} - -func TestFailEncodingSelectorSpec(t *testing.T) { - cids := testutil.GenerateCids(5) - spec := NewUnencodableSelectorSpec(cids) - bridge := NewMockIPLDBridge() - _, err := bridge.EncodeNode(spec) - if err == nil { - t.Fatal("Spec should not be encodable") - } -} diff --git a/testutil/testchain.go b/testutil/testchain.go new file mode 100644 index 00000000..58a03e70 --- /dev/null +++ b/testutil/testchain.go @@ -0,0 +1,224 @@ +package testutil + +import ( + "context" + "io/ioutil" + "testing" + + blocks "github.com/ipfs/go-block-format" + cid "github.com/ipfs/go-cid" + "github.com/ipfs/go-graphsync" + "github.com/ipld/go-ipld-prime" + "github.com/ipld/go-ipld-prime/fluent" + ipldfree "github.com/ipld/go-ipld-prime/impl/free" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" + "github.com/ipld/go-ipld-prime/traversal/selector" + "github.com/ipld/go-ipld-prime/traversal/selector/builder" + mh "github.com/multiformats/go-multihash" +) + +const blockChainTraversedNodesPerBlock = 2 + +// TestBlockChain is a simulated data structure similar to a blockchain +// which graphsync is uniquely suited for +type TestBlockChain struct { + t *testing.T + blockChainLength int + loader ipld.Loader + GenisisNode ipld.Node + GenisisLink ipld.Link + MiddleNodes []ipld.Node + MiddleLinks []ipld.Link + TipNode ipld.Node + TipLink ipld.Link +} + +func createBlock(nb fluent.NodeBuilder, parents []ipld.Link, size uint64) ipld.Node { + return nb.CreateMap(func(mb fluent.MapBuilder, knb fluent.NodeBuilder, vnb fluent.NodeBuilder) { + mb.Insert(knb.CreateString("Parents"), vnb.CreateList(func(lb fluent.ListBuilder, vnb fluent.NodeBuilder) { + for _, parent := range parents { + lb.Append(vnb.CreateLink(parent)) + } + })) + mb.Insert(knb.CreateString("Messages"), vnb.CreateList(func(lb fluent.ListBuilder, vnb fluent.NodeBuilder) { + lb.Append(vnb.CreateBytes(RandomBytes(int64(size)))) + })) + }) +} + +// SetupBlockChain creates a new test block chain with the given height +func SetupBlockChain( + ctx context.Context, + t *testing.T, + loader ipld.Loader, + storer ipld.Storer, + size uint64, + blockChainLength int) *TestBlockChain { + linkBuilder := cidlink.LinkBuilder{Prefix: cid.NewPrefixV1(cid.DagCBOR, mh.SHA2_256)} + var genisisNode ipld.Node + err := fluent.Recover(func() { + nb := fluent.WrapNodeBuilder(ipldfree.NodeBuilder()) + genisisNode = createBlock(nb, []ipld.Link{}, size) + }) + if err != nil { + t.Fatal("Error creating genesis block") + } + genesisLink, err := linkBuilder.Build(ctx, ipld.LinkContext{}, genisisNode, storer) + if err != nil { + t.Fatal("Error creating link to genesis block") + } + parent := genesisLink + middleNodes := make([]ipld.Node, 0, blockChainLength-2) + middleLinks := make([]ipld.Link, 0, blockChainLength-2) + for i := 0; i < blockChainLength-2; i++ { + var node ipld.Node + err := fluent.Recover(func() { + nb := fluent.WrapNodeBuilder(ipldfree.NodeBuilder()) + node = createBlock(nb, []ipld.Link{parent}, size) + }) + if err != nil { + t.Fatal("Error creating middle block") + } + middleNodes = append(middleNodes, node) + link, err := linkBuilder.Build(ctx, ipld.LinkContext{}, node, storer) + if err != nil { + t.Fatal("Error creating link to middle block") + } + middleLinks = append(middleLinks, link) + parent = link + } + var tipNode ipld.Node + err = fluent.Recover(func() { + nb := fluent.WrapNodeBuilder(ipldfree.NodeBuilder()) + tipNode = createBlock(nb, []ipld.Link{parent}, size) + }) + if err != nil { + t.Fatal("Error creating tip block") + } + tipLink, err := linkBuilder.Build(ctx, ipld.LinkContext{}, tipNode, storer) + if err != nil { + t.Fatal("Error creating link to tip block") + } + return &TestBlockChain{t, blockChainLength, loader, genisisNode, genesisLink, middleNodes, middleLinks, tipNode, tipLink} +} + +// Selector returns the selector to recursive traverse the block chain parent links +func (tbc *TestBlockChain) Selector() ipld.Node { + ssb := builder.NewSelectorSpecBuilder(ipldfree.NodeBuilder()) + return ssb.ExploreRecursive(selector.RecursionLimitDepth(tbc.blockChainLength), + ssb.ExploreFields(func(efsb builder.ExploreFieldsSpecBuilder) { + efsb.Insert("Parents", ssb.ExploreAll( + ssb.ExploreRecursiveEdge())) + })).Node() +} + +// LinkTipIndex returns a link to the block at the given index from the tip +func (tbc *TestBlockChain) LinkTipIndex(fromTip int) ipld.Link { + switch height := tbc.blockChainLength - 1 - fromTip; { + case height == 0: + return tbc.GenisisLink + case height == tbc.blockChainLength-1: + return tbc.TipLink + default: + return tbc.MiddleLinks[height-1] + } +} + +// NodeTipIndex returns the node to the block at the given index from the tip +func (tbc *TestBlockChain) NodeTipIndex(fromTip int) ipld.Node { + switch height := tbc.blockChainLength - 1 - fromTip; { + case height == 0: + return tbc.GenisisNode + case height == tbc.blockChainLength-1: + return tbc.TipNode + default: + return tbc.MiddleNodes[height-1] + } +} +func (tbc *TestBlockChain) checkResponses(responses []graphsync.ResponseProgress, start int, end int) { + if len(responses) != (end-start)*blockChainTraversedNodesPerBlock { + tbc.t.Fatal("did not traverse all nodes") + } + expectedPath := "" + for i := 0; i < start; i++ { + if expectedPath == "" { + expectedPath = "Parents/0" + } else { + expectedPath = expectedPath + "/Parents/0" + } + } + for i, response := range responses { + if response.Path.String() != expectedPath { + tbc.t.Fatal("incorrect path") + } + if i%2 == 0 { + if expectedPath == "" { + expectedPath = "Parents" + } else { + expectedPath = expectedPath + "/Parents" + } + } else { + expectedPath = expectedPath + "/0" + } + if response.LastBlock.Path.String() != response.Path.String() { + continue + } + if response.LastBlock.Link == nil { + continue + } + expectedLink := tbc.LinkTipIndex((i / 2) + start) + if expectedLink != response.LastBlock.Link { + tbc.t.Fatal("Unexpected link in response") + } + } +} + +// VerifyWholeChain verifies the given response channel returns the expected responses for the whole chain +func (tbc *TestBlockChain) VerifyWholeChain(ctx context.Context, responseChan <-chan graphsync.ResponseProgress) { + tbc.VerifyRemainder(ctx, responseChan, 0) +} + +// VerifyRemainder verifies the given response channel returns the remainder of the chain starting at the nth block from the tip +func (tbc *TestBlockChain) VerifyRemainder(ctx context.Context, responseChan <-chan graphsync.ResponseProgress, from int) { + responses := CollectResponses(ctx, tbc.t, responseChan) + tbc.checkResponses(responses, from, tbc.blockChainLength) +} + +// VerifyResponseRange verifies the given response channel returns the given range of respnses, indexed from the tip +// (with possibly more data left in the channel) +func (tbc *TestBlockChain) VerifyResponseRange(ctx context.Context, responseChan <-chan graphsync.ResponseProgress, from int, to int) { + responses := ReadNResponses(ctx, tbc.t, responseChan, (to-from)*blockChainTraversedNodesPerBlock) + tbc.checkResponses(responses, from, to) +} + +// Blocks Returns the given raw blocks for the block chain for the given range, indexed from the tip +func (tbc *TestBlockChain) Blocks(from int, to int) []blocks.Block { + var blks []blocks.Block + for i := from; i < to; i++ { + link := tbc.LinkTipIndex(i) + reader, err := tbc.loader(link, ipld.LinkContext{}) + if err != nil { + tbc.t.Fatal("Unable to load link") + } + data, err := ioutil.ReadAll(reader) + if err != nil { + tbc.t.Fatal("Unable to read link data") + } + blk, err := blocks.NewBlockWithCid(data, link.(cidlink.Link).Cid) + if err != nil { + tbc.t.Fatal("Could not construct block") + } + blks = append(blks, blk) + } + return blks +} + +// AllBlocks returns all blocks for a blockchain +func (tbc *TestBlockChain) AllBlocks() []blocks.Block { + return tbc.Blocks(0, tbc.blockChainLength) +} + +// RemainderBlocks returns the remaining blocks for a blockchain, indexed from tip +func (tbc *TestBlockChain) RemainderBlocks(from int) []blocks.Block { + return tbc.Blocks(from, tbc.blockChainLength) +} diff --git a/testutil/testnodes.go b/testutil/testnodes.go new file mode 100644 index 00000000..ed22cb25 --- /dev/null +++ b/testutil/testnodes.go @@ -0,0 +1,28 @@ +package testutil + +import ( + ipld "github.com/ipld/go-ipld-prime" + ipldfree "github.com/ipld/go-ipld-prime/impl/free" + "github.com/ipld/go-ipld-prime/traversal/selector" + "github.com/ipld/go-ipld-prime/traversal/selector/builder" +) + +// NewUnparsableSelectorSpec returns a spec that will fail when you attempt to +// validate it or decompose to a node + selector. +func NewUnparsableSelectorSpec() ipld.Node { + ssb := builder.NewSelectorSpecBuilder(ipldfree.NodeBuilder()) + return ssb.ExploreRecursiveEdge().Node() +} + +// NewInvalidSelectorSpec returns a spec that will fail when you attempt to +// validate it on the responder side +func NewInvalidSelectorSpec() ipld.Node { + ssb := builder.NewSelectorSpecBuilder(ipldfree.NodeBuilder()) + return ssb.ExploreRecursive(selector.RecursionLimitNone(), ssb.ExploreAll(ssb.ExploreRecursiveEdge())).Node() +} + +// NewUnencodableSelectorSpec returns a spec that will fail when you attempt to +// encode it. +func NewUnencodableSelectorSpec() ipld.Node { + return &ipldfree.Node{} +} diff --git a/testutil/testnodes_test.go b/testutil/testnodes_test.go new file mode 100644 index 00000000..2a7e28d6 --- /dev/null +++ b/testutil/testnodes_test.go @@ -0,0 +1,23 @@ +package testutil + +import ( + "testing" + + "github.com/ipfs/go-graphsync/ipldutil" +) + +func TestFailParseSelectorSpec(t *testing.T) { + spec := NewUnparsableSelectorSpec() + _, err := ipldutil.ParseSelector(spec) + if err == nil { + t.Fatal("Spec should not decompose to node and selector") + } +} + +func TestFailEncodingSelectorSpec(t *testing.T) { + spec := NewUnencodableSelectorSpec() + _, err := ipldutil.EncodeNode(spec) + if err == nil { + t.Fatal("Spec should not be encodable") + } +} diff --git a/testbridge/mockStore.go b/testutil/teststore.go similarity index 57% rename from testbridge/mockStore.go rename to testutil/teststore.go index 50271f67..86f84673 100644 --- a/testbridge/mockStore.go +++ b/testutil/teststore.go @@ -1,4 +1,4 @@ -package testbridge +package testutil import ( "bytes" @@ -6,14 +6,13 @@ import ( "io" "sync" - "github.com/ipfs/go-graphsync/ipldbridge" ipld "github.com/ipld/go-ipld-prime" ) -// NewMockStore provides a loader and storer for the given in memory link -> byte data map -func NewMockStore(blocksWritten map[ipld.Link][]byte) (ipldbridge.Loader, ipldbridge.Storer) { +// NewTestStore provides a loader and storer for the given in memory link -> byte data map +func NewTestStore(blocksWritten map[ipld.Link][]byte) (ipld.Loader, ipld.Storer) { var storeLk sync.RWMutex - storer := func(lnkCtx ipldbridge.LinkContext) (io.Writer, ipldbridge.StoreCommitter, error) { + storer := func(lnkCtx ipld.LinkContext) (io.Writer, ipld.StoreCommitter, error) { var buffer bytes.Buffer committer := func(lnk ipld.Link) error { storeLk.Lock() @@ -23,7 +22,7 @@ func NewMockStore(blocksWritten map[ipld.Link][]byte) (ipldbridge.Loader, ipldbr } return &buffer, committer, nil } - loader := func(lnk ipld.Link, lnkCtx ipldbridge.LinkContext) (io.Reader, error) { + loader := func(lnk ipld.Link, lnkCtx ipld.LinkContext) (io.Reader, error) { storeLk.RLock() data, ok := blocksWritten[lnk] storeLk.RUnlock() diff --git a/testutil/testutil.go b/testutil/testutil.go index 3564c90e..0a9105ac 100644 --- a/testutil/testutil.go +++ b/testutil/testutil.go @@ -5,10 +5,15 @@ import ( "context" "testing" + "github.com/ipfs/go-bitswap/testutil" blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" "github.com/ipfs/go-graphsync" blocksutil "github.com/ipfs/go-ipfs-blocksutil" + util "github.com/ipfs/go-ipfs-util" + "github.com/ipld/go-ipld-prime" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" + random "github.com/jbenet/go-random" "github.com/libp2p/go-libp2p-core/peer" ) @@ -29,7 +34,10 @@ func RandomBytes(n int64) []byte { func GenerateBlocksOfSize(n int, size int64) []blocks.Block { generatedBlocks := make([]blocks.Block, 0, n) for i := 0; i < n; i++ { - b := blocks.NewBlock(RandomBytes(size)) + data := RandomBytes(size) + mhash := util.Hash(data) + c := cid.NewCidV1(cid.Raw, mhash) + b, _ := blocks.NewBlockWithCid(data, c) generatedBlocks = append(generatedBlocks, b) } @@ -184,3 +192,8 @@ func VerifyEmptyResponse(ctx context.Context, t *testing.T, responseChan <-chan } } } + +// NewTestLink returns a randomly generated IPLD Link +func NewTestLink() ipld.Link { + return cidlink.Link{Cid: testutil.GenerateCids(1)[0]} +}