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