16c34c2576eb241f134431b2cc847a6c7d70ef012Steve Fung/* 26c34c2576eb241f134431b2cc847a6c7d70ef012Steve Fung * Copyright (C) 2012 The Android Open Source Project 36c34c2576eb241f134431b2cc847a6c7d70ef012Steve Fung * 46c34c2576eb241f134431b2cc847a6c7d70ef012Steve Fung * Licensed under the Apache License, Version 2.0 (the "License"); 56c34c2576eb241f134431b2cc847a6c7d70ef012Steve Fung * you may not use this file except in compliance with the License. 66c34c2576eb241f134431b2cc847a6c7d70ef012Steve Fung * You may obtain a copy of the License at 76c34c2576eb241f134431b2cc847a6c7d70ef012Steve Fung * 86c34c2576eb241f134431b2cc847a6c7d70ef012Steve Fung * http://www.apache.org/licenses/LICENSE-2.0 96c34c2576eb241f134431b2cc847a6c7d70ef012Steve Fung * 106c34c2576eb241f134431b2cc847a6c7d70ef012Steve Fung * Unless required by applicable law or agreed to in writing, software 116c34c2576eb241f134431b2cc847a6c7d70ef012Steve Fung * distributed under the License is distributed on an "AS IS" BASIS, 126c34c2576eb241f134431b2cc847a6c7d70ef012Steve Fung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136c34c2576eb241f134431b2cc847a6c7d70ef012Steve Fung * See the License for the specific language governing permissions and 146c34c2576eb241f134431b2cc847a6c7d70ef012Steve Fung * limitations under the License. 156c34c2576eb241f134431b2cc847a6c7d70ef012Steve Fung */ 16e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa 17129bea543b7572bfdf09c6a7b3cebbe3b57ce723Steve Fung#include "user_collector.h" 187e77690375bc8a896a8de318d69d515e67c7aefeBen Chan 196e709a11031c80c96f47da50b3231074334f462cBen Chan#include <elf.h> 208bafb3da8fe46993f995054ec84c75f82e6bb2d8Steve Fung#include <sys/cdefs.h> // For __WORDSIZE 21777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter#include <unistd.h> 22e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa 23ab6cc90503ca2db976a3cb9c9382a9da85c4b5a2Ben Chan#include <base/files/file_util.h> 247e77690375bc8a896a8de318d69d515e67c7aefeBen Chan#include <base/files/scoped_temp_dir.h> 257e77690375bc8a896a8de318d69d515e67c7aefeBen Chan#include <base/strings/string_split.h> 2674dc62460b8cdd5bfeac47bfe8e759fc04b55ef8Alex Vakulenko#include <brillo/syslog_logging.h> 276e13952269ad729594f2670b889bd806e9b0f3b3Steve Fung#include <gmock/gmock.h> 287e77690375bc8a896a8de318d69d515e67c7aefeBen Chan#include <gtest/gtest.h> 29e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa 30d257ea1cbeb0d61fe73a2aef8f3f8feca5402a3cDaniel Eratusing base::FilePath; 3174dc62460b8cdd5bfeac47bfe8e759fc04b55ef8Alex Vakulenkousing brillo::FindLog; 32e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa 33d257ea1cbeb0d61fe73a2aef8f3f8feca5402a3cDaniel Eratnamespace { 34e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa 35d257ea1cbeb0d61fe73a2aef8f3f8feca5402a3cDaniel Eratint s_crashes = 0; 36d257ea1cbeb0d61fe73a2aef8f3f8feca5402a3cDaniel Eratbool s_metrics = false; 37d2db5ff98889fbe0bb75bcf34c3ef31672bb38e4Mike Frysinger 38d257ea1cbeb0d61fe73a2aef8f3f8feca5402a3cDaniel Eratconst char kFilePath[] = "/my/path"; 39d257ea1cbeb0d61fe73a2aef8f3f8feca5402a3cDaniel Erat 40e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosavoid CountCrash() { 41e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa ++s_crashes; 42e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa} 43e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa 44e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosabool IsMetrics() { 45e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa return s_metrics; 46e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa} 47e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa 48d257ea1cbeb0d61fe73a2aef8f3f8feca5402a3cDaniel Erat} // namespace 49d257ea1cbeb0d61fe73a2aef8f3f8feca5402a3cDaniel Erat 506e13952269ad729594f2670b889bd806e9b0f3b3Steve Fungclass UserCollectorMock : public UserCollector { 516e13952269ad729594f2670b889bd806e9b0f3b3Steve Fung public: 526e13952269ad729594f2670b889bd806e9b0f3b3Steve Fung MOCK_METHOD0(SetUpDBus, void()); 536e13952269ad729594f2670b889bd806e9b0f3b3Steve Fung}; 546e13952269ad729594f2670b889bd806e9b0f3b3Steve Fung 55e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosaclass UserCollectorTest : public ::testing::Test { 56e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa void SetUp() { 57e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa s_crashes = 0; 586e13952269ad729594f2670b889bd806e9b0f3b3Steve Fung 596e13952269ad729594f2670b889bd806e9b0f3b3Steve Fung EXPECT_CALL(collector_, SetUpDBus()).WillRepeatedly(testing::Return()); 606e13952269ad729594f2670b889bd806e9b0f3b3Steve Fung 61e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa collector_.Initialize(CountCrash, 62e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa kFilePath, 63e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa IsMetrics, 64d6169a2a4f775da37ffa8b8ba4d767efd0377343Steve Fung false, 65d6169a2a4f775da37ffa8b8ba4d767efd0377343Steve Fung false, 66d6169a2a4f775da37ffa8b8ba4d767efd0377343Steve Fung false, 67d6169a2a4f775da37ffa8b8ba4d767efd0377343Steve Fung ""); 6878fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung 6978fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung EXPECT_TRUE(test_dir_.CreateUniqueTempDir()); 7078fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung 7178fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung mkdir(test_dir_.path().Append("test").value().c_str(), 0777); 72777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter pid_ = getpid(); 7374dc62460b8cdd5bfeac47bfe8e759fc04b55ef8Alex Vakulenko brillo::ClearLog(); 74e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa } 75f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan 76e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa protected: 772953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter void ExpectFileEquals(const char *golden, 789b1f300139689eb9c7b7a35e91a4fbc1eab93b4eLei Zhang const FilePath &file_path) { 792953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter std::string contents; 809b1f300139689eb9c7b7a35e91a4fbc1eab93b4eLei Zhang EXPECT_TRUE(base::ReadFileToString(file_path, &contents)); 812953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter EXPECT_EQ(golden, contents); 822953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter } 832953c3a87a7b201bbf08555129f0640ede1d0cdbKen Mixter 84f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan std::vector<std::string> SplitLines(const std::string &lines) const { 85ea05ff9229163e6aacfb7f7dffdd76bff559673cAlex Vakulenko return base::SplitString(lines, "\n", base::TRIM_WHITESPACE, 86ea05ff9229163e6aacfb7f7dffdd76bff559673cAlex Vakulenko base::SPLIT_WANT_ALL); 87f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan } 88f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan 896e13952269ad729594f2670b889bd806e9b0f3b3Steve Fung UserCollectorMock collector_; 90777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter pid_t pid_; 9178fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung base::ScopedTempDir test_dir_; 92e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa}; 93e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa 941b8fe015585c0b966d5240b8e22eba1af8c69e88Ken MixterTEST_F(UserCollectorTest, ParseCrashAttributes) { 951b8fe015585c0b966d5240b8e22eba1af8c69e88Ken Mixter pid_t pid; 961b8fe015585c0b966d5240b8e22eba1af8c69e88Ken Mixter int signal; 971c57e9e330bc4c6a44955fd649ee9a4badb9e1dcMichael Krebs uid_t uid; 98773fd3c42883b17b5918c71aead5690e16438248Steve Fung gid_t gid; 991b8fe015585c0b966d5240b8e22eba1af8c69e88Ken Mixter std::string exec_name; 100773fd3c42883b17b5918c71aead5690e16438248Steve Fung EXPECT_TRUE(collector_.ParseCrashAttributes("123456:11:1000:2000:foobar", 101773fd3c42883b17b5918c71aead5690e16438248Steve Fung &pid, &signal, &uid, &gid, &exec_name)); 1021b8fe015585c0b966d5240b8e22eba1af8c69e88Ken Mixter EXPECT_EQ(123456, pid); 1031b8fe015585c0b966d5240b8e22eba1af8c69e88Ken Mixter EXPECT_EQ(11, signal); 1041c57e9e330bc4c6a44955fd649ee9a4badb9e1dcMichael Krebs EXPECT_EQ(1000, uid); 105773fd3c42883b17b5918c71aead5690e16438248Steve Fung EXPECT_EQ(2000, gid); 1061b8fe015585c0b966d5240b8e22eba1af8c69e88Ken Mixter EXPECT_EQ("foobar", exec_name); 1071c57e9e330bc4c6a44955fd649ee9a4badb9e1dcMichael Krebs EXPECT_TRUE(collector_.ParseCrashAttributes("4321:6:barfoo", 108773fd3c42883b17b5918c71aead5690e16438248Steve Fung &pid, &signal, &uid, &gid, &exec_name)); 1091c57e9e330bc4c6a44955fd649ee9a4badb9e1dcMichael Krebs EXPECT_EQ(4321, pid); 1101c57e9e330bc4c6a44955fd649ee9a4badb9e1dcMichael Krebs EXPECT_EQ(6, signal); 1111c57e9e330bc4c6a44955fd649ee9a4badb9e1dcMichael Krebs EXPECT_EQ(-1, uid); 112773fd3c42883b17b5918c71aead5690e16438248Steve Fung EXPECT_EQ(-1, gid); 1131c57e9e330bc4c6a44955fd649ee9a4badb9e1dcMichael Krebs EXPECT_EQ("barfoo", exec_name); 1141b8fe015585c0b966d5240b8e22eba1af8c69e88Ken Mixter 1151b8fe015585c0b966d5240b8e22eba1af8c69e88Ken Mixter EXPECT_FALSE(collector_.ParseCrashAttributes("123456:11", 116773fd3c42883b17b5918c71aead5690e16438248Steve Fung &pid, &signal, &uid, &gid, &exec_name)); 1171b8fe015585c0b966d5240b8e22eba1af8c69e88Ken Mixter 1181b8fe015585c0b966d5240b8e22eba1af8c69e88Ken Mixter EXPECT_TRUE(collector_.ParseCrashAttributes("123456:11:exec:extra", 119773fd3c42883b17b5918c71aead5690e16438248Steve Fung &pid, &signal, &uid, &gid, &exec_name)); 1201b8fe015585c0b966d5240b8e22eba1af8c69e88Ken Mixter EXPECT_EQ("exec:extra", exec_name); 1211b8fe015585c0b966d5240b8e22eba1af8c69e88Ken Mixter 1221b8fe015585c0b966d5240b8e22eba1af8c69e88Ken Mixter EXPECT_FALSE(collector_.ParseCrashAttributes("12345p:11:foobar", 123773fd3c42883b17b5918c71aead5690e16438248Steve Fung &pid, &signal, &uid, &gid, &exec_name)); 1241b8fe015585c0b966d5240b8e22eba1af8c69e88Ken Mixter 1251b8fe015585c0b966d5240b8e22eba1af8c69e88Ken Mixter EXPECT_FALSE(collector_.ParseCrashAttributes("123456:1 :foobar", 126773fd3c42883b17b5918c71aead5690e16438248Steve Fung &pid, &signal, &uid, &gid, &exec_name)); 1271b8fe015585c0b966d5240b8e22eba1af8c69e88Ken Mixter 1281b8fe015585c0b966d5240b8e22eba1af8c69e88Ken Mixter EXPECT_FALSE(collector_.ParseCrashAttributes("123456::foobar", 129773fd3c42883b17b5918c71aead5690e16438248Steve Fung &pid, &signal, &uid, &gid, &exec_name)); 1301b8fe015585c0b966d5240b8e22eba1af8c69e88Ken Mixter} 1311b8fe015585c0b966d5240b8e22eba1af8c69e88Ken Mixter 1325d3a1a2c3543db21913f67cf240bad6c137063c9Ken MixterTEST_F(UserCollectorTest, ShouldDumpDeveloperImageOverridesConsent) { 1335d3a1a2c3543db21913f67cf240bad6c137063c9Ken Mixter std::string reason; 134c8b741428caeb01f7aca3c4c199e5f6894d335f8Steve Fung EXPECT_TRUE(collector_.ShouldDump(false, true, &reason)); 1355d3a1a2c3543db21913f67cf240bad6c137063c9Ken Mixter EXPECT_EQ("developer build - not testing - always dumping", reason); 1365d3a1a2c3543db21913f67cf240bad6c137063c9Ken Mixter 1375d3a1a2c3543db21913f67cf240bad6c137063c9Ken Mixter // When running a crash test, behave as normal. 138c8b741428caeb01f7aca3c4c199e5f6894d335f8Steve Fung EXPECT_FALSE(collector_.ShouldDump(false, false, &reason)); 1395d3a1a2c3543db21913f67cf240bad6c137063c9Ken Mixter EXPECT_EQ("ignoring - no consent", reason); 1405d3a1a2c3543db21913f67cf240bad6c137063c9Ken Mixter} 1415d3a1a2c3543db21913f67cf240bad6c137063c9Ken Mixter 1425d3a1a2c3543db21913f67cf240bad6c137063c9Ken MixterTEST_F(UserCollectorTest, ShouldDumpUseConsentProductionImage) { 1435d3a1a2c3543db21913f67cf240bad6c137063c9Ken Mixter std::string result; 144c8b741428caeb01f7aca3c4c199e5f6894d335f8Steve Fung EXPECT_FALSE(collector_.ShouldDump(false, false, &result)); 1455d3a1a2c3543db21913f67cf240bad6c137063c9Ken Mixter EXPECT_EQ("ignoring - no consent", result); 1465d3a1a2c3543db21913f67cf240bad6c137063c9Ken Mixter 147c8b741428caeb01f7aca3c4c199e5f6894d335f8Steve Fung EXPECT_TRUE(collector_.ShouldDump(true, false, &result)); 1485d3a1a2c3543db21913f67cf240bad6c137063c9Ken Mixter EXPECT_EQ("handling", result); 1495d3a1a2c3543db21913f67cf240bad6c137063c9Ken Mixter} 1505d3a1a2c3543db21913f67cf240bad6c137063c9Ken Mixter 1515d3a1a2c3543db21913f67cf240bad6c137063c9Ken MixterTEST_F(UserCollectorTest, HandleCrashWithoutConsent) { 152e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa s_metrics = false; 1531b8fe015585c0b966d5240b8e22eba1af8c69e88Ken Mixter collector_.HandleCrash("20:10:ignored", "foobar"); 154a324932e066ccb7ed9d62db9c409ee2c10052554Ken Mixter EXPECT_TRUE(FindLog( 155a324932e066ccb7ed9d62db9c409ee2c10052554Ken Mixter "Received crash notification for foobar[20] sig 10")); 156e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa ASSERT_EQ(s_crashes, 0); 157e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa} 158e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa 1595d3a1a2c3543db21913f67cf240bad6c137063c9Ken MixterTEST_F(UserCollectorTest, HandleNonChromeCrashWithConsent) { 160e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa s_metrics = true; 1611b8fe015585c0b966d5240b8e22eba1af8c69e88Ken Mixter collector_.HandleCrash("5:2:ignored", "chromeos-wm"); 162a324932e066ccb7ed9d62db9c409ee2c10052554Ken Mixter EXPECT_TRUE(FindLog( 163a324932e066ccb7ed9d62db9c409ee2c10052554Ken Mixter "Received crash notification for chromeos-wm[5] sig 2")); 164e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa ASSERT_EQ(s_crashes, 1); 165e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa} 166e4a86037f405415c460ace194fbf16cfd93d4c6Chris Sosa 167777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, GetProcessPath) { 168777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter FilePath path = collector_.GetProcessPath(100); 169777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter ASSERT_EQ("/proc/100", path.value()); 170777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter} 171777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter 172777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, GetSymlinkTarget) { 173777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter FilePath result; 174777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter ASSERT_FALSE(collector_.GetSymlinkTarget(FilePath("/does_not_exist"), 175777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter &result)); 176a324932e066ccb7ed9d62db9c409ee2c10052554Ken Mixter ASSERT_TRUE(FindLog( 177a324932e066ccb7ed9d62db9c409ee2c10052554Ken Mixter "Readlink failed on /does_not_exist with 2")); 17878fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung std::string long_link = test_dir_.path().value(); 179777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter for (int i = 0; i < 50; ++i) 180777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter long_link += "0123456789"; 181777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter long_link += "/gold"; 182777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter 183777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter for (size_t len = 1; len <= long_link.size(); ++len) { 184777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter std::string this_link; 18578fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung static const char* kLink = 18678fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung test_dir_.path().Append("test/this_link").value().c_str(); 187777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter this_link.assign(long_link.c_str(), len); 188777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter ASSERT_EQ(len, this_link.size()); 189777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter unlink(kLink); 190777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter ASSERT_EQ(0, symlink(this_link.c_str(), kLink)); 191777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter ASSERT_TRUE(collector_.GetSymlinkTarget(FilePath(kLink), &result)); 192777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter ASSERT_EQ(this_link, result.value()); 193777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter } 194777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter} 195777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter 196d49d362f61c7e702d557e563055b1c541ead5b67Ken MixterTEST_F(UserCollectorTest, GetExecutableBaseNameFromPid) { 197d49d362f61c7e702d557e563055b1c541ead5b67Ken Mixter std::string base_name; 198d49d362f61c7e702d557e563055b1c541ead5b67Ken Mixter EXPECT_FALSE(collector_.GetExecutableBaseNameFromPid(0, &base_name)); 199a324932e066ccb7ed9d62db9c409ee2c10052554Ken Mixter EXPECT_TRUE(FindLog( 200a324932e066ccb7ed9d62db9c409ee2c10052554Ken Mixter "Readlink failed on /proc/0/exe with 2")); 201a324932e066ccb7ed9d62db9c409ee2c10052554Ken Mixter EXPECT_TRUE(FindLog( 202a324932e066ccb7ed9d62db9c409ee2c10052554Ken Mixter "GetSymlinkTarget failed - Path /proc/0 DirectoryExists: 0")); 203a324932e066ccb7ed9d62db9c409ee2c10052554Ken Mixter EXPECT_TRUE(FindLog("stat /proc/0/exe failed: -1 2")); 204a324932e066ccb7ed9d62db9c409ee2c10052554Ken Mixter 20574dc62460b8cdd5bfeac47bfe8e759fc04b55ef8Alex Vakulenko brillo::ClearLog(); 206d49d362f61c7e702d557e563055b1c541ead5b67Ken Mixter pid_t my_pid = getpid(); 207d49d362f61c7e702d557e563055b1c541ead5b67Ken Mixter EXPECT_TRUE(collector_.GetExecutableBaseNameFromPid(my_pid, &base_name)); 208a324932e066ccb7ed9d62db9c409ee2c10052554Ken Mixter EXPECT_FALSE(FindLog("Readlink failed")); 2098ed101bab5d01b1ab0c648586c1d5259404b79c4Steve Fung EXPECT_EQ("crash_reporter_tests", base_name); 210d49d362f61c7e702d557e563055b1c541ead5b67Ken Mixter} 211d49d362f61c7e702d557e563055b1c541ead5b67Ken Mixter 212f13bb58358b879258c5c0eb48c6e09895d394ef1Ben ChanTEST_F(UserCollectorTest, GetFirstLineWithPrefix) { 213f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan std::vector<std::string> lines; 214f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan std::string line; 215f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan 216f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan EXPECT_FALSE(collector_.GetFirstLineWithPrefix(lines, "Name:", &line)); 217f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan EXPECT_EQ("", line); 218f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan 219f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan lines.push_back("Name:\tls"); 220f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan lines.push_back("State:\tR (running)"); 221f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan lines.push_back(" Foo:\t1000"); 222f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan 223f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan line.clear(); 224f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan EXPECT_TRUE(collector_.GetFirstLineWithPrefix(lines, "Name:", &line)); 225f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan EXPECT_EQ(lines[0], line); 226f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan 227f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan line.clear(); 228f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan EXPECT_TRUE(collector_.GetFirstLineWithPrefix(lines, "State:", &line)); 229f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan EXPECT_EQ(lines[1], line); 230f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan 231f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan line.clear(); 232f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan EXPECT_FALSE(collector_.GetFirstLineWithPrefix(lines, "Foo:", &line)); 233f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan EXPECT_EQ("", line); 234f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan 235f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan line.clear(); 236f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan EXPECT_TRUE(collector_.GetFirstLineWithPrefix(lines, " Foo:", &line)); 237f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan EXPECT_EQ(lines[2], line); 238f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan 239f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan line.clear(); 240f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan EXPECT_FALSE(collector_.GetFirstLineWithPrefix(lines, "Bar:", &line)); 241f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan EXPECT_EQ("", line); 242f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan} 243f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan 244777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, GetIdFromStatus) { 245777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter int id = 1; 246777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_FALSE(collector_.GetIdFromStatus(UserCollector::kUserId, 247777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter UserCollector::kIdEffective, 248f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan SplitLines("nothing here"), 249777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter &id)); 250777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_EQ(id, 1); 251777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter 252777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter // Not enough parameters. 253777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_FALSE(collector_.GetIdFromStatus(UserCollector::kUserId, 254777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter UserCollector::kIdReal, 255f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan SplitLines("line 1\nUid:\t1\n"), 256f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan &id)); 257777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter 258f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan const std::vector<std::string> valid_contents = 259f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan SplitLines("\nUid:\t1\t2\t3\t4\nGid:\t5\t6\t7\t8\n"); 260777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_TRUE(collector_.GetIdFromStatus(UserCollector::kUserId, 261777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter UserCollector::kIdReal, 262777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter valid_contents, 263777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter &id)); 264777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_EQ(1, id); 265777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter 266777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_TRUE(collector_.GetIdFromStatus(UserCollector::kUserId, 267777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter UserCollector::kIdEffective, 268777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter valid_contents, 269777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter &id)); 270777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_EQ(2, id); 271777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter 272777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_TRUE(collector_.GetIdFromStatus(UserCollector::kUserId, 273777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter UserCollector::kIdFileSystem, 274777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter valid_contents, 275777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter &id)); 276777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_EQ(4, id); 277777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter 278777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_TRUE(collector_.GetIdFromStatus(UserCollector::kGroupId, 279777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter UserCollector::kIdEffective, 280777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter valid_contents, 281777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter &id)); 282777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_EQ(6, id); 283777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter 284777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_TRUE(collector_.GetIdFromStatus(UserCollector::kGroupId, 285777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter UserCollector::kIdSet, 286777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter valid_contents, 287777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter &id)); 288777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_EQ(7, id); 289777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter 290777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_FALSE(collector_.GetIdFromStatus(UserCollector::kGroupId, 291777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter UserCollector::IdKind(5), 292777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter valid_contents, 293777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter &id)); 294777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_FALSE(collector_.GetIdFromStatus(UserCollector::kGroupId, 295777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter UserCollector::IdKind(-1), 296777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter valid_contents, 297777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter &id)); 298777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter 299777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter // Fail if junk after number 300777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_FALSE(collector_.GetIdFromStatus(UserCollector::kUserId, 301777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter UserCollector::kIdReal, 302f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan SplitLines("Uid:\t1f\t2\t3\t4\n"), 303777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter &id)); 304777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_TRUE(collector_.GetIdFromStatus(UserCollector::kUserId, 305777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter UserCollector::kIdReal, 306f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan SplitLines("Uid:\t1\t2\t3\t4\n"), 307777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter &id)); 308777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_EQ(1, id); 309777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter 310777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter // Fail if more than 4 numbers. 311777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_FALSE(collector_.GetIdFromStatus(UserCollector::kUserId, 312777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter UserCollector::kIdReal, 313f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan SplitLines("Uid:\t1\t2\t3\t4\t5\n"), 314777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter &id)); 315777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter} 316777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter 317f13bb58358b879258c5c0eb48c6e09895d394ef1Ben ChanTEST_F(UserCollectorTest, GetStateFromStatus) { 318f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan std::string state; 319f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan EXPECT_FALSE(collector_.GetStateFromStatus(SplitLines("nothing here"), 320f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan &state)); 321f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan EXPECT_EQ("", state); 322f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan 323f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan EXPECT_TRUE(collector_.GetStateFromStatus(SplitLines("State:\tR (running)"), 324f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan &state)); 325f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan EXPECT_EQ("R (running)", state); 326f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan 327f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan EXPECT_TRUE(collector_.GetStateFromStatus( 328f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan SplitLines("Name:\tls\nState:\tZ (zombie)\n"), &state)); 329f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan EXPECT_EQ("Z (zombie)", state); 330f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan} 331f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan 332777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, GetUserInfoFromName) { 333777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter gid_t gid = 100; 334777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter uid_t uid = 100; 335777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_TRUE(collector_.GetUserInfoFromName("root", &uid, &gid)); 336777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_EQ(0, uid); 337777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_EQ(0, gid); 338777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter} 339777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter 340777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, CopyOffProcFilesBadPath) { 341777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter // Try a path that is not writable. 342777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter ASSERT_FALSE(collector_.CopyOffProcFiles(pid_, FilePath("/bad/path"))); 343a324932e066ccb7ed9d62db9c409ee2c10052554Ken Mixter EXPECT_TRUE(FindLog("Could not create /bad/path")); 344777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter} 345777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter 346777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, CopyOffProcFilesBadPid) { 34778fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung FilePath container_path(test_dir_.path().Append("test/container")); 348777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter ASSERT_FALSE(collector_.CopyOffProcFiles(0, container_path)); 349a324932e066ccb7ed9d62db9c409ee2c10052554Ken Mixter EXPECT_TRUE(FindLog("Path /proc/0 does not exist")); 350777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter} 351777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter 352777484c41cc63e2f97f41a443d1d55f7e6037a5eKen MixterTEST_F(UserCollectorTest, CopyOffProcFilesOK) { 35378fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung FilePath container_path(test_dir_.path().Append("test/container")); 354777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter ASSERT_TRUE(collector_.CopyOffProcFiles(pid_, container_path)); 355a324932e066ccb7ed9d62db9c409ee2c10052554Ken Mixter EXPECT_FALSE(FindLog("Could not copy")); 356777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter static struct { 357777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter const char *name; 358777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter bool exists; 359777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter } expectations[] = { 360777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter { "auxv", true }, 361777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter { "cmdline", true }, 362777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter { "environ", true }, 363777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter { "maps", true }, 364777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter { "mem", false }, 365777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter { "mounts", false }, 366777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter { "sched", false }, 367777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter { "status", true } 368777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter }; 369777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter for (unsigned i = 0; i < sizeof(expectations)/sizeof(expectations[0]); ++i) { 370777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter EXPECT_EQ(expectations[i].exists, 371a557c1187ff19d422db2a9c951ecd8f7243e79bdMike Frysinger base::PathExists( 372777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter container_path.Append(expectations[i].name))); 373777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter } 374777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter} 375777484c41cc63e2f97f41a443d1d55f7e6037a5eKen Mixter 376f13bb58358b879258c5c0eb48c6e09895d394ef1Ben ChanTEST_F(UserCollectorTest, ValidateProcFiles) { 37778fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung FilePath container_dir = test_dir_.path(); 378f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan 379f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan // maps file not exists (i.e. GetFileSize fails) 380f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan EXPECT_FALSE(collector_.ValidateProcFiles(container_dir)); 381f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan 382f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan // maps file is empty 383f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan FilePath maps_file = container_dir.Append("maps"); 384262d798b380a59ef691ede4c6a32aa71ff191295Ben Chan ASSERT_EQ(0, base::WriteFile(maps_file, nullptr, 0)); 385a557c1187ff19d422db2a9c951ecd8f7243e79bdMike Frysinger ASSERT_TRUE(base::PathExists(maps_file)); 386f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan EXPECT_FALSE(collector_.ValidateProcFiles(container_dir)); 387f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan 388f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan // maps file is not empty 389f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan const char data[] = "test data"; 390f30c641225e55055641ffe3fd679a96e44f34af6Ben Chan ASSERT_EQ(sizeof(data), base::WriteFile(maps_file, data, sizeof(data))); 391a557c1187ff19d422db2a9c951ecd8f7243e79bdMike Frysinger ASSERT_TRUE(base::PathExists(maps_file)); 392f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan EXPECT_TRUE(collector_.ValidateProcFiles(container_dir)); 393f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan} 394f13bb58358b879258c5c0eb48c6e09895d394ef1Ben Chan 3956e709a11031c80c96f47da50b3231074334f462cBen ChanTEST_F(UserCollectorTest, ValidateCoreFile) { 39678fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung FilePath container_dir = test_dir_.path(); 3976e709a11031c80c96f47da50b3231074334f462cBen Chan FilePath core_file = container_dir.Append("core"); 3986e709a11031c80c96f47da50b3231074334f462cBen Chan 3996e709a11031c80c96f47da50b3231074334f462cBen Chan // Core file does not exist 4006e709a11031c80c96f47da50b3231074334f462cBen Chan EXPECT_EQ(UserCollector::kErrorInvalidCoreFile, 4016e709a11031c80c96f47da50b3231074334f462cBen Chan collector_.ValidateCoreFile(core_file)); 4026e709a11031c80c96f47da50b3231074334f462cBen Chan char e_ident[EI_NIDENT]; 4036e709a11031c80c96f47da50b3231074334f462cBen Chan e_ident[EI_MAG0] = ELFMAG0; 4046e709a11031c80c96f47da50b3231074334f462cBen Chan e_ident[EI_MAG1] = ELFMAG1; 4056e709a11031c80c96f47da50b3231074334f462cBen Chan e_ident[EI_MAG2] = ELFMAG2; 4066e709a11031c80c96f47da50b3231074334f462cBen Chan e_ident[EI_MAG3] = ELFMAG3; 4076e709a11031c80c96f47da50b3231074334f462cBen Chan#if __WORDSIZE == 32 4086e709a11031c80c96f47da50b3231074334f462cBen Chan e_ident[EI_CLASS] = ELFCLASS32; 4096e709a11031c80c96f47da50b3231074334f462cBen Chan#elif __WORDSIZE == 64 4106e709a11031c80c96f47da50b3231074334f462cBen Chan e_ident[EI_CLASS] = ELFCLASS64; 4116e709a11031c80c96f47da50b3231074334f462cBen Chan#else 4126e709a11031c80c96f47da50b3231074334f462cBen Chan#error Unknown/unsupported value of __WORDSIZE. 4136e709a11031c80c96f47da50b3231074334f462cBen Chan#endif 4146e709a11031c80c96f47da50b3231074334f462cBen Chan 4156e709a11031c80c96f47da50b3231074334f462cBen Chan // Core file has the expected header 416f30c641225e55055641ffe3fd679a96e44f34af6Ben Chan ASSERT_TRUE(base::WriteFile(core_file, e_ident, sizeof(e_ident))); 4176e709a11031c80c96f47da50b3231074334f462cBen Chan EXPECT_EQ(UserCollector::kErrorNone, 4186e709a11031c80c96f47da50b3231074334f462cBen Chan collector_.ValidateCoreFile(core_file)); 4196e709a11031c80c96f47da50b3231074334f462cBen Chan 4206e709a11031c80c96f47da50b3231074334f462cBen Chan#if __WORDSIZE == 64 4216e709a11031c80c96f47da50b3231074334f462cBen Chan // 32-bit core file on 64-bit platform 4226e709a11031c80c96f47da50b3231074334f462cBen Chan e_ident[EI_CLASS] = ELFCLASS32; 423f30c641225e55055641ffe3fd679a96e44f34af6Ben Chan ASSERT_TRUE(base::WriteFile(core_file, e_ident, sizeof(e_ident))); 4246e709a11031c80c96f47da50b3231074334f462cBen Chan EXPECT_EQ(UserCollector::kErrorUnsupported32BitCoreFile, 4256e709a11031c80c96f47da50b3231074334f462cBen Chan collector_.ValidateCoreFile(core_file)); 4266e709a11031c80c96f47da50b3231074334f462cBen Chan e_ident[EI_CLASS] = ELFCLASS64; 4276e709a11031c80c96f47da50b3231074334f462cBen Chan#endif 4286e709a11031c80c96f47da50b3231074334f462cBen Chan 4296e709a11031c80c96f47da50b3231074334f462cBen Chan // Invalid core files 430f30c641225e55055641ffe3fd679a96e44f34af6Ben Chan ASSERT_TRUE(base::WriteFile(core_file, e_ident, sizeof(e_ident) - 1)); 4316e709a11031c80c96f47da50b3231074334f462cBen Chan EXPECT_EQ(UserCollector::kErrorInvalidCoreFile, 4326e709a11031c80c96f47da50b3231074334f462cBen Chan collector_.ValidateCoreFile(core_file)); 4336e709a11031c80c96f47da50b3231074334f462cBen Chan 4346e709a11031c80c96f47da50b3231074334f462cBen Chan e_ident[EI_MAG0] = 0; 435f30c641225e55055641ffe3fd679a96e44f34af6Ben Chan ASSERT_TRUE(base::WriteFile(core_file, e_ident, sizeof(e_ident))); 4366e709a11031c80c96f47da50b3231074334f462cBen Chan EXPECT_EQ(UserCollector::kErrorInvalidCoreFile, 4376e709a11031c80c96f47da50b3231074334f462cBen Chan collector_.ValidateCoreFile(core_file)); 4386e709a11031c80c96f47da50b3231074334f462cBen Chan} 439