github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/stellar/airdrop/reg_test.go (about)

     1  package stellar
     2  
     3  import (
     4  	"context"
     5  	"net"
     6  	"testing"
     7  
     8  	"github.com/keybase/client/go/kbtest"
     9  	"github.com/keybase/client/go/libkb"
    10  	keybase1 "github.com/keybase/client/go/protocol/keybase1"
    11  	"github.com/keybase/go-framed-msgpack-rpc/rpc"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  // ConnPair is like Unix's SocketPair, but uses TCP so it should work on all platforms.
    16  // Copy/pasta'ed from: https://gist.github.com/tsavola/cd847385989f1ae497dbbcd2bba68753
    17  func connPair() (serverConn, clientConn net.Conn, err error) {
    18  	l, err := net.Listen("tcp", "localhost:0")
    19  	if err != nil {
    20  		return nil, nil, err
    21  	}
    22  	defer l.Close()
    23  
    24  	addr := l.Addr()
    25  	var err2 error
    26  	done := make(chan struct{})
    27  
    28  	go func() {
    29  		defer close(done)
    30  		clientConn, err2 = net.Dial(addr.Network(), addr.String())
    31  	}()
    32  
    33  	serverConn, err = l.Accept()
    34  	<-done
    35  
    36  	if err == nil {
    37  		err = err2
    38  	}
    39  	if err != nil {
    40  		if clientConn != nil {
    41  			clientConn.Close()
    42  		}
    43  		if serverConn != nil {
    44  			serverConn.Close()
    45  		}
    46  	}
    47  	return serverConn, clientConn, err
    48  }
    49  
    50  func newTestClient(conn net.Conn) *Client {
    51  	return &Client{
    52  		dialFunc: func(m libkb.MetaContext) (net.Conn, error) { return conn, nil },
    53  	}
    54  }
    55  
    56  type testProcessor struct {
    57  	details keybase1.AirdropDetails
    58  	err     error
    59  	doneCh  chan struct{}
    60  }
    61  
    62  var _ RequestProcessor = (*testProcessor)(nil)
    63  
    64  func newTestProcessor() *testProcessor {
    65  	return &testProcessor{
    66  		doneCh: make(chan struct{}),
    67  	}
    68  }
    69  
    70  func (p *testProcessor) Reg1(c context.Context, uid keybase1.UID, kid keybase1.BinaryKID, err error) {
    71  }
    72  func (p *testProcessor) Close(ctx context.Context, err error) {}
    73  
    74  func (p *testProcessor) Reg2(ctx context.Context, details keybase1.AirdropDetails, err error) {
    75  	p.details = details
    76  	p.err = err
    77  	p.doneCh <- struct{}{}
    78  }
    79  
    80  func TestReg(t *testing.T) {
    81  	tc := libkb.SetupTest(t, "stellar", 2)
    82  	defer tc.Cleanup()
    83  	fu, err := kbtest.CreateAndSignupFakeUser("t", tc.G)
    84  	require.NoError(t, err)
    85  	serverConn, clientConn, err := connPair()
    86  	require.NoError(t, err)
    87  	tp := newTestProcessor()
    88  	mctx := tc.MetaContext()
    89  	xp := libkb.NewTransportFromSocket(mctx.G(), serverConn, keybase1.NetworkSource_REMOTE)
    90  	srv := rpc.NewServer(xp, libkb.MakeWrapError(mctx.G()))
    91  	err = HandleRequest(mctx.Ctx(), xp, srv, tp)
    92  	require.NoError(t, err)
    93  	go func() {
    94  		cli := newTestClient(clientConn)
    95  		err := cli.Register(mctx)
    96  		require.NoError(t, err)
    97  	}()
    98  	<-tp.doneCh
    99  	require.NoError(t, tp.err)
   100  	require.Equal(t, tp.details.Uid, fu.GetUID())
   101  }