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