Skip to content
Snippets Groups Projects
Select Git revision
  • e2d31b3276e214526fdc7b6b1ab067f1bb2f3f2d
  • release default protected
  • 11-22-implement-kv-interface-defined-in-collectiveversionedkvgo
  • hotfix/TestHostPool_UpdateNdf_AddFilter
  • XX-4719/announcementChannels
  • xx-4717/logLevel
  • jonah/noob-channel
  • master protected
  • XX-4707/tagDiskJson
  • xx-4698/notification-retry
  • hotfix/notifylockup
  • syncNodes
  • hotfix/localCB
  • XX-4677/NewChanManagerMobile
  • XX-4689/DmSync
  • duplicatePrefix
  • XX-4601/HavenInvites
  • finalizedUICallbacks
  • XX-4673/AdminKeySync
  • debugNotifID
  • anne/test
  • v4.7.5
  • v4.7.4
  • v4.7.3
  • v4.7.2
  • v4.7.1
  • v4.6.3
  • v4.6.1
  • v4.5.0
  • v4.4.4
  • v4.3.11
  • v4.3.8
  • v4.3.7
  • v4.3.6
  • v4.3.5
  • v4.2.0
  • v4.3.0
  • v4.3.4
  • v4.3.3
  • v4.3.2
  • v4.3.1
41 results

ud.go

Blame
  • search_test.go 5.94 KiB
    package ud
    
    import (
    	"gitlab.com/elixxir/client/cmix"
    	"gitlab.com/elixxir/client/single"
    	"gitlab.com/elixxir/crypto/contact"
    	"gitlab.com/elixxir/primitives/fact"
    	"gitlab.com/xx_network/crypto/csprng"
    	"gitlab.com/xx_network/primitives/id"
    	"testing"
    	"time"
    )
    
    // Happy path.
    func TestManager_Search(t *testing.T) {
    	// Set up mock UD values
    	grp := getGroup()
    	prng := NewPrng(42)
    	privKeyBytes, err := csprng.GenerateInGroup(
    		grp.GetP().Bytes(), grp.GetP().ByteLen(), prng)
    	if err != nil {
    		t.Fatalf("Failed to generate a mock private key: %v", err)
    	}
    	udMockPrivKey := grp.NewIntFromBytes(privKeyBytes)
    
    	// Set up mock manager
    	m, tnm := newTestManager(t)
    	// Generate callback function
    	callbackChan := make(mockChannel)
    	callback := func(c []contact.Contact, err error) {
    		callbackChan <- mockResponse{
    			c:   c,
    			err: err}
    	}
    
    	// Generate fact list
    	var factList fact.FactList
    	udbId, err := id.Unmarshal(tnm.instance.GetFullNdf().Get().UDB.ID)
    	if err != nil {
    		t.Fatalf("Failed to unmarshal ID in mock ndf: %v", err)
    	}
    	factList = append(factList, fact.Fact{
    		Fact: udbId.String(),
    		T:    fact.Username,
    	})
    
    	grp = getGroup()
    
    	var contacts []*Contact
    	udContact, err := m.GetContact()
    	if err != nil {
    		t.Fatalf("Failed to get ud contact: %v", err)
    	}
    	contacts = append(contacts, &Contact{
    		UserID: udContact.ID.Bytes(),
    		PubKey: udContact.DhPubKey.Bytes(),
    	})
    
    	// Generate a mock UD service to respond to the search request
    
    	receiver := newMockReceiver(callbackChan, contacts, t)
    
    	mockListener := single.Listen(SearchTag, udbId, udMockPrivKey,
    		tnm, grp, receiver)
    	defer mockListener.Stop()
    
    	timeout := 100 * time.Millisecond
    	p := single.RequestParams{
    		Timeout:             timeout,
    		MaxResponseMessages: 1,
    		CmixParams:          cmix.GetDefaultCMIXParams(),
    	}
    
    	_, _, err = Search(m.network, m.events, prng, m.e2e.GetGroup(),
    		udContact, callback, factList, p)
    	if err != nil {
    		t.Fatalf("Search() returned an error: %+v", err)
    	}
    
    	// Verify the callback is called
    	select {
    	case cb := <-callbackChan:
    		if cb.err != nil {
    			t.Fatalf("Callback returned an error: %+v", cb.err)
    		}
    
    		expectedContacts := []contact.Contact{udContact}
    		if !contact.Equal(expectedContacts[0], cb.c[0]) {
    			t.Errorf("Failed to get expected Contacts."+
    				"\n\texpected: %+v\n\treceived: %+v", expectedContacts, cb.c)
    		}
    	case <-time.After(timeout):
    		t.Error("Callback not called.")
    	}
    }
    
    // todo; note this was commented out in release
    // // Error path: the callback returns an error.
    // func TestManager_Search_CallbackError(t *testing.T) {
    // 	isReg := uint32(1)
    // 	// Set up manager
    // 	m := &Manager{
    // 		rng:        fastRNG.NewStreamGenerator(12, 3, csprng.NewSystemRNG),
    // 		grp:        cyclic.NewGroup(large.NewInt(107), large.NewInt(2)),
    // 		storage:    storage.InitTestingSession(t),
    // 		udContact:  contact.Contact{ID: &id.UDB},
    // 		net:        newTestNetworkManager(t),
    // 		registered: &isReg,
    // 	}
    //
    // 	// Generate callback function
    // 	callbackChan := make(chan struct {
    // 		c   []contact.Contact
    // 		err error
    // 	})
    // 	callback := func(c []contact.Contact, err error) {
    // 		callbackChan <- struct {
    // 			c   []contact.Contact
    // 			err error
    // 		}{c: c, err: err}
    // 	}
    //
    // 	// Generate fact list
    // 	factList := fact.FactList{
    // 		{Fact: "fact1", T: fact.Username},
    // 		{Fact: "fact2", T: fact.Email},
    // 		{Fact: "fact3", T: fact.Phone},
    // 	}
    //
    // 	// Trigger lookup response chan
    // 	// go func() {
    // 	// 	time.Sleep(1 * time.Millisecond)
    // 	// 	m.inProgressSearch[0] <- &SearchResponse{
    // 	// 		Contacts: nil,
    // 	// 		Error:    "Error",
    // 	// 	}
    // 	// }()
    //
    // 	// Run the search
    // 	err := m.Search(factList, callback, 10*time.Millisecond)
    // 	if err != nil {
    // 		t.Errorf("Search() returned an error: %+v", err)
    // 	}
    //
    // 	// Verify the callback is called
    // 	select {
    // 	case cb := <-callbackChan:
    // 		if cb.err == nil {
    // 			t.Error("Callback did not return an expected error.")
    // 		}
    //
    // 		if cb.c != nil {
    // 			t.Errorf("Failed to get expected Contacts."+
    // 				"\n\texpected: %v\n\treceived: %v", nil, cb.c)
    // 		}
    // 	case <-time.After(100 * time.Millisecond):
    // 		t.Error("Callback not called.")
    // 	}
    //
    // 	// if _, exists := m.inProgressSearch[m.commID-1]; exists {
    // 	// 	t.Error("Failed to delete SearchResponse from inProgressSearch.")
    // 	// }
    // }
    //
    // todo; note this was commented out in release
    // // Error path: the round event chan times out.
    // func TestManager_Search_EventChanTimeout(t *testing.T) {
    // 	isReg := uint32(1)
    // 	// Set up manager
    // 	m := &State{
    // 		rng:        fastRNG.NewStreamGenerator(12, 3, csprng.NewSystemRNG),
    // 		grp:        cyclic.NewGroup(large.NewInt(107), large.NewInt(2)),
    // 		storage:    storage.InitTestingSession(t),
    // 		udContact:  contact.Contact{ID: &id.UDB},
    // 		net:        newTestNetworkManager(t),
    // 		registered: &isReg,
    // 	}
    //
    // 	// Generate callback function
    // 	callbackChan := make(chan struct {
    // 		c   []contact.Contact
    // 		err error
    // 	})
    // 	callback := func(c []contact.Contact, err error) {
    // 		callbackChan <- struct {
    // 			c   []contact.Contact
    // 			err error
    // 		}{c: c, err: err}
    // 	}
    //
    // 	// Generate fact list
    // 	factList := fact.FactList{
    // 		{Fact: "fact1", T: fact.Username},
    // 		{Fact: "fact2", T: fact.Email},
    // 		{Fact: "fact3", T: fact.Phone},
    // 	}
    //
    // 	// Run the search
    // 	err := m.Search(factList, callback, 10*time.Millisecond)
    // 	if err != nil {
    // 		t.Errorf("Search() returned an error: %+v", err)
    // 	}
    //
    // 	// Verify the callback is called
    // 	select {
    // 	case cb := <-callbackChan:
    // 		if cb.err == nil {
    // 			t.Error("Callback did not return an expected error.")
    // 		}
    //
    // 		if cb.c != nil {
    // 			t.Errorf("Failed to get expected Contacts."+
    // 				"\n\texpected: %v\n\treceived: %v", nil, cb.c)
    // 		}
    // 	case <-time.After(100 * time.Millisecond):
    // 		t.Error("Callback not called.")
    // 	}
    //
    // 	// if _, exists := m.inProgressSearch[m.commID-1]; exists {
    // 	// 	t.Error("Failed to delete SearchResponse from inProgressSearch.")
    // 	// }
    // }