Chromium Code Reviews| 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; |
| +} |