/ lib_tests / peer_discovery_test.go
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  }