Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10558)

Unified Diff: chrome/common/multi_process_lock_unittest.cc

Issue 4721001: Add multi_process_lock to chrome/common (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix up linux not compiling Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/common/multi_process_lock_unittest.cc
diff --git a/chrome/common/multi_process_lock_unittest.cc b/chrome/common/multi_process_lock_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..9afed7904bbb4694685cfc48e380b55e9d1facc2
--- /dev/null
+++ b/chrome/common/multi_process_lock_unittest.cc
@@ -0,0 +1,101 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "build/build_config.h"
+
+#if defined(OS_LINUX)
+#include <sys/un.h>
+#endif // defined(OS_LINUX)
+
+#include "base/basictypes.h"
+#include "base/scoped_ptr.h"
+#include "base/stringprintf.h"
+#include "base/test/multiprocess_test.h"
+#include "chrome/common/multi_process_lock.h"
+#include "testing/multiprocess_func_list.h"
+
+static char kMutexName[] = "shared_mutex_unittest " __DATE__ " " __TIME__;
Mark Mentovai 2010/11/15 23:42:55 This is no good. Multiple invocations of the same
dmac 2010/11/15 23:55:24 How do you suggest adding the randomness you seek?
Mark Mentovai 2010/11/16 04:05:50 Can you pass a cookie to the processes on the comm
dmac 2010/11/16 17:54:17 Done.
+
+class MultiProcessLockTest : public base::MultiProcessTest {
+};
+
+TEST_F(MultiProcessLockTest, BasicCreationTest) {
+ // Test basic creation/destruction with no lock taken
+ scoped_ptr<MultiProcessLock> scoped(MultiProcessLock::Create(kMutexName));
+ scoped.reset(NULL);
+}
+
+TEST_F(MultiProcessLockTest, LongNameTest) {
+ // Linux has a max path name of 108 characters.
+ // http://lxr.linux.no/linux+v2.6.36/include/linux/un.h
+ // This is enforced on all platforms.
+ std::string name("This is a name that is longer than one hundred and eight "
+ "characters to make sure that we fail appropriately on linux when we "
+ "have a path that is to long for linux to handle " __DATE__ " " __TIME__);
Mark Mentovai 2010/11/15 23:42:55 And these guys are just gratuitous. Take them out.
dmac 2010/11/16 17:54:17 Done.
+ scoped_ptr<MultiProcessLock> test_lock(MultiProcessLock::Create(name));
+ EXPECT_FALSE(test_lock->TryLock());
+}
+
+TEST_F(MultiProcessLockTest, SimpleLock) {
+ scoped_ptr<MultiProcessLock> test_lock(MultiProcessLock::Create(kMutexName));
+ EXPECT_TRUE(test_lock->TryLock());
+ base::ProcessHandle handle = SpawnChild("MultiProcessLockTryFailMain", false);
+ ASSERT_TRUE(handle);
+ int exit_code = 0;
+ EXPECT_TRUE(base::WaitForExitCode(handle, &exit_code));
+ EXPECT_EQ(exit_code, 0);
+ test_lock->Unlock();
+ handle = SpawnChild("MultiProcessLockTrySucceedMain", false);
+ ASSERT_TRUE(handle);
+ EXPECT_TRUE(base::WaitForExitCode(handle, &exit_code));
+ EXPECT_EQ(exit_code, 0);
+}
+
+TEST_F(MultiProcessLockTest, RecursiveLock) {
+ scoped_ptr<MultiProcessLock> test_lock(MultiProcessLock::Create(kMutexName));
+ EXPECT_TRUE(test_lock->TryLock());
+
+ // Will cause LOG in debug, but will complete.
+ EXPECT_TRUE(test_lock->TryLock());
+ test_lock->Unlock();
+
+ // Will cause LOG in debug, but will complete.
+ test_lock->Unlock();
+ test_lock.reset();
+}
+
+TEST_F(MultiProcessLockTest, LockScope) {
+ // Check to see that lock is released when it goes out of scope.
Mark Mentovai 2010/11/15 23:42:55 This doesn’t really check with {scoping}, which is
dmac 2010/11/15 23:55:24 Why isn't the scoped_ptr with a reset not giving u
Mark Mentovai 2010/11/16 04:05:50 It simulates it, but I was hoping for a check that
dmac 2010/11/16 17:54:17 Done.
+ scoped_ptr<MultiProcessLock> test_lock(MultiProcessLock::Create(kMutexName));
+ EXPECT_TRUE(test_lock->TryLock());
+ test_lock.reset(MultiProcessLock::Create(kMutexName));
+ EXPECT_TRUE(test_lock->TryLock());
Mark Mentovai 2010/11/15 23:42:55 Also, this will still be true if the lock is still
dmac 2010/11/15 23:55:24 Good point. I'll look into this one...
dmac 2010/11/16 17:54:17 Done.
+ test_lock.reset();
+}
+
+#if defined(OS_LINUX)
+TEST_F(MultiProcessLockTest, MaxNameLength) {
Mark Mentovai 2010/11/15 23:42:55 Ah, I see what you’ve done. I think the COMPILE_A
dmac 2010/11/15 23:55:24 Ah... missed the assert. Went looking for it, and
dmac 2010/11/16 17:54:17 Done.
+ // +1 for terminator, +1 for 0 in position 0 that makes it an
+ // abstract named socket.
+ // If this test fails it is because sockaddr_un.sun_path size has been
+ // redefined and MULTI_PROCESS_LOCK_NAME_MAX_LEN can change accordingly.
+ // Only tested on Linux because it is the only platform that has a limit.
+ struct sockaddr_un addr;
+ EXPECT_EQ(sizeof(addr.sun_path),
+ MultiProcessLock::MULTI_PROCESS_LOCK_NAME_MAX_LEN + 2);
+}
+#endif // defined(OS_LINUX)
+
+MULTIPROCESS_TEST_MAIN(MultiProcessLockTryFailMain) {
+ scoped_ptr<MultiProcessLock> test_lock(MultiProcessLock::Create(kMutexName));
+ EXPECT_FALSE(test_lock->TryLock());
+ return 0;
+}
+
+
Mark Mentovai 2010/11/15 23:42:55 Extra blank line.
dmac 2010/11/16 17:54:17 Done.
+MULTIPROCESS_TEST_MAIN(MultiProcessLockTrySucceedMain) {
+ scoped_ptr<MultiProcessLock> test_lock(MultiProcessLock::Create(kMutexName));
+ EXPECT_TRUE(test_lock->TryLock());
+ return 0;
+}

Powered by Google App Engine
This is Rietveld 408576698