Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
ac7404a6
提交
ac7404a6
authored
9月 23, 2014
作者:
Brian Tiger Chow
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'feat/mock-dht'
上级
f0019754
c044d9c3
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
95 行增加
和
55 行删除
+95
-55
bitswap_test.go
exchange/bitswap/bitswap_test.go
+9
-8
routing.go
routing/mock/routing.go
+76
-34
routing_test.go
routing/mock/routing_test.go
+10
-13
没有找到文件。
exchange/bitswap/bitswap_test.go
浏览文件 @
ac7404a6
...
...
@@ -16,6 +16,7 @@ import (
strategy
"github.com/jbenet/go-ipfs/exchange/bitswap/strategy"
tn
"github.com/jbenet/go-ipfs/exchange/bitswap/testnet"
peer
"github.com/jbenet/go-ipfs/peer"
mock
"github.com/jbenet/go-ipfs/routing/mock"
util
"github.com/jbenet/go-ipfs/util"
testutil
"github.com/jbenet/go-ipfs/util/testutil"
)
...
...
@@ -23,7 +24,7 @@ import (
func
TestGetBlockTimeout
(
t
*
testing
.
T
)
{
net
:=
tn
.
VirtualNetwork
()
rs
:=
tn
.
VirtualRoutingServer
()
rs
:=
mock
.
VirtualRoutingServer
()
g
:=
NewSessionGenerator
(
net
,
rs
)
self
:=
g
.
Next
()
...
...
@@ -40,7 +41,7 @@ func TestGetBlockTimeout(t *testing.T) {
func
TestProviderForKeyButNetworkCannotFind
(
t
*
testing
.
T
)
{
net
:=
tn
.
VirtualNetwork
()
rs
:=
tn
.
VirtualRoutingServer
()
rs
:=
mock
.
VirtualRoutingServer
()
g
:=
NewSessionGenerator
(
net
,
rs
)
block
:=
testutil
.
NewBlockOrFail
(
t
,
"block"
)
...
...
@@ -61,7 +62,7 @@ func TestProviderForKeyButNetworkCannotFind(t *testing.T) {
func
TestGetBlockFromPeerAfterPeerAnnounces
(
t
*
testing
.
T
)
{
net
:=
tn
.
VirtualNetwork
()
rs
:=
tn
.
VirtualRoutingServer
()
rs
:=
mock
.
VirtualRoutingServer
()
block
:=
testutil
.
NewBlockOrFail
(
t
,
"block"
)
g
:=
NewSessionGenerator
(
net
,
rs
)
...
...
@@ -90,7 +91,7 @@ func TestGetBlockFromPeerAfterPeerAnnounces(t *testing.T) {
func
TestSwarm
(
t
*
testing
.
T
)
{
net
:=
tn
.
VirtualNetwork
()
rs
:=
tn
.
VirtualRoutingServer
()
rs
:=
mock
.
VirtualRoutingServer
()
sg
:=
NewSessionGenerator
(
net
,
rs
)
bg
:=
NewBlockGenerator
(
t
)
...
...
@@ -151,7 +152,7 @@ func TestSendToWantingPeer(t *testing.T) {
util
.
Debug
=
true
net
:=
tn
.
VirtualNetwork
()
rs
:=
tn
.
VirtualRoutingServer
()
rs
:=
mock
.
VirtualRoutingServer
()
sg
:=
NewSessionGenerator
(
net
,
rs
)
bg
:=
NewBlockGenerator
(
t
)
...
...
@@ -237,7 +238,7 @@ func (bg *BlockGenerator) Blocks(n int) []*blocks.Block {
}
func
NewSessionGenerator
(
net
tn
.
Network
,
rs
tn
.
RoutingServer
)
SessionGenerator
{
net
tn
.
Network
,
rs
mock
.
RoutingServer
)
SessionGenerator
{
return
SessionGenerator
{
net
:
net
,
rs
:
rs
,
...
...
@@ -248,7 +249,7 @@ func NewSessionGenerator(
type
SessionGenerator
struct
{
seq
int
net
tn
.
Network
rs
tn
.
RoutingServer
rs
mock
.
RoutingServer
}
func
(
g
*
SessionGenerator
)
Next
()
instance
{
...
...
@@ -276,7 +277,7 @@ type instance struct {
// NB: It's easy make mistakes by providing the same peer ID to two different
// sessions. To safeguard, use the SessionGenerator to generate sessions. It's
// just a much better idea.
func
session
(
net
tn
.
Network
,
rs
tn
.
RoutingServer
,
id
peer
.
ID
)
instance
{
func
session
(
net
tn
.
Network
,
rs
mock
.
RoutingServer
,
id
peer
.
ID
)
instance
{
p
:=
&
peer
.
Peer
{
ID
:
id
}
adapter
:=
net
.
Adapter
(
p
)
...
...
exchange/bitswap/testnet
/routing.go
→
routing/mock
/routing.go
浏览文件 @
ac7404a6
package
bitswap
package
mock
import
(
"errors"
"math/rand"
"sync"
context
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
bsnet
"github.com/jbenet/go-ipfs/exchange/bitswap/network
"
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
ds
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go
"
peer
"github.com/jbenet/go-ipfs/peer"
routing
"github.com/jbenet/go-ipfs/routing"
u
"github.com/jbenet/go-ipfs/util"
)
var
_
routing
.
IpfsRouting
=
&
MockRouter
{}
type
MockRouter
struct
{
datastore
ds
.
Datastore
hashTable
RoutingServer
peer
*
peer
.
Peer
}
func
NewMockRouter
(
local
*
peer
.
Peer
,
dstore
ds
.
Datastore
)
routing
.
IpfsRouting
{
return
&
MockRouter
{
datastore
:
dstore
,
peer
:
local
,
hashTable
:
VirtualRoutingServer
(),
}
}
func
(
mr
*
MockRouter
)
SetRoutingServer
(
rs
RoutingServer
)
{
mr
.
hashTable
=
rs
}
func
(
mr
*
MockRouter
)
PutValue
(
ctx
context
.
Context
,
key
u
.
Key
,
val
[]
byte
)
error
{
return
mr
.
datastore
.
Put
(
ds
.
NewKey
(
string
(
key
)),
val
)
}
func
(
mr
*
MockRouter
)
GetValue
(
ctx
context
.
Context
,
key
u
.
Key
)
([]
byte
,
error
)
{
v
,
err
:=
mr
.
datastore
.
Get
(
ds
.
NewKey
(
string
(
key
)))
if
err
!=
nil
{
return
nil
,
err
}
data
,
ok
:=
v
.
([]
byte
)
if
!
ok
{
return
nil
,
errors
.
New
(
"could not cast value from datastore"
)
}
return
data
,
nil
}
func
(
mr
*
MockRouter
)
FindProviders
(
ctx
context
.
Context
,
key
u
.
Key
)
([]
*
peer
.
Peer
,
error
)
{
return
nil
,
nil
}
func
(
mr
*
MockRouter
)
FindPeer
(
ctx
context
.
Context
,
pid
peer
.
ID
)
(
*
peer
.
Peer
,
error
)
{
return
nil
,
nil
}
func
(
mr
*
MockRouter
)
FindProvidersAsync
(
ctx
context
.
Context
,
k
u
.
Key
,
max
int
)
<-
chan
*
peer
.
Peer
{
out
:=
make
(
chan
*
peer
.
Peer
)
go
func
()
{
defer
close
(
out
)
for
i
,
p
:=
range
mr
.
hashTable
.
Providers
(
k
)
{
if
max
<=
i
{
return
}
select
{
case
out
<-
p
:
case
<-
ctx
.
Done
()
:
return
}
}
}()
return
out
}
func
(
mr
*
MockRouter
)
Provide
(
_
context
.
Context
,
key
u
.
Key
)
error
{
return
mr
.
hashTable
.
Announce
(
mr
.
peer
,
key
)
}
type
RoutingServer
interface
{
Announce
(
*
peer
.
Peer
,
u
.
Key
)
error
Providers
(
u
.
Key
)
[]
*
peer
.
Peer
// Returns a Routing instance configured to query this hash table
Client
(
*
peer
.
Peer
)
bsnet
.
Routing
Client
(
p
*
peer
.
Peer
)
routing
.
IpfsRouting
}
func
VirtualRoutingServer
()
RoutingServer
{
...
...
@@ -62,36 +131,9 @@ func (rs *hashTable) Providers(k u.Key) []*peer.Peer {
return
ret
}
func
(
rs
*
hashTable
)
Client
(
p
*
peer
.
Peer
)
bsnet
.
Routing
{
return
&
routingClient
{
func
(
rs
*
hashTable
)
Client
(
p
*
peer
.
Peer
)
routing
.
Ipfs
Routing
{
return
&
MockRouter
{
peer
:
p
,
hashTable
:
rs
,
}
}
type
routingClient
struct
{
peer
*
peer
.
Peer
hashTable
RoutingServer
}
func
(
a
*
routingClient
)
FindProvidersAsync
(
ctx
context
.
Context
,
k
u
.
Key
,
max
int
)
<-
chan
*
peer
.
Peer
{
out
:=
make
(
chan
*
peer
.
Peer
)
go
func
()
{
defer
close
(
out
)
for
i
,
p
:=
range
a
.
hashTable
.
Providers
(
k
)
{
if
max
<=
i
{
return
}
select
{
case
out
<-
p
:
case
<-
ctx
.
Done
()
:
return
}
}
}()
return
out
}
func
(
a
*
routingClient
)
Provide
(
_
context
.
Context
,
key
u
.
Key
)
error
{
return
a
.
hashTable
.
Announce
(
a
.
peer
,
key
)
}
exchange/bitswap/testnet
/routing_test.go
→
routing/mock
/routing_test.go
浏览文件 @
ac7404a6
package
bitswap
package
mock
import
(
"bytes"
"testing"
context
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
)
import
(
"github.com/jbenet/go-ipfs/peer"
u
"github.com/jbenet/go-ipfs/util"
)
func
TestKeyNotFound
(
t
*
testing
.
T
)
{
rs
:=
func
()
RoutingServer
{
// TODO fields
return
&
hashTable
{}
}()
empty
:=
rs
.
Providers
(
u
.
Key
(
"not there"
))
vrs
:=
VirtualRoutingServer
()
empty
:=
vrs
.
Providers
(
u
.
Key
(
"not there"
))
if
len
(
empty
)
!=
0
{
t
.
Fatal
(
"should be empty"
)
}
...
...
@@ -47,11 +42,10 @@ func TestSetAndGet(t *testing.T) {
}
func
TestClientFindProviders
(
t
*
testing
.
T
)
{
peer
:=
&
peer
.
Peer
{
ID
:
[]
byte
(
"42"
),
}
peer
:=
&
peer
.
Peer
{
ID
:
[]
byte
(
"42"
)}
rs
:=
VirtualRoutingServer
()
client
:=
rs
.
Client
(
peer
)
k
:=
u
.
Key
(
"hello"
)
err
:=
client
.
Provide
(
context
.
Background
(),
k
)
if
err
!=
nil
{
...
...
@@ -102,7 +96,9 @@ func TestClientOverMax(t *testing.T) {
}
max
:=
10
client
:=
rs
.
Client
(
&
peer
.
Peer
{
ID
:
[]
byte
(
"TODO"
)})
peer
:=
&
peer
.
Peer
{
ID
:
[]
byte
(
"TODO"
)}
client
:=
rs
.
Client
(
peer
)
providersFromClient
:=
client
.
FindProvidersAsync
(
context
.
Background
(),
k
,
max
)
i
:=
0
for
_
=
range
providersFromClient
{
...
...
@@ -133,7 +129,8 @@ func TestCanceledContext(t *testing.T) {
}
}()
client
:=
rs
.
Client
(
&
peer
.
Peer
{
ID
:
[]
byte
(
"peer id doesn't matter"
)})
local
:=
&
peer
.
Peer
{
ID
:
[]
byte
(
"peer id doesn't matter"
)}
client
:=
rs
.
Client
(
local
)
t
.
Log
(
"warning: max is finite so this test is non-deterministic"
)
t
.
Log
(
"context cancellation could simply take lower priority"
)
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论