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