blob: 0bb3b0bd60e927dbce670c69e37ee8f8283d5f21 [file] [log] [blame]
// Copyright 2016 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 "chromeos/components/tether/host_scan_device_prioritizer_impl.h"
#include <memory>
#include "chromeos/components/tether/device_id_tether_network_guid_map.h"
#include "chromeos/components/tether/tether_host_response_recorder.h"
#include "components/cryptauth/remote_device_test_util.h"
#include "components/sync_preferences/testing_pref_service_syncable.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace chromeos {
namespace tether {
namespace {
cryptauth::RemoteDeviceRef CreateRemoteDeviceRef(
int id,
int64_t last_update_time_millis) {
return cryptauth::RemoteDeviceRefBuilder()
.SetPublicKey("publicKey" + std::to_string(id))
.SetLastUpdateTimeMillis(last_update_time_millis)
.Build();
}
} // namespace
class HostScanDevicePrioritizerImplTest : public testing::Test {
protected:
HostScanDevicePrioritizerImplTest()
: test_devices_(cryptauth::CreateRemoteDeviceRefListForTest(10)) {}
void SetUp() override {
pref_service_ =
std::make_unique<sync_preferences::TestingPrefServiceSyncable>();
TetherHostResponseRecorder::RegisterPrefs(pref_service_->registry());
recorder_ =
std::make_unique<TetherHostResponseRecorder>(pref_service_.get());
prioritizer_ =
std::make_unique<HostScanDevicePrioritizerImpl>(recorder_.get());
}
cryptauth::RemoteDeviceRefList test_devices_;
std::unique_ptr<sync_preferences::TestingPrefServiceSyncable> pref_service_;
std::unique_ptr<TetherHostResponseRecorder> recorder_;
std::unique_ptr<HostScanDevicePrioritizerImpl> prioritizer_;
private:
DISALLOW_COPY_AND_ASSIGN(HostScanDevicePrioritizerImplTest);
};
TEST_F(HostScanDevicePrioritizerImplTest,
TestOnlyLastUpdateTime_RemoteDevices) {
test_devices_[0] = CreateRemoteDeviceRef(0, 15000L);
test_devices_[1] = CreateRemoteDeviceRef(1, 20000L);
test_devices_[2] = CreateRemoteDeviceRef(2, 300L);
test_devices_[3] = CreateRemoteDeviceRef(3, 10000L);
test_devices_[4] = CreateRemoteDeviceRef(4, 5000L);
test_devices_[5] = CreateRemoteDeviceRef(5, 30000L);
test_devices_[6] = CreateRemoteDeviceRef(6, 600L);
// Do not receive a TetherAvailabilityResponse or ConnectTetheringResponse.
cryptauth::RemoteDeviceRefList test_vector = cryptauth::RemoteDeviceRefList{
test_devices_[6], test_devices_[5], test_devices_[4], test_devices_[3],
test_devices_[2], test_devices_[1], test_devices_[0]};
prioritizer_->SortByHostScanOrder(&test_vector);
EXPECT_EQ((cryptauth::RemoteDeviceRefList{test_devices_[5], test_devices_[1],
test_devices_[0], test_devices_[3],
test_devices_[4], test_devices_[6],
test_devices_[2]}),
test_vector);
}
TEST_F(HostScanDevicePrioritizerImplTest,
TestOnlyTetherAvailabilityResponses_RemoteDevices) {
// Receive TetherAvailabilityResponses from devices 0-4.
recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[0]);
recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[1]);
recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[2]);
recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[3]);
recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[4]);
// Do not receive a ConnectTetheringResponse.
cryptauth::RemoteDeviceRefList test_vector = cryptauth::RemoteDeviceRefList{
test_devices_[6], test_devices_[5], test_devices_[4], test_devices_[3],
test_devices_[2], test_devices_[1], test_devices_[0]};
prioritizer_->SortByHostScanOrder(&test_vector);
EXPECT_EQ((cryptauth::RemoteDeviceRefList{test_devices_[4], test_devices_[3],
test_devices_[2], test_devices_[1],
test_devices_[0], test_devices_[6],
test_devices_[5]}),
test_vector);
}
TEST_F(HostScanDevicePrioritizerImplTest,
TestBothTypesOfResponses_RemoteDevices) {
// Receive TetherAvailabilityResponses from devices 0-4.
recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[0]);
recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[1]);
recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[2]);
recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[3]);
recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[4]);
// Receive ConnectTetheringResponse from device 0.
recorder_->RecordSuccessfulConnectTetheringResponse(test_devices_[0]);
cryptauth::RemoteDeviceRefList test_vector = cryptauth::RemoteDeviceRefList{
test_devices_[6], test_devices_[5], test_devices_[4], test_devices_[3],
test_devices_[2], test_devices_[1], test_devices_[0]};
prioritizer_->SortByHostScanOrder(&test_vector);
EXPECT_EQ((cryptauth::RemoteDeviceRefList{test_devices_[0], test_devices_[4],
test_devices_[3], test_devices_[2],
test_devices_[1], test_devices_[6],
test_devices_[5]}),
test_vector);
}
TEST_F(HostScanDevicePrioritizerImplTest,
TestBothTypesOfResponses_DifferentOrder_RemoteDevices) {
// Receive different order.
recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[0]);
recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[2]);
recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[1]);
recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[4]);
recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[3]);
// Receive ConnectTetheringResponse from device 1.
recorder_->RecordSuccessfulConnectTetheringResponse(test_devices_[1]);
cryptauth::RemoteDeviceRefList test_vector = cryptauth::RemoteDeviceRefList{
test_devices_[9], test_devices_[8], test_devices_[7], test_devices_[6],
test_devices_[5], test_devices_[4], test_devices_[3], test_devices_[2],
test_devices_[1], test_devices_[0]};
prioritizer_->SortByHostScanOrder(&test_vector);
EXPECT_EQ((cryptauth::RemoteDeviceRefList{
test_devices_[1], test_devices_[3], test_devices_[4],
test_devices_[2], test_devices_[0], test_devices_[9],
test_devices_[8], test_devices_[7], test_devices_[6],
test_devices_[5]}),
test_vector);
}
TEST_F(HostScanDevicePrioritizerImplTest,
TestLastUpdateTimeAndBothTypesOfResponses_RemoteDevices) {
test_devices_[0] = CreateRemoteDeviceRef(0, 2000L);
test_devices_[1] = CreateRemoteDeviceRef(1, 9000000L);
test_devices_[2] = CreateRemoteDeviceRef(2, 3000L);
test_devices_[3] = CreateRemoteDeviceRef(3, 7000L);
test_devices_[4] = CreateRemoteDeviceRef(4, 5000L);
test_devices_[5] = CreateRemoteDeviceRef(5, 4000L);
test_devices_[6] = CreateRemoteDeviceRef(6, 10L);
test_devices_[7] = CreateRemoteDeviceRef(7, 40L);
test_devices_[8] = CreateRemoteDeviceRef(8, 80L);
test_devices_[9] = CreateRemoteDeviceRef(9, 20L);
// Receive different order.
recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[0]);
recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[2]);
recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[1]);
recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[4]);
recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[3]);
// Receive ConnectTetheringResponse from device 1.
recorder_->RecordSuccessfulConnectTetheringResponse(test_devices_[1]);
cryptauth::RemoteDeviceRefList test_vector = cryptauth::RemoteDeviceRefList{
test_devices_[9], test_devices_[8], test_devices_[7], test_devices_[6],
test_devices_[5], test_devices_[4], test_devices_[3], test_devices_[2],
test_devices_[1], test_devices_[0]};
prioritizer_->SortByHostScanOrder(&test_vector);
EXPECT_EQ((cryptauth::RemoteDeviceRefList{
test_devices_[1], test_devices_[3], test_devices_[4],
test_devices_[2], test_devices_[0], test_devices_[5],
test_devices_[8], test_devices_[7], test_devices_[9],
test_devices_[6]}),
test_vector);
}
} // namespace tether
} // namespace chromeos