blob: 5e269255e49f411dbfd34ef9342beaf091b900ac [file] [log] [blame]
// Copyright 2020 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 "media/fuchsia/cdm/service/provisioning_fetcher_impl.h"
#include <fuchsia/media/drm/cpp/fidl.h>
#include <memory>
#include "base/bind.h"
#include "base/fuchsia/mem_buffer_util.h"
#include "base/location.h"
#include "base/test/bind.h"
#include "base/test/task_environment.h"
#include "media/fuchsia/cdm/service/mock_provision_fetcher.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace media {
namespace {
namespace drm = ::fuchsia::media::drm;
using ::testing::_;
using ::testing::Eq;
using ::testing::Invoke;
using ::testing::WithArgs;
using MockProvisionFetcher = ::media::testing::MockProvisionFetcher;
constexpr char kTestDefaultUrl[] = "http://test_default_url.com/";
constexpr char kTestRequest[] = "test_request_message";
constexpr char kTestResponse[] = "test_response_message";
drm::ProvisioningRequest CreateProvisioningRequest(
fidl::StringPtr default_provisioning_server_url,
const std::string& message) {
drm::ProvisioningRequest request;
request.default_provisioning_server_url =
std::move(default_provisioning_server_url);
request.message = base::MemBufferFromString(message, "provisioning_request");
return request;
}
class ProvisioningFetcherImplTest : public ::testing::Test {
public:
ProvisioningFetcherImplTest() = default;
protected:
base::test::SingleThreadTaskEnvironment task_environment_{
base::test::SingleThreadTaskEnvironment::MainThreadType::IO};
};
TEST_F(ProvisioningFetcherImplTest, Fetch) {
ProvisioningFetcherImpl fetcher(base::BindLambdaForTesting([]() {
auto mock_provision_fetcher = std::make_unique<MockProvisionFetcher>();
EXPECT_CALL(*mock_provision_fetcher,
Retrieve(Eq(kTestDefaultUrl), Eq(kTestRequest), _))
.WillOnce(WithArgs<2>(
Invoke([](ProvisionFetcher::ResponseCB response_callback) {
std::move(response_callback).Run(true, kTestResponse);
})));
return std::unique_ptr<ProvisionFetcher>(std::move(mock_provision_fetcher));
}));
fetcher.Bind(base::MakeExpectedNotRunClosure(FROM_HERE));
absl::optional<std::string> response_message;
fetcher.Fetch(CreateProvisioningRequest(kTestDefaultUrl, kTestRequest),
[&](drm::ProvisioningResponse response) {
response_message =
base::StringFromMemBuffer(response.message);
});
ASSERT_TRUE(response_message.has_value());
EXPECT_EQ(*response_message, kTestResponse);
}
TEST_F(ProvisioningFetcherImplTest, RetrieveFails) {
ProvisioningFetcherImpl fetcher(base::BindLambdaForTesting([]() {
auto mock_provision_fetcher = std::make_unique<MockProvisionFetcher>();
EXPECT_CALL(*mock_provision_fetcher, Retrieve(_, _, _))
.WillOnce(WithArgs<2>(
Invoke([](ProvisionFetcher::ResponseCB response_callback) {
std::move(response_callback).Run(false, "");
})));
return std::unique_ptr<ProvisionFetcher>(std::move(mock_provision_fetcher));
}));
fetcher.Bind(base::MakeExpectedNotRunClosure(FROM_HERE));
absl::optional<std::string> response_message;
fetcher.Fetch(CreateProvisioningRequest(kTestDefaultUrl, kTestRequest),
[&](drm::ProvisioningResponse response) {
response_message =
base::StringFromMemBuffer(response.message);
});
ASSERT_TRUE(response_message.has_value());
EXPECT_TRUE(response_message->empty());
}
TEST_F(ProvisioningFetcherImplTest, NoDefaultProvisioningUrl) {
ProvisioningFetcherImpl fetcher(base::BindLambdaForTesting([]() {
auto mock_provision_fetcher = std::make_unique<MockProvisionFetcher>();
EXPECT_CALL(*mock_provision_fetcher, Retrieve(_, _, _))
.WillOnce(WithArgs<2>(
Invoke([](ProvisionFetcher::ResponseCB response_callback) {
std::move(response_callback).Run(true, kTestResponse);
})));
return std::unique_ptr<ProvisionFetcher>(std::move(mock_provision_fetcher));
}));
fetcher.Bind(base::MakeExpectedRunClosure(FROM_HERE));
fetcher.Fetch(CreateProvisioningRequest({}, kTestRequest),
[](drm::ProvisioningResponse response) { FAIL(); });
}
TEST_F(ProvisioningFetcherImplTest, MultipleRequestsFails) {
ProvisioningFetcherImpl fetcher(base::BindLambdaForTesting([]() {
auto mock_provision_fetcher = std::make_unique<MockProvisionFetcher>();
EXPECT_CALL(*mock_provision_fetcher, Retrieve(_, _, _)).Times(1);
return std::unique_ptr<ProvisionFetcher>(std::move(mock_provision_fetcher));
}));
fetcher.Bind(base::MakeExpectedRunClosure(FROM_HERE));
fetcher.Fetch(CreateProvisioningRequest(kTestDefaultUrl, kTestRequest),
[](drm::ProvisioningResponse) { FAIL(); });
fetcher.Fetch(CreateProvisioningRequest(kTestDefaultUrl, kTestRequest),
[](drm::ProvisioningResponse) { FAIL(); });
}
} // namespace
} // namespace media