mirror of
https://github.com/kidfromjupiter/nearby.git
synced 2026-09-14 14:46:12 -04:00
Make sure timer is destroyed on the same thread callback is scheduled on.
PiperOrigin-RevId: 912325093
This commit is contained in:
committed by
Copybara-Service
parent
313efed9c9
commit
fc0fb02fee
@@ -24,7 +24,6 @@
|
||||
#include "absl/strings/string_view.h"
|
||||
#include "internal/base/file_path.h"
|
||||
#include "internal/platform/implementation/device_info.h"
|
||||
#include "internal/platform/task_runner.h"
|
||||
#include "sharing/internal/api/app_info.h"
|
||||
#include "sharing/internal/api/bluetooth_adapter.h"
|
||||
#include "sharing/internal/api/fast_init_ble_beacon.h"
|
||||
@@ -71,7 +70,6 @@ class MockSharingPlatform : public SharingPlatform {
|
||||
MOCK_METHOD(PreferenceManager&, GetPreferenceManager, (), (override));
|
||||
|
||||
MOCK_METHOD(AccountManager&, GetAccountManager, (), (override));
|
||||
MOCK_METHOD(TaskRunner&, GetDefaultTaskRunner, (), (override));
|
||||
MOCK_METHOD(nearby::api::DeviceInfo&, GetDeviceInfo, (), (override));
|
||||
MOCK_METHOD(std::unique_ptr<PublicCertificateDatabase>,
|
||||
CreatePublicCertificateDatabase, (const FilePath& database_path),
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include "absl/strings/string_view.h"
|
||||
#include "internal/base/file_path.h"
|
||||
#include "internal/platform/implementation/device_info.h"
|
||||
#include "internal/platform/task_runner.h"
|
||||
#include "sharing/internal/api/app_info.h"
|
||||
#include "sharing/internal/api/bluetooth_adapter.h"
|
||||
#include "sharing/internal/api/fast_init_ble_beacon.h"
|
||||
@@ -64,7 +63,6 @@ class SharingPlatform {
|
||||
|
||||
virtual PreferenceManager& GetPreferenceManager() = 0;
|
||||
virtual AccountManager& GetAccountManager() = 0;
|
||||
virtual TaskRunner& GetDefaultTaskRunner() = 0;
|
||||
virtual nearby::api::DeviceInfo& GetDeviceInfo() = 0;
|
||||
virtual std::unique_ptr<PublicCertificateDatabase>
|
||||
CreatePublicCertificateDatabase(const FilePath& database_path) = 0;
|
||||
|
||||
@@ -49,9 +49,6 @@ class Context {
|
||||
// count of tasks running at the same time.
|
||||
virtual std::unique_ptr<TaskRunner> CreateConcurrentTaskRunner(
|
||||
uint32_t concurrent_count) const = 0;
|
||||
|
||||
// Provides the API to retrieve TaskRunner to run a task globally.
|
||||
virtual TaskRunner* GetTaskRunner() = 0;
|
||||
};
|
||||
|
||||
} // namespace nearby
|
||||
|
||||
@@ -70,8 +70,4 @@ std::unique_ptr<TaskRunner> ContextImpl::CreateConcurrentTaskRunner(
|
||||
return task_runner;
|
||||
}
|
||||
|
||||
TaskRunner* ContextImpl::GetTaskRunner() {
|
||||
return &platform_.GetDefaultTaskRunner();
|
||||
}
|
||||
|
||||
} // namespace nearby
|
||||
|
||||
@@ -43,7 +43,6 @@ class ContextImpl : public Context {
|
||||
std::unique_ptr<TaskRunner> CreateSequencedTaskRunner() const override;
|
||||
std::unique_ptr<TaskRunner> CreateConcurrentTaskRunner(
|
||||
uint32_t concurrent_count) const override;
|
||||
TaskRunner* GetTaskRunner() override;
|
||||
|
||||
private:
|
||||
nearby::sharing::api::SharingPlatform& platform_;
|
||||
|
||||
@@ -38,8 +38,7 @@ FakeContext::FakeContext()
|
||||
fake_connectivity_manager_(std::make_unique<FakeConnectivityManager>()),
|
||||
fake_bluetooth_adapter_(std::make_unique<FakeBluetoothAdapter>()),
|
||||
fake_fast_initiation_manager_(
|
||||
std::make_unique<FakeFastInitiationManager>()),
|
||||
executor_(std::make_unique<FakeTaskRunner>(fake_clock_.get(), 5)) {}
|
||||
std::make_unique<FakeFastInitiationManager>()) {}
|
||||
|
||||
Clock* FakeContext::GetClock() const { return fake_clock_.get(); }
|
||||
|
||||
@@ -70,6 +69,4 @@ std::unique_ptr<TaskRunner> FakeContext::CreateConcurrentTaskRunner(
|
||||
return std::make_unique<FakeTaskRunner>(fake_clock_.get(), concurrent_count);
|
||||
}
|
||||
|
||||
TaskRunner* FakeContext::GetTaskRunner() { return executor_.get(); }
|
||||
|
||||
} // namespace nearby
|
||||
|
||||
@@ -47,7 +47,6 @@ class FakeContext : public Context {
|
||||
std::unique_ptr<TaskRunner> CreateSequencedTaskRunner() const override;
|
||||
std::unique_ptr<TaskRunner> CreateConcurrentTaskRunner(
|
||||
uint32_t concurrent_count) const override;
|
||||
TaskRunner* GetTaskRunner() override;
|
||||
|
||||
FakeClock* fake_clock() const { return fake_clock_.get(); }
|
||||
FakeConnectivityManager* fake_connectivity_manager() const {
|
||||
@@ -59,9 +58,6 @@ class FakeContext : public Context {
|
||||
FakeFastInitiationManager* fake_fast_initiation_manager() const {
|
||||
return fake_fast_initiation_manager_.get();
|
||||
}
|
||||
FakeTaskRunner* fake_task_runner() const {
|
||||
return executor_.get();
|
||||
}
|
||||
|
||||
FakeTaskRunner* last_sequenced_task_runner() const {
|
||||
return last_sequenced_task_runner_;
|
||||
@@ -72,7 +68,6 @@ class FakeContext : public Context {
|
||||
std::unique_ptr<FakeConnectivityManager> fake_connectivity_manager_;
|
||||
std::unique_ptr<FakeBluetoothAdapter> fake_bluetooth_adapter_;
|
||||
std::unique_ptr<FakeFastInitiationManager> fake_fast_initiation_manager_;
|
||||
std::unique_ptr<FakeTaskRunner> executor_;
|
||||
mutable FakeTaskRunner* last_sequenced_task_runner_ = nullptr;
|
||||
};
|
||||
|
||||
|
||||
@@ -15,9 +15,6 @@
|
||||
#include "sharing/internal/test/fake_context.h"
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
#include "absl/synchronization/notification.h"
|
||||
#include "absl/time/time.h"
|
||||
#include "internal/platform/task_runner.h"
|
||||
|
||||
namespace nearby {
|
||||
namespace {
|
||||
@@ -31,18 +28,5 @@ TEST(FakeContext, TestAccessMockContext) {
|
||||
EXPECT_NE(context.CreateConcurrentTaskRunner(5), nullptr);
|
||||
}
|
||||
|
||||
TEST(FakeContext, ExecuteTask) {
|
||||
FakeContext context;
|
||||
absl::Notification notification;
|
||||
bool is_called = false;
|
||||
context.GetTaskRunner()->PostTask([&]() {
|
||||
is_called = true;
|
||||
notification.Notify();
|
||||
});
|
||||
|
||||
EXPECT_TRUE(notification.WaitForNotificationWithTimeout(absl::Seconds(1)));
|
||||
EXPECT_TRUE(is_called);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace nearby
|
||||
|
||||
@@ -423,8 +423,8 @@ void NearbyConnectionsManagerImpl::Connect(
|
||||
|
||||
// Setup transfer manager.
|
||||
if (IsTransportTypeFlagsSet(transport_type, TransportType::kHighQuality)) {
|
||||
transfer_managers_[endpoint_id] =
|
||||
std::make_unique<TransferManager>(context_, endpoint_id);
|
||||
transfer_managers_[endpoint_id] = std::make_unique<TransferManager>(
|
||||
connections_callback_task_runner_, endpoint_id);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -259,8 +259,9 @@ NearbySharingServiceImpl::NearbySharingServiceImpl(
|
||||
nearby_fast_initiation_(
|
||||
NearbyFastInitiationImpl::Factory::Create(context_)),
|
||||
settings_(std::make_unique<NearbyShareSettings>(
|
||||
context_, context_->GetClock(), device_info_, preference_manager_,
|
||||
local_device_data_manager_.get(), &analytics_recorder_)),
|
||||
service_thread_.get(), context_->GetClock(), device_info_,
|
||||
preference_manager_, local_device_data_manager_.get(),
|
||||
&analytics_recorder_)),
|
||||
service_extension_(std::make_unique<NearbySharingServiceExtension>()),
|
||||
file_handler_(sharing_platform),
|
||||
app_info_(sharing_platform.CreateAppInfo()),
|
||||
|
||||
@@ -22,17 +22,18 @@
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
#include "absl/base/nullability.h"
|
||||
#include "absl/strings/string_view.h"
|
||||
#include "absl/synchronization/mutex.h"
|
||||
#include "absl/time/time.h"
|
||||
#include "internal/platform/clock.h"
|
||||
#include "internal/platform/implementation/device_info.h"
|
||||
#include "internal/platform/task_runner.h"
|
||||
#include "proto/sharing_enums.pb.h"
|
||||
#include "sharing/analytics/analytics_recorder.h"
|
||||
#include "sharing/common/nearby_share_enums.h"
|
||||
#include "sharing/common/nearby_share_prefs.h"
|
||||
#include "sharing/internal/api/preference_manager.h"
|
||||
#include "sharing/internal/public/context.h"
|
||||
#include "sharing/internal/public/logging.h"
|
||||
#include "sharing/internal/public/pref_names.h"
|
||||
#include "sharing/local_device_data/nearby_share_local_device_data_manager.h"
|
||||
@@ -70,12 +71,12 @@ ShowNotificationStatus GetNotificationStatus(
|
||||
} // namespace
|
||||
|
||||
NearbyShareSettings::NearbyShareSettings(
|
||||
Context* context, nearby::Clock* clock,
|
||||
TaskRunner* absl_nonnull task_runner, nearby::Clock* absl_nonnull clock,
|
||||
nearby::api::DeviceInfo& device_info, PreferenceManager& preference_manager,
|
||||
NearbyShareLocalDeviceDataManager* local_device_data_manager,
|
||||
analytics::AnalyticsRecorder* analytics_recorder)
|
||||
: context_(context),
|
||||
clock_(clock),
|
||||
: task_runner_(*task_runner),
|
||||
clock_(*clock),
|
||||
device_info_(device_info),
|
||||
preference_manager_(preference_manager),
|
||||
local_device_data_manager_(local_device_data_manager),
|
||||
@@ -143,7 +144,7 @@ void NearbyShareSettings::StartVisibilityTimer(
|
||||
LOG(INFO) << __func__
|
||||
<< ": start visibility timer. expiration=" << expiration;
|
||||
visibility_expiration_timer_ = std::make_unique<ThreadTimer>(
|
||||
*context_->GetTaskRunner(), "nearby_share_settings_visibility_timer",
|
||||
task_runner_, "nearby_share_settings_visibility_timer",
|
||||
expiration, [this]() {
|
||||
LOG(INFO) << __func__ << ": visibility timer expired.";
|
||||
proto::DeviceVisibility visibility;
|
||||
@@ -164,7 +165,7 @@ void NearbyShareSettings::RestoreFallbackVisibility() {
|
||||
static_cast<int>(prefs::kDefaultFallbackVisibility));
|
||||
fallback_visibility_ = static_cast<DeviceVisibility>(fallback_visibility);
|
||||
|
||||
int64_t now_seconds = absl::ToUnixSeconds(clock_->Now());
|
||||
int64_t now_seconds = absl::ToUnixSeconds(clock_.Now());
|
||||
int64_t remaining_seconds = expiration_seconds - now_seconds;
|
||||
int64_t diff = kMaxVisibilityExpirationSeconds - remaining_seconds;
|
||||
LOG(INFO) << __func__ << ": diff=" << diff << ", now=" << now_seconds
|
||||
@@ -276,7 +277,7 @@ void NearbyShareSettings::SetVisibility(DeviceVisibility visibility,
|
||||
visibility_expiration_timer_.reset();
|
||||
|
||||
SetFallbackVisibility(last_visibility);
|
||||
absl::Time now = clock_->Now();
|
||||
absl::Time now = clock_.Now();
|
||||
if (expiration != absl::ZeroDuration()) {
|
||||
VLOG(1) << __func__ << ": temporary visibility timer starts.";
|
||||
absl::Time fallback_visibility_timestamp = now + expiration;
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <vector>
|
||||
|
||||
#include "location/nearby/sharing/lib/sync/sync_binding_prefs.pb.h"
|
||||
#include "absl/base/nullability.h"
|
||||
#include "absl/base/thread_annotations.h"
|
||||
#include "absl/strings/string_view.h"
|
||||
#include "absl/synchronization/mutex.h"
|
||||
@@ -30,11 +31,11 @@
|
||||
#include "internal/base/observer_list.h"
|
||||
#include "internal/platform/clock.h"
|
||||
#include "internal/platform/implementation/device_info.h"
|
||||
#include "internal/platform/task_runner.h"
|
||||
#include "proto/sharing_enums.pb.h"
|
||||
#include "sharing/analytics/analytics_recorder.h"
|
||||
#include "sharing/common/nearby_share_enums.h"
|
||||
#include "sharing/internal/api/preference_manager.h"
|
||||
#include "sharing/internal/public/context.h"
|
||||
#include "sharing/internal/public/logging.h"
|
||||
#include "sharing/local_device_data/nearby_share_local_device_data_manager.h"
|
||||
#include "sharing/proto/settings_observer_data.pb.h"
|
||||
@@ -139,7 +140,7 @@ class NearbyShareSettings
|
||||
};
|
||||
|
||||
NearbyShareSettings(
|
||||
Context* context, nearby::Clock* clock,
|
||||
TaskRunner* absl_nonnull task_runner, nearby::Clock* absl_nonnull clock,
|
||||
nearby::api::DeviceInfo& device_info,
|
||||
nearby::sharing::api::PreferenceManager& preference_manager,
|
||||
NearbyShareLocalDeviceDataManager* local_device_data_manager,
|
||||
@@ -224,8 +225,8 @@ class NearbyShareSettings
|
||||
|
||||
// Make sure thread safe to access Nearby settings
|
||||
mutable absl::Mutex mutex_;
|
||||
Context* context_;
|
||||
nearby::Clock* const clock_;
|
||||
TaskRunner& task_runner_;
|
||||
nearby::Clock& clock_;
|
||||
nearby::api::DeviceInfo& device_info_;
|
||||
nearby::sharing::api::PreferenceManager& preference_manager_;
|
||||
NearbyShareLocalDeviceDataManager* const local_device_data_manager_;
|
||||
|
||||
@@ -29,12 +29,12 @@
|
||||
#include "absl/time/clock.h"
|
||||
#include "absl/time/time.h"
|
||||
#include "internal/base/files.h"
|
||||
#include "internal/test/fake_clock.h"
|
||||
#include "internal/test/fake_device_info.h"
|
||||
#include "internal/test/fake_task_runner.h"
|
||||
#include "sharing/common/nearby_share_enums.h"
|
||||
#include "sharing/common/nearby_share_prefs.h"
|
||||
#include "sharing/internal/public/pref_names.h"
|
||||
#include "sharing/internal/test/fake_context.h"
|
||||
#include "sharing/internal/test/fake_preference_manager.h"
|
||||
#include "sharing/local_device_data/fake_nearby_share_local_device_data_manager.h"
|
||||
#include "sharing/proto/enums.pb.h"
|
||||
@@ -120,11 +120,12 @@ class FakeNearbyShareSettingsObserver : public NearbyShareSettings::Observer {
|
||||
class NearbyShareSettingsTest : public ::testing::Test {
|
||||
public:
|
||||
NearbyShareSettingsTest()
|
||||
: local_device_data_manager_(kDefaultDeviceName) {
|
||||
: local_device_data_manager_(kDefaultDeviceName),
|
||||
fake_task_runner_(&fake_clock_, /*count=*/1) {
|
||||
prefs::RegisterNearbySharingPrefs(preference_manager_);
|
||||
nearby_share_settings_ = std::make_unique<NearbyShareSettings>(
|
||||
&context_, context_.GetClock(), fake_device_info_, preference_manager_,
|
||||
&local_device_data_manager_);
|
||||
&fake_task_runner_, &fake_clock_, fake_device_info_,
|
||||
preference_manager_, &local_device_data_manager_);
|
||||
|
||||
nearby_share_settings_->AddSettingsObserver(&observer_);
|
||||
}
|
||||
@@ -147,11 +148,11 @@ class NearbyShareSettingsTest : public ::testing::Test {
|
||||
// Waits for running tasks to complete.
|
||||
void Flush() {
|
||||
absl::SleepFor(absl::Seconds(1));
|
||||
context_.fake_task_runner()->SyncWithTimeout(absl::Milliseconds(200));
|
||||
fake_task_runner_.SyncWithTimeout(absl::Milliseconds(200));
|
||||
}
|
||||
|
||||
void FastForward(absl::Duration duration) {
|
||||
context_.fake_clock()->FastForward(duration);
|
||||
fake_clock_.FastForward(duration);
|
||||
}
|
||||
|
||||
bool Contains(std::vector<std::string> v, std::string val) {
|
||||
@@ -164,8 +165,9 @@ class NearbyShareSettingsTest : public ::testing::Test {
|
||||
protected:
|
||||
nearby::FakeDeviceInfo fake_device_info_;
|
||||
nearby::FakePreferenceManager preference_manager_;
|
||||
FakeContext context_;
|
||||
FakeNearbyShareLocalDeviceDataManager local_device_data_manager_;
|
||||
FakeClock fake_clock_;
|
||||
FakeTaskRunner fake_task_runner_;
|
||||
FakeNearbyShareSettingsObserver observer_;
|
||||
std::unique_ptr<NearbyShareSettings> nearby_share_settings_;
|
||||
};
|
||||
@@ -301,7 +303,7 @@ TEST_F(NearbyShareSettingsTest,
|
||||
// Set our initial visibility to self share.
|
||||
settings()->SetVisibility(DeviceVisibility::DEVICE_VISIBILITY_SELF_SHARE);
|
||||
// Set everyone mode temporarily.
|
||||
absl::Time now = context_.GetClock()->Now();
|
||||
absl::Time now = fake_clock_.Now();
|
||||
settings()->SetVisibility(
|
||||
DeviceVisibility::DEVICE_VISIBILITY_EVERYONE,
|
||||
absl::Seconds(prefs::kDefaultMaxVisibilityExpirationSeconds));
|
||||
@@ -357,7 +359,7 @@ TEST_F(NearbyShareSettingsTest, TemporaryVisibilityIsCorrect) {
|
||||
DeviceVisibility::DEVICE_VISIBILITY_UNSPECIFIED);
|
||||
EXPECT_EQ(fallback_visibility.fallback_time, absl::UnixEpoch());
|
||||
// Transition to temporary everyone mode.
|
||||
absl::Time now = context_.GetClock()->Now();
|
||||
absl::Time now = fake_clock_.Now();
|
||||
settings()->SetVisibility(
|
||||
DeviceVisibility::DEVICE_VISIBILITY_EVERYONE,
|
||||
absl::Seconds(prefs::kDefaultMaxVisibilityExpirationSeconds));
|
||||
@@ -378,7 +380,7 @@ TEST_F(NearbyShareSettingsTest, SetVisibilityWithExpirationTooLong) {
|
||||
absl::Hours(1));
|
||||
// Expiration capped at 10minutes.
|
||||
absl::Time expected_fallback_time =
|
||||
context_.GetClock()->Now() + absl::Minutes(10);
|
||||
fake_clock_.Now() + absl::Minutes(10);
|
||||
NearbyShareSettings::FallbackVisibilityInfo fallback_visibility =
|
||||
settings()->GetFallbackVisibility();
|
||||
// default visibility was hidden.
|
||||
@@ -420,7 +422,8 @@ TEST_F(NearbyShareSettingsTest, SetSyncBindingPerfs_Success) {
|
||||
|
||||
TEST(NearbyShareVisibilityTest, RestoresFallbackVisibility_ExpiredTimer) {
|
||||
// Create Nearby Share settings dependencies.
|
||||
FakeContext context;
|
||||
FakeClock fake_clock;
|
||||
FakeTaskRunner fake_task_runner(&fake_clock, /*count=*/1);
|
||||
FakeDeviceInfo fake_device_info;
|
||||
FakePreferenceManager preference_manager;
|
||||
FakeNearbyShareLocalDeviceDataManager local_device_data_manager(
|
||||
@@ -432,13 +435,13 @@ TEST(NearbyShareVisibilityTest, RestoresFallbackVisibility_ExpiredTimer) {
|
||||
// Set expiration to 10 seconds ago.
|
||||
preference_manager.SetInteger(
|
||||
PrefNames::kVisibilityExpirationSeconds,
|
||||
absl::ToUnixSeconds(context.GetClock()->Now() - absl::Seconds(10)));
|
||||
absl::ToUnixSeconds(fake_clock.Now() - absl::Seconds(10)));
|
||||
// Set fallback visibility to self share.
|
||||
preference_manager.SetInteger(
|
||||
PrefNames::kFallbackVisibility,
|
||||
static_cast<int>(DeviceVisibility::DEVICE_VISIBILITY_SELF_SHARE));
|
||||
// Create a Nearby Share settings instance.
|
||||
NearbyShareSettings settings(&context, context.GetClock(), fake_device_info,
|
||||
NearbyShareSettings settings(&fake_task_runner, &fake_clock, fake_device_info,
|
||||
preference_manager, &local_device_data_manager);
|
||||
|
||||
// Make sure we restore the correct visibility.
|
||||
@@ -448,7 +451,8 @@ TEST(NearbyShareVisibilityTest, RestoresFallbackVisibility_ExpiredTimer) {
|
||||
|
||||
TEST(NearbyShareVisibilityTest, RestoresFallbackVisibility_FutureTimer) {
|
||||
// Create Nearby Share settings dependencies.
|
||||
FakeContext context;
|
||||
FakeClock fake_clock;
|
||||
FakeTaskRunner fake_task_runner(&fake_clock, /*count=*/1);
|
||||
FakeDeviceInfo fake_device_info;
|
||||
FakePreferenceManager preference_manager;
|
||||
FakeNearbyShareLocalDeviceDataManager local_device_data_manager(
|
||||
@@ -460,13 +464,13 @@ TEST(NearbyShareVisibilityTest, RestoresFallbackVisibility_FutureTimer) {
|
||||
// Set expiration to 10 seconds in the future.
|
||||
preference_manager.SetInteger(
|
||||
PrefNames::kVisibilityExpirationSeconds,
|
||||
absl::ToUnixSeconds(context.GetClock()->Now() + absl::Seconds(10)));
|
||||
absl::ToUnixSeconds(fake_clock.Now() + absl::Seconds(10)));
|
||||
// Set fallback visibility to self share.
|
||||
preference_manager.SetInteger(
|
||||
PrefNames::kFallbackVisibility,
|
||||
static_cast<int>(DeviceVisibility::DEVICE_VISIBILITY_SELF_SHARE));
|
||||
// Create a Nearby Share settings instance.
|
||||
NearbyShareSettings settings(&context, context.GetClock(), fake_device_info,
|
||||
NearbyShareSettings settings(&fake_task_runner, &fake_clock, fake_device_info,
|
||||
preference_manager, &local_device_data_manager);
|
||||
|
||||
// Make sure we restore the correct visibility.
|
||||
|
||||
@@ -19,10 +19,10 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "absl/base/nullability.h"
|
||||
#include "absl/strings/string_view.h"
|
||||
#include "absl/synchronization/mutex.h"
|
||||
#include "absl/time/time.h"
|
||||
#include "sharing/internal/public/context.h"
|
||||
#include "internal/platform/task_runner.h"
|
||||
#include "sharing/internal/public/logging.h"
|
||||
#include "sharing/nearby_connections_types.h"
|
||||
#include "sharing/thread_timer.h"
|
||||
@@ -43,9 +43,9 @@ bool IsHighQualityMedium(Medium medium) {
|
||||
|
||||
} // namespace
|
||||
|
||||
TransferManager::TransferManager(Context* context,
|
||||
TransferManager::TransferManager(TaskRunner* absl_nonnull runner,
|
||||
absl::string_view endpoint_id)
|
||||
: context_(context), endpoint_id_(endpoint_id) {}
|
||||
: runner_(*runner), endpoint_id_(endpoint_id) {}
|
||||
|
||||
TransferManager::~TransferManager() {
|
||||
absl::MutexLock lock(mutex_);
|
||||
@@ -101,8 +101,8 @@ bool TransferManager::StartTransfer() {
|
||||
}
|
||||
|
||||
timeout_timer_ = std::make_unique<ThreadTimer>(
|
||||
*context_->GetTaskRunner(), "transfer_manager_timeout_timer",
|
||||
kMediumUpgradeTimeout, [this]() {
|
||||
runner_, "transfer_manager_timeout_timer", kMediumUpgradeTimeout,
|
||||
[this]() {
|
||||
absl::MutexLock lock(mutex_);
|
||||
|
||||
LOG(INFO) << "Timed out for endpoint " << endpoint_id_ << " after "
|
||||
@@ -113,8 +113,7 @@ bool TransferManager::StartTransfer() {
|
||||
LOG(INFO) << "Attempting to upgrade the bandwidth for endpoint " +
|
||||
endpoint_id_ + ". Large payloads will be delayed" +
|
||||
" until either bandwidth is upgraded or a timeout of "
|
||||
<< (kMediumUpgradeTimeout / absl::Milliseconds(1))
|
||||
<< " milliseconds is reached";
|
||||
<< kMediumUpgradeTimeout << " is reached";
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -132,6 +131,7 @@ bool TransferManager::CancelTransfer() {
|
||||
}
|
||||
|
||||
void TransferManager::StopWaitingForHighQualityMedium() {
|
||||
timeout_timer_.reset();
|
||||
is_waiting_for_high_quality_medium_ = false;
|
||||
|
||||
for (const auto& task : pending_tasks_) {
|
||||
@@ -140,7 +140,6 @@ void TransferManager::StopWaitingForHighQualityMedium() {
|
||||
}
|
||||
|
||||
pending_tasks_.clear();
|
||||
timeout_timer_.reset();
|
||||
}
|
||||
|
||||
} // namespace sharing
|
||||
|
||||
@@ -20,11 +20,12 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "absl/base/nullability.h"
|
||||
#include "absl/base/thread_annotations.h"
|
||||
#include "absl/strings/string_view.h"
|
||||
#include "absl/synchronization/mutex.h"
|
||||
#include "absl/time/time.h"
|
||||
#include "sharing/internal/public/context.h"
|
||||
#include "internal/platform/task_runner.h"
|
||||
#include "sharing/nearby_connections_types.h"
|
||||
#include "sharing/thread_timer.h"
|
||||
|
||||
@@ -39,7 +40,8 @@ class TransferManager {
|
||||
// Used to wait for the medium upgrade.
|
||||
static constexpr absl::Duration kMediumUpgradeTimeout = absl::Seconds(10);
|
||||
|
||||
TransferManager(Context* context, absl::string_view endpoint_id);
|
||||
TransferManager(TaskRunner* absl_nonnull runner,
|
||||
absl::string_view endpoint_id);
|
||||
|
||||
~TransferManager();
|
||||
|
||||
@@ -52,7 +54,7 @@ class TransferManager {
|
||||
private:
|
||||
void StopWaitingForHighQualityMedium() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
|
||||
|
||||
Context* context_;
|
||||
TaskRunner& runner_;
|
||||
std::string endpoint_id_;
|
||||
absl::Mutex mutex_;
|
||||
bool is_waiting_for_high_quality_medium_ ABSL_GUARDED_BY(mutex_) = true;
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
#include "absl/synchronization/notification.h"
|
||||
#include "absl/time/time.h"
|
||||
#include "internal/test/fake_clock.h"
|
||||
#include "sharing/internal/test/fake_context.h"
|
||||
#include "internal/test/fake_task_runner.h"
|
||||
#include "sharing/nearby_connections_types.h"
|
||||
|
||||
namespace nearby {
|
||||
@@ -32,11 +32,12 @@ constexpr absl::string_view kEndpointId = "endpoint";
|
||||
constexpr absl::Duration kNotificationTimeout = absl::Milliseconds(200);
|
||||
|
||||
TEST(TransferManager, MediumUpgradeSuccess) {
|
||||
FakeContext context;
|
||||
FakeClock fake_clock;
|
||||
FakeTaskRunner executor(&fake_clock, /*concurrent_count=*/1);
|
||||
absl::Notification notification;
|
||||
bool is_called = false;
|
||||
|
||||
TransferManager transfer_manager{&context, kEndpointId};
|
||||
TransferManager transfer_manager{&executor, kEndpointId};
|
||||
transfer_manager.Send([&]() {
|
||||
is_called = true;
|
||||
notification.Notify();
|
||||
@@ -53,11 +54,12 @@ TEST(TransferManager, MediumUpgradeSuccess) {
|
||||
}
|
||||
|
||||
TEST(TransferManager, SendAfterMediumUpgradeSuccess) {
|
||||
FakeContext context;
|
||||
FakeClock fake_clock;
|
||||
FakeTaskRunner executor(&fake_clock, /*concurrent_count=*/1);
|
||||
absl::Notification notification;
|
||||
bool is_called = false;
|
||||
|
||||
TransferManager transfer_manager{&context, kEndpointId};
|
||||
TransferManager transfer_manager{&executor, kEndpointId};
|
||||
transfer_manager.Send([&]() {
|
||||
is_called = true;
|
||||
notification.Notify();
|
||||
@@ -75,11 +77,12 @@ TEST(TransferManager, SendAfterMediumUpgradeSuccess) {
|
||||
}
|
||||
|
||||
TEST(TransferManager, MediumUpgradeFailed) {
|
||||
FakeContext context;
|
||||
FakeClock fake_clock;
|
||||
FakeTaskRunner executor(&fake_clock, /*concurrent_count=*/1);
|
||||
absl::Notification notification;
|
||||
bool is_called = false;
|
||||
|
||||
TransferManager transfer_manager{&context, kEndpointId};
|
||||
TransferManager transfer_manager{&executor, kEndpointId};
|
||||
transfer_manager.Send([&]() {
|
||||
is_called = true;
|
||||
notification.Notify();
|
||||
@@ -94,11 +97,12 @@ TEST(TransferManager, MediumUpgradeFailed) {
|
||||
}
|
||||
|
||||
TEST(TransferManager, MediumUpgradeTimeout) {
|
||||
FakeContext context;
|
||||
FakeClock fake_clock;
|
||||
FakeTaskRunner executor(&fake_clock, /*concurrent_count=*/1);
|
||||
absl::Notification notification;
|
||||
bool is_called = false;
|
||||
|
||||
TransferManager transfer_manager{&context, kEndpointId};
|
||||
TransferManager transfer_manager{&executor, kEndpointId};
|
||||
transfer_manager.Send([&]() {
|
||||
is_called = true;
|
||||
notification.Notify();
|
||||
@@ -106,8 +110,7 @@ TEST(TransferManager, MediumUpgradeTimeout) {
|
||||
|
||||
ASSERT_FALSE(is_called);
|
||||
ASSERT_TRUE(transfer_manager.StartTransfer());
|
||||
FakeClock* clock = static_cast<FakeClock*>(context.GetClock());
|
||||
clock->FastForward(TransferManager::kMediumUpgradeTimeout);
|
||||
fake_clock.FastForward(TransferManager::kMediumUpgradeTimeout);
|
||||
|
||||
ASSERT_TRUE(
|
||||
notification.WaitForNotificationWithTimeout(kNotificationTimeout));
|
||||
@@ -115,11 +118,12 @@ TEST(TransferManager, MediumUpgradeTimeout) {
|
||||
}
|
||||
|
||||
TEST(TransferManager, CancelStartedTransfer) {
|
||||
FakeContext context;
|
||||
FakeClock fake_clock;
|
||||
FakeTaskRunner executor(&fake_clock, /*concurrent_count=*/1);
|
||||
absl::Notification notification;
|
||||
bool is_called = false;
|
||||
|
||||
TransferManager transfer_manager{&context, kEndpointId};
|
||||
TransferManager transfer_manager{&executor, kEndpointId};
|
||||
transfer_manager.Send([&]() {
|
||||
is_called = true;
|
||||
notification.Notify();
|
||||
@@ -127,8 +131,7 @@ TEST(TransferManager, CancelStartedTransfer) {
|
||||
|
||||
ASSERT_FALSE(is_called);
|
||||
ASSERT_TRUE(transfer_manager.StartTransfer());
|
||||
FakeClock* clock = static_cast<FakeClock*>(context.GetClock());
|
||||
clock->FastForward(absl::Seconds(5));
|
||||
fake_clock.FastForward(absl::Seconds(5));
|
||||
ASSERT_TRUE(transfer_manager.CancelTransfer());
|
||||
|
||||
ASSERT_FALSE(
|
||||
@@ -137,11 +140,12 @@ TEST(TransferManager, CancelStartedTransfer) {
|
||||
}
|
||||
|
||||
TEST(TransferManager, CancelTimedOutMediumUpgrade) {
|
||||
FakeContext context;
|
||||
FakeClock fake_clock;
|
||||
FakeTaskRunner executor(&fake_clock, /*concurrent_count=*/1);
|
||||
absl::Notification notification;
|
||||
bool is_called = false;
|
||||
|
||||
TransferManager transfer_manager{&context, kEndpointId};
|
||||
TransferManager transfer_manager{&executor, kEndpointId};
|
||||
transfer_manager.Send([&]() {
|
||||
is_called = true;
|
||||
notification.Notify();
|
||||
@@ -149,8 +153,7 @@ TEST(TransferManager, CancelTimedOutMediumUpgrade) {
|
||||
|
||||
ASSERT_FALSE(is_called);
|
||||
ASSERT_TRUE(transfer_manager.StartTransfer());
|
||||
FakeClock* clock = static_cast<FakeClock*>(context.GetClock());
|
||||
clock->FastForward(TransferManager::kMediumUpgradeTimeout);
|
||||
fake_clock.FastForward(TransferManager::kMediumUpgradeTimeout);
|
||||
|
||||
ASSERT_TRUE(
|
||||
notification.WaitForNotificationWithTimeout(kNotificationTimeout));
|
||||
@@ -159,11 +162,12 @@ TEST(TransferManager, CancelTimedOutMediumUpgrade) {
|
||||
}
|
||||
|
||||
TEST(TransferManager, MediumUpgradeBeforeStartTransfer) {
|
||||
FakeContext context;
|
||||
FakeClock fake_clock;
|
||||
FakeTaskRunner executor(&fake_clock, /*concurrent_count=*/1);
|
||||
absl::Notification notification;
|
||||
bool is_called = false;
|
||||
|
||||
TransferManager transfer_manager{&context, kEndpointId};
|
||||
TransferManager transfer_manager{&executor, kEndpointId};
|
||||
transfer_manager.Send([&]() {
|
||||
is_called = true;
|
||||
notification.Notify();
|
||||
|
||||
Reference in New Issue
Block a user