github.com/status-im/status-go@v1.1.0/server/pairing/peers/udp_notifier_test.go (about)

     1  package peers
     2  
     3  import (
     4  	"runtime"
     5  	"sync"
     6  	"testing"
     7  	"time"
     8  
     9  	udpp2p "github.com/schollz/peerdiscovery"
    10  	"github.com/stretchr/testify/suite"
    11  
    12  	"github.com/status-im/status-go/server/servertest"
    13  )
    14  
    15  func TestUDPPeerDiscoverySuite(t *testing.T) {
    16  	suite.Run(t, new(UDPPeerDiscoverySuite))
    17  }
    18  
    19  type UDPPeerDiscoverySuite struct {
    20  	suite.Suite
    21  	servertest.TestLoggerComponents
    22  }
    23  
    24  func (s *UDPPeerDiscoverySuite) SetupSuite() {
    25  	s.SetupLoggerComponents()
    26  }
    27  
    28  type testSignalLogger struct {
    29  	log  map[string]map[string]bool
    30  	lock sync.Mutex
    31  }
    32  
    33  func newTestSignalLogger() *testSignalLogger {
    34  	tsl := new(testSignalLogger)
    35  	tsl.log = make(map[string]map[string]bool)
    36  	return tsl
    37  }
    38  
    39  func (t *testSignalLogger) testSignal(h *LocalPairingPeerHello) {
    40  	t.lock.Lock()
    41  	defer t.lock.Unlock()
    42  
    43  	if _, ok := t.log[h.Discovered.Address]; !ok {
    44  		t.log[h.Discovered.Address] = make(map[string]bool)
    45  	}
    46  	t.log[h.Discovered.Address][h.DeviceName] = true
    47  }
    48  
    49  func (s *UDPPeerDiscoverySuite) TestUDPNotifier() {
    50  	tsl := newTestSignalLogger()
    51  
    52  	u1, err := NewUDPNotifier(s.Logger, tsl.testSignal)
    53  	s.Require().NoError(err)
    54  
    55  	u2, err := NewUDPNotifier(s.Logger, tsl.testSignal)
    56  	s.Require().NoError(err)
    57  
    58  	n1 := "device 1"
    59  	n2 := "device 2"
    60  
    61  	wg := sync.WaitGroup{}
    62  	wg.Add(1)
    63  	go func() {
    64  		settings, err := u1.MakeUDPP2PSettings(n1, runtime.GOOS)
    65  		s.Require().NoError(err)
    66  
    67  		settings.TimeLimit = 2 * time.Second
    68  		settings.Limit = 4
    69  		settings.AllowSelf = true
    70  
    71  		_, err = udpp2p.Discover(*settings)
    72  		s.Require().NoError(err)
    73  		wg.Done()
    74  	}()
    75  
    76  	wg.Add(1)
    77  	go func() {
    78  		settings, err := u2.MakeUDPP2PSettings(n2, runtime.GOOS)
    79  		s.Require().NoError(err)
    80  
    81  		settings.TimeLimit = 2 * time.Second
    82  		settings.Limit = 4
    83  		settings.AllowSelf = true
    84  
    85  		_, err = udpp2p.Discover(*settings)
    86  		s.Require().NoError(err)
    87  		wg.Done()
    88  	}()
    89  
    90  	wg.Wait()
    91  
    92  	s.Require().NotEmpty(tsl.log)
    93  
    94  	for _, address := range tsl.log {
    95  		s.Require().Len(address, 2)
    96  
    97  		for device := range address {
    98  			if !(device == n1 || device == n2) {
    99  				s.Require().Failf("unknown device name", device)
   100  			}
   101  		}
   102  	}
   103  }