Class: WifiWand::NetworkConnectivityTester

Inherits:
Object
  • Object
show all
Includes:
ProcessProbeManager
Defined in:
lib/wifi_wand/services/network_connectivity_tester.rb

Constant Summary collapse

UNSET =
Object.new.freeze
HELPER_RESULT_GRACE =
0.05

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from ProcessProbeManager

#finalize_probe, #helper_exit_poll_interval, #helper_result_grace, #probe_reaped_within_grace?, #reap_probe, #terminate_probe, #terminate_probes, #wait_for_killed_probe_reap, #wait_for_probe_exit

Constructor Details

#initialize(verbose: false, output: $stdout, runtime_config: nil, dns_resolution_timeout_in_secs: TimingConstants::DNS_RESOLUTION_TIMEOUT, http_connectivity_timeout_in_secs: TimingConstants::HTTP_CONNECTIVITY_TIMEOUT, overall_connectivity_timeout_in_secs: TimingConstants::OVERALL_CONNECTIVITY_TIMEOUT, tcp_connection_timeout_in_secs: TimingConstants::TCP_CONNECTION_TIMEOUT) ⇒ NetworkConnectivityTester

Returns a new instance of NetworkConnectivityTester.



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/wifi_wand/services/network_connectivity_tester.rb', line 25

def initialize(verbose: false, output: $stdout, runtime_config: nil,
  dns_resolution_timeout_in_secs: TimingConstants::DNS_RESOLUTION_TIMEOUT,
  http_connectivity_timeout_in_secs: TimingConstants::HTTP_CONNECTIVITY_TIMEOUT,
  overall_connectivity_timeout_in_secs: TimingConstants::OVERALL_CONNECTIVITY_TIMEOUT,
  tcp_connection_timeout_in_secs: TimingConstants::TCP_CONNECTION_TIMEOUT)
  @runtime_config = runtime_config || RuntimeConfig.new(
    verbose:    verbose,
    out_stream: output
  )
  @dns_resolution_timeout_in_secs = dns_resolution_timeout_in_secs
  @overall_connectivity_timeout_in_secs = overall_connectivity_timeout_in_secs
  @tcp_connection_timeout_in_secs = tcp_connection_timeout_in_secs
  @captive_portal_checker = CaptivePortalChecker.new(
    runtime_config:                    @runtime_config,
    http_connectivity_timeout_in_secs: http_connectivity_timeout_in_secs
  )
end

Instance Attribute Details

#captive_portal_checkerObject (readonly)

Returns the value of attribute captive_portal_checker.



21
22
23
# File 'lib/wifi_wand/services/network_connectivity_tester.rb', line 21

def captive_portal_checker
  @captive_portal_checker
end

Instance Method Details

#captive_portal_login_required(timeout_in_secs: nil) ⇒ Object



79
80
81
# File 'lib/wifi_wand/services/network_connectivity_tester.rb', line 79

def (timeout_in_secs: nil)
  @captive_portal_checker.(timeout_in_secs: timeout_in_secs)
end

#dns_working?(timeout_in_secs: nil, overall_timeout: nil, return_details: false) ⇒ Boolean

Returns:

  • (Boolean)


101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/wifi_wand/services/network_connectivity_tester.rb', line 101

def dns_working?(timeout_in_secs: nil, overall_timeout: nil, return_details: false)
  test_domains = dns_test_domains

  err_output.puts "Testing DNS resolution for domains: #{test_domains.join(', ')}" if verbose?

  result = parallel_check_result(
    test_domains,
    resolved_timeout(timeout_in_secs, overall_timeout, overall_connectivity_timeout_in_secs),
    helper_mode: :dns
  )
  return result if return_details

  result[:success]
end

#internet_connectivity_state(tcp_working = nil, dns_working = nil, captive_portal_login_required = UNSET, timeout_in_secs: nil) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/wifi_wand/services/network_connectivity_tester.rb', line 43

def internet_connectivity_state(
  tcp_working = nil, dns_working = nil,  = UNSET, timeout_in_secs: nil
)
  deadline = timeout_in_secs && (current_time + timeout_in_secs)

  tcp_result = probe_result_for(
    tcp_working,
    deadline:      deadline,
    stage_timeout: overall_connectivity_timeout_in_secs,
    probe_method:  :tcp_connectivity?
  )
  return ConnectivityStates::INTERNET_INDETERMINATE if tcp_result[:timed_out]
  return ConnectivityStates::INTERNET_UNREACHABLE unless tcp_result[:success]

  dns_result = probe_result_for(
    dns_working,
    deadline:      deadline,
    stage_timeout: overall_connectivity_timeout_in_secs,
    probe_method:  :dns_working?
  )
  return ConnectivityStates::INTERNET_INDETERMINATE if dns_result[:timed_out]
  return ConnectivityStates::INTERNET_UNREACHABLE unless dns_result[:success]

  if .equal?(UNSET)
    remaining_time = deadline ? remaining_time_until(deadline) : nil
    return ConnectivityStates::INTERNET_INDETERMINATE if deadline && remaining_time <= 0

     = self.(timeout_in_secs: remaining_time)
  end
  ConnectivityStates.(
    tcp_working:                   true,
    dns_working:                   true,
    captive_portal_login_required: 
  )
end

#run_probe_result(mode, target) ⇒ Hash

Detailed single-probe interface used by the connectivity helper process.

Parameters:

  • mode (Symbol)

    one of :tcp or :dns

  • target (Hash, String)

    endpoint hash for TCP modes or domain for DNS

Returns:

  • (Hash)

    probe result including :success and optional :error_class



121
122
123
124
125
126
127
128
129
130
# File 'lib/wifi_wand/services/network_connectivity_tester.rb', line 121

def run_probe_result(mode, target)
  case mode
  when :tcp
    attempt_tcp_connection(target)
  when :dns
    attempt_dns_resolution(target)
  else
    raise ArgumentError, "Unsupported probe mode: #{mode}"
  end
end

#tcp_connectivity?(timeout_in_secs: nil, overall_timeout: nil, return_details: false) ⇒ Boolean

Returns:

  • (Boolean)


83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/wifi_wand/services/network_connectivity_tester.rb', line 83

def tcp_connectivity?(timeout_in_secs: nil, overall_timeout: nil, return_details: false)
  test_endpoints = tcp_test_endpoints

  if verbose?
    endpoints_list = test_endpoints.map { |e| "#{e[:host]}:#{e[:port]}" }.join(', ')
    err_output.puts "Testing internet TCP connectivity to: #{endpoints_list}"
  end

  result = parallel_check_result(
    test_endpoints,
    resolved_timeout(timeout_in_secs, overall_timeout, overall_connectivity_timeout_in_secs),
    helper_mode: :tcp
  )
  return result if return_details

  result[:success]
end