github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/systests/account_deadlock_test.go (about)

     1  // Copyright 2015 Keybase, Inc. All rights reserved. Use of
     2  // this source code is governed by the included BSD license.
     3  
     4  package systests
     5  
     6  // Test various RPCs that are used mainly in other clients but not by the CLI.
     7  
     8  import (
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/keybase/client/go/client"
    13  	"github.com/keybase/client/go/libkb"
    14  	keybase1 "github.com/keybase/client/go/protocol/keybase1"
    15  	"github.com/keybase/client/go/service"
    16  	context "golang.org/x/net/context"
    17  )
    18  
    19  func TestAccountDeadlock(t *testing.T) {
    20  	tc := setupTest(t, "deadlock")
    21  	defer tc.Cleanup()
    22  	tc2 := cloneContext(tc)
    23  	defer tc2.Cleanup()
    24  
    25  	stopCh := make(chan error)
    26  	svc := service.NewService(tc.G, false)
    27  	startCh := svc.GetStartChannel()
    28  	go func() {
    29  		err := svc.Run()
    30  		if err != nil {
    31  			t.Logf("Running the service produced an error: %v", err)
    32  		}
    33  		stopCh <- err
    34  	}()
    35  
    36  	<-startCh
    37  
    38  	signupDoneCh := make(chan struct{})
    39  
    40  	go func() {
    41  		issueSignup(t, tc2.G)
    42  		signupDoneCh <- struct{}{}
    43  	}()
    44  
    45  	currentStatusLoop(t, tc2.G, signupDoneCh)
    46  
    47  	if err := CtlStop(tc2.G); err != nil {
    48  		t.Fatal(err)
    49  	}
    50  
    51  	// If the server failed, it's also an error
    52  	if err := <-stopCh; err != nil {
    53  		t.Fatal(err)
    54  	}
    55  }
    56  
    57  func issueSignup(t *testing.T, g *libkb.GlobalContext) {
    58  	cli, err := client.GetSignupClient(g)
    59  	if err != nil {
    60  		t.Fatalf("failed to get new identifyclient: %v", err)
    61  	}
    62  
    63  	id, err := libkb.RandString("", 5)
    64  	if err != nil {
    65  		t.Fatalf("Failed to get a random string: %s", err)
    66  	}
    67  
    68  	arg := keybase1.SignupArg{
    69  		Email:      "test+" + id + "@keyba.se",
    70  		Passphrase: "strong-password",
    71  		Username:   "t_" + id,
    72  		DeviceName: "dev0",
    73  		InviteCode: "202020202020202020202020",
    74  		DeviceType: keybase1.DeviceType_DESKTOP,
    75  	}
    76  
    77  	if _, err := cli.Signup(context.TODO(), arg); err != nil {
    78  		t.Fatalf("signup failed: %s", err)
    79  	}
    80  }
    81  
    82  func currentStatusLoop(t *testing.T, g *libkb.GlobalContext, stopCh chan struct{}) {
    83  	cli, err := client.GetSessionClient(g)
    84  	if err != nil {
    85  		t.Fatal(err)
    86  	}
    87  	for {
    88  		select {
    89  		case <-stopCh:
    90  			return
    91  		case <-time.After(50 * time.Millisecond):
    92  			_, err := cli.CurrentSession(context.TODO(), 0)
    93  			if err != nil {
    94  				if _, ok := err.(libkb.NoSessionError); !ok {
    95  					t.Fatal(err)
    96  				}
    97  			}
    98  		}
    99  	}
   100  }