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