blob: a2593b760389c08a931643fa608c1616c4d9d746 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <string>
#include "base/files/file_util.h"
#include "chromecast/base/scoped_temp_file.h"
#include "chromecast/crash/cast_crashdump_uploader.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/breakpad/breakpad/src/common/linux/libcurl_wrapper.h"
namespace chromecast {
class MockLibcurlWrapper : public google_breakpad::LibcurlWrapper {
public:
MOCK_METHOD0(Init, bool());
MOCK_METHOD2(SetProxy,
bool(const std::string& proxy_host,
const std::string& proxy_userpwd));
MOCK_METHOD2(AddFile,
bool(const std::string& upload_file_path,
const std::string& basename));
MOCK_METHOD5(SendRequest,
bool(const std::string& url,
const std::map<std::string, std::string>& parameters,
int* http_status_code,
std::string* http_header_data,
std::string* http_response_data));
};
// Declared for the scope of this file to increase readability.
using testing::_;
using testing::Return;
TEST(CastCrashdumpUploaderTest, UploadFailsWhenInitFails) {
auto m = std::make_unique<testing::StrictMock<MockLibcurlWrapper>>();
EXPECT_CALL(*m, Init()).Times(1).WillOnce(Return(false));
CastCrashdumpData data;
data.product = "foobar";
data.version = "1.0";
data.guid = "AAA-BBB";
data.email = "test@test.com";
data.comments = "none";
data.minidump_pathname = "/tmp/foo.dmp";
data.crash_server = "http://foo.com";
CastCrashdumpUploader uploader(data, std::move(m));
ASSERT_FALSE(uploader.Upload(nullptr));
}
TEST(CastCrashdumpUploaderTest, UploadSucceedsWithValidParameters) {
auto m = std::make_unique<testing::StrictMock<MockLibcurlWrapper>>();
// Create a temporary file.
ScopedTempFile minidump;
EXPECT_CALL(*m, Init()).Times(1).WillOnce(Return(true));
EXPECT_CALL(*m, AddFile(minidump.path().value(), _)).WillOnce(Return(true));
EXPECT_CALL(*m, SendRequest("http://foo.com", _, _, _, _)).Times(1).WillOnce(
Return(true));
CastCrashdumpData data;
data.product = "foobar";
data.version = "1.0";
data.guid = "AAA-BBB";
data.email = "test@test.com";
data.comments = "none";
data.minidump_pathname = minidump.path().value();
data.crash_server = "http://foo.com";
CastCrashdumpUploader uploader(data, std::move(m));
ASSERT_TRUE(uploader.Upload(nullptr));
}
TEST(CastCrashdumpUploaderTest, UploadFailsWithInvalidPathname) {
auto m = std::make_unique<testing::StrictMock<MockLibcurlWrapper>>();
EXPECT_CALL(*m, Init()).Times(1).WillOnce(Return(true));
EXPECT_CALL(*m, SendRequest(_, _, _, _, _)).Times(0);
CastCrashdumpData data;
data.product = "foobar";
data.version = "1.0";
data.guid = "AAA-BBB";
data.email = "test@test.com";
data.comments = "none";
data.minidump_pathname = "/invalid/file/path";
data.crash_server = "http://foo.com";
CastCrashdumpUploader uploader(data, std::move(m));
ASSERT_FALSE(uploader.Upload(nullptr));
}
TEST(CastCrashdumpUploaderTest, UploadFailsWithoutAllRequiredParameters) {
// Create a temporary file.
ScopedTempFile minidump;
// Has all the require fields for a crashdump.
CastCrashdumpData data;
data.product = "foobar";
data.version = "1.0";
data.guid = "AAA-BBB";
data.email = "test@test.com";
data.comments = "none";
data.minidump_pathname = minidump.path().value();
data.crash_server = "http://foo.com";
// Test with empty product name.
data.product = "";
auto m = std::make_unique<testing::StrictMock<MockLibcurlWrapper>>();
EXPECT_CALL(*m, Init()).Times(1).WillOnce(Return(true));
CastCrashdumpUploader uploader_no_product(data, std::move(m));
ASSERT_FALSE(uploader_no_product.Upload(nullptr));
data.product = "foobar";
// Test with empty product version.
data.version = "";
m = std::make_unique<testing::StrictMock<MockLibcurlWrapper>>();
EXPECT_CALL(*m, Init()).Times(1).WillOnce(Return(true));
CastCrashdumpUploader uploader_no_version(data, std::move(m));
ASSERT_FALSE(uploader_no_version.Upload(nullptr));
data.version = "1.0";
// Test with empty client GUID.
data.guid = "";
m = std::make_unique<testing::StrictMock<MockLibcurlWrapper>>();
EXPECT_CALL(*m, Init()).Times(1).WillOnce(Return(true));
CastCrashdumpUploader uploader_no_guid(data, std::move(m));
ASSERT_FALSE(uploader_no_guid.Upload(nullptr));
}
TEST(CastCrashdumpUploaderTest, UploadFailsWithInvalidAttachment) {
auto m = std::make_unique<testing::StrictMock<MockLibcurlWrapper>>();
// Create a temporary file.
ScopedTempFile minidump;
EXPECT_CALL(*m, Init()).Times(1).WillOnce(Return(true));
EXPECT_CALL(*m, AddFile(minidump.path().value(), _)).WillOnce(Return(true));
CastCrashdumpData data;
data.product = "foobar";
data.version = "1.0";
data.guid = "AAA-BBB";
data.email = "test@test.com";
data.comments = "none";
data.minidump_pathname = minidump.path().value();
data.crash_server = "http://foo.com";
CastCrashdumpUploader uploader(data, std::move(m));
// Add a file that does not exist as an attachment.
uploader.AddAttachment("label", "/path/does/not/exist");
ASSERT_FALSE(uploader.Upload(nullptr));
}
TEST(CastCrashdumpUploaderTest, UploadSucceedsWithValidAttachment) {
auto m = std::make_unique<testing::StrictMock<MockLibcurlWrapper>>();
// Create a temporary file.
ScopedTempFile minidump;
// Create a valid attachment.
ScopedTempFile attachment;
EXPECT_CALL(*m, Init()).Times(1).WillOnce(Return(true));
EXPECT_CALL(*m, AddFile(minidump.path().value(), _)).WillOnce(Return(true));
EXPECT_CALL(*m, AddFile(attachment.path().value(), _)).WillOnce(Return(true));
EXPECT_CALL(*m, SendRequest(_, _, _, _, _)).Times(1).WillOnce(Return(true));
CastCrashdumpData data;
data.product = "foobar";
data.version = "1.0";
data.guid = "AAA-BBB";
data.email = "test@test.com";
data.comments = "none";
data.minidump_pathname = minidump.path().value();
data.crash_server = "http://foo.com";
CastCrashdumpUploader uploader(data, std::move(m));
// Add a valid file as an attachment.
uploader.AddAttachment("label", attachment.path().value());
ASSERT_TRUE(uploader.Upload(nullptr));
}
} // namespace chromecast