sessionpeermanager_test.go 6.08 KB
Newer Older
1 2 3
package sessionpeermanager

import (
4
	"sync"
5 6
	"testing"

7 8
	"gitlab.dms3.io/dms3/go-bitswap/internal/testutil"
	peer "gitlab.dms3.io/p2p/go-p2p-core/peer"
9 10
)

11
type fakePeerTagger struct {
12 13 14 15 16 17 18 19 20 21
	lk             sync.Mutex
	taggedPeers    []peer.ID
	protectedPeers map[peer.ID]map[string]struct{}
	wait           sync.WaitGroup
}

func newFakePeerTagger() *fakePeerTagger {
	return &fakePeerTagger{
		protectedPeers: make(map[peer.ID]map[string]struct{}),
	}
22 23
}

24 25
func (fpt *fakePeerTagger) TagPeer(p peer.ID, tag string, n int) {
	fpt.wait.Add(1)
26 27 28

	fpt.lk.Lock()
	defer fpt.lk.Unlock()
29
	fpt.taggedPeers = append(fpt.taggedPeers, p)
30
}
31

32 33 34
func (fpt *fakePeerTagger) UntagPeer(p peer.ID, tag string) {
	defer fpt.wait.Done()

35 36
	fpt.lk.Lock()
	defer fpt.lk.Unlock()
37 38 39 40
	for i := 0; i < len(fpt.taggedPeers); i++ {
		if fpt.taggedPeers[i] == p {
			fpt.taggedPeers[i] = fpt.taggedPeers[len(fpt.taggedPeers)-1]
			fpt.taggedPeers = fpt.taggedPeers[:len(fpt.taggedPeers)-1]
41 42 43 44
			return
		}
	}
}
45

46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
func (fpt *fakePeerTagger) Protect(p peer.ID, tag string) {
	fpt.lk.Lock()
	defer fpt.lk.Unlock()

	tags, ok := fpt.protectedPeers[p]
	if !ok {
		tags = make(map[string]struct{})
		fpt.protectedPeers[p] = tags
	}
	tags[tag] = struct{}{}
}

func (fpt *fakePeerTagger) Unprotect(p peer.ID, tag string) bool {
	fpt.lk.Lock()
	defer fpt.lk.Unlock()

	if tags, ok := fpt.protectedPeers[p]; ok {
		delete(tags, tag)
64 65 66
		if len(tags) == 0 {
			delete(fpt.protectedPeers, p)
		}
67 68 69 70 71 72
		return len(tags) > 0
	}

	return false
}

73 74 75 76 77 78 79
func (fpt *fakePeerTagger) isProtected(p peer.ID) bool {
	fpt.lk.Lock()
	defer fpt.lk.Unlock()

	return len(fpt.protectedPeers[p]) > 0
}

80 81 82 83 84 85 86
func TestAddPeers(t *testing.T) {
	peers := testutil.GeneratePeers(2)
	spm := New(1, &fakePeerTagger{})

	isNew := spm.AddPeer(peers[0])
	if !isNew {
		t.Fatal("Expected peer to be new")
87 88
	}

89 90 91
	isNew = spm.AddPeer(peers[0])
	if isNew {
		t.Fatal("Expected peer to no longer be new")
92 93
	}

94 95 96
	isNew = spm.AddPeer(peers[1])
	if !isNew {
		t.Fatal("Expected peer to be new")
97 98 99
	}
}

100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
func TestRemovePeers(t *testing.T) {
	peers := testutil.GeneratePeers(2)
	spm := New(1, &fakePeerTagger{})

	existed := spm.RemovePeer(peers[0])
	if existed {
		t.Fatal("Expected peer not to exist")
	}

	spm.AddPeer(peers[0])
	spm.AddPeer(peers[1])

	existed = spm.RemovePeer(peers[0])
	if !existed {
		t.Fatal("Expected peer to exist")
115
	}
116 117 118
	existed = spm.RemovePeer(peers[1])
	if !existed {
		t.Fatal("Expected peer to exist")
119
	}
120 121 122
	existed = spm.RemovePeer(peers[0])
	if existed {
		t.Fatal("Expected peer not to have existed")
123 124 125
	}
}

126 127 128
func TestHasPeers(t *testing.T) {
	peers := testutil.GeneratePeers(2)
	spm := New(1, &fakePeerTagger{})
hannahhoward's avatar
hannahhoward committed
129

130 131
	if spm.HasPeers() {
		t.Fatal("Expected not to have peers yet")
hannahhoward's avatar
hannahhoward committed
132 133
	}

134 135 136
	spm.AddPeer(peers[0])
	if !spm.HasPeers() {
		t.Fatal("Expected to have peers")
137 138
	}

139 140 141
	spm.AddPeer(peers[1])
	if !spm.HasPeers() {
		t.Fatal("Expected to have peers")
142 143
	}

144 145 146
	spm.RemovePeer(peers[0])
	if !spm.HasPeers() {
		t.Fatal("Expected to have peers")
147 148
	}

149 150 151 152 153
	spm.RemovePeer(peers[1])
	if spm.HasPeers() {
		t.Fatal("Expected to no longer have peers")
	}
}
154

155 156 157
func TestHasPeer(t *testing.T) {
	peers := testutil.GeneratePeers(2)
	spm := New(1, &fakePeerTagger{})
hannahhoward's avatar
hannahhoward committed
158

159 160
	if spm.HasPeer(peers[0]) {
		t.Fatal("Expected not to have peer yet")
hannahhoward's avatar
hannahhoward committed
161 162
	}

163 164 165
	spm.AddPeer(peers[0])
	if !spm.HasPeer(peers[0]) {
		t.Fatal("Expected to have peer")
hannahhoward's avatar
hannahhoward committed
166 167
	}

168 169 170
	spm.AddPeer(peers[1])
	if !spm.HasPeer(peers[1]) {
		t.Fatal("Expected to have peer")
hannahhoward's avatar
hannahhoward committed
171
	}
172

173 174 175
	spm.RemovePeer(peers[0])
	if spm.HasPeer(peers[0]) {
		t.Fatal("Expected not to have peer")
176 177
	}

178 179 180 181
	if !spm.HasPeer(peers[1]) {
		t.Fatal("Expected to have peer")
	}
}
182

183 184 185
func TestPeers(t *testing.T) {
	peers := testutil.GeneratePeers(2)
	spm := New(1, &fakePeerTagger{})
186

187 188
	if len(spm.Peers()) > 0 {
		t.Fatal("Expected not to have peers yet")
189 190
	}

191 192 193
	spm.AddPeer(peers[0])
	if len(spm.Peers()) != 1 {
		t.Fatal("Expected to have one peer")
194 195
	}

196 197 198
	spm.AddPeer(peers[1])
	if len(spm.Peers()) != 2 {
		t.Fatal("Expected to have two peers")
199 200
	}

201 202 203
	spm.RemovePeer(peers[0])
	if len(spm.Peers()) != 1 {
		t.Fatal("Expected to have one peer")
204
	}
205
}
206

207 208 209
func TestPeersDiscovered(t *testing.T) {
	peers := testutil.GeneratePeers(2)
	spm := New(1, &fakePeerTagger{})
210

211 212
	if spm.PeersDiscovered() {
		t.Fatal("Expected not to have discovered peers yet")
213 214
	}

215 216 217 218
	spm.AddPeer(peers[0])
	if !spm.PeersDiscovered() {
		t.Fatal("Expected to have discovered peers")
	}
219

220 221 222
	spm.RemovePeer(peers[0])
	if !spm.PeersDiscovered() {
		t.Fatal("Expected to still have discovered peers")
223
	}
224
}
225

226 227 228 229
func TestPeerTagging(t *testing.T) {
	peers := testutil.GeneratePeers(2)
	fpt := &fakePeerTagger{}
	spm := New(1, fpt)
230

231 232 233 234
	spm.AddPeer(peers[0])
	if len(fpt.taggedPeers) != 1 {
		t.Fatal("Expected to have tagged one peer")
	}
235

236 237 238 239
	spm.AddPeer(peers[0])
	if len(fpt.taggedPeers) != 1 {
		t.Fatal("Expected to have tagged one peer")
	}
240

241 242 243
	spm.AddPeer(peers[1])
	if len(fpt.taggedPeers) != 2 {
		t.Fatal("Expected to have tagged two peers")
244
	}
245

246 247 248
	spm.RemovePeer(peers[1])
	if len(fpt.taggedPeers) != 1 {
		t.Fatal("Expected to have untagged peer")
249
	}
250 251
}

252 253 254 255 256 257 258 259
func TestProtectConnection(t *testing.T) {
	peers := testutil.GeneratePeers(1)
	peerA := peers[0]
	fpt := newFakePeerTagger()
	spm := New(1, fpt)

	// Should not protect connection if peer hasn't been added yet
	spm.ProtectConnection(peerA)
260
	if fpt.isProtected(peerA) {
261 262 263 264 265 266
		t.Fatal("Expected peer not to be protected")
	}

	// Once peer is added, should be able to protect connection
	spm.AddPeer(peerA)
	spm.ProtectConnection(peerA)
267
	if !fpt.isProtected(peerA) {
268 269 270 271 272
		t.Fatal("Expected peer to be protected")
	}

	// Removing peer should unprotect connection
	spm.RemovePeer(peerA)
273
	if fpt.isProtected(peerA) {
274 275 276 277
		t.Fatal("Expected peer to be unprotected")
	}
}

278 279
func TestShutdown(t *testing.T) {
	peers := testutil.GeneratePeers(2)
280
	fpt := newFakePeerTagger()
281
	spm := New(1, fpt)
282

283 284 285 286
	spm.AddPeer(peers[0])
	spm.AddPeer(peers[1])
	if len(fpt.taggedPeers) != 2 {
		t.Fatal("Expected to have tagged two peers")
287 288
	}

289
	spm.ProtectConnection(peers[0])
290
	if !fpt.isProtected(peers[0]) {
291 292 293
		t.Fatal("Expected peer to be protected")
	}

294
	spm.Shutdown()
295

296 297
	if len(fpt.taggedPeers) != 0 {
		t.Fatal("Expected to have untagged all peers")
298
	}
299 300 301
	if len(fpt.protectedPeers) != 0 {
		t.Fatal("Expected to have unprotected all peers")
	}
302
}