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 */
160340316050044e0995b98fea87ed41ea77abb28bKen Mixter
17129bea543b7572bfdf09c6a7b3cebbe3b57ce723Steve Fung#include "crash_collector_test.h"
18f19b518532cb2ab8fc1ed77381809f24a30ac4caMike Frysinger
190340316050044e0995b98fea87ed41ea77abb28bKen Mixter#include <unistd.h>
206e13952269ad729594f2670b889bd806e9b0f3b3Steve Fung#include <utility>
21f19b518532cb2ab8fc1ed77381809f24a30ac4caMike Frysinger
22ab6cc90503ca2db976a3cb9c9382a9da85c4b5a2Ben Chan#include <base/files/file_util.h>
2378fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung#include <base/files/scoped_temp_dir.h>
247e77690375bc8a896a8de318d69d515e67c7aefeBen Chan#include <base/strings/string_util.h>
257e77690375bc8a896a8de318d69d515e67c7aefeBen Chan#include <base/strings/stringprintf.h>
2674dc62460b8cdd5bfeac47bfe8e759fc04b55ef8Alex Vakulenko#include <brillo/syslog_logging.h>
277e77690375bc8a896a8de318d69d515e67c7aefeBen Chan#include <gtest/gtest.h>
287e77690375bc8a896a8de318d69d515e67c7aefeBen Chan
29129bea543b7572bfdf09c6a7b3cebbe3b57ce723Steve Fung#include "crash_collector.h"
300340316050044e0995b98fea87ed41ea77abb28bKen Mixter
319f90acaa4d420530d7b4ddd37112518df68e373aSimon Queusing base::FilePath;
32a557c1187ff19d422db2a9c951ecd8f7243e79bdMike Frysingerusing base::StringPrintf;
3374dc62460b8cdd5bfeac47bfe8e759fc04b55ef8Alex Vakulenkousing brillo::FindLog;
346e13952269ad729594f2670b889bd806e9b0f3b3Steve Fungusing ::testing::Invoke;
35f19b518532cb2ab8fc1ed77381809f24a30ac4caMike Frysingerusing ::testing::Return;
36a324932e066ccb7ed9d62db9c409ee2c10052554Ken Mixter
37d257ea1cbeb0d61fe73a2aef8f3f8feca5402a3cDaniel Eratnamespace {
38d257ea1cbeb0d61fe73a2aef8f3f8feca5402a3cDaniel Erat
390340316050044e0995b98fea87ed41ea77abb28bKen Mixtervoid CountCrash() {
400340316050044e0995b98fea87ed41ea77abb28bKen Mixter  ADD_FAILURE();
410340316050044e0995b98fea87ed41ea77abb28bKen Mixter}
420340316050044e0995b98fea87ed41ea77abb28bKen Mixter
430340316050044e0995b98fea87ed41ea77abb28bKen Mixterbool IsMetrics() {
440340316050044e0995b98fea87ed41ea77abb28bKen Mixter  ADD_FAILURE();
450340316050044e0995b98fea87ed41ea77abb28bKen Mixter  return false;
460340316050044e0995b98fea87ed41ea77abb28bKen Mixter}
470340316050044e0995b98fea87ed41ea77abb28bKen Mixter
48d257ea1cbeb0d61fe73a2aef8f3f8feca5402a3cDaniel Erat}  // namespace
49d257ea1cbeb0d61fe73a2aef8f3f8feca5402a3cDaniel Erat
500340316050044e0995b98fea87ed41ea77abb28bKen Mixterclass CrashCollectorTest : public ::testing::Test {
5104ec10fc93b08057657503559ecf511661b55c9fKen Mixter public:
520340316050044e0995b98fea87ed41ea77abb28bKen Mixter  void SetUp() {
536e13952269ad729594f2670b889bd806e9b0f3b3Steve Fung    EXPECT_CALL(collector_, SetUpDBus()).WillRepeatedly(Return());
546e13952269ad729594f2670b889bd806e9b0f3b3Steve Fung
559b1f300139689eb9c7b7a35e91a4fbc1eab93b4eLei Zhang    collector_.Initialize(CountCrash, IsMetrics);
5678fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung    EXPECT_TRUE(test_dir_.CreateUniqueTempDir());
5774dc62460b8cdd5bfeac47bfe8e759fc04b55ef8Alex Vakulenko    brillo::ClearLog();
580340316050044e0995b98fea87ed41ea77abb28bKen Mixter  }
5904ec10fc93b08057657503559ecf511661b55c9fKen Mixter
6004ec10fc93b08057657503559ecf511661b55c9fKen Mixter  bool CheckHasCapacity();
6104ec10fc93b08057657503559ecf511661b55c9fKen Mixter
620340316050044e0995b98fea87ed41ea77abb28bKen Mixter protected:
63f19b518532cb2ab8fc1ed77381809f24a30ac4caMike Frysinger  CrashCollectorMock collector_;
6478fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung
6578fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung  // Temporary directory used for tests.
6678fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung  base::ScopedTempDir test_dir_;
670340316050044e0995b98fea87ed41ea77abb28bKen Mixter};
680340316050044e0995b98fea87ed41ea77abb28bKen Mixter
690340316050044e0995b98fea87ed41ea77abb28bKen MixterTEST_F(CrashCollectorTest, Initialize) {
700340316050044e0995b98fea87ed41ea77abb28bKen Mixter  ASSERT_TRUE(CountCrash == collector_.count_crash_function_);
710340316050044e0995b98fea87ed41ea77abb28bKen Mixter  ASSERT_TRUE(IsMetrics == collector_.is_feedback_allowed_function_);
720340316050044e0995b98fea87ed41ea77abb28bKen Mixter}
730340316050044e0995b98fea87ed41ea77abb28bKen Mixter
749b346474538a255bc7144ae358bb0ee129163d58Ken MixterTEST_F(CrashCollectorTest, WriteNewFile) {
7578fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung  FilePath test_file = test_dir_.path().Append("test_new");
769b346474538a255bc7144ae358bb0ee129163d58Ken Mixter  const char kBuffer[] = "buffer";
779b346474538a255bc7144ae358bb0ee129163d58Ken Mixter  EXPECT_EQ(strlen(kBuffer),
789b346474538a255bc7144ae358bb0ee129163d58Ken Mixter            collector_.WriteNewFile(test_file,
799b346474538a255bc7144ae358bb0ee129163d58Ken Mixter                                    kBuffer,
809b346474538a255bc7144ae358bb0ee129163d58Ken Mixter                                    strlen(kBuffer)));
819b346474538a255bc7144ae358bb0ee129163d58Ken Mixter  EXPECT_LT(collector_.WriteNewFile(test_file,
829b346474538a255bc7144ae358bb0ee129163d58Ken Mixter                                    kBuffer,
839b346474538a255bc7144ae358bb0ee129163d58Ken Mixter                                    strlen(kBuffer)), 0);
849b346474538a255bc7144ae358bb0ee129163d58Ken Mixter}
859b346474538a255bc7144ae358bb0ee129163d58Ken Mixter
86ee849c5ef4c416cb0321483fa10c92f8aada3179Ken MixterTEST_F(CrashCollectorTest, Sanitize) {
87ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter  EXPECT_EQ("chrome", collector_.Sanitize("chrome"));
88ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter  EXPECT_EQ("CHROME", collector_.Sanitize("CHROME"));
89ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter  EXPECT_EQ("1chrome2", collector_.Sanitize("1chrome2"));
90ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter  EXPECT_EQ("chrome__deleted_", collector_.Sanitize("chrome (deleted)"));
91ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter  EXPECT_EQ("foo_bar", collector_.Sanitize("foo.bar"));
92ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter  EXPECT_EQ("", collector_.Sanitize(""));
93ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter  EXPECT_EQ("_", collector_.Sanitize(" "));
94ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter}
95ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter
960340316050044e0995b98fea87ed41ea77abb28bKen MixterTEST_F(CrashCollectorTest, FormatDumpBasename) {
970340316050044e0995b98fea87ed41ea77abb28bKen Mixter  struct tm tm = {0};
980340316050044e0995b98fea87ed41ea77abb28bKen Mixter  tm.tm_sec = 15;
990340316050044e0995b98fea87ed41ea77abb28bKen Mixter  tm.tm_min = 50;
1000340316050044e0995b98fea87ed41ea77abb28bKen Mixter  tm.tm_hour = 13;
1010340316050044e0995b98fea87ed41ea77abb28bKen Mixter  tm.tm_mday = 23;
1020340316050044e0995b98fea87ed41ea77abb28bKen Mixter  tm.tm_mon = 4;
1030340316050044e0995b98fea87ed41ea77abb28bKen Mixter  tm.tm_year = 110;
1040340316050044e0995b98fea87ed41ea77abb28bKen Mixter  tm.tm_isdst = -1;
1050340316050044e0995b98fea87ed41ea77abb28bKen Mixter  std::string basename =
1060340316050044e0995b98fea87ed41ea77abb28bKen Mixter      collector_.FormatDumpBasename("foo", mktime(&tm), 100);
1070340316050044e0995b98fea87ed41ea77abb28bKen Mixter  ASSERT_EQ("foo.20100523.135015.100", basename);
1080340316050044e0995b98fea87ed41ea77abb28bKen Mixter}
1090340316050044e0995b98fea87ed41ea77abb28bKen Mixter
110207694d3f491ef602a859c30cc1379584f2d61cfKen MixterTEST_F(CrashCollectorTest, GetCrashPath) {
111207694d3f491ef602a859c30cc1379584f2d61cfKen Mixter  EXPECT_EQ("/var/spool/crash/myprog.20100101.1200.1234.core",
112207694d3f491ef602a859c30cc1379584f2d61cfKen Mixter            collector_.GetCrashPath(FilePath("/var/spool/crash"),
113207694d3f491ef602a859c30cc1379584f2d61cfKen Mixter                                    "myprog.20100101.1200.1234",
114207694d3f491ef602a859c30cc1379584f2d61cfKen Mixter                                    "core").value());
115207694d3f491ef602a859c30cc1379584f2d61cfKen Mixter  EXPECT_EQ("/home/chronos/user/crash/chrome.20100101.1200.1234.dmp",
116207694d3f491ef602a859c30cc1379584f2d61cfKen Mixter            collector_.GetCrashPath(FilePath("/home/chronos/user/crash"),
117207694d3f491ef602a859c30cc1379584f2d61cfKen Mixter                                    "chrome.20100101.1200.1234",
118207694d3f491ef602a859c30cc1379584f2d61cfKen Mixter                                    "dmp").value());
119207694d3f491ef602a859c30cc1379584f2d61cfKen Mixter}
120207694d3f491ef602a859c30cc1379584f2d61cfKen Mixter
121207694d3f491ef602a859c30cc1379584f2d61cfKen Mixter
12204ec10fc93b08057657503559ecf511661b55c9fKen Mixterbool CrashCollectorTest::CheckHasCapacity() {
12378fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung  const char* kFullMessage =
12478fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung      StringPrintf("Crash directory %s already full",
12578fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung                   test_dir_.path().value().c_str()).c_str();
12678fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung  bool has_capacity = collector_.CheckHasCapacity(test_dir_.path());
127a324932e066ccb7ed9d62db9c409ee2c10052554Ken Mixter  bool has_message = FindLog(kFullMessage);
12804ec10fc93b08057657503559ecf511661b55c9fKen Mixter  EXPECT_EQ(has_message, !has_capacity);
12904ec10fc93b08057657503559ecf511661b55c9fKen Mixter  return has_capacity;
13004ec10fc93b08057657503559ecf511661b55c9fKen Mixter}
13104ec10fc93b08057657503559ecf511661b55c9fKen Mixter
132ee849c5ef4c416cb0321483fa10c92f8aada3179Ken MixterTEST_F(CrashCollectorTest, CheckHasCapacityUsual) {
133ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter  // Test kMaxCrashDirectorySize - 1 non-meta files can be added.
13404ec10fc93b08057657503559ecf511661b55c9fKen Mixter  for (int i = 0; i < CrashCollector::kMaxCrashDirectorySize - 1; ++i) {
13578fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung    base::WriteFile(test_dir_.path().Append(StringPrintf("file%d.core", i)),
13678fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung                    "", 0);
13704ec10fc93b08057657503559ecf511661b55c9fKen Mixter    EXPECT_TRUE(CheckHasCapacity());
13804ec10fc93b08057657503559ecf511661b55c9fKen Mixter  }
13904ec10fc93b08057657503559ecf511661b55c9fKen Mixter
140ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter  // Test an additional kMaxCrashDirectorySize - 1 meta files fit.
14104ec10fc93b08057657503559ecf511661b55c9fKen Mixter  for (int i = 0; i < CrashCollector::kMaxCrashDirectorySize - 1; ++i) {
14278fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung    base::WriteFile(test_dir_.path().Append(StringPrintf("file%d.meta", i)),
14378fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung                    "", 0);
144ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter    EXPECT_TRUE(CheckHasCapacity());
14504ec10fc93b08057657503559ecf511661b55c9fKen Mixter  }
14604ec10fc93b08057657503559ecf511661b55c9fKen Mixter
147ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter  // Test an additional kMaxCrashDirectorySize meta files don't fit.
14804ec10fc93b08057657503559ecf511661b55c9fKen Mixter  for (int i = 0; i < CrashCollector::kMaxCrashDirectorySize; ++i) {
14978fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung    base::WriteFile(test_dir_.path().Append(StringPrintf("overage%d.meta", i)),
15078fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung                    "", 0);
15104ec10fc93b08057657503559ecf511661b55c9fKen Mixter    EXPECT_FALSE(CheckHasCapacity());
15204ec10fc93b08057657503559ecf511661b55c9fKen Mixter  }
15304ec10fc93b08057657503559ecf511661b55c9fKen Mixter}
15404ec10fc93b08057657503559ecf511661b55c9fKen Mixter
155ee849c5ef4c416cb0321483fa10c92f8aada3179Ken MixterTEST_F(CrashCollectorTest, CheckHasCapacityCorrectBasename) {
156ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter  // Test kMaxCrashDirectorySize - 1 files can be added.
15704ec10fc93b08057657503559ecf511661b55c9fKen Mixter  for (int i = 0; i < CrashCollector::kMaxCrashDirectorySize - 1; ++i) {
15878fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung    base::WriteFile(test_dir_.path().Append(StringPrintf("file.%d.core", i)),
15978fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung                    "", 0);
160ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter    EXPECT_TRUE(CheckHasCapacity());
16104ec10fc93b08057657503559ecf511661b55c9fKen Mixter  }
16278fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung  base::WriteFile(test_dir_.path().Append("file.last.core"), "", 0);
163ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter  EXPECT_FALSE(CheckHasCapacity());
164ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter}
16504ec10fc93b08057657503559ecf511661b55c9fKen Mixter
166ee849c5ef4c416cb0321483fa10c92f8aada3179Ken MixterTEST_F(CrashCollectorTest, CheckHasCapacityStrangeNames) {
167ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter  // Test many files with different extensions and same base fit.
168ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter  for (int i = 0; i < 5 * CrashCollector::kMaxCrashDirectorySize; ++i) {
16978fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung    base::WriteFile(test_dir_.path().Append(StringPrintf("a.%d", i)), "", 0);
170ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter    EXPECT_TRUE(CheckHasCapacity());
171ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter  }
172ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter  // Test dot files are treated as individual files.
173ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter  for (int i = 0; i < CrashCollector::kMaxCrashDirectorySize - 2; ++i) {
17478fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung    base::WriteFile(test_dir_.path().Append(StringPrintf(".file%d", i)), "", 0);
175ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter    EXPECT_TRUE(CheckHasCapacity());
176ee849c5ef4c416cb0321483fa10c92f8aada3179Ken Mixter  }
17778fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung  base::WriteFile(test_dir_.path().Append("normal.meta"), "", 0);
17804ec10fc93b08057657503559ecf511661b55c9fKen Mixter  EXPECT_FALSE(CheckHasCapacity());
17904ec10fc93b08057657503559ecf511661b55c9fKen Mixter}
18004ec10fc93b08057657503559ecf511661b55c9fKen Mixter
181afcf80821c57a189b53b7a66f76d13855d63821eKen MixterTEST_F(CrashCollectorTest, MetaData) {
1829b346474538a255bc7144ae358bb0ee129163d58Ken Mixter  const char kMetaFileBasename[] = "generated.meta";
18378fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung  FilePath meta_file = test_dir_.path().Append(kMetaFileBasename);
18478fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung  FilePath payload_file = test_dir_.path().Append("payload-file");
185afcf80821c57a189b53b7a66f76d13855d63821eKen Mixter  std::string contents;
186afcf80821c57a189b53b7a66f76d13855d63821eKen Mixter  const char kPayload[] = "foo";
187f30c641225e55055641ffe3fd679a96e44f34af6Ben Chan  ASSERT_TRUE(base::WriteFile(payload_file, kPayload, strlen(kPayload)));
188afcf80821c57a189b53b7a66f76d13855d63821eKen Mixter  collector_.AddCrashMetaData("foo", "bar");
189afcf80821c57a189b53b7a66f76d13855d63821eKen Mixter  collector_.WriteCrashMetaData(meta_file, "kernel", payload_file.value());
190a557c1187ff19d422db2a9c951ecd8f7243e79bdMike Frysinger  EXPECT_TRUE(base::ReadFileToString(meta_file, &contents));
19178fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung  const std::string kExpectedMeta =
19278fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung      StringPrintf("foo=bar\n"
19378fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung          "exec_name=kernel\n"
19478fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung          "payload=%s\n"
19578fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung          "payload_size=3\n"
19678fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung          "done=1\n",
19778fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung          test_dir_.path().Append("payload-file").value().c_str());
1989b346474538a255bc7144ae358bb0ee129163d58Ken Mixter  EXPECT_EQ(kExpectedMeta, contents);
1999b346474538a255bc7144ae358bb0ee129163d58Ken Mixter
2009b346474538a255bc7144ae358bb0ee129163d58Ken Mixter  // Test target of symlink is not overwritten.
20178fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung  payload_file = test_dir_.path().Append("payload2-file");
202f30c641225e55055641ffe3fd679a96e44f34af6Ben Chan  ASSERT_TRUE(base::WriteFile(payload_file, kPayload, strlen(kPayload)));
20378fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung  FilePath meta_symlink_path = test_dir_.path().Append("symlink.meta");
2049b346474538a255bc7144ae358bb0ee129163d58Ken Mixter  ASSERT_EQ(0,
2059b346474538a255bc7144ae358bb0ee129163d58Ken Mixter            symlink(kMetaFileBasename,
2069b346474538a255bc7144ae358bb0ee129163d58Ken Mixter                    meta_symlink_path.value().c_str()));
207a557c1187ff19d422db2a9c951ecd8f7243e79bdMike Frysinger  ASSERT_TRUE(base::PathExists(meta_symlink_path));
20874dc62460b8cdd5bfeac47bfe8e759fc04b55ef8Alex Vakulenko  brillo::ClearLog();
2099b346474538a255bc7144ae358bb0ee129163d58Ken Mixter  collector_.WriteCrashMetaData(meta_symlink_path,
2109b346474538a255bc7144ae358bb0ee129163d58Ken Mixter                                "kernel",
2119b346474538a255bc7144ae358bb0ee129163d58Ken Mixter                                payload_file.value());
212a324932e066ccb7ed9d62db9c409ee2c10052554Ken Mixter  // Target metadata contents should have stayed the same.
2139b346474538a255bc7144ae358bb0ee129163d58Ken Mixter  contents.clear();
214a557c1187ff19d422db2a9c951ecd8f7243e79bdMike Frysinger  EXPECT_TRUE(base::ReadFileToString(meta_file, &contents));
2159b346474538a255bc7144ae358bb0ee129163d58Ken Mixter  EXPECT_EQ(kExpectedMeta, contents);
216a324932e066ccb7ed9d62db9c409ee2c10052554Ken Mixter  EXPECT_TRUE(FindLog("Unable to write"));
2179b346474538a255bc7144ae358bb0ee129163d58Ken Mixter
2189b346474538a255bc7144ae358bb0ee129163d58Ken Mixter  // Test target of dangling symlink is not created.
219a557c1187ff19d422db2a9c951ecd8f7243e79bdMike Frysinger  base::DeleteFile(meta_file, false);
220a557c1187ff19d422db2a9c951ecd8f7243e79bdMike Frysinger  ASSERT_FALSE(base::PathExists(meta_file));
22174dc62460b8cdd5bfeac47bfe8e759fc04b55ef8Alex Vakulenko  brillo::ClearLog();
2229b346474538a255bc7144ae358bb0ee129163d58Ken Mixter  collector_.WriteCrashMetaData(meta_symlink_path, "kernel",
2239b346474538a255bc7144ae358bb0ee129163d58Ken Mixter                                payload_file.value());
224a557c1187ff19d422db2a9c951ecd8f7243e79bdMike Frysinger  EXPECT_FALSE(base::PathExists(meta_file));
225a324932e066ccb7ed9d62db9c409ee2c10052554Ken Mixter  EXPECT_TRUE(FindLog("Unable to write"));
226afcf80821c57a189b53b7a66f76d13855d63821eKen Mixter}
227afcf80821c57a189b53b7a66f76d13855d63821eKen Mixter
228c49dbd4775986f32b2f09659595f9f28ef7f6b44Ken MixterTEST_F(CrashCollectorTest, GetLogContents) {
22978fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung  FilePath config_file = test_dir_.path().Append("crash_config");
23078fcf66c1747ed6cc067e764ac3e39e12d6b103bSteve Fung  FilePath output_file = test_dir_.path().Append("crash_log");
231c49dbd4775986f32b2f09659595f9f28ef7f6b44Ken Mixter  const char kConfigContents[] =
232731da3379bd7ead7222b1a7add45e307bec7c865Daniel Erat      "foobar=echo hello there | \\\n  sed -e \"s/there/world/\"";
233c49dbd4775986f32b2f09659595f9f28ef7f6b44Ken Mixter  ASSERT_TRUE(
234f30c641225e55055641ffe3fd679a96e44f34af6Ben Chan      base::WriteFile(config_file, kConfigContents, strlen(kConfigContents)));
235a557c1187ff19d422db2a9c951ecd8f7243e79bdMike Frysinger  base::DeleteFile(FilePath(output_file), false);
236c49dbd4775986f32b2f09659595f9f28ef7f6b44Ken Mixter  EXPECT_FALSE(collector_.GetLogContents(config_file,
237c49dbd4775986f32b2f09659595f9f28ef7f6b44Ken Mixter                                         "barfoo",
238c49dbd4775986f32b2f09659595f9f28ef7f6b44Ken Mixter                                         output_file));
239a557c1187ff19d422db2a9c951ecd8f7243e79bdMike Frysinger  EXPECT_FALSE(base::PathExists(output_file));
240a557c1187ff19d422db2a9c951ecd8f7243e79bdMike Frysinger  base::DeleteFile(FilePath(output_file), false);
241c49dbd4775986f32b2f09659595f9f28ef7f6b44Ken Mixter  EXPECT_TRUE(collector_.GetLogContents(config_file,
242c49dbd4775986f32b2f09659595f9f28ef7f6b44Ken Mixter                                        "foobar",
243c49dbd4775986f32b2f09659595f9f28ef7f6b44Ken Mixter                                        output_file));
244a557c1187ff19d422db2a9c951ecd8f7243e79bdMike Frysinger  ASSERT_TRUE(base::PathExists(output_file));
245c49dbd4775986f32b2f09659595f9f28ef7f6b44Ken Mixter  std::string contents;
246a557c1187ff19d422db2a9c951ecd8f7243e79bdMike Frysinger  EXPECT_TRUE(base::ReadFileToString(output_file, &contents));
247c49dbd4775986f32b2f09659595f9f28ef7f6b44Ken Mixter  EXPECT_EQ("hello world\n", contents);
248c49dbd4775986f32b2f09659595f9f28ef7f6b44Ken Mixter}
249