blob: a5fc5fe21d4682c5629ec7bbdac9b1d14ea790ce [file] [log] [blame]
slanf8218ca2015-06-29 18:17:011// Copyright 2015 The Chromium 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
5#include <string>
6
7#include "base/files/file_util.h"
slanef83eab2015-12-09 00:59:318#include "chromecast/base/scoped_temp_file.h"
slanf8218ca2015-06-29 18:17:019#include "chromecast/crash/cast_crashdump_uploader.h"
10#include "testing/gmock/include/gmock/gmock.h"
11#include "testing/gtest/include/gtest/gtest.h"
Mark Mentovaiebb9ddd62017-09-25 17:24:4112#include "third_party/breakpad/breakpad/src/common/linux/libcurl_wrapper.h"
slanf8218ca2015-06-29 18:17:0113
14namespace chromecast {
15
16class MockLibcurlWrapper : public google_breakpad::LibcurlWrapper {
17 public:
18 MOCK_METHOD0(Init, bool());
19 MOCK_METHOD2(SetProxy,
20 bool(const std::string& proxy_host,
21 const std::string& proxy_userpwd));
22 MOCK_METHOD2(AddFile,
23 bool(const std::string& upload_file_path,
24 const std::string& basename));
25 MOCK_METHOD5(SendRequest,
26 bool(const std::string& url,
27 const std::map<std::string, std::string>& parameters,
Joshua Peraza766beea9b72020-04-22 17:25:5628 long* http_status_code,
slanf8218ca2015-06-29 18:17:0129 std::string* http_header_data,
30 std::string* http_response_data));
31};
32
33// Declared for the scope of this file to increase readability.
34using testing::_;
35using testing::Return;
36
37TEST(CastCrashdumpUploaderTest, UploadFailsWhenInitFails) {
Jinho Bangb10ad1f2018-01-18 22:56:5838 auto m = std::make_unique<testing::StrictMock<MockLibcurlWrapper>>();
mbjorge5265ce55f2017-02-08 01:35:5739 EXPECT_CALL(*m, Init()).Times(1).WillOnce(Return(false));
slanf8218ca2015-06-29 18:17:0140
41 CastCrashdumpData data;
42 data.product = "foobar";
43 data.version = "1.0";
44 data.guid = "AAA-BBB";
45 data.email = "[email protected]";
46 data.comments = "none";
47 data.minidump_pathname = "/tmp/foo.dmp";
48 data.crash_server = "http://foo.com";
mbjorge5265ce55f2017-02-08 01:35:5749 CastCrashdumpUploader uploader(data, std::move(m));
slanf8218ca2015-06-29 18:17:0150
51 ASSERT_FALSE(uploader.Upload(nullptr));
52}
53
54TEST(CastCrashdumpUploaderTest, UploadSucceedsWithValidParameters) {
Jinho Bangb10ad1f2018-01-18 22:56:5855 auto m = std::make_unique<testing::StrictMock<MockLibcurlWrapper>>();
slanf8218ca2015-06-29 18:17:0156
57 // Create a temporary file.
slanef83eab2015-12-09 00:59:3158 ScopedTempFile minidump;
slanf8218ca2015-06-29 18:17:0159
mbjorge5265ce55f2017-02-08 01:35:5760 EXPECT_CALL(*m, Init()).Times(1).WillOnce(Return(true));
61 EXPECT_CALL(*m, AddFile(minidump.path().value(), _)).WillOnce(Return(true));
62 EXPECT_CALL(*m, SendRequest("http://foo.com", _, _, _, _)).Times(1).WillOnce(
slanf8218ca2015-06-29 18:17:0163 Return(true));
64
65 CastCrashdumpData data;
66 data.product = "foobar";
67 data.version = "1.0";
68 data.guid = "AAA-BBB";
69 data.email = "[email protected]";
70 data.comments = "none";
slanef83eab2015-12-09 00:59:3171 data.minidump_pathname = minidump.path().value();
slanf8218ca2015-06-29 18:17:0172 data.crash_server = "http://foo.com";
mbjorge5265ce55f2017-02-08 01:35:5773 CastCrashdumpUploader uploader(data, std::move(m));
slanf8218ca2015-06-29 18:17:0174
75 ASSERT_TRUE(uploader.Upload(nullptr));
76}
77
78TEST(CastCrashdumpUploaderTest, UploadFailsWithInvalidPathname) {
Jinho Bangb10ad1f2018-01-18 22:56:5879 auto m = std::make_unique<testing::StrictMock<MockLibcurlWrapper>>();
mbjorge5265ce55f2017-02-08 01:35:5780 EXPECT_CALL(*m, Init()).Times(1).WillOnce(Return(true));
81 EXPECT_CALL(*m, SendRequest(_, _, _, _, _)).Times(0);
slanf8218ca2015-06-29 18:17:0182
83 CastCrashdumpData data;
84 data.product = "foobar";
85 data.version = "1.0";
86 data.guid = "AAA-BBB";
87 data.email = "[email protected]";
88 data.comments = "none";
89 data.minidump_pathname = "/invalid/file/path";
90 data.crash_server = "http://foo.com";
mbjorge5265ce55f2017-02-08 01:35:5791 CastCrashdumpUploader uploader(data, std::move(m));
slanf8218ca2015-06-29 18:17:0192
93 ASSERT_FALSE(uploader.Upload(nullptr));
94}
95
96TEST(CastCrashdumpUploaderTest, UploadFailsWithoutAllRequiredParameters) {
slanf8218ca2015-06-29 18:17:0197
98 // Create a temporary file.
slanef83eab2015-12-09 00:59:3199 ScopedTempFile minidump;
slanf8218ca2015-06-29 18:17:01100
101 // Has all the require fields for a crashdump.
102 CastCrashdumpData data;
103 data.product = "foobar";
104 data.version = "1.0";
105 data.guid = "AAA-BBB";
106 data.email = "[email protected]";
107 data.comments = "none";
slanef83eab2015-12-09 00:59:31108 data.minidump_pathname = minidump.path().value();
slanf8218ca2015-06-29 18:17:01109 data.crash_server = "http://foo.com";
110
111 // Test with empty product name.
112 data.product = "";
Jinho Bangb10ad1f2018-01-18 22:56:58113 auto m = std::make_unique<testing::StrictMock<MockLibcurlWrapper>>();
mbjorge5265ce55f2017-02-08 01:35:57114 EXPECT_CALL(*m, Init()).Times(1).WillOnce(Return(true));
115 CastCrashdumpUploader uploader_no_product(data, std::move(m));
slanf8218ca2015-06-29 18:17:01116 ASSERT_FALSE(uploader_no_product.Upload(nullptr));
117 data.product = "foobar";
118
119 // Test with empty product version.
120 data.version = "";
Jinho Bangb10ad1f2018-01-18 22:56:58121 m = std::make_unique<testing::StrictMock<MockLibcurlWrapper>>();
mbjorge5265ce55f2017-02-08 01:35:57122 EXPECT_CALL(*m, Init()).Times(1).WillOnce(Return(true));
123 CastCrashdumpUploader uploader_no_version(data, std::move(m));
slanf8218ca2015-06-29 18:17:01124 ASSERT_FALSE(uploader_no_version.Upload(nullptr));
125 data.version = "1.0";
126
127 // Test with empty client GUID.
128 data.guid = "";
Jinho Bangb10ad1f2018-01-18 22:56:58129 m = std::make_unique<testing::StrictMock<MockLibcurlWrapper>>();
mbjorge5265ce55f2017-02-08 01:35:57130 EXPECT_CALL(*m, Init()).Times(1).WillOnce(Return(true));
131 CastCrashdumpUploader uploader_no_guid(data, std::move(m));
slanf8218ca2015-06-29 18:17:01132 ASSERT_FALSE(uploader_no_guid.Upload(nullptr));
133}
134
135TEST(CastCrashdumpUploaderTest, UploadFailsWithInvalidAttachment) {
Jinho Bangb10ad1f2018-01-18 22:56:58136 auto m = std::make_unique<testing::StrictMock<MockLibcurlWrapper>>();
slanf8218ca2015-06-29 18:17:01137
138 // Create a temporary file.
slanef83eab2015-12-09 00:59:31139 ScopedTempFile minidump;
slanf8218ca2015-06-29 18:17:01140
slanf8218ca2015-06-29 18:17:01141 CastCrashdumpData data;
142 data.product = "foobar";
143 data.version = "1.0";
144 data.guid = "AAA-BBB";
145 data.email = "[email protected]";
146 data.comments = "none";
slanef83eab2015-12-09 00:59:31147 data.minidump_pathname = minidump.path().value();
slanf8218ca2015-06-29 18:17:01148 data.crash_server = "http://foo.com";
mbjorge5265ce55f2017-02-08 01:35:57149 CastCrashdumpUploader uploader(data, std::move(m));
slanf8218ca2015-06-29 18:17:01150
151 // Add a file that does not exist as an attachment.
Yi Fandbe50ca2019-08-12 23:12:07152 ASSERT_FALSE(uploader.AddAttachment("label", "/path/does/not/exist"));
slanf8218ca2015-06-29 18:17:01153}
154
155TEST(CastCrashdumpUploaderTest, UploadSucceedsWithValidAttachment) {
Jinho Bangb10ad1f2018-01-18 22:56:58156 auto m = std::make_unique<testing::StrictMock<MockLibcurlWrapper>>();
slanf8218ca2015-06-29 18:17:01157
158 // Create a temporary file.
slanef83eab2015-12-09 00:59:31159 ScopedTempFile minidump;
slanf8218ca2015-06-29 18:17:01160
161 // Create a valid attachment.
slanef83eab2015-12-09 00:59:31162 ScopedTempFile attachment;
slanf8218ca2015-06-29 18:17:01163
mbjorge5265ce55f2017-02-08 01:35:57164 EXPECT_CALL(*m, Init()).Times(1).WillOnce(Return(true));
165 EXPECT_CALL(*m, AddFile(minidump.path().value(), _)).WillOnce(Return(true));
166 EXPECT_CALL(*m, AddFile(attachment.path().value(), _)).WillOnce(Return(true));
167 EXPECT_CALL(*m, SendRequest(_, _, _, _, _)).Times(1).WillOnce(Return(true));
slanf8218ca2015-06-29 18:17:01168
169 CastCrashdumpData data;
170 data.product = "foobar";
171 data.version = "1.0";
172 data.guid = "AAA-BBB";
173 data.email = "[email protected]";
174 data.comments = "none";
slanef83eab2015-12-09 00:59:31175 data.minidump_pathname = minidump.path().value();
slanf8218ca2015-06-29 18:17:01176 data.crash_server = "http://foo.com";
mbjorge5265ce55f2017-02-08 01:35:57177 CastCrashdumpUploader uploader(data, std::move(m));
slanf8218ca2015-06-29 18:17:01178
slanef83eab2015-12-09 00:59:31179 // Add a valid file as an attachment.
180 uploader.AddAttachment("label", attachment.path().value());
slanf8218ca2015-06-29 18:17:01181 ASSERT_TRUE(uploader.Upload(nullptr));
182}
183
Mark Mentovaiebb9ddd62017-09-25 17:24:41184} // namespace chromecast