user_collector_test.cc revision 2953c3a87a7b201bbf08555129f0640ede1d0cdb
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
130340316050044e0995b98fea87ed41ea77abb28bKen Mixterstatic int s_crashes = 0;
140340316050044e0995b98fea87ed41ea77abb28bKen Mixterstatic bool s_metrics = false;
15e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
16e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosastatic const char kFilePath[] = "/my/path";
17e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
182953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter// This test assumes the following standard binaries are installed.
192953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixterstatic const char kBinBash[] = "/bin/bash";
202953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixterstatic const char kBinCp[] = "/bin/cp";
212953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixterstatic const char kBinEcho[] = "/bin/echo";
222953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixterstatic const char kBinFalse[] = "/bin/false";
232953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter
24e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosavoid CountCrash() {
25e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ++s_crashes;
26e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa}
27e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
28e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosabool IsMetrics() {
29e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  return s_metrics;
30e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa}
31e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
32e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosaclass UserCollectorTest : public ::testing::Test {
33e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  void SetUp() {
34e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa    s_crashes = 0;
35e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa    collector_.Initialize(CountCrash,
36e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa                          kFilePath,
37e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa                          IsMetrics,
38777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                          &logging_,
39777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                          false);
40e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa    mkdir("test", 0777);
41e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa    collector_.set_core_pattern_file("test/core_pattern");
42777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    pid_ = getpid();
43e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  }
44e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa protected:
45777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  void TestEnableOK(bool generate_diagnostics);
46777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
472953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  void ExpectFileEquals(const char *golden,
482953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter                        const char *file_path) {
492953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter    std::string contents;
502953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter    EXPECT_TRUE(file_util::ReadFileToString(FilePath(file_path),
512953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter                                            &contents));
522953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter    EXPECT_EQ(golden, contents);
532953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  }
542953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter
55e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  SystemLoggingMock logging_;
56e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  UserCollector collector_;
57777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  pid_t pid_;
58e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa};
59e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
60e4a86037f405415c460ace194fbf16cfd93d4c6Chris SosaTEST_F(UserCollectorTest, EnableOK) {
61e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_TRUE(collector_.Enable());
622953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  ExpectFileEquals("|/my/path --signal=%s --pid=%p", "test/core_pattern");
63e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_EQ(s_crashes, 0);
640340316050044e0995b98fea87ed41ea77abb28bKen Mixter  ASSERT_NE(logging_.log().find("Enabling user crash handling"),
650340316050044e0995b98fea87ed41ea77abb28bKen Mixter            std::string::npos);
66e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa}
67e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
68e4a86037f405415c460ace194fbf16cfd93d4c6Chris SosaTEST_F(UserCollectorTest, EnableNoFileAccess) {
69e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  collector_.set_core_pattern_file("/does_not_exist");
70e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_FALSE(collector_.Enable());
71e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_EQ(s_crashes, 0);
720340316050044e0995b98fea87ed41ea77abb28bKen Mixter  ASSERT_NE(logging_.log().find("Enabling user crash handling"),
730340316050044e0995b98fea87ed41ea77abb28bKen Mixter            std::string::npos);
74e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_NE(logging_.log().find("Unable to write /does_not_exist"),
75e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa            std::string::npos);
76e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa}
77e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
78e4a86037f405415c460ace194fbf16cfd93d4c6Chris SosaTEST_F(UserCollectorTest, DisableOK) {
79e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_TRUE(collector_.Disable());
802953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  ExpectFileEquals("core", "test/core_pattern");
81e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_EQ(s_crashes, 0);
820340316050044e0995b98fea87ed41ea77abb28bKen Mixter  ASSERT_NE(logging_.log().find("Disabling user crash handling"),
83e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa            std::string::npos);
84e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa}
85e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
86e4a86037f405415c460ace194fbf16cfd93d4c6Chris SosaTEST_F(UserCollectorTest, DisableNoFileAccess) {
87e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  collector_.set_core_pattern_file("/does_not_exist");
88e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_FALSE(collector_.Disable());
89e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_EQ(s_crashes, 0);
900340316050044e0995b98fea87ed41ea77abb28bKen Mixter  ASSERT_NE(logging_.log().find("Disabling user crash handling"),
910340316050044e0995b98fea87ed41ea77abb28bKen Mixter            std::string::npos);
92e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_NE(logging_.log().find("Unable to write /does_not_exist"),
93e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa            std::string::npos);
94e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa}
95e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
962953c3a87a7b201bbf08555129f0640ede1d0cdbKen MixterTEST_F(UserCollectorTest, ForkExecAndPipe) {
972953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  std::vector<const char *> args;
982953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  char output_file[] = "test/fork_out";
992953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter
1002953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  // Test basic call with stdout.
1012953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  args.clear();
1022953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  args.push_back(kBinEcho);
1032953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  args.push_back("hello world");
1042953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  EXPECT_EQ(0, collector_.ForkExecAndPipe(args, output_file));
1052953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  ExpectFileEquals("hello world\n", output_file);
1062953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  EXPECT_EQ("", logging_.log());
1072953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter
1082953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  // Test non-zero return value
1092953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  logging_.clear();
1102953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  args.clear();
1112953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  args.push_back(kBinFalse);
1122953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  EXPECT_EQ(1, collector_.ForkExecAndPipe(args, output_file));
1132953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  ExpectFileEquals("", output_file);
1142953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  EXPECT_EQ("", logging_.log());
1152953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter
1162953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  // Test bad output_file.
1172953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  EXPECT_EQ(127, collector_.ForkExecAndPipe(args, "/bad/path"));
1182953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter
1192953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  // Test bad executable.
1202953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  logging_.clear();
1212953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  args.clear();
1222953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  args.push_back("false");
1232953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  EXPECT_EQ(127, collector_.ForkExecAndPipe(args, output_file));
1242953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter
1252953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  // Test stderr captured.
1262953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  std::string contents;
1272953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  logging_.clear();
1282953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  args.clear();
1292953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  args.push_back(kBinCp);
1302953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  EXPECT_EQ(1, collector_.ForkExecAndPipe(args, output_file));
1312953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  EXPECT_TRUE(file_util::ReadFileToString(FilePath(output_file),
1322953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter                                                   &contents));
1332953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  EXPECT_NE(std::string::npos, contents.find("missing file operand"));
1342953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  EXPECT_EQ("", logging_.log());
1352953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter
1362953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  // NULL parameter.
1372953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  logging_.clear();
1382953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  args.clear();
1392953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  args.push_back(NULL);
1402953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  EXPECT_EQ(-1, collector_.ForkExecAndPipe(args, output_file));
1412953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  EXPECT_NE(std::string::npos,
1422953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter            logging_.log().find("Bad parameter"));
1432953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter
1442953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  // No parameters.
1452953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  args.clear();
1462953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  EXPECT_EQ(127, collector_.ForkExecAndPipe(args, output_file));
1472953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter
1482953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  // Segmentation faulting process.
1492953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  logging_.clear();
1502953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  args.clear();
1512953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  args.push_back(kBinBash);
1522953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  args.push_back("-c");
1532953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  args.push_back("kill -SEGV $$");
1542953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  EXPECT_EQ(-1, collector_.ForkExecAndPipe(args, output_file));
1552953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter  EXPECT_NE(std::string::npos,
1562953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter            logging_.log().find("Process did not exit normally"));
1572953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter}
1582953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter
159e4a86037f405415c460ace194fbf16cfd93d4c6Chris SosaTEST_F(UserCollectorTest, HandleCrashWithoutMetrics) {
160e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  s_metrics = false;
161e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  collector_.HandleCrash(10, 20, "foobar");
162e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_NE(logging_.log().find(
163e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa      "Received crash notification for foobar[20] sig 10"),
164e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa      std::string::npos);
165e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_EQ(s_crashes, 0);
166e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa}
167e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
168e4a86037f405415c460ace194fbf16cfd93d4c6Chris SosaTEST_F(UserCollectorTest, HandleCrashWithMetrics) {
169e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  s_metrics = true;
170e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  collector_.HandleCrash(2, 5, "chrome");
171e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_NE(logging_.log().find(
172e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa      "Received crash notification for chrome[5] sig 2"),
173e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa      std::string::npos);
174e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ASSERT_EQ(s_crashes, 1);
175e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa}
176e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa
177777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, GetProcessPath) {
178777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  FilePath path = collector_.GetProcessPath(100);
179777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  ASSERT_EQ("/proc/100", path.value());
180777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter}
181777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
182777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, GetSymlinkTarget) {
183777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  FilePath result;
184777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  ASSERT_FALSE(collector_.GetSymlinkTarget(FilePath("/does_not_exist"),
185777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                           &result));
186777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
187777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  std::string long_link;
188777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  for (int i = 0; i < 50; ++i)
189777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    long_link += "0123456789";
190777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  long_link += "/gold";
191777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
192777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  for (size_t len = 1; len <= long_link.size(); ++len) {
193777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    std::string this_link;
194777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    static const char kLink[] = "test/this_link";
195777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    this_link.assign(long_link.c_str(), len);
196777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    ASSERT_EQ(len, this_link.size());
197777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    unlink(kLink);
198777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    ASSERT_EQ(0, symlink(this_link.c_str(), kLink));
199777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    ASSERT_TRUE(collector_.GetSymlinkTarget(FilePath(kLink), &result));
200777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    ASSERT_EQ(this_link, result.value());
201777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  }
202777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter}
203777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
204777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, GetIdFromStatus) {
205777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  int id = 1;
206777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_FALSE(collector_.GetIdFromStatus(UserCollector::kUserId,
207777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          UserCollector::kIdEffective,
208777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          "nothing here",
209777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          &id));
210777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(id, 1);
211777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
212777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  // Not enough parameters.
213777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_FALSE(collector_.GetIdFromStatus(UserCollector::kUserId,
214777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          UserCollector::kIdReal,
215777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          "line 1\nUid:\t1\n", &id));
216777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
217777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  const char valid_contents[] = "\nUid:\t1\t2\t3\t4\nGid:\t5\t6\t7\t8\n";
218777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_TRUE(collector_.GetIdFromStatus(UserCollector::kUserId,
219777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         UserCollector::kIdReal,
220777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         valid_contents,
221777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         &id));
222777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(1, id);
223777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
224777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_TRUE(collector_.GetIdFromStatus(UserCollector::kUserId,
225777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         UserCollector::kIdEffective,
226777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         valid_contents,
227777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         &id));
228777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(2, id);
229777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
230777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_TRUE(collector_.GetIdFromStatus(UserCollector::kUserId,
231777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         UserCollector::kIdFileSystem,
232777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         valid_contents,
233777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         &id));
234777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(4, id);
235777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
236777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_TRUE(collector_.GetIdFromStatus(UserCollector::kGroupId,
237777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         UserCollector::kIdEffective,
238777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         valid_contents,
239777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         &id));
240777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(6, id);
241777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
242777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_TRUE(collector_.GetIdFromStatus(UserCollector::kGroupId,
243777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         UserCollector::kIdSet,
244777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         valid_contents,
245777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         &id));
246777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(7, id);
247777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
248777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_FALSE(collector_.GetIdFromStatus(UserCollector::kGroupId,
249777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          UserCollector::IdKind(5),
250777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          valid_contents,
251777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          &id));
252777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_FALSE(collector_.GetIdFromStatus(UserCollector::kGroupId,
253777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          UserCollector::IdKind(-1),
254777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          valid_contents,
255777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          &id));
256777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
257777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  // Fail if junk after number
258777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_FALSE(collector_.GetIdFromStatus(UserCollector::kUserId,
259777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          UserCollector::kIdReal,
260777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          "Uid:\t1f\t2\t3\t4\n",
261777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          &id));
262777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_TRUE(collector_.GetIdFromStatus(UserCollector::kUserId,
263777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         UserCollector::kIdReal,
264777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         "Uid:\t1\t2\t3\t4\n",
265777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                         &id));
266777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(1, id);
267777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
268777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  // Fail if more than 4 numbers.
269777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_FALSE(collector_.GetIdFromStatus(UserCollector::kUserId,
270777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          UserCollector::kIdReal,
271777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          "Uid:\t1\t2\t3\t4\t5\n",
272777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                                          &id));
273777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter}
274777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
275777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, GetUserInfoFromName) {
276777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  gid_t gid = 100;
277777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  uid_t uid = 100;
278777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_TRUE(collector_.GetUserInfoFromName("root", &uid, &gid));
279777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(0, uid);
280777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  EXPECT_EQ(0, gid);
281777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter}
282777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
283777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, CopyOffProcFilesBadPath) {
284777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  // Try a path that is not writable.
285777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  ASSERT_FALSE(collector_.CopyOffProcFiles(pid_, FilePath("/bad/path")));
286777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  ASSERT_NE(logging_.log().find(
287777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter      "Could not create /bad/path"),
288777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter            std::string::npos);
289777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter}
290777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
291777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, CopyOffProcFilesBadPid) {
292777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  FilePath container_path("test/container");
293777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  ASSERT_FALSE(collector_.CopyOffProcFiles(0, container_path));
294777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  ASSERT_NE(logging_.log().find(
295777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter      "Path /proc/0 does not exist"),
296777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter            std::string::npos);
297777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter}
298777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
299777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, CopyOffProcFilesOK) {
300777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  FilePath container_path("test/container");
301777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  ASSERT_TRUE(collector_.CopyOffProcFiles(pid_, container_path));
302777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  ASSERT_EQ(logging_.log().find(
303777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter      "Could not copy"), std::string::npos);
304777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  static struct {
305777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    const char *name;
306777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    bool exists;
307777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  } expectations[] = {
308777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    { "auxv", true },
309777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    { "cmdline", true },
310777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    { "environ", true },
311777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    { "maps", true },
312777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    { "mem", false },
313777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    { "mounts", false },
314777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    { "sched", false },
315777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    { "status", true }
316777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  };
317777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  for (unsigned i = 0; i < sizeof(expectations)/sizeof(expectations[0]); ++i) {
318777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter    EXPECT_EQ(expectations[i].exists,
319777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter              file_util::PathExists(
320777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter                  container_path.Append(expectations[i].name)));
321777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter  }
322777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter}
323777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter
324e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosaint main(int argc, char **argv) {
325e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  ::testing::InitGoogleTest(&argc, argv);
326e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa  return RUN_ALL_TESTS();
327e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa}
328