blob: 90a2ff0d8505b1556dd7bd6593683e5f6a9d7629 [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
34 void AnonymizeLogMap(LogTool::LogMap* log_map) {
Darin Petkovce9b3a12013-01-10 16:38:54 +010035 log_tool_.AnonymizeLogMap(log_map);
36 }
37
38 LogTool log_tool_;
39};
40
41TEST_F(LogToolTest, AnonymizeLogMap) {
42 LogTool::LogMap log_map;
43 AnonymizeLogMap(&log_map);
44 EXPECT_TRUE(log_map.empty());
45 static const char kKey1[] = "log-key1";
46 static const char kKey2[] = "log-key2";
47 static const char kMAC[] = "aa:bb:cc:dd:ee:ff";
Jeffrey Kardatzke100dd1e2019-03-21 15:31:33 -070048 static const char kAnonymousMAC[] = "[MAC OUI=aa:bb:cc IFACE=1]";
Darin Petkovce9b3a12013-01-10 16:38:54 +010049 log_map[kKey1] = kMAC;
50 log_map[kKey2] = kMAC;
51 AnonymizeLogMap(&log_map);
52 EXPECT_EQ(2, log_map.size());
53 EXPECT_EQ(kAnonymousMAC, log_map[kKey1]);
54 EXPECT_EQ(kAnonymousMAC, log_map[kKey2]);
55}
56
Chris Morin790fd262019-04-03 20:29:36 -070057TEST_F(LogToolTest, EncodeString) {
Luis Hector Chavezfc2566f2018-09-13 15:00:36 -070058 // U+1F600 GRINNING FACE
59 constexpr const char kGrinningFaceUTF8[] = "\xF0\x9F\x98\x80";
60 constexpr const char kGrinningFaceBase64[] = "<base64>: 8J+YgA==";
61 EXPECT_EQ(kGrinningFaceUTF8,
Chris Morin790fd262019-04-03 20:29:36 -070062 LogTool::EncodeString(kGrinningFaceUTF8,
63 LogTool::Encoding::kAutodetect));
Luis Hector Chavezfc2566f2018-09-13 15:00:36 -070064 EXPECT_EQ(
65 kGrinningFaceUTF8,
Chris Morin790fd262019-04-03 20:29:36 -070066 LogTool::EncodeString(kGrinningFaceUTF8, LogTool::Encoding::kUtf8));
Luis Hector Chavezfc2566f2018-09-13 15:00:36 -070067 EXPECT_EQ(
68 kGrinningFaceBase64,
Chris Morin790fd262019-04-03 20:29:36 -070069 LogTool::EncodeString(kGrinningFaceUTF8, LogTool::Encoding::kBase64));
Luis Hector Chavezfc2566f2018-09-13 15:00:36 -070070
71 // .xz Stream Header Magic Bytes
72 constexpr const char kXzStreamHeaderMagicBytes[] = "\xFD\x37\x7A\x58\x5A\x00";
73 constexpr const char kXzStreamHeaderMagicUTF8[] =
74 "\xEF\xBF\xBD"
75 "7zXZ";
76 constexpr const char kXzStreamHeaderMagicBase64[] = "<base64>: /Td6WFo=";
77 EXPECT_EQ(kXzStreamHeaderMagicBase64,
Chris Morin790fd262019-04-03 20:29:36 -070078 LogTool::EncodeString(kXzStreamHeaderMagicBytes,
79 LogTool::Encoding::kAutodetect));
Luis Hector Chavezfc2566f2018-09-13 15:00:36 -070080 EXPECT_EQ(kXzStreamHeaderMagicUTF8,
Chris Morin790fd262019-04-03 20:29:36 -070081 LogTool::EncodeString(kXzStreamHeaderMagicBytes,
82 LogTool::Encoding::kUtf8));
Luis Hector Chavezfc2566f2018-09-13 15:00:36 -070083 EXPECT_EQ(kXzStreamHeaderMagicBase64,
Chris Morin790fd262019-04-03 20:29:36 -070084 LogTool::EncodeString(kXzStreamHeaderMagicBytes,
85 LogTool::Encoding::kBase64));
86
87 EXPECT_EQ(kXzStreamHeaderMagicBytes,
88 LogTool::EncodeString(kXzStreamHeaderMagicBytes,
89 LogTool::Encoding::kBinary));
Luis Hector Chavezfc2566f2018-09-13 15:00:36 -070090}
91
Fletcher Woodruff07c28532019-01-24 11:08:53 -070092class LogTest : public testing::Test {
93 protected:
94 void SetUp() override {
95 std::vector<char> buf(1024);
96
97 uid_t uid = getuid();
98 struct passwd pw_entry;
99 struct passwd* pw_result;
100 ASSERT_EQ(getpwuid_r(uid, &pw_entry, &buf[0], buf.size(), &pw_result), 0);
101 ASSERT_NE(pw_result, nullptr);
102 user_name_ = pw_entry.pw_name;
103
104 gid_t gid = getgid();
105 struct group gr_entry;
106 struct group* gr_result;
107 ASSERT_EQ(getgrgid_r(gid, &gr_entry, &buf[0], buf.size(), &gr_result), 0);
108 ASSERT_NE(gr_result, nullptr);
109 group_name_ = gr_entry.gr_name;
110 }
111
112 std::string user_name_;
113 std::string group_name_;
114};
115
116TEST_F(LogTest, GetFileLogData) {
117 base::ScopedTempDir temp;
118 ASSERT_TRUE(temp.CreateUniqueTempDir());
119
120 base::FilePath file_one = temp.GetPath().Append("test/file_one");
121 ASSERT_TRUE(WriteFile(file_one, "test_one_contents"));
122 const LogTool::Log log_one(LogTool::Log::kFile, "test_log_one",
123 file_one.value(), user_name_, group_name_);
Chris Morin790fd262019-04-03 20:29:36 -0700124 EXPECT_EQ(log_one.GetLogData(), "test_one_contents");
Fletcher Woodruff07c28532019-01-24 11:08:53 -0700125
126 base::FilePath file_two = temp.GetPath().Append("test/file_two");
127 ASSERT_TRUE(WriteFile(file_two, ""));
128 const LogTool::Log log_two(LogTool::Log::kFile, "test_log_two",
129 file_two.value(), user_name_, group_name_);
Chris Morin790fd262019-04-03 20:29:36 -0700130 EXPECT_EQ(log_two.GetLogData(), "<empty>");
Fletcher Woodruff07c28532019-01-24 11:08:53 -0700131
132 base::FilePath file_three = temp.GetPath().Append("test/file_three");
133 ASSERT_TRUE(WriteFile(file_three, "long input value"));
134 const LogTool::Log log_three(LogTool::Log::kFile, "test_log_three",
135 file_three.value(), user_name_, group_name_, 5);
Chris Morin790fd262019-04-03 20:29:36 -0700136 EXPECT_EQ(log_three.GetLogData(), "value");
Fletcher Woodruff07c28532019-01-24 11:08:53 -0700137}
138
139TEST_F(LogTest, GetCommandLogData) {
140 LogTool::Log log_one(LogTool::Log::kCommand, "test_log_one", "printf ''",
141 user_name_, group_name_);
142 log_one.DisableMinijailForTest();
Chris Morin790fd262019-04-03 20:29:36 -0700143 EXPECT_EQ(log_one.GetLogData(), "<empty>");
Fletcher Woodruff07c28532019-01-24 11:08:53 -0700144
145 LogTool::Log log_two(LogTool::Log::kCommand, "test_log_two",
146 "printf 'test_output'", user_name_, group_name_);
147 log_two.DisableMinijailForTest();
Chris Morin790fd262019-04-03 20:29:36 -0700148 EXPECT_EQ(log_two.GetLogData(), "test_output");
Fletcher Woodruff07c28532019-01-24 11:08:53 -0700149
150 LogTool::Log log_three(LogTool::Log::kCommand, "test_log_three",
151 "echo a,b,c | cut -d, -f2", user_name_,
152 group_name_);
153 log_three.DisableMinijailForTest();
Chris Morin790fd262019-04-03 20:29:36 -0700154 EXPECT_EQ(log_three.GetLogData(), "b\n");
Fletcher Woodruff07c28532019-01-24 11:08:53 -0700155}
Darin Petkovce9b3a12013-01-10 16:38:54 +0100156} // namespace debugd