user_collector_test.cc revision 777484c41cc63e2f97f41a443d1d55f7e6037a5e
1e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
2e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa// Use of this source code is governed by a BSD-style license that can be
3e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa// found in the LICENSE file.
4e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
5777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter#include <unistd.h>
6e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
7e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa#include "base/file_util.h"
8522c061f831325e73e3d46ee2161238ad6fa8b22Chris Sosa#include "crash-reporter/system_logging_mock.h"
9522c061f831325e73e3d46ee2161238ad6fa8b22Chris Sosa#include "crash-reporter/user_collector.h"
10777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter#include "gflags/gflags.h"
11777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter#include "gtest/gtest.h"
12e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
13e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosaint s_crashes = 0;
14e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosabool s_metrics = false;
15e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
16e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosastatic const char kFilePath[] = "/my/path";
17e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
18e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosavoid CountCrash() {
19e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ++s_crashes;
20e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa}
21e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
22e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosabool IsMetrics() {
23e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  return s_metrics;
24e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa}
25e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
26e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosaclass UserCollectorTest : public ::testing::Test {
27e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  void SetUp() {
28e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa    s_crashes = 0;
29e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa    collector_.Initialize(CountCrash,
30e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa                          kFilePath,
31e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa                          IsMetrics,
32777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                          &logging_,
33777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                          false);
34e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa    mkdir("test", 0777);
35e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa    collector_.set_core_pattern_file("test/core_pattern");
36777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    pid_ = getpid();
37e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  }
38e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa protected:
39777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  void TestEnableOK(bool generate_diagnostics);
40777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
41e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  SystemLoggingMock logging_;
42e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  UserCollector collector_;
43777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  pid_t pid_;
44e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa};
45e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
46e4a86037f405415c460ace194fbf16cfd93d4c6Chris SosaTEST_F(UserCollectorTest, EnableOK) {
47e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  std::string contents;
48e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_TRUE(collector_.Enable());
49e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_TRUE(file_util::ReadFileToString(FilePath("test/core_pattern"),
50e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa                                                   &contents));
51777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  ASSERT_EQ("|/my/path --signal=%s --pid=%p", contents);
52e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_EQ(s_crashes, 0);
53e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_NE(logging_.log().find("Enabling crash handling"), std::string::npos);
54e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa}
55e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
56e4a86037f405415c460ace194fbf16cfd93d4c6Chris SosaTEST_F(UserCollectorTest, EnableNoFileAccess) {
57e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  collector_.set_core_pattern_file("/does_not_exist");
58e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_FALSE(collector_.Enable());
59e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_EQ(s_crashes, 0);
60e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_NE(logging_.log().find("Enabling crash handling"), std::string::npos);
61e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_NE(logging_.log().find("Unable to write /does_not_exist"),
62e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa            std::string::npos);
63e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa}
64e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
65e4a86037f405415c460ace194fbf16cfd93d4c6Chris SosaTEST_F(UserCollectorTest, DisableOK) {
66e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  std::string contents;
67e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_TRUE(collector_.Disable());
68e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_TRUE(file_util::ReadFileToString(FilePath("test/core_pattern"),
69e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa                                          &contents));
70777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  ASSERT_EQ("core", contents);
71e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_EQ(s_crashes, 0);
72e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_NE(logging_.log().find("Disabling crash handling"),
73e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa            std::string::npos);
74e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa}
75e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
76e4a86037f405415c460ace194fbf16cfd93d4c6Chris SosaTEST_F(UserCollectorTest, DisableNoFileAccess) {
77e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  collector_.set_core_pattern_file("/does_not_exist");
78e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_FALSE(collector_.Disable());
79e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_EQ(s_crashes, 0);
80e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_NE(logging_.log().find("Disabling crash handling"), std::string::npos);
81e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_NE(logging_.log().find("Unable to write /does_not_exist"),
82e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa            std::string::npos);
83e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa}
84e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
85e4a86037f405415c460ace194fbf16cfd93d4c6Chris SosaTEST_F(UserCollectorTest, HandleCrashWithoutMetrics) {
86e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  s_metrics = false;
87e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  collector_.HandleCrash(10, 20, "foobar");
88e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_NE(logging_.log().find(
89e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa      "Received crash notification for foobar[20] sig 10"),
90e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa      std::string::npos);
91e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_EQ(s_crashes, 0);
92e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa}
93e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
94e4a86037f405415c460ace194fbf16cfd93d4c6Chris SosaTEST_F(UserCollectorTest, HandleCrashWithMetrics) {
95e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  s_metrics = true;
96e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  collector_.HandleCrash(2, 5, "chrome");
97e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_NE(logging_.log().find(
98e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa      "Received crash notification for chrome[5] sig 2"),
99e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa      std::string::npos);
100e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_EQ(s_crashes, 1);
101e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa}
102e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
103777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, GetProcessPath) {
104777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  FilePath path = collector_.GetProcessPath(100);
105777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  ASSERT_EQ("/proc/100", path.value());
106777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter}
107777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
108777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, GetSymlinkTarget) {
109777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  FilePath result;
110777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  ASSERT_FALSE(collector_.GetSymlinkTarget(FilePath("/does_not_exist"),
111777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                           &result));
112777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
113777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  std::string long_link;
114777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  for (int i = 0; i < 50; ++i)
115777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    long_link += "0123456789";
116777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  long_link += "/gold";
117777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
118777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  for (size_t len = 1; len <= long_link.size(); ++len) {
119777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    std::string this_link;
120777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    static const char kLink[] = "test/this_link";
121777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    this_link.assign(long_link.c_str(), len);
122777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    ASSERT_EQ(len, this_link.size());
123777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    unlink(kLink);
124777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    ASSERT_EQ(0, symlink(this_link.c_str(), kLink));
125777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    ASSERT_TRUE(collector_.GetSymlinkTarget(FilePath(kLink), &result));
126777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    ASSERT_EQ(this_link, result.value());
127777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  }
128777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter}
129777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
130777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, GetIdFromStatus) {
131777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  int id = 1;
132777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_FALSE(collector_.GetIdFromStatus(UserCollector::kUserId,
133777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          UserCollector::kIdEffective,
134777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          "nothing here",
135777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          &id));
136777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(id, 1);
137777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
138777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  // Not enough parameters.
139777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_FALSE(collector_.GetIdFromStatus(UserCollector::kUserId,
140777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          UserCollector::kIdReal,
141777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          "line 1\nUid:\t1\n", &id));
142777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
143777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  const char valid_contents[] = "\nUid:\t1\t2\t3\t4\nGid:\t5\t6\t7\t8\n";
144777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_TRUE(collector_.GetIdFromStatus(UserCollector::kUserId,
145777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         UserCollector::kIdReal,
146777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         valid_contents,
147777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         &id));
148777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(1, id);
149777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
150777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_TRUE(collector_.GetIdFromStatus(UserCollector::kUserId,
151777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         UserCollector::kIdEffective,
152777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         valid_contents,
153777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         &id));
154777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(2, id);
155777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
156777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_TRUE(collector_.GetIdFromStatus(UserCollector::kUserId,
157777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         UserCollector::kIdFileSystem,
158777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         valid_contents,
159777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         &id));
160777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(4, id);
161777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
162777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_TRUE(collector_.GetIdFromStatus(UserCollector::kGroupId,
163777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         UserCollector::kIdEffective,
164777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         valid_contents,
165777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         &id));
166777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(6, id);
167777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
168777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_TRUE(collector_.GetIdFromStatus(UserCollector::kGroupId,
169777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         UserCollector::kIdSet,
170777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         valid_contents,
171777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         &id));
172777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(7, id);
173777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
174777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_FALSE(collector_.GetIdFromStatus(UserCollector::kGroupId,
175777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          UserCollector::IdKind(5),
176777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          valid_contents,
177777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          &id));
178777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_FALSE(collector_.GetIdFromStatus(UserCollector::kGroupId,
179777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          UserCollector::IdKind(-1),
180777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          valid_contents,
181777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          &id));
182777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
183777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  // Fail if junk after number
184777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_FALSE(collector_.GetIdFromStatus(UserCollector::kUserId,
185777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          UserCollector::kIdReal,
186777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          "Uid:\t1f\t2\t3\t4\n",
187777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          &id));
188777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_TRUE(collector_.GetIdFromStatus(UserCollector::kUserId,
189777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         UserCollector::kIdReal,
190777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         "Uid:\t1\t2\t3\t4\n",
191777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         &id));
192777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(1, id);
193777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
194777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  // Fail if more than 4 numbers.
195777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_FALSE(collector_.GetIdFromStatus(UserCollector::kUserId,
196777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          UserCollector::kIdReal,
197777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          "Uid:\t1\t2\t3\t4\t5\n",
198777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          &id));
199777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter}
200777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
201777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, GetUserInfoFromName) {
202777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  gid_t gid = 100;
203777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  uid_t uid = 100;
204777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_TRUE(collector_.GetUserInfoFromName("root", &uid, &gid));
205777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(0, uid);
206777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(0, gid);
207777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter}
208777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
209777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, GetCrashDirectoryInfo) {
210777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  FilePath path;
211777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  const int kRootUid = 0;
212777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  const int kRootGid = 0;
213777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  const int kNtpUid = 5;
214777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  const int kChronosUid = 1000;
215777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  const int kChronosGid = 1001;
216777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  const mode_t kExpectedSystemMode = 01755;
217777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  const mode_t kExpectedUserMode = 0755;
218777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
219777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  mode_t directory_mode;
220777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  uid_t directory_owner;
221777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  gid_t directory_group;
222777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
223777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  path = collector_.GetCrashDirectoryInfo(kRootUid,
224777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          kChronosUid,
225777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          kChronosGid,
226777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          &directory_mode,
227777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          &directory_owner,
228777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          &directory_group);
229777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ("/var/spool/crash", path.value());
230777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(kExpectedSystemMode, directory_mode);
231777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(kRootUid, directory_owner);
232777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(kRootGid, directory_group);
233777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
234777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  path = collector_.GetCrashDirectoryInfo(kNtpUid,
235777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          kChronosUid,
236777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          kChronosGid,
237777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          &directory_mode,
238777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          &directory_owner,
239777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          &directory_group);
240777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ("/var/spool/crash", path.value());
241777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(kExpectedSystemMode, directory_mode);
242777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(kRootUid, directory_owner);
243777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(kRootGid, directory_group);
244777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
245777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  path = collector_.GetCrashDirectoryInfo(kChronosUid,
246777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          kChronosUid,
247777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          kChronosGid,
248777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          &directory_mode,
249777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          &directory_owner,
250777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          &directory_group);
251777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ("/home/chronos/user/crash", path.value());
252777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(kExpectedUserMode, directory_mode);
253777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(kChronosUid, directory_owner);
254777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(kChronosGid, directory_group);
255777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter}
256777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
257777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, CopyOffProcFilesBadPath) {
258777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  // Try a path that is not writable.
259777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  ASSERT_FALSE(collector_.CopyOffProcFiles(pid_, FilePath("/bad/path")));
260777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  ASSERT_NE(logging_.log().find(
261777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter      "Could not create /bad/path"),
262777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter            std::string::npos);
263777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter}
264777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
265777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, CopyOffProcFilesBadPid) {
266777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  FilePath container_path("test/container");
267777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  ASSERT_FALSE(collector_.CopyOffProcFiles(0, container_path));
268777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  ASSERT_NE(logging_.log().find(
269777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter      "Path /proc/0 does not exist"),
270777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter            std::string::npos);
271777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter}
272777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
273777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, CopyOffProcFilesOK) {
274777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  FilePath container_path("test/container");
275777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  ASSERT_TRUE(collector_.CopyOffProcFiles(pid_, container_path));
276777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  ASSERT_EQ(logging_.log().find(
277777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter      "Could not copy"), std::string::npos);
278777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  static struct {
279777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    const char *name;
280777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    bool exists;
281777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  } expectations[] = {
282777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    { "auxv", true },
283777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    { "cmdline", true },
284777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    { "environ", true },
285777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    { "maps", true },
286777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    { "mem", false },
287777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    { "mounts", false },
288777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    { "sched", false },
289777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    { "status", true }
290777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  };
291777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  for (unsigned i = 0; i < sizeof(expectations)/sizeof(expectations[0]); ++i) {
292777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    EXPECT_EQ(expectations[i].exists,
293777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter              file_util::PathExists(
294777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                  container_path.Append(expectations[i].name)));
295777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  }
296777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter}
297777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
298777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, FormatDumpBasename) {
299777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  struct tm tm = {0};
300777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  tm.tm_sec = 15;
301777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  tm.tm_min = 50;
302777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  tm.tm_hour = 13;
303777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  tm.tm_mday = 23;
304777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  tm.tm_mon = 4;
305777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  tm.tm_year = 110;
306777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  tm.tm_isdst = -1;
307777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  std::string basename =
308777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter      collector_.FormatDumpBasename("foo", mktime(&tm), 100);
309777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  ASSERT_EQ("foo.20100523.135015.100", basename);
310777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter}
311777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
312e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosaint main(int argc, char **argv) {
313e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ::testing::InitGoogleTest(&argc, argv);
314e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  return RUN_ALL_TESTS();
315e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa}
316