#include "services/network/test/test_network_connection_tracker.h"
#include <utility>
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/functional/callback_helpers.h"
#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "base/task/sequenced_task_runner.h"
namespace network {
static TestNetworkConnectionTracker*
g_test_network_connection_tracker_instance = nullptr;
namespace {
using NetworkConnectionTrackerCallback =
base::OnceCallback<void(NetworkConnectionTracker*)>;
void GetInstanceAsync(NetworkConnectionTrackerCallback callback) {
base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE,
base::BindOnce(
[](NetworkConnectionTrackerCallback callback) {
std::move(callback).Run(g_test_network_connection_tracker_instance);
},
std::move(callback)));
}
NetworkConnectionTracker* GetNonTestInstance() {
return TestNetworkConnectionTracker::GetInstance();
}
}
std::unique_ptr<TestNetworkConnectionTracker>
TestNetworkConnectionTracker::CreateInstance() {
return base::WrapUnique(new TestNetworkConnectionTracker());
}
TestNetworkConnectionTracker* TestNetworkConnectionTracker::GetInstance() {
DCHECK(g_test_network_connection_tracker_instance);
return g_test_network_connection_tracker_instance;
}
bool TestNetworkConnectionTracker::HasInstance() {
return g_test_network_connection_tracker_instance != nullptr;
}
NetworkConnectionTrackerGetter TestNetworkConnectionTracker::CreateGetter() {
return base::BindRepeating(&GetNonTestInstance);
}
NetworkConnectionTrackerAsyncGetter
TestNetworkConnectionTracker::CreateAsyncGetter() {
return base::BindRepeating(&GetInstanceAsync);
}
TestNetworkConnectionTracker::TestNetworkConnectionTracker() {
if (g_test_network_connection_tracker_instance) {
LOG(WARNING) << "Creating more than one TestNetworkConnectionTracker";
return;
}
g_test_network_connection_tracker_instance = this;
OnNetworkChanged(network::mojom::ConnectionType::CONNECTION_UNKNOWN);
}
TestNetworkConnectionTracker::~TestNetworkConnectionTracker() {
if (g_test_network_connection_tracker_instance == this)
g_test_network_connection_tracker_instance = nullptr;
}
bool TestNetworkConnectionTracker::GetConnectionType(
network::mojom::ConnectionType* type,
ConnectionTypeCallback callback) {
network::mojom::ConnectionType current_type;
bool sync = NetworkConnectionTracker::GetConnectionType(¤t_type,
base::DoNothing());
DCHECK(sync);
if (respond_synchronously_) {
*type = current_type;
return true;
}
base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE, base::BindOnce(std::move(callback), current_type));
return false;
}
void TestNetworkConnectionTracker::SetConnectionType(
network::mojom::ConnectionType type) {
OnNetworkChanged(type);
}
void TestNetworkConnectionTracker::SetRespondSynchronously(
bool respond_synchronously) {
respond_synchronously_ = respond_synchronously;
}
}