blob: 65267e817ff5d8fcfee7a67e5fb7de9dbbd5777e [file] [log] [blame] [edit]
// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package session
import (
"context"
"github.com/godbus/dbus"
"chromiumos/tast/local/cryptohome"
"chromiumos/tast/local/session"
"chromiumos/tast/local/upstart"
"chromiumos/tast/testing"
)
func init() {
testing.AddTest(&testing.Test{
Func: RejectDuplicate,
Desc: "Ensures that the session_manager won't start the same session twice",
Contacts: []string{
"mnissler@chromium.org", // session_manager owner
"hidehiko@chromium.org", // Tast port author
},
SoftwareDeps: []string{"chrome"},
Attr: []string{"group:mainline"},
})
}
func RejectDuplicate(ctx context.Context, s *testing.State) {
if err := upstart.RestartJob(ctx, "ui"); err != nil {
s.Fatal("Failed to restart session_manager: ", err)
}
const user = "first_user@nowhere.com"
// Create clean vault.
if err := cryptohome.RemoveVault(ctx, user); err != nil {
s.Fatalf("Failed to remove the vault for %s: %v", user, err)
}
if err := cryptohome.CreateVault(ctx, user, ""); err != nil {
s.Fatalf("Failed to create a vault for %s: %v", user, err)
}
defer cryptohome.RemoveVault(ctx, user)
// Start the first session.
sm, err := session.NewSessionManager(ctx)
if err != nil {
s.Fatal("Failed to create session_manager binding: ", err)
}
if err := session.PrepareChromeForPolicyTesting(ctx, sm); err != nil {
s.Fatal("Failed to prepare Chrome for testing: ", err)
}
if err = sm.StartSession(ctx, user, ""); err != nil {
s.Fatalf("Failed to start new session for %s: %v", user, err)
}
// Second StartSession() should fail with SessionExists.
if err = sm.StartSession(ctx, user, ""); err == nil {
s.Fatalf("Unexpectedly succeeded to start session for %s twice", user)
} else if e, ok := err.(dbus.Error); !ok || e.Name != "org.chromium.SessionManagerInterface.SessionExists" {
s.Error("Unexpected error: ", err)
}
}