1 // Copyright 2020 The Chromium Authors. All rights reserved.
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 CHROME_BROWSER_CHROMEOS_NET_NETWORK_DIAGNOSTICS_FAKE_NETWORK_CONTEXT_H_
6 #define CHROME_BROWSER_CHROMEOS_NET_NETWORK_DIAGNOSTICS_FAKE_NETWORK_CONTEXT_H_
7 
8 #include <deque>
9 #include <memory>
10 
11 #include "chrome/browser/chromeos/net/network_diagnostics/fake_host_resolver.h"
12 #include "chrome/browser/chromeos/net/network_diagnostics/fake_tcp_connected_socket.h"
13 #include "services/network/test/test_network_context.h"
14 
15 namespace chromeos {
16 namespace network_diagnostics {
17 
18 // Used in unit tests, the FakeNetworkContext class simulates the behavior of a
19 // network context.
20 class FakeNetworkContext : public network::TestNetworkContext {
21  public:
22   FakeNetworkContext();
23   ~FakeNetworkContext() override;
24 
25   // network::TestNetworkContext:
26   void CreateHostResolver(
27       const base::Optional<net::DnsConfigOverrides>& config_overrides,
28       mojo::PendingReceiver<network::mojom::HostResolver> receiver) override;
29 
30   void CreateTCPConnectedSocket(
31       const base::Optional<net::IPEndPoint>& local_addr,
32       const net::AddressList& remote_addr_list,
33       network::mojom::TCPConnectedSocketOptionsPtr tcp_connected_socket_options,
34       const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
35       mojo::PendingReceiver<network::mojom::TCPConnectedSocket> socket,
36       mojo::PendingRemote<network::mojom::SocketObserver> observer,
37       CreateTCPConnectedSocketCallback callback) override;
38 
39   // Sets the fake TCP connect code.
40   void SetTCPConnectCode(base::Optional<net::Error>& tcp_connect_code);
41 
42   // Sets the fake TLS upgrade code.
43   void SetTLSUpgradeCode(base::Optional<net::Error>& tls_upgrade_code);
44 
45   // Sets the fake dns results.
set_fake_dns_results(std::deque<FakeHostResolver::DnsResult * > fake_dns_results)46   void set_fake_dns_results(
47       std::deque<FakeHostResolver::DnsResult*> fake_dns_results) {
48     fake_dns_results_ = std::move(fake_dns_results);
49   }
50 
51   // If set to true, the binding pipe will be disconnected when attempting to
52   // connect.
set_disconnect_during_host_resolution(bool disconnect)53   void set_disconnect_during_host_resolution(bool disconnect) {
54     host_resolution_disconnect_ = disconnect;
55   }
56 
57   // If set to true, the binding pipe will be disconnected when attempting to
58   // connect.
set_disconnect_during_tcp_connection_attempt(bool disconnect)59   void set_disconnect_during_tcp_connection_attempt(bool disconnect) {
60     tcp_connection_attempt_disconnect_ = disconnect;
61   }
62 
63   // If set to true, the binding pipe will be disconnected when attempting to
64   // connect.
set_disconnect_during_tls_upgrade_attempt(bool disconnect)65   void set_disconnect_during_tls_upgrade_attempt(bool disconnect) {
66     tls_upgrade_attempt_disconnect_ = disconnect;
67   }
68 
69  private:
70   // Fake host resolver.
71   std::unique_ptr<FakeHostResolver> resolver_;
72   // Fake DNS lookup results.
73   std::deque<FakeHostResolver::DnsResult*> fake_dns_results_;
74   // Provides the TCP socket functionality for tests.
75   std::unique_ptr<FakeTCPConnectedSocket> fake_tcp_connected_socket_;
76   // TCP connect code corresponding to the connection attempt.
77   net::Error tcp_connect_code_ = net::OK;
78   // Used to mimic the scenario where network::mojom::HostResolver receiver
79   // is disconnected.
80   bool host_resolution_disconnect_ = false;
81   // Used to mimic the scenario where network::mojom::TCPConnectedSocket
82   // receiver is disconnected.
83   bool tcp_connection_attempt_disconnect_ = false;
84   // Used to mimic the scenario where network::mojom::TLSClientSocket receiver
85   // is disconnected.
86   bool tls_upgrade_attempt_disconnect_ = false;
87 };
88 
89 }  // namespace network_diagnostics
90 }  // namespace chromeos
91 
92 #endif  // CHROME_BROWSER_CHROMEOS_NET_NETWORK_DIAGNOSTICS_FAKE_NETWORK_CONTEXT_H_
93