service_process_util_unittest.cc revision 21d179b334e59e9a3bfcaed4c4430bef1bc5759d
1731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Use of this source code is governed by a BSD-style license that can be 3731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// found in the LICENSE file. 4731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/at_exit.h" 6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/process_util.h" 7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/string_util.h" 8731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/chrome_version_info.h" 9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/service_process_util.h" 10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "testing/gtest/include/gtest/gtest.h" 11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 13731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST(ServiceProcessUtilTest, ScopedVersionedName) { 14731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string test_str = "test"; 15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string scoped_name = GetServiceProcessScopedVersionedName(test_str); 16731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick chrome::VersionInfo version_info; 17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(version_info.is_valid()); 18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(EndsWith(scoped_name, test_str, true)); 19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_NE(std::string::npos, scoped_name.find(version_info.Version())); 20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 2221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass ServiceProcessStateTest : public testing::Test { 2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen private: 2421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // This is used to release the ServiceProcessState singleton after each test. 2521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen base::ShadowingAtExitManager at_exit_manager_; 2621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}; 2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if defined(OS_WIN) 29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Singleton-ness is only implemented on Windows. 3021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// TODO(sanjeev): Rewrite this test to spawn a new process and test using the 3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// ServiceProcessState singleton across processes. 3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen/* 3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(ServiceProcessStateTest, Singleton) { 34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ServiceProcessState state; 35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(state.Initialize()); 36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // The second instance should fail to Initialize. 37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ServiceProcessState another_state; 38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(another_state.Initialize()); 39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen*/ 41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif // defined(OS_WIN) 42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(ServiceProcessStateTest, ReadyState) { 44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if defined(OS_WIN) 45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // On Posix, we use a lock file on disk to signal readiness. This lock file 46731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // could be lying around from previous crashes which could cause 47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // CheckServiceProcessReady to lie. On Windows, we use a named event so we 48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // don't have this issue. Until we have a more stable signalling mechanism on 49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Posix, this check will only execute on Windows. 50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(CheckServiceProcessReady()); 51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif // defined(OS_WIN) 5221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ServiceProcessState* state = ServiceProcessState::GetInstance(); 5321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_TRUE(state->Initialize()); 5421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen state->SignalReady(NULL); 55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(CheckServiceProcessReady()); 5621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen state->SignalStopped(); 57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(CheckServiceProcessReady()); 58731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 6021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(ServiceProcessStateTest, SharedMem) { 61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if defined(OS_WIN) 62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // On Posix, named shared memory uses a file on disk. This file 63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // could be lying around from previous crashes which could cause 64731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // GetServiceProcessPid to lie. On Windows, we use a named event so we 65731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // don't have this issue. Until we have a more stable shared memory 66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // implementation on Posix, this check will only execute on Windows. 67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(0, GetServiceProcessPid()); 68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif // defined(OS_WIN) 6921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ServiceProcessState* state = ServiceProcessState::GetInstance(); 7021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_TRUE(state->Initialize()); 71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(base::GetCurrentProcId(), GetServiceProcessPid()); 72731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 74