feat: test the three-legged cat
Brian Tiger Chow committed
Dec 25, 2014 at 04:04 UTC
1891c8915d2a2a602612ae8d51e5e9b6174058e7
1 file changed
+77
epictest/three_legged_cat_test.go
new
+77
@@ -0,0 +1,77 @@
1
+package epictest
2
+
3
+import (
4
+ "bytes"
5
+ "io"
6
+ "math"
7
+ "testing"
8
+
9
+ context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
10
+ mocknet "github.com/jbenet/go-ipfs/net/mock"
11
+ errors "github.com/jbenet/go-ipfs/util/debugerror"
12
+)
13
+
14
+func TestThreeLeggedCat(t *testing.T) {
15
+ conf := Config{
16
+ NetworkLatency: 0,
17
+ RoutingLatency: 0,
18
+ BlockstoreLatency: 0,
19
+ }
20
+ if err := RunThreeLeggedCat(RandomBytes(1*KB), conf); err != nil {
21
+ t.Fatal(err)
22
+ }
23
+}
24
+
25
+func RunThreeLeggedCat(data []byte, conf Config) error {
26
+ ctx, cancel := context.WithCancel(context.Background())
27
+ defer cancel()
28
+ const numPeers = 3
29
+
30
+ // create network
31
+ mn, err := mocknet.FullMeshLinked(ctx, numPeers)
32
+ if err != nil {
33
+ return errors.Wrap(err)
34
+ }
35
+ mn.SetLinkDefaults(mocknet.LinkOptions{
36
+ Latency: conf.NetworkLatency,
37
+ // TODO add to conf. This is tricky because we want 0 values to be functional.
38
+ Bandwidth: math.MaxInt32,
39
+ })
40
+
41
+ if len(mn.Peers()) < numPeers {
42
+ return errors.New("test initialization error")
43
+ }
44
+ adder, err := makeCore(ctx, MocknetTestRepo(mn.Peers()[0], mn.Net(mn.Peers()[0]), conf))
45
+ if err != nil {
46
+ return err
47
+ }
48
+ catter, err := makeCore(ctx, MocknetTestRepo(mn.Peers()[1], mn.Net(mn.Peers()[1]), conf))
49
+ if err != nil {
50
+ return err
51
+ }
52
+ bootstrap, err := makeCore(ctx, MocknetTestRepo(mn.Peers()[2], mn.Net(mn.Peers()[2]), conf))
53
+ if err != nil {
54
+ return err
55
+ }
56
+
57
+ adder.Bootstrap(ctx, bootstrap.ID())
58
+ catter.Bootstrap(ctx, bootstrap.ID())
59
+
60
+ keyAdded, err := adder.Add(bytes.NewReader(data))
61
+ if err != nil {
62
+ return err
63
+ }
64
+
65
+ readerCatted, err := catter.Cat(keyAdded)
66
+ if err != nil {
67
+ return err
68
+ }
69
+
70
+ // verify
71
+ var bufout bytes.Buffer
72
+ io.Copy(&bufout, readerCatted)
73
+ if 0 != bytes.Compare(bufout.Bytes(), data) {
74
+ return errors.New("catted data does not match added data")
75
+ }
76
+ return nil
77
+}