blob: 331cf689613cd225b36e57551642c0b14627251b [file] [log] [blame]
// Copyright 2019 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 "remoting/client/notification/gstatic_json_fetcher.h"
#include <memory>
#include "base/run_loop.h"
#include "base/test/gmock_callback_support.h"
#include "base/test/mock_callback.h"
#include "base/test/task_environment.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/values.h"
#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
#include "net/url_request/test_url_fetcher_factory.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace remoting {
namespace {
using ::testing::Return;
constexpr char kTestPath1[] = "test_1.json";
constexpr char kTestPath2[] = "test_2.json";
constexpr char kTestJsonData1[] = R"({"a": 1})";
constexpr char kTestJsonData2[] = R"(["123"])";
MATCHER(NoJsonData, "") {
return !arg;
}
MATCHER(IsJsonData1, "") {
if (!arg || !arg->is_dict()) {
return false;
}
const base::Value* a = arg->FindKey("a");
return a && a->is_int() && a->GetInt() == 1;
}
MATCHER(IsJsonData2, "") {
if (!arg || !arg->is_list()) {
return false;
}
auto list = arg->GetListDeprecated();
return list.size() == 1 && list[0].is_string() &&
list[0].GetString() == "123";
}
} // namespace
class GstaticJsonFetcherTest : public testing::Test {
protected:
void SetFakeOkResponse(const std::string& relative_path,
const std::string& data) {
url_fetcher_factory_.SetFakeResponse(
GstaticJsonFetcher::GetFullUrl(relative_path), data, net::HTTP_OK,
net::OK);
}
void SetFakeFailedResponse(const std::string& relative_path,
net::HttpStatusCode status_code) {
url_fetcher_factory_.SetFakeResponse(
GstaticJsonFetcher::GetFullUrl(relative_path), "", status_code,
net::ERR_FAILED);
}
base::test::SingleThreadTaskEnvironment task_environment_{
base::test::SingleThreadTaskEnvironment::MainThreadType::IO};
net::FakeURLFetcherFactory url_fetcher_factory_{nullptr};
GstaticJsonFetcher fetcher_{base::ThreadTaskRunnerHandle::Get()};
};
TEST_F(GstaticJsonFetcherTest, FetchJsonFileSuccess) {
SetFakeOkResponse(kTestPath1, kTestJsonData1);
base::MockCallback<JsonFetcher::FetchJsonFileCallback> callback;
base::RunLoop run_loop;
EXPECT_CALL(callback, Run(IsJsonData1()))
.WillOnce(base::test::RunClosure(run_loop.QuitClosure()));
fetcher_.FetchJsonFile(kTestPath1, callback.Get(),
TRAFFIC_ANNOTATION_FOR_TESTS);
run_loop.Run();
}
TEST_F(GstaticJsonFetcherTest, FetchTwoJsonFilesInParallel) {
SetFakeOkResponse(kTestPath1, kTestJsonData1);
SetFakeOkResponse(kTestPath2, kTestJsonData2);
base::RunLoop run_loop;
base::MockRepeatingClosure quit_on_second_run;
EXPECT_CALL(quit_on_second_run, Run())
.WillOnce(Return())
.WillOnce(base::test::RunClosure(run_loop.QuitClosure()));
base::MockCallback<JsonFetcher::FetchJsonFileCallback> callback1;
EXPECT_CALL(callback1, Run(IsJsonData1()))
.WillOnce(base::test::RunClosure(quit_on_second_run.Get()));
fetcher_.FetchJsonFile(kTestPath1, callback1.Get(),
TRAFFIC_ANNOTATION_FOR_TESTS);
base::MockCallback<JsonFetcher::FetchJsonFileCallback> callback2;
EXPECT_CALL(callback2, Run(IsJsonData2()))
.WillOnce(base::test::RunClosure(quit_on_second_run.Get()));
fetcher_.FetchJsonFile(kTestPath2, callback2.Get(),
TRAFFIC_ANNOTATION_FOR_TESTS);
run_loop.Run();
}
TEST_F(GstaticJsonFetcherTest, FetchJsonFileNotOk) {
SetFakeFailedResponse(kTestPath1, net::HTTP_INTERNAL_SERVER_ERROR);
base::MockCallback<JsonFetcher::FetchJsonFileCallback> callback;
base::RunLoop run_loop;
EXPECT_CALL(callback, Run(NoJsonData()))
.WillOnce(base::test::RunClosure(run_loop.QuitClosure()));
fetcher_.FetchJsonFile(kTestPath1, callback.Get(),
TRAFFIC_ANNOTATION_FOR_TESTS);
run_loop.Run();
}
TEST_F(GstaticJsonFetcherTest, FetchJsonFileMalformed) {
SetFakeOkResponse(kTestPath1, "Malformed!");
base::MockCallback<JsonFetcher::FetchJsonFileCallback> callback;
base::RunLoop run_loop;
EXPECT_CALL(callback, Run(NoJsonData()))
.WillOnce(base::test::RunClosure(run_loop.QuitClosure()));
fetcher_.FetchJsonFile(kTestPath1, callback.Get(),
TRAFFIC_ANNOTATION_FOR_TESTS);
run_loop.Run();
}
} // namespace remoting