blob: 1f50d49738acb4e1edf6acff0a553ce822db3a34 [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";
48 static const char kAnonymousMAC[] = "aa:bb:cc:00:00:01";
49 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
Luis Hector Chavezfc2566f2018-09-13 15:00:36 -070057TEST_F(LogToolTest, EnsureUTF8String) {
58 // 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,
62 LogTool::EnsureUTF8String(kGrinningFaceUTF8,
63 LogTool::Encoding::kAutodetect));
64 EXPECT_EQ(
65 kGrinningFaceUTF8,
66 LogTool::EnsureUTF8String(kGrinningFaceUTF8, LogTool::Encoding::kUtf8));
67 EXPECT_EQ(
68 kGrinningFaceBase64,
69 LogTool::EnsureUTF8String(kGrinningFaceUTF8, LogTool::Encoding::kBinary));
70
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,
78 LogTool::EnsureUTF8String(kXzStreamHeaderMagicBytes,
79 LogTool::Encoding::kAutodetect));
80 EXPECT_EQ(kXzStreamHeaderMagicUTF8,
81 LogTool::EnsureUTF8String(kXzStreamHeaderMagicBytes,
82 LogTool::Encoding::kUtf8));
83 EXPECT_EQ(kXzStreamHeaderMagicBase64,
84 LogTool::EnsureUTF8String(kXzStreamHeaderMagicBytes,
85 LogTool::Encoding::kBinary));
86}
87
Fletcher Woodruff07c28532019-01-24 11:08:53 -070088class LogTest : public testing::Test {
89 protected:
90 void SetUp() override {
91 std::vector<char> buf(1024);
92
93 uid_t uid = getuid();
94 struct passwd pw_entry;
95 struct passwd* pw_result;
96 ASSERT_EQ(getpwuid_r(uid, &pw_entry, &buf[0], buf.size(), &pw_result), 0);
97 ASSERT_NE(pw_result, nullptr);
98 user_name_ = pw_entry.pw_name;
99
100 gid_t gid = getgid();
101 struct group gr_entry;
102 struct group* gr_result;
103 ASSERT_EQ(getgrgid_r(gid, &gr_entry, &buf[0], buf.size(), &gr_result), 0);
104 ASSERT_NE(gr_result, nullptr);
105 group_name_ = gr_entry.gr_name;
106 }
107
108 std::string user_name_;
109 std::string group_name_;
110};
111
112TEST_F(LogTest, GetFileLogData) {
113 base::ScopedTempDir temp;
114 ASSERT_TRUE(temp.CreateUniqueTempDir());
115
116 base::FilePath file_one = temp.GetPath().Append("test/file_one");
117 ASSERT_TRUE(WriteFile(file_one, "test_one_contents"));
118 const LogTool::Log log_one(LogTool::Log::kFile, "test_log_one",
119 file_one.value(), user_name_, group_name_);
120 EXPECT_EQ(log_one.GetFileLogData(), "test_one_contents");
121
122 base::FilePath file_two = temp.GetPath().Append("test/file_two");
123 ASSERT_TRUE(WriteFile(file_two, ""));
124 const LogTool::Log log_two(LogTool::Log::kFile, "test_log_two",
125 file_two.value(), user_name_, group_name_);
126 EXPECT_EQ(log_two.GetFileLogData(), "<empty>");
127
128 base::FilePath file_three = temp.GetPath().Append("test/file_three");
129 ASSERT_TRUE(WriteFile(file_three, "long input value"));
130 const LogTool::Log log_three(LogTool::Log::kFile, "test_log_three",
131 file_three.value(), user_name_, group_name_, 5);
132 EXPECT_EQ(log_three.GetFileLogData(), "value");
133}
134
135TEST_F(LogTest, GetCommandLogData) {
136 LogTool::Log log_one(LogTool::Log::kCommand, "test_log_one", "printf ''",
137 user_name_, group_name_);
138 log_one.DisableMinijailForTest();
139 EXPECT_EQ(log_one.GetCommandLogData(), "<empty>");
140
141 LogTool::Log log_two(LogTool::Log::kCommand, "test_log_two",
142 "printf 'test_output'", user_name_, group_name_);
143 log_two.DisableMinijailForTest();
144 EXPECT_EQ(log_two.GetCommandLogData(), "test_output");
145
146 LogTool::Log log_three(LogTool::Log::kCommand, "test_log_three",
147 "echo a,b,c | cut -d, -f2", user_name_,
148 group_name_);
149 log_three.DisableMinijailForTest();
150 EXPECT_EQ(log_three.GetCommandLogData(), "b\n");
151}
Darin Petkovce9b3a12013-01-10 16:38:54 +0100152} // namespace debugd