blob: 5c5ddf1e3a09d7b0019e310cb22d48e93bb76320 [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 "remoting/host/gcd_rest_client.h"
#include "base/memory/ptr_util.h"
#include "base/run_loop.h"
#include "base/test/scoped_task_environment.h"
#include "base/test/simple_test_clock.h"
#include "base/values.h"
#include "net/url_request/test_url_fetcher_factory.h"
#include "remoting/base/fake_oauth_token_getter.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace remoting {
class GcdRestClientTest : public testing::Test {
public:
GcdRestClientTest()
: default_token_getter_(OAuthTokenGetter::SUCCESS,
"<fake_user_email>",
"<fake_access_token>") {}
void OnRequestComplete(GcdRestClient::Result result) {
++counter_;
last_result_ = result;
}
std::unique_ptr<base::DictionaryValue> MakePatchDetails(int id) {
std::unique_ptr<base::DictionaryValue> patch_details(
new base::DictionaryValue);
patch_details->SetInteger("id", id);
return patch_details;
}
void CreateClient(OAuthTokenGetter* token_getter = nullptr) {
if (!token_getter) {
token_getter = &default_token_getter_;
}
client_.reset(new GcdRestClient("http://gcd_base_url", "<gcd_device_id>",
nullptr, token_getter));
client_->SetClockForTest(base::WrapUnique(new base::SimpleTestClock));
}
protected:
net::TestURLFetcherFactory url_fetcher_factory_;
FakeOAuthTokenGetter default_token_getter_;
std::unique_ptr<GcdRestClient> client_;
int counter_ = 0;
GcdRestClient::Result last_result_ = GcdRestClient::OTHER_ERROR;
private:
base::test::ScopedTaskEnvironment scoped_task_environment_;
};
TEST_F(GcdRestClientTest, NetworkErrorGettingToken) {
FakeOAuthTokenGetter token_getter(OAuthTokenGetter::NETWORK_ERROR, "", "");
CreateClient(&token_getter);
client_->PatchState(MakePatchDetails(0),
base::Bind(&GcdRestClientTest::OnRequestComplete,
base::Unretained(this)));
base::RunLoop().RunUntilIdle();
EXPECT_EQ(1, counter_);
EXPECT_EQ(GcdRestClient::NETWORK_ERROR, last_result_);
}
TEST_F(GcdRestClientTest, AuthErrorGettingToken) {
FakeOAuthTokenGetter token_getter(OAuthTokenGetter::AUTH_ERROR, "", "");
CreateClient(&token_getter);
client_->PatchState(MakePatchDetails(0),
base::Bind(&GcdRestClientTest::OnRequestComplete,
base::Unretained(this)));
base::RunLoop().RunUntilIdle();
EXPECT_EQ(1, counter_);
EXPECT_EQ(GcdRestClient::OTHER_ERROR, last_result_);
}
TEST_F(GcdRestClientTest, NetworkErrorOnPost) {
CreateClient();
client_->PatchState(MakePatchDetails(0),
base::Bind(&GcdRestClientTest::OnRequestComplete,
base::Unretained(this)));
net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(fetcher);
fetcher->set_response_code(0);
fetcher->delegate()->OnURLFetchComplete(fetcher);
EXPECT_EQ(1, counter_);
EXPECT_EQ(GcdRestClient::NETWORK_ERROR, last_result_);
}
TEST_F(GcdRestClientTest, OtherErrorOnPost) {
CreateClient();
client_->PatchState(MakePatchDetails(0),
base::Bind(&GcdRestClientTest::OnRequestComplete,
base::Unretained(this)));
net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(fetcher);
fetcher->set_response_code(500);
fetcher->delegate()->OnURLFetchComplete(fetcher);
EXPECT_EQ(1, counter_);
EXPECT_EQ(GcdRestClient::OTHER_ERROR, last_result_);
}
TEST_F(GcdRestClientTest, NoSuchHost) {
CreateClient();
client_->PatchState(MakePatchDetails(0),
base::Bind(&GcdRestClientTest::OnRequestComplete,
base::Unretained(this)));
net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(fetcher);
fetcher->set_response_code(404);
fetcher->delegate()->OnURLFetchComplete(fetcher);
EXPECT_EQ(1, counter_);
EXPECT_EQ(GcdRestClient::NO_SUCH_HOST, last_result_);
}
TEST_F(GcdRestClientTest, Succeed) {
CreateClient();
client_->PatchState(MakePatchDetails(0),
base::Bind(&GcdRestClientTest::OnRequestComplete,
base::Unretained(this)));
net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(fetcher);
EXPECT_EQ("http://gcd_base_url/devices/%3Cgcd_device_id%3E/patchState",
fetcher->GetOriginalURL().spec());
EXPECT_EQ(
"{\"patches\":[{\"patch\":{\"id\":0},\"timeMs\":0.0}],"
"\"requestTimeMs\":0.0}",
fetcher->upload_data());
EXPECT_EQ("application/json", fetcher->upload_content_type());
fetcher->set_response_code(200);
fetcher->delegate()->OnURLFetchComplete(fetcher);
EXPECT_EQ(1, counter_);
EXPECT_EQ(GcdRestClient::SUCCESS, last_result_);
}
} // namespace remoting