peer_discovery_test.go
1 package lib_tests 2 3 import ( 4 "fmt" 5 "log" 6 mrand "math/rand" 7 "sync" 8 "testing" 9 "time" 10 11 "github.com/schollz/peerdiscovery" 12 ) 13 14 func TestPeerDiscovery(t *testing.T) { 15 //wg := new(sync.WaitGroup) 16 17 for x:=0;x<10;x++{ 18 t.Logf("attempting discovery %d", x+1) 19 ds, err := peerdiscovery.Discover(peerdiscovery.Settings{Limit: 1}) 20 if err != nil { 21 t.Error(err) 22 } 23 24 //t.Logf("Read peer list of %s", "peer 1") 25 for _, d := range ds { 26 fmt.Printf("discovered '%s'\n", d.Address) 27 } 28 } 29 30 /*wg.Add(1) 31 go peerDiscovery(t, "peer 1", wg) 32 33 wg.Add(1) 34 go peerDiscovery(t, "peer 2", wg) 35 */ 36 37 //wg.Wait() 38 } 39 40 func peerDiscovery(t *testing.T, name string, wg *sync.WaitGroup) { 41 t.Logf("Begin discovery %s", name) 42 ds, err := peerdiscovery.Discover(peerdiscovery.Settings{Limit: 1}) 43 if err != nil { 44 t.Error(err) 45 } 46 47 t.Logf("Read peer list of %s", name) 48 for _, d := range ds { 49 fmt.Printf("discovered '%s'\n", d.Address) 50 } 51 wg.Done() 52 } 53 54 func TestAnother(t *testing.T) { 55 fmt.Println("Scanning for 10 seconds to find LAN peers") 56 pl := randStringBytesMaskImprSrc(10) 57 fmt.Printf("Payload sending : '%s'\n", pl) 58 59 // discover peers 60 discoveries, err := peerdiscovery.Discover(peerdiscovery.Settings{ 61 Limit: -1, 62 Payload: []byte(pl), 63 Delay: 500 * time.Millisecond, 64 TimeLimit: 10 * time.Second, 65 Notify: func(d peerdiscovery.Discovered) { 66 log.Println(d) 67 }, 68 }) 69 70 // print out results 71 if err != nil { 72 log.Fatal(err) 73 } else { 74 if len(discoveries) > 0 { 75 fmt.Printf("Found %d other computers\n", len(discoveries)) 76 for i, d := range discoveries { 77 fmt.Printf("%d) '%s' with payload '%s'\n", i, d.Address, d.Payload) 78 } 79 } else { 80 fmt.Println("Found no devices. You need to run this on another computer at the same time.") 81 } 82 } 83 } 84 85 // src is seeds the random generator for generating random strings 86 var src = mrand.NewSource(time.Now().UnixNano()) 87 88 const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 89 const ( 90 letterIdxBits = 6 // 6 bits to represent a letter index 91 letterIdxMask = 1<<letterIdxBits - 1 // All 1-bits, as many as letterIdxBits 92 letterIdxMax = 63 / letterIdxBits // # of letter indices fitting in 63 bits 93 ) 94 95 // RandStringBytesMaskImprSrc prints a random string 96 func randStringBytesMaskImprSrc(n int) string { 97 b := make([]byte, n) 98 // A src.Int63() generates 63 random bits, enough for letterIdxMax characters! 99 for i, cache, remain := n-1, src.Int63(), letterIdxMax; i >= 0; { 100 if remain == 0 { 101 cache, remain = src.Int63(), letterIdxMax 102 } 103 if idx := int(cache & letterIdxMask); idx < len(letterBytes) { 104 b[i] = letterBytes[idx] 105 i-- 106 } 107 cache >>= letterIdxBits 108 remain-- 109 } 110 111 return string(b) 112 }