wantmanager_test.go 3.24 KB
Newer Older
1 2 3 4 5 6
package wantmanager

import (
	"context"
	"testing"

7 8 9 10
	bsbpm "github.com/ipfs/go-bitswap/internal/blockpresencemanager"
	bssim "github.com/ipfs/go-bitswap/internal/sessioninterestmanager"
	"github.com/ipfs/go-bitswap/internal/sessionmanager"
	"github.com/ipfs/go-bitswap/internal/testutil"
11

12
	"github.com/ipfs/go-cid"
Raúl Kripalani's avatar
Raúl Kripalani committed
13
	"github.com/libp2p/go-libp2p-core/peer"
14 15
)

16
type fakePeerHandler struct {
17 18
	lastBcstWants []cid.Cid
	lastCancels   []cid.Cid
19 20
}

21
func (fph *fakePeerHandler) Connected(p peer.ID) {
22
}
dirkmc's avatar
dirkmc committed
23
func (fph *fakePeerHandler) Disconnected(p peer.ID) {
24 25

}
dirkmc's avatar
dirkmc committed
26 27 28 29 30
func (fph *fakePeerHandler) BroadcastWantHaves(ctx context.Context, wantHaves []cid.Cid) {
	fph.lastBcstWants = wantHaves
}
func (fph *fakePeerHandler) SendCancels(ctx context.Context, cancels []cid.Cid) {
	fph.lastCancels = cancels
31 32
}

dirkmc's avatar
dirkmc committed
33 34
type fakeSessionManager struct {
}
35

dirkmc's avatar
dirkmc committed
36 37 38
func (*fakeSessionManager) ReceiveFrom(p peer.ID, blks []cid.Cid, haves []cid.Cid, dontHaves []cid.Cid) []sessionmanager.Session {
	return nil
}
39

dirkmc's avatar
dirkmc committed
40 41 42 43 44 45 46 47
func TestReceiveFrom(t *testing.T) {
	ctx := context.Background()
	ph := &fakePeerHandler{}
	sim := bssim.New()
	bpm := bsbpm.New()
	wm := New(context.Background(), ph, sim, bpm)
	sm := &fakeSessionManager{}
	wm.SetSessionManager(sm)
48

dirkmc's avatar
dirkmc committed
49 50 51 52 53
	p := testutil.GeneratePeers(1)[0]
	ks := testutil.GenerateCids(2)
	haves := testutil.GenerateCids(2)
	dontHaves := testutil.GenerateCids(2)
	wm.ReceiveFrom(ctx, p, ks, haves, dontHaves)
54

dirkmc's avatar
dirkmc committed
55 56
	if !bpm.PeerHasBlock(p, haves[0]) {
		t.Fatal("expected block presence manager to be invoked")
57
	}
dirkmc's avatar
dirkmc committed
58 59
	if !bpm.PeerDoesNotHaveBlock(p, dontHaves[0]) {
		t.Fatal("expected block presence manager to be invoked")
60
	}
dirkmc's avatar
dirkmc committed
61 62
	if len(ph.lastCancels) != len(ks) {
		t.Fatal("expected received blocks to be cancelled")
63
	}
dirkmc's avatar
dirkmc committed
64
}
65

dirkmc's avatar
dirkmc committed
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
func TestRemoveSession(t *testing.T) {
	ctx := context.Background()
	ph := &fakePeerHandler{}
	sim := bssim.New()
	bpm := bsbpm.New()
	wm := New(context.Background(), ph, sim, bpm)
	sm := &fakeSessionManager{}
	wm.SetSessionManager(sm)

	// Record session interest in 2 keys for session 0 and 2 keys for session 1
	// with 1 overlapping key
	cids := testutil.GenerateCids(3)
	ses0 := uint64(0)
	ses1 := uint64(1)
	ses0ks := cids[:2]
	ses1ks := cids[1:]
	sim.RecordSessionInterest(ses0, ses0ks)
	sim.RecordSessionInterest(ses1, ses1ks)

	// Receive HAVE for all keys
	p := testutil.GeneratePeers(1)[0]
	ks := []cid.Cid{}
	haves := append(ses0ks, ses1ks...)
	dontHaves := []cid.Cid{}
	wm.ReceiveFrom(ctx, p, ks, haves, dontHaves)

	// Remove session 0
	wm.RemoveSession(ctx, ses0)

	// Expect session 0 interest to be removed and session 1 interest to be
	// unchanged
	if len(sim.FilterSessionInterested(ses0, ses0ks)[0]) != 0 {
		t.Fatal("expected session 0 interest to be removed")
	}
	if len(sim.FilterSessionInterested(ses1, ses1ks)[0]) != len(ses1ks) {
		t.Fatal("expected session 1 interest to be unchanged")
	}

	// Should clear block presence for key that was in session 0 and not
	// in session 1
	if bpm.PeerHasBlock(p, ses0ks[0]) {
		t.Fatal("expected block presence manager to be cleared")
	}
	if !bpm.PeerHasBlock(p, ses0ks[1]) {
		t.Fatal("expected block presence manager to be unchanged for overlapping key")
	}

	// Should cancel key that was in session 0 and not session 1
	if len(ph.lastCancels) != 1 || !ph.lastCancels[0].Equals(cids[0]) {
		t.Fatal("expected removed want-have to be cancelled")
116 117
	}
}