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; |
+} |