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

Unified Diff: chrome/browser/process_singleton_posix_unittest.cc

Issue 2880333004: Fix not deleting a lockfile or not killing a frozen browser on hostname change (Closed)
Patch Set: Renamed KillProcessByLockPath() parameter to is_connected_to_socket Created 3 years, 6 months 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
« no previous file with comments | « chrome/browser/process_singleton_posix.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/process_singleton_posix_unittest.cc
diff --git a/chrome/browser/process_singleton_posix_unittest.cc b/chrome/browser/process_singleton_posix_unittest.cc
index 9b09212498b2c0785a0f92d078c2aa9e499d63a2..005cd38dbedb5e40575f3a48b20dc03dc2e47bb1 100644
--- a/chrome/browser/process_singleton_posix_unittest.cc
+++ b/chrome/browser/process_singleton_posix_unittest.cc
@@ -83,6 +83,7 @@ class ProcessSingletonPosixTest : public testing::Test {
ProcessSingleton::DisablePromptForTesting();
ProcessSingleton::SkipIsChromeProcessCheckForTesting(false);
+ ProcessSingleton::SetUserOptedUnlockInUseProfileForTesting(false);
// Put the lock in a temporary directory. Doesn't need to be a
// full profile to test this code.
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
@@ -338,9 +339,10 @@ TEST_F(ProcessSingletonPosixTest, NotifyOtherProcessHostChanged) {
CheckNotified();
}
-// Test that we fail when lock says process is on another host and we can't
-// notify it over the socket.
+// Test that we kill hung browser when lock says process is on another host and
+// we can't notify it over the socket.
TEST_F(ProcessSingletonPosixTest, NotifyOtherProcessDifferingHost) {
+ base::HistogramTester histogram_tester;
CreateProcessSingletonOnThread();
BlockWorkerThread();
@@ -348,16 +350,62 @@ TEST_F(ProcessSingletonPosixTest, NotifyOtherProcessDifferingHost) {
EXPECT_EQ(0, unlink(lock_path_.value().c_str()));
EXPECT_EQ(0, symlink("FAKEFOOHOST-1234", lock_path_.value().c_str()));
- EXPECT_EQ(ProcessSingleton::PROFILE_IN_USE, NotifyOtherProcess(false));
+ EXPECT_EQ(ProcessSingleton::PROCESS_NONE, NotifyOtherProcess(true));
+ ASSERT_EQ(1, kill_callbacks_);
- ASSERT_EQ(0, unlink(lock_path_.value().c_str()));
+ // lock_path_ should be unlinked in NotifyOtherProcess().
+ base::FilePath target_path;
+ EXPECT_FALSE(base::ReadSymbolicLink(lock_path_, &target_path));
UnblockWorkerThread();
+
+ histogram_tester.ExpectUniqueSample(
+ "Chrome.ProcessSingleton.RemoteHungProcessTerminateReason",
+ ProcessSingleton::SOCKET_READ_FAILED, 1u);
}
-// Test that we fail when lock says process is on another host and we can't
-// notify it over the socket.
+// Test that we'll start creating ProcessSingleton when we have old lock file
+// that says process is on another host and there is browser with the same pid
+// but with another user data dir. Also suppose that user opted to unlock
+// profile.
+TEST_F(ProcessSingletonPosixTest,
+ NotifyOtherProcessDifferingHost_UnlockedProfileBeforeKill) {
+ base::HistogramTester histogram_tester;
+ CreateProcessSingletonOnThread();
+
+ BlockWorkerThread();
+
+ EXPECT_EQ(0, unlink(lock_path_.value().c_str()));
+ EXPECT_EQ(0, symlink("FAKEFOOHOST-1234", lock_path_.value().c_str()));
+
+ // Remove socket so that we will not be able to notify the existing browser.
+ EXPECT_EQ(0, unlink(socket_path_.value().c_str()));
+
+ // Unlock profile that was locked by process on another host.
+ ProcessSingleton::SetUserOptedUnlockInUseProfileForTesting(true);
+ // Treat process with pid 1234 as browser with different user data dir.
+ ProcessSingleton::SkipIsChromeProcessCheckForTesting(true);
+
+ EXPECT_EQ(ProcessSingleton::PROCESS_NONE, NotifyOtherProcess(false));
+
+ // lock_path_ should be unlinked in NotifyOtherProcess().
+ base::FilePath target_path;
+ EXPECT_FALSE(base::ReadSymbolicLink(lock_path_, &target_path));
+
+ UnblockWorkerThread();
+
+ histogram_tester.ExpectUniqueSample(
+ "Chrome.ProcessSingleton.RemoteHungProcessTerminateReason",
+ ProcessSingleton::NOTIFY_ATTEMPTS_EXCEEDED, 1u);
+ histogram_tester.ExpectUniqueSample(
+ "Chrome.ProcessSingleton.RemoteProcessInteractionResult",
+ ProcessSingleton::PROFILE_UNLOCKED_BEFORE_KILL, 1u);
+}
+
+// Test that we unlock profile when lock says process is on another host and we
+// can't notify it over the socket.
TEST_F(ProcessSingletonPosixTest, NotifyOtherProcessOrCreate_DifferingHost) {
+ base::HistogramTester histogram_tester;
CreateProcessSingletonOnThread();
BlockWorkerThread();
@@ -365,12 +413,21 @@ TEST_F(ProcessSingletonPosixTest, NotifyOtherProcessOrCreate_DifferingHost) {
EXPECT_EQ(0, unlink(lock_path_.value().c_str()));
EXPECT_EQ(0, symlink("FAKEFOOHOST-1234", lock_path_.value().c_str()));
+ // Remove socket so that we will not be able to notify the existing browser.
+ EXPECT_EQ(0, unlink(socket_path_.value().c_str()));
+ // Unlock profile that was locked by process on another host.
+ ProcessSingleton::SetUserOptedUnlockInUseProfileForTesting(true);
+
std::string url("about:blank");
- EXPECT_EQ(ProcessSingleton::PROFILE_IN_USE, NotifyOtherProcessOrCreate(url));
+ EXPECT_EQ(ProcessSingleton::PROCESS_NONE, NotifyOtherProcessOrCreate(url));
ASSERT_EQ(0, unlink(lock_path_.value().c_str()));
UnblockWorkerThread();
+
+ histogram_tester.ExpectUniqueSample(
+ "Chrome.ProcessSingleton.RemoteProcessInteractionResult",
+ ProcessSingleton::PROFILE_UNLOCKED, 1u);
}
// Test that Create fails when another browser is using the profile directory.
« no previous file with comments | « chrome/browser/process_singleton_posix.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698