package api import ( "context" "net" "testing" "git.julianfamily.org/keepassgo/passwords" keepassgov1 "git.julianfamily.org/keepassgo/proto/keepassgo/v1" "git.julianfamily.org/keepassgo/session" "git.julianfamily.org/keepassgo/vault" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) func TestStartHostServesVaultLifecycleAndSyncsSessionState(t *testing.T) { t.Parallel() lifecycle := &session.Manager{} if err := lifecycle.Create(vault.Model{ Entries: []vault.Entry{ testAPITokenEntry(t), {ID: "entry-1", Title: "Vault Console", Path: []string{"Root", "Internet"}}, }, }, vault.MasterKey{Password: "correct horse battery staple"}); err != nil { t.Fatalf("Create() error = %v", err) } host, err := StartHost("127.0.0.1:0", lifecycle, passwords.DefaultProfiles(), nil, func() bool { return true }) if err != nil { t.Fatalf("StartHost() error = %v", err) } defer func() { _ = host.Stop() }() conn, err := grpc.NewClient("passthrough:///"+host.Address(), grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) { return net.Dial("tcp", host.Address()) }), ) if err != nil { t.Fatalf("grpc.NewClient() error = %v", err) } defer func() { _ = conn.Close() }() client := keepassgov1.NewVaultServiceClient(conn) statusResp, err := client.GetSessionStatus(tokenContext(defaultTestTokenSecret), &keepassgov1.GetSessionStatusRequest{}) if err != nil { t.Fatalf("GetSessionStatus() error = %v", err) } if statusResp.Locked { t.Fatal("GetSessionStatus().Locked = true, want false") } if !statusResp.Dirty { t.Fatal("GetSessionStatus().Dirty = false, want true from dirty provider") } if err := lifecycle.Lock(); err != nil { t.Fatalf("Lock() error = %v", err) } if err := host.SyncFromLifecycle(); err != nil { t.Fatalf("SyncFromLifecycle() after lock error = %v", err) } statusResp, err = client.GetSessionStatus(tokenContext(defaultTestTokenSecret), &keepassgov1.GetSessionStatusRequest{}) if err != nil { t.Fatalf("GetSessionStatus() after lock error = %v", err) } if !statusResp.Locked { t.Fatal("GetSessionStatus().Locked = false, want true after lifecycle lock") } }