providers_test.go 4.1 KB
Newer Older
1 2 3
package providers

import (
4
	"context"
5
	"fmt"
6 7
	"io/ioutil"
	"os"
8 9 10
	"testing"
	"time"

11
	cid "github.com/ipfs/go-cid"
12
	ds "github.com/ipfs/go-datastore"
13
	lds "github.com/ipfs/go-ds-leveldb"
14
	u "github.com/ipfs/go-ipfs-util"
15
	peer "github.com/libp2p/go-libp2p-peer"
16 17 18 19 20 21
)

func TestProviderManager(t *testing.T) {
	ctx := context.Background()
	mid := peer.ID("testing")
	p := NewProviderManager(ctx, mid, ds.NewMapDatastore())
22
	a := cid.NewCidV0(u.Hash([]byte("test")))
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
	p.AddProvider(ctx, a, peer.ID("testingprovider"))
	resp := p.GetProviders(ctx, a)
	if len(resp) != 1 {
		t.Fatal("Could not retrieve provider.")
	}
	p.proc.Close()
}

func TestProvidersDatastore(t *testing.T) {
	old := lruCacheSize
	lruCacheSize = 10
	defer func() { lruCacheSize = old }()

	ctx := context.Background()
	mid := peer.ID("testing")
	p := NewProviderManager(ctx, mid, ds.NewMapDatastore())
	defer p.proc.Close()

	friend := peer.ID("friend")
42
	var cids []*cid.Cid
43
	for i := 0; i < 100; i++ {
44 45 46
		c := cid.NewCidV0(u.Hash([]byte(fmt.Sprint(i))))
		cids = append(cids, c)
		p.AddProvider(ctx, c, friend)
47 48
	}

49 50
	for _, c := range cids {
		resp := p.GetProviders(ctx, c)
51 52 53 54 55 56 57 58 59 60 61 62
		if len(resp) != 1 {
			t.Fatal("Could not retrieve provider.")
		}
		if resp[0] != friend {
			t.Fatal("expected provider to be 'friend'")
		}
	}
}

func TestProvidersSerialization(t *testing.T) {
	dstore := ds.NewMapDatastore()

63
	k := cid.NewCidV0(u.Hash(([]byte("my key!"))))
Jeromy's avatar
Jeromy committed
64 65 66 67
	p1 := peer.ID("peer one")
	p2 := peer.ID("peer two")
	pt1 := time.Now()
	pt2 := pt1.Add(time.Hour)
68

Jeromy's avatar
Jeromy committed
69 70 71 72 73 74
	err := writeProviderEntry(dstore, k, p1, pt1)
	if err != nil {
		t.Fatal(err)
	}

	err = writeProviderEntry(dstore, k, p2, pt2)
75 76 77 78 79 80 81 82 83
	if err != nil {
		t.Fatal(err)
	}

	pset, err := loadProvSet(dstore, k)
	if err != nil {
		t.Fatal(err)
	}

Jeromy's avatar
Jeromy committed
84 85 86 87 88 89 90 91 92 93
	lt1, ok := pset.set[p1]
	if !ok {
		t.Fatal("failed to load set correctly")
	}

	if pt1 != lt1 {
		t.Fatal("time wasnt serialized correctly")
	}

	lt2, ok := pset.set[p2]
94 95 96 97
	if !ok {
		t.Fatal("failed to load set correctly")
	}

Jeromy's avatar
Jeromy committed
98
	if pt2 != lt2 {
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
		t.Fatal("time wasnt serialized correctly")
	}
}

func TestProvidesExpire(t *testing.T) {
	pval := ProvideValidity
	cleanup := defaultCleanupInterval
	ProvideValidity = time.Second / 2
	defaultCleanupInterval = time.Second / 2
	defer func() {
		ProvideValidity = pval
		defaultCleanupInterval = cleanup
	}()

	ctx := context.Background()
	mid := peer.ID("testing")
	p := NewProviderManager(ctx, mid, ds.NewMapDatastore())

	peers := []peer.ID{"a", "b"}
118
	var cids []*cid.Cid
119
	for i := 0; i < 10; i++ {
120 121 122 123
		c := cid.NewCidV0(u.Hash([]byte(fmt.Sprint(i))))
		cids = append(cids, c)
		p.AddProvider(ctx, c, peers[0])
		p.AddProvider(ctx, c, peers[1])
124 125 126
	}

	for i := 0; i < 10; i++ {
127
		out := p.GetProviders(ctx, cids[i])
128 129 130 131 132 133 134
		if len(out) != 2 {
			t.Fatal("expected providers to still be there")
		}
	}

	time.Sleep(time.Second)
	for i := 0; i < 10; i++ {
135 136 137
		out := p.GetProviders(ctx, cids[i])
		if len(out) > 0 {
			t.Fatal("expected providers to be cleaned up, got: ", out)
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
		}
	}

	if p.providers.Len() != 0 {
		t.Fatal("providers map not cleaned up")
	}

	allprovs, err := p.getAllProvKeys()
	if err != nil {
		t.Fatal(err)
	}

	if len(allprovs) != 0 {
		t.Fatal("expected everything to be cleaned out of the datastore")
	}
}
154

155
///* This can be used for profiling. Keeping it commented out for now to avoid incurring extra CI time
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
func TestLargeProvidersSet(t *testing.T) {
	old := lruCacheSize
	lruCacheSize = 10
	defer func() { lruCacheSize = old }()

	dirn, err := ioutil.TempDir("", "provtest")
	if err != nil {
		t.Fatal(err)
	}

	opts := &lds.Options{
		NoSync:      true,
		Compression: 1,
	}
	lds, err := lds.NewDatastore(dirn, opts)
	if err != nil {
		t.Fatal(err)
	}
	_ = lds

	defer func() {
		os.RemoveAll(dirn)
	}()

	ctx := context.Background()
	var peers []peer.ID
	for i := 0; i < 3000; i++ {
		peers = append(peers, peer.ID(fmt.Sprint(i)))
	}

	mid := peer.ID("myself")
	p := NewProviderManager(ctx, mid, lds)
	defer p.proc.Close()

	var cids []*cid.Cid
	for i := 0; i < 1000; i++ {
		c := cid.NewCidV0(u.Hash([]byte(fmt.Sprint(i))))
		cids = append(cids, c)
		for _, pid := range peers {
			p.AddProvider(ctx, c, pid)
		}
	}

	for _, c := range cids {
		_ = p.GetProviders(ctx, c)
	}

}