blob: 5474f482b76bed54bdc4a1ee9379141e927e8b44 [file] [log] [blame]
Steve Fung6c34c252015-08-20 00:27:30 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Simon Queacc79382012-05-04 18:10:09 -070016
Ben Chan7e776902014-06-18 13:19:51 -070017#include <base/files/file_enumerator.h>
Ben Chanab6cc902014-09-05 08:21:06 -070018#include <base/files/file_util.h>
Ben Chan7e776902014-06-18 13:19:51 -070019#include <base/files/scoped_temp_dir.h>
Peter Qiu6aa551e2015-03-06 11:42:04 -080020#include <base/strings/stringprintf.h>
Alex Vakulenko74dc6242015-10-13 09:23:34 -070021#include <brillo/syslog_logging.h>
Steve Fung6e139522015-02-05 14:54:16 -080022#include <gmock/gmock.h>
Ben Chan7e776902014-06-18 13:19:51 -070023#include <gtest/gtest.h>
24
Steve Fung129bea52015-07-23 13:11:15 -070025#include "udev_collector.h"
Simon Queacc79382012-05-04 18:10:09 -070026
Simon Que9f90aca2013-02-19 17:19:52 -080027using base::FilePath;
28
Simon Queacc79382012-05-04 18:10:09 -070029namespace {
30
31// Dummy log config file name.
32const char kLogConfigFileName[] = "log_config_file";
33
Peter Qiu6aa551e2015-03-06 11:42:04 -080034// Dummy directory for storing device coredumps.
35const char kDevCoredumpDirectory[] = "devcoredump";
36
Simon Queacc79382012-05-04 18:10:09 -070037// A bunch of random rules to put into the dummy log config file.
38const char kLogConfigFileContents[] =
Daniel Erat731da332015-01-28 09:48:10 -070039 "crash_reporter-udev-collection-change-card0-drm=echo change card0 drm\n"
40 "crash_reporter-udev-collection-add-state0-cpu=echo change state0 cpu\n"
Peter Qiu6aa551e2015-03-06 11:42:04 -080041 "crash_reporter-udev-collection-devcoredump-iwlwifi=echo devcoredump\n"
Daniel Erat731da332015-01-28 09:48:10 -070042 "cros_installer=echo not for udev";
Simon Queacc79382012-05-04 18:10:09 -070043
Peter Qiu6aa551e2015-03-06 11:42:04 -080044const char kCrashLogFilePattern[] = "*.log.gz";
45const char kDevCoredumpFilePattern[] = "*.devcore";
46
47// Dummy content for device coredump data file.
48const char kDevCoredumpDataContents[] = "coredump";
49
50// Content for failing device's uevent file.
51const char kFailingDeviceUeventContents[] = "DRIVER=iwlwifi\n";
52
Simon Queacc79382012-05-04 18:10:09 -070053void CountCrash() {}
54
55bool s_consent_given = true;
56
57bool IsMetrics() {
58 return s_consent_given;
59}
60
Peter Qiu6aa551e2015-03-06 11:42:04 -080061// Returns the number of files found in the given path that matches the
62// specified file name pattern.
63int GetNumFiles(const FilePath& path, const std::string& file_pattern) {
Mike Frysingera557c112014-02-05 22:55:39 -050064 base::FileEnumerator enumerator(path, false, base::FileEnumerator::FILES,
Peter Qiu6aa551e2015-03-06 11:42:04 -080065 file_pattern);
Simon Queacc79382012-05-04 18:10:09 -070066 int num_files = 0;
67 for (FilePath file_path = enumerator.Next();
68 !file_path.value().empty();
69 file_path = enumerator.Next()) {
70 num_files++;
71 }
72 return num_files;
73}
74
75} // namespace
76
Steve Fung6e139522015-02-05 14:54:16 -080077class UdevCollectorMock : public UdevCollector {
78 public:
79 MOCK_METHOD0(SetUpDBus, void());
80};
81
Simon Queacc79382012-05-04 18:10:09 -070082class UdevCollectorTest : public ::testing::Test {
Lei Zhang9b1f3002014-04-24 02:10:57 -070083 protected:
84 base::ScopedTempDir temp_dir_generator_;
85
86 void HandleCrash(const std::string &udev_event) {
87 collector_.HandleCrash(udev_event);
88 }
89
Peter Qiu6aa551e2015-03-06 11:42:04 -080090 void GenerateDevCoredump(const std::string& device_name) {
91 // Generate coredump data file.
92 ASSERT_TRUE(CreateDirectory(
93 FilePath(base::StringPrintf("%s/%s",
94 collector_.dev_coredump_directory_.c_str(),
95 device_name.c_str()))));
96 FilePath data_path =
97 FilePath(base::StringPrintf("%s/%s/data",
98 collector_.dev_coredump_directory_.c_str(),
99 device_name.c_str()));
100 ASSERT_EQ(strlen(kDevCoredumpDataContents),
101 base::WriteFile(data_path,
102 kDevCoredumpDataContents,
103 strlen(kDevCoredumpDataContents)));
104 // Generate uevent file for failing device.
105 ASSERT_TRUE(CreateDirectory(
106 FilePath(base::StringPrintf("%s/%s/failing_device",
107 collector_.dev_coredump_directory_.c_str(),
108 device_name.c_str()))));
109 FilePath uevent_path =
110 FilePath(base::StringPrintf("%s/%s/failing_device/uevent",
111 collector_.dev_coredump_directory_.c_str(),
112 device_name.c_str()));
113 ASSERT_EQ(strlen(kFailingDeviceUeventContents),
114 base::WriteFile(uevent_path,
115 kFailingDeviceUeventContents,
116 strlen(kFailingDeviceUeventContents)));
117 }
118
Lei Zhang9b1f3002014-04-24 02:10:57 -0700119 private:
Alex Vakulenko0dfc9ce2014-08-14 12:55:41 -0700120 void SetUp() override {
Simon Queacc79382012-05-04 18:10:09 -0700121 s_consent_given = true;
122
Steve Fung6e139522015-02-05 14:54:16 -0800123 EXPECT_CALL(collector_, SetUpDBus()).WillRepeatedly(testing::Return());
124
Lei Zhang9b1f3002014-04-24 02:10:57 -0700125 collector_.Initialize(CountCrash, IsMetrics);
Simon Queacc79382012-05-04 18:10:09 -0700126
Lei Zhang9b1f3002014-04-24 02:10:57 -0700127 ASSERT_TRUE(temp_dir_generator_.CreateUniqueTempDir());
Simon Queacc79382012-05-04 18:10:09 -0700128
129 FilePath log_config_path =
Lei Zhang9b1f3002014-04-24 02:10:57 -0700130 temp_dir_generator_.path().Append(kLogConfigFileName);
131 collector_.log_config_path_ = log_config_path;
132 collector_.ForceCrashDirectory(temp_dir_generator_.path());
Simon Queacc79382012-05-04 18:10:09 -0700133
Peter Qiu6aa551e2015-03-06 11:42:04 -0800134 FilePath dev_coredump_path =
135 temp_dir_generator_.path().Append(kDevCoredumpDirectory);
136 collector_.dev_coredump_directory_ = dev_coredump_path.value();
137
Simon Queacc79382012-05-04 18:10:09 -0700138 // Write to a dummy log config file.
139 ASSERT_EQ(strlen(kLogConfigFileContents),
Ben Chanf30c6412014-05-22 23:09:01 -0700140 base::WriteFile(log_config_path,
141 kLogConfigFileContents,
142 strlen(kLogConfigFileContents)));
Simon Queacc79382012-05-04 18:10:09 -0700143
Alex Vakulenko74dc6242015-10-13 09:23:34 -0700144 brillo::ClearLog();
Simon Queacc79382012-05-04 18:10:09 -0700145 }
146
Steve Fung6e139522015-02-05 14:54:16 -0800147 UdevCollectorMock collector_;
Simon Queacc79382012-05-04 18:10:09 -0700148};
149
150TEST_F(UdevCollectorTest, TestNoConsent) {
151 s_consent_given = false;
Lei Zhang9b1f3002014-04-24 02:10:57 -0700152 HandleCrash("ACTION=change:KERNEL=card0:SUBSYSTEM=drm");
Peter Qiu6aa551e2015-03-06 11:42:04 -0800153 EXPECT_EQ(0, GetNumFiles(temp_dir_generator_.path(), kCrashLogFilePattern));
Simon Queacc79382012-05-04 18:10:09 -0700154}
155
156TEST_F(UdevCollectorTest, TestNoMatch) {
157 // No rule should match this.
Lei Zhang9b1f3002014-04-24 02:10:57 -0700158 HandleCrash("ACTION=change:KERNEL=foo:SUBSYSTEM=bar");
Peter Qiu6aa551e2015-03-06 11:42:04 -0800159 EXPECT_EQ(0, GetNumFiles(temp_dir_generator_.path(), kCrashLogFilePattern));
Simon Queacc79382012-05-04 18:10:09 -0700160}
161
162TEST_F(UdevCollectorTest, TestMatches) {
163 // Try multiple udev events in sequence. The number of log files generated
164 // should increase.
Lei Zhang9b1f3002014-04-24 02:10:57 -0700165 HandleCrash("ACTION=change:KERNEL=card0:SUBSYSTEM=drm");
Peter Qiu6aa551e2015-03-06 11:42:04 -0800166 EXPECT_EQ(1, GetNumFiles(temp_dir_generator_.path(), kCrashLogFilePattern));
Lei Zhang9b1f3002014-04-24 02:10:57 -0700167 HandleCrash("ACTION=add:KERNEL=state0:SUBSYSTEM=cpu");
Peter Qiu6aa551e2015-03-06 11:42:04 -0800168 EXPECT_EQ(2, GetNumFiles(temp_dir_generator_.path(), kCrashLogFilePattern));
169}
170
171TEST_F(UdevCollectorTest, TestDevCoredump) {
172 GenerateDevCoredump("devcd0");
173 HandleCrash("ACTION=add:KERNEL_NUMBER=0:SUBSYSTEM=devcoredump");
174 EXPECT_EQ(1, GetNumFiles(temp_dir_generator_.path(),
175 kDevCoredumpFilePattern));
176 GenerateDevCoredump("devcd1");
177 HandleCrash("ACTION=add:KERNEL_NUMBER=1:SUBSYSTEM=devcoredump");
178 EXPECT_EQ(2, GetNumFiles(temp_dir_generator_.path(),
179 kDevCoredumpFilePattern));
Simon Queacc79382012-05-04 18:10:09 -0700180}
181
182// TODO(sque, crosbug.com/32238) - test wildcard cases, multiple identical udev
183// events.