blob: 2008de4e165b2ae2c233495be34c8d7e2546f004 [file] [log] [blame] [edit]
// Copyright 2020 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 crash
import (
"context"
"os"
"golang.org/x/sys/unix"
"chromiumos/tast/local/crash"
"chromiumos/tast/testing"
)
func init() {
testing.AddTest(&testing.Test{
Func: SenderLock,
Desc: "Check that only one crash_sender runs at a time",
Contacts: []string{
"mutexlox@chromium.org",
"iby@chromium.org",
"cros-telemetry@google.com",
"nya@chromium.org", // ported to Tast
},
Attr: []string{"group:mainline"},
// We only care about crash_sender on internal builds.
SoftwareDeps: []string{"cros_internal"},
})
}
func SenderLock(ctx context.Context, s *testing.State) {
if err := crash.SetUpCrashTest(ctx, crash.FilterCrashes(crash.FilterInIgnoreAllCrashes), crash.WithMockConsent()); err != nil {
s.Fatal("Setup failed: ", err)
}
defer crash.TearDownCrashTest(ctx)
const basename = "some_program.1.2.3.4"
if _, err := crash.AddFakeMinidumpCrash(ctx, basename); err != nil {
s.Fatal("Failed to add a fake minidump crash: ", err)
}
// Obtain the crash_sender lock. This should prevent crash_sender from running.
const lockPath = "/run/lock/crash_sender"
f, err := os.OpenFile(lockPath, os.O_CREATE|os.O_RDWR, 0644)
if err != nil {
s.Fatal("Failed to obtain crash_sender lock: ", err)
}
defer f.Close()
if err := unix.FcntlFlock(f.Fd(), unix.F_SETLK, &unix.Flock_t{Type: unix.F_WRLCK}); err != nil {
s.Fatal("Failed to obtain crash_sender lock: ", err)
}
if _, err := crash.RunSender(ctx); err == nil {
s.Fatal("crash_sender succeeded unexpectedly")
}
s.Log("crash_sender failed as expected")
}