blob: ad272add4d092c18cc0b77504017be5371378e96 [file] [log] [blame]
Darin Petkovce9b3a12013-01-10 16:38:54 +01001// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Fletcher Woodruff07c28532019-01-24 11:08:53 -07005#include <grp.h>
6#include <pwd.h>
7#include <sys/types.h>
8#include <unistd.h>
9#include <string>
10#include <vector>
11
12#include <base/files/file_path.h>
13#include <base/files/file_util.h>
14#include <base/files/scoped_temp_dir.h>
Eric Carusof9091f82017-04-28 14:18:59 -070015#include <dbus/mock_bus.h>
Darin Petkovce9b3a12013-01-10 16:38:54 +010016#include <gtest/gtest.h>
17
Alex Vakulenko262be3f2014-07-30 15:25:50 -070018#include "debugd/src/log_tool.h"
Darin Petkovce9b3a12013-01-10 16:38:54 +010019
Fletcher Woodruff07c28532019-01-24 11:08:53 -070020namespace {
21bool WriteFile(const base::FilePath& path, const std::string& contents) {
22 return base::CreateDirectory(path.DirName()) &&
23 base::WriteFile(path, contents.c_str(), contents.length()) ==
24 contents.length();
25}
26} // namespace
27
Darin Petkovce9b3a12013-01-10 16:38:54 +010028namespace debugd {
29
30class LogToolTest : public testing::Test {
31 protected:
Fletcher Woodruff07c28532019-01-24 11:08:53 -070032 LogToolTest() : log_tool_(new dbus::MockBus(dbus::Bus::Options())) {}
Eric Carusof9091f82017-04-28 14:18:59 -070033
Darin Petkovce9b3a12013-01-10 16:38:54 +010034 LogTool log_tool_;
35};
36
Chris Morin790fd262019-04-03 20:29:36 -070037TEST_F(LogToolTest, EncodeString) {
Luis Hector Chavezfc2566f2018-09-13 15:00:36 -070038 // U+1F600 GRINNING FACE
39 constexpr const char kGrinningFaceUTF8[] = "\xF0\x9F\x98\x80";
40 constexpr const char kGrinningFaceBase64[] = "<base64>: 8J+YgA==";
41 EXPECT_EQ(kGrinningFaceUTF8,
Chris Morin790fd262019-04-03 20:29:36 -070042 LogTool::EncodeString(kGrinningFaceUTF8,
43 LogTool::Encoding::kAutodetect));
Luis Hector Chavezfc2566f2018-09-13 15:00:36 -070044 EXPECT_EQ(
45 kGrinningFaceUTF8,
Chris Morin790fd262019-04-03 20:29:36 -070046 LogTool::EncodeString(kGrinningFaceUTF8, LogTool::Encoding::kUtf8));
Luis Hector Chavezfc2566f2018-09-13 15:00:36 -070047 EXPECT_EQ(
48 kGrinningFaceBase64,
Chris Morin790fd262019-04-03 20:29:36 -070049 LogTool::EncodeString(kGrinningFaceUTF8, LogTool::Encoding::kBase64));
Luis Hector Chavezfc2566f2018-09-13 15:00:36 -070050
51 // .xz Stream Header Magic Bytes
52 constexpr const char kXzStreamHeaderMagicBytes[] = "\xFD\x37\x7A\x58\x5A\x00";
53 constexpr const char kXzStreamHeaderMagicUTF8[] =
54 "\xEF\xBF\xBD"
55 "7zXZ";
56 constexpr const char kXzStreamHeaderMagicBase64[] = "<base64>: /Td6WFo=";
57 EXPECT_EQ(kXzStreamHeaderMagicBase64,
Chris Morin790fd262019-04-03 20:29:36 -070058 LogTool::EncodeString(kXzStreamHeaderMagicBytes,
59 LogTool::Encoding::kAutodetect));
Luis Hector Chavezfc2566f2018-09-13 15:00:36 -070060 EXPECT_EQ(kXzStreamHeaderMagicUTF8,
Chris Morin790fd262019-04-03 20:29:36 -070061 LogTool::EncodeString(kXzStreamHeaderMagicBytes,
62 LogTool::Encoding::kUtf8));
Luis Hector Chavezfc2566f2018-09-13 15:00:36 -070063 EXPECT_EQ(kXzStreamHeaderMagicBase64,
Chris Morin790fd262019-04-03 20:29:36 -070064 LogTool::EncodeString(kXzStreamHeaderMagicBytes,
65 LogTool::Encoding::kBase64));
66
67 EXPECT_EQ(kXzStreamHeaderMagicBytes,
68 LogTool::EncodeString(kXzStreamHeaderMagicBytes,
69 LogTool::Encoding::kBinary));
Luis Hector Chavezfc2566f2018-09-13 15:00:36 -070070}
71
Fletcher Woodruff07c28532019-01-24 11:08:53 -070072class LogTest : public testing::Test {
73 protected:
74 void SetUp() override {
75 std::vector<char> buf(1024);
76
77 uid_t uid = getuid();
78 struct passwd pw_entry;
79 struct passwd* pw_result;
80 ASSERT_EQ(getpwuid_r(uid, &pw_entry, &buf[0], buf.size(), &pw_result), 0);
81 ASSERT_NE(pw_result, nullptr);
82 user_name_ = pw_entry.pw_name;
83
84 gid_t gid = getgid();
85 struct group gr_entry;
86 struct group* gr_result;
87 ASSERT_EQ(getgrgid_r(gid, &gr_entry, &buf[0], buf.size(), &gr_result), 0);
88 ASSERT_NE(gr_result, nullptr);
89 group_name_ = gr_entry.gr_name;
90 }
91
92 std::string user_name_;
93 std::string group_name_;
94};
95
96TEST_F(LogTest, GetFileLogData) {
97 base::ScopedTempDir temp;
98 ASSERT_TRUE(temp.CreateUniqueTempDir());
99
100 base::FilePath file_one = temp.GetPath().Append("test/file_one");
101 ASSERT_TRUE(WriteFile(file_one, "test_one_contents"));
102 const LogTool::Log log_one(LogTool::Log::kFile, "test_log_one",
103 file_one.value(), user_name_, group_name_);
Chris Morin790fd262019-04-03 20:29:36 -0700104 EXPECT_EQ(log_one.GetLogData(), "test_one_contents");
Fletcher Woodruff07c28532019-01-24 11:08:53 -0700105
106 base::FilePath file_two = temp.GetPath().Append("test/file_two");
107 ASSERT_TRUE(WriteFile(file_two, ""));
108 const LogTool::Log log_two(LogTool::Log::kFile, "test_log_two",
109 file_two.value(), user_name_, group_name_);
Chris Morin790fd262019-04-03 20:29:36 -0700110 EXPECT_EQ(log_two.GetLogData(), "<empty>");
Fletcher Woodruff07c28532019-01-24 11:08:53 -0700111
112 base::FilePath file_three = temp.GetPath().Append("test/file_three");
113 ASSERT_TRUE(WriteFile(file_three, "long input value"));
114 const LogTool::Log log_three(LogTool::Log::kFile, "test_log_three",
115 file_three.value(), user_name_, group_name_, 5);
Chris Morin790fd262019-04-03 20:29:36 -0700116 EXPECT_EQ(log_three.GetLogData(), "value");
Fletcher Woodruff07c28532019-01-24 11:08:53 -0700117}
118
119TEST_F(LogTest, GetCommandLogData) {
120 LogTool::Log log_one(LogTool::Log::kCommand, "test_log_one", "printf ''",
121 user_name_, group_name_);
122 log_one.DisableMinijailForTest();
Chris Morin790fd262019-04-03 20:29:36 -0700123 EXPECT_EQ(log_one.GetLogData(), "<empty>");
Fletcher Woodruff07c28532019-01-24 11:08:53 -0700124
125 LogTool::Log log_two(LogTool::Log::kCommand, "test_log_two",
126 "printf 'test_output'", user_name_, group_name_);
127 log_two.DisableMinijailForTest();
Chris Morin790fd262019-04-03 20:29:36 -0700128 EXPECT_EQ(log_two.GetLogData(), "test_output");
Fletcher Woodruff07c28532019-01-24 11:08:53 -0700129
130 LogTool::Log log_three(LogTool::Log::kCommand, "test_log_three",
131 "echo a,b,c | cut -d, -f2", user_name_,
132 group_name_);
133 log_three.DisableMinijailForTest();
Chris Morin790fd262019-04-03 20:29:36 -0700134 EXPECT_EQ(log_three.GetLogData(), "b\n");
Fletcher Woodruff07c28532019-01-24 11:08:53 -0700135}
Darin Petkovce9b3a12013-01-10 16:38:54 +0100136} // namespace debugd