diff --git a/browser/ipfs/ipfs_dns_resolver_impl.cc b/browser/ipfs/ipfs_dns_resolver_impl.cc index 2454878f6a70..439a5a8755d6 100644 --- a/browser/ipfs/ipfs_dns_resolver_impl.cc +++ b/browser/ipfs/ipfs_dns_resolver_impl.cc @@ -12,6 +12,8 @@ namespace ipfs { +const int kThrottleDeltaMs = 1000; + mojo::Remote GetDnsConfigChangeManager() { mojo::Remote @@ -21,7 +23,7 @@ GetDnsConfigChangeManager() { return dns_config_change_manager_remote; } -IpfsDnsResolverImpl::IpfsDnsResolverImpl() { +IpfsDnsResolverImpl::IpfsDnsResolverImpl() : weak_ptr_factory_(this) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); dns_config_change_manager_ = GetDnsConfigChangeManager(); SetupDnsConfigChangeNotifications(); @@ -41,7 +43,11 @@ IpfsDnsResolverImpl::~IpfsDnsResolverImpl() {} void IpfsDnsResolverImpl::OnDnsConfigChangeManagerConnectionError() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); receiver_.reset(); - SetupDnsConfigChangeNotifications(); + base::SequencedTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, + base::BindOnce(&IpfsDnsResolverImpl::SetupDnsConfigChangeNotifications, + weak_ptr_factory_.GetWeakPtr()), + base::Milliseconds(kThrottleDeltaMs)); } void IpfsDnsResolverImpl::OnDnsConfigChanged() { diff --git a/browser/ipfs/ipfs_dns_resolver_impl.h b/browser/ipfs/ipfs_dns_resolver_impl.h index 5b85c800d42f..fe99fc4012cb 100644 --- a/browser/ipfs/ipfs_dns_resolver_impl.h +++ b/browser/ipfs/ipfs_dns_resolver_impl.h @@ -34,6 +34,7 @@ class IpfsDnsResolverImpl absl::optional GetFirstDnsOverHttpsServer() override; private: + FRIEND_TEST_ALL_PREFIXES(IpfsDnsResolverImplUnitTest, ReconnectOnMojoError); void SetupDnsConfigChangeNotifications(); mojo::Remote @@ -41,6 +42,8 @@ class IpfsDnsResolverImpl mojo::Receiver receiver_{this}; SEQUENCE_CHECKER(sequence_checker_); + + base::WeakPtrFactory weak_ptr_factory_; }; } // namespace ipfs diff --git a/browser/ipfs/test/BUILD.gn b/browser/ipfs/test/BUILD.gn index 404f4456cb8c..0039962b1b48 100644 --- a/browser/ipfs/test/BUILD.gn +++ b/browser/ipfs/test/BUILD.gn @@ -13,6 +13,7 @@ source_set("unittests") { "//brave/browser/ipfs/ipfs_blob_context_getter_factory_unittest.cc", "//brave/browser/ipfs/ipfs_host_resolver_unittest.cc", "//brave/browser/ipfs/ipfs_tab_helper_unittest.cc", + "//brave/browser/ipfs/test/ipfs_dns_resolver_impl_unittest.cc", "//brave/browser/ipfs/test/ipfs_navigation_throttle_unittest.cc", "//brave/browser/ipfs/test/ipfs_network_utils_unittest.cc", "//brave/browser/net/ipfs_redirect_network_delegate_helper_unittest.cc", diff --git a/browser/ipfs/test/ipfs_dns_resolver_impl_unittest.cc b/browser/ipfs/test/ipfs_dns_resolver_impl_unittest.cc new file mode 100644 index 000000000000..f57619da1f14 --- /dev/null +++ b/browser/ipfs/test/ipfs_dns_resolver_impl_unittest.cc @@ -0,0 +1,45 @@ +/* Copyright (c) 2022 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "brave/browser/ipfs/ipfs_dns_resolver_impl.h" + +#include +#include + +#include "content/public/browser/network_service_instance.h" +#include "content/public/test/browser_task_environment.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace ipfs { + +class IpfsDnsResolverImplUnitTest : public testing::Test { + public: + IpfsDnsResolverImplUnitTest() = default; + IpfsDnsResolverImplUnitTest(const IpfsDnsResolverImplUnitTest&) = delete; + IpfsDnsResolverImplUnitTest& operator=(const IpfsDnsResolverImplUnitTest&) = + delete; + ~IpfsDnsResolverImplUnitTest() override = default; + + void SetUp() override {} + + void TearDown() override {} + content::BrowserTaskEnvironment task_environment_; +}; + +TEST_F(IpfsDnsResolverImplUnitTest, ReconnectOnMojoError) { + std::unique_ptr ipfs_dns_resolver_impl_ = + std::make_unique(); + ipfs_dns_resolver_impl_->receiver_.reset(); + ipfs_dns_resolver_impl_->OnDnsConfigChangeManagerConnectionError(); + EXPECT_FALSE(ipfs_dns_resolver_impl_->receiver_.is_bound()); + { + base::RunLoop loop; + while (!ipfs_dns_resolver_impl_->receiver_.is_bound()) { + loop.RunUntilIdle(); + } + } +} + +} // namespace ipfs