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