xref: /aosp_15_r20/external/cronet/net/dns/dns_config_service_linux.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2021 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef NET_DNS_DNS_CONFIG_SERVICE_LINUX_H_
6 #define NET_DNS_DNS_CONFIG_SERVICE_LINUX_H_
7 
8 #include <memory>
9 #include <utility>
10 
11 #include "base/check.h"
12 #include "base/gtest_prod_util.h"
13 #include "net/base/net_export.h"
14 #include "net/dns/dns_config_service.h"
15 #include "net/dns/nsswitch_reader.h"
16 #include "net/dns/public/resolv_reader.h"
17 
18 namespace net {
19 
20 // Use DnsConfigService::CreateSystemService to use it outside of tests.
21 namespace internal {
22 
23 // Service for reading and watching Linux  DNS settings.
24 // This object is not thread-safe and methods may perform blocking I/O so
25 // methods must be called on a sequence that allows blocking (i.e.
26 // base::MayBlock). It may be constructed on a different sequence than which
27 // it's later called on. WatchConfig() must be called prior to ReadConfig().
28 class NET_EXPORT_PRIVATE DnsConfigServiceLinux : public DnsConfigService {
29  public:
30   DnsConfigServiceLinux();
31   ~DnsConfigServiceLinux() override;
32 
33   DnsConfigServiceLinux(const DnsConfigServiceLinux&) = delete;
34   DnsConfigServiceLinux& operator=(const DnsConfigServiceLinux&) = delete;
35 
set_resolv_reader_for_testing(std::unique_ptr<ResolvReader> resolv_reader)36   void set_resolv_reader_for_testing(
37       std::unique_ptr<ResolvReader> resolv_reader) {
38     DCHECK(!config_reader_);  // Need to call before first read.
39     DCHECK(resolv_reader);
40     resolv_reader_ = std::move(resolv_reader);
41   }
42 
set_nsswitch_reader_for_testing(std::unique_ptr<NsswitchReader> nsswitch_reader)43   void set_nsswitch_reader_for_testing(
44       std::unique_ptr<NsswitchReader> nsswitch_reader) {
45     DCHECK(!config_reader_);  // Need to call before first read.
46     DCHECK(nsswitch_reader);
47     nsswitch_reader_ = std::move(nsswitch_reader);
48   }
49 
50  protected:
51   // DnsConfigService:
52   void ReadConfigNow() override;
53   bool StartWatching() override;
54 
55   // Create |config_reader_|.
56   void CreateReader();
57 
58  private:
59   FRIEND_TEST_ALL_PREFIXES(DnsConfigServiceLinuxTest,
60                            ChangeConfigMultipleTimes);
61   class Watcher;
62   class ConfigReader;
63 
64   std::unique_ptr<ResolvReader> resolv_reader_ =
65       std::make_unique<ResolvReader>();
66   std::unique_ptr<NsswitchReader> nsswitch_reader_ =
67       std::make_unique<NsswitchReader>();
68 
69   std::unique_ptr<Watcher> watcher_;
70   std::unique_ptr<ConfigReader> config_reader_;
71 };
72 
73 }  // namespace internal
74 
75 }  // namespace net
76 
77 #endif  // NET_DNS_DNS_CONFIG_SERVICE_LINUX_H_
78