@@ -274,6 +274,39 @@ func TestNewIggyTcpClient_StoresProvidedLogger(t *testing.T) {
274274 }
275275}
276276
277+ func TestLoginUser_LoginAndLogout (t * testing.T ) {
278+ c , serverConn := newTestClient (t )
279+
280+ identity := make ([]byte , 4 )
281+ binary .LittleEndian .PutUint32 (identity , 42 )
282+
283+ go func () {
284+ serverRespond (t , serverConn , 0 , identity )
285+ // login always probes for a leader afterwards; it must be answered or the call blocks.
286+ serverRespond (t , serverConn , uint32 (ierror .FeatureUnavailableCode ), nil )
287+ serverRespond (t , serverConn , 0 , nil )
288+ }()
289+
290+ ctx := context .Background ()
291+ info , err := c .LoginUser (ctx , "iggy" , "iggy" )
292+ if err != nil {
293+ t .Fatalf ("unexpected login error: %v" , err )
294+ }
295+ if info .UserId != 42 {
296+ t .Errorf ("got user id %d, want 42" , info .UserId )
297+ }
298+ if c .sessionState != iggcon .SessionStateAuthenticated {
299+ t .Errorf ("expected session %v after login, got %v" , iggcon .SessionStateAuthenticated , c .sessionState )
300+ }
301+
302+ if err := c .LogoutUser (ctx ); err != nil {
303+ t .Fatalf ("unexpected logout error: %v" , err )
304+ }
305+ if c .sessionState != iggcon .SessionStateUnauthenticated {
306+ t .Errorf ("expected session %v after logout, got %v" , iggcon .SessionStateUnauthenticated , c .sessionState )
307+ }
308+ }
309+
277310func TestLoginUser_RejectedReloginKeepsExistingSession (t * testing.T ) {
278311 c , serverConn := newTestClient (t )
279312 c .sessionState = iggcon .SessionStateAuthenticated
0 commit comments