// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Definitions for the NetworkDiagnosticsRoutines API exposed by the browser.
// This API is consumed by cros_healthd to retrieve network diagnostics from
// the browser.
//
// NOTE: This mojom should be kept in sync with the copy in Chromium's repo in
// src/chromeos/services/network_health/public/mojom/network_diagnostics.mojom.

module chromeos.network_diagnostics.mojom;

// Each routine can result in one of the possible verdicts.
[Extensible]
enum RoutineVerdict {
  // Routine ran successfully and no connectivity problem found.
  kNoProblem,
  // Routine ran successfully and connectivity problem found.
  kProblem,
  // Routine has not been run.
  kNotRun,
};

// Problems related to the SignalStrength routine.
[Extensible]
enum SignalStrengthProblem {
  kWeakSignal,
};

// Problems related to the GatewayCanBePinged routine.
[Extensible]
enum GatewayCanBePingedProblem {
  // All gateways are unreachable, hence cannot be pinged.
  kUnreachableGateway,
  // The default network cannot be pinged.
  kFailedToPingDefaultNetwork,
  // The default network has a latency above the threshold.
  kDefaultNetworkAboveLatencyThreshold,
  // One or more of the non-default networks has failed pings.
  kUnsuccessfulNonDefaultNetworksPings,
  // One or more of the non-default networks has a latency above the threshold.
  kNonDefaultNetworksAboveLatencyThreshold,
};

// Problems related to the HasSecureWiFiConnection routine.
[Extensible]
enum HasSecureWiFiConnectionProblem {
  kSecurityTypeNone,
  kSecurityTypeWep8021x,
  kSecurityTypeWepPsk,
  kUnknownSecurityType,
};

// Problems related to the DnsResolverPresent routine.
[Extensible]
enum DnsResolverPresentProblem {
  kNoNameServersFound,
  kMalformedNameServers,
  kEmptyNameServers,
};

// Problems related to the DnsLatencyProblem routine.
[Extensible]
enum DnsLatencyProblem {
  // The routine was unable to resolve one or more hosts.
  kHostResolutionFailure,
  // Average DNS latency across hosts is slightly above expected threshold
  kSlightlyAboveThreshold,
  // Average DNS latency across hosts is significantly above expected threshold
  kSignificantlyAboveThreshold,
};

// Problems related to the DnsResolution routine.
[Extensible]
enum DnsResolutionProblem {
  // The routine was unable to successfully resolve the test host
  kFailedToResolveHost,
};

// Problems related to the CaptivePortal routine.
[Extensible]
enum CaptivePortalProblem {
  // No active networks found.
  kNoActiveNetworks,
  // The active network is not connected or the portal state is not available.
  kUnknownPortalState,
  // A portal is suspected but no redirect was provided.
  kPortalSuspected,
  // The network is in a portal state with a redirect URL.
  kPortal,
  // A proxy requiring authentication is detected.
  kProxyAuthRequired,
  // The active network is connected but no internet is available and no proxy
  // was detected.
  kNoInternet,
};

// Problems related to the HttpFirewall routine.
[Extensible]
enum HttpFirewallProblem {
  // DNS resolution failures above threshold.
  kDnsResolutionFailuresAboveThreshold,
  // Firewall detected.
  kFirewallDetected,
  // A firewall may potentially exist.
  kPotentialFirewall,
};

// Problems related to the HttpsFirewall routine.
[Extensible]
enum HttpsFirewallProblem {
  // DNS resolution failure rate is high.
  kHighDnsResolutionFailureRate,
  // Firewall detected.
  kFirewallDetected,
  // A firewall may potentially exist.
  kPotentialFirewall,
};

// Problems related to the HttpsLatency routine.
[Extensible]
enum HttpsLatencyProblem {
  // One or more DNS resolutions resulted in a failure.
  kFailedDnsResolutions,
  // One or more HTTPS requests resulted in a failure.
  kFailedHttpsRequests,
  // HTTPS request latency is high.
  kHighLatency,
  // HTTPS request latency is very high.
  kVeryHighLatency,
};

// Problems related to the VideoConferencing routine.
[Extensible]
enum VideoConferencingProblem {
  // Failed requests to a STUN server via UDP.
  kUdpFailure,
  // Failed requests to a STUN server via TCP.
  kTcpFailure,
  // Failed to establish a TLS connection to media hostnames.
  kMediaFailure,
};

// This interface is to be used by any clients that need to run specific
// network-related diagnostics. Expected clients of this interface are
// NetworkHealth, cros_healthd, and a connectivity diagnostics Web UI (to name
// a few). The bound implementation is intended to live in the browser process.
interface NetworkDiagnosticsRoutines {
  // Tests whether the device is connected to a LAN. It is possible that the
  // device may be trapped in a captive portal yet pass this test successfully.
  // Captive portal checks are done separately and are outside of the scope of
  // this routine. See CaptivePortal() below.
  LanConnectivity() => (RoutineVerdict verdict);

  // Tests whether there is an acceptable signal strength on wireless networks.
  SignalStrength() => (RoutineVerdict verdict,
      array<SignalStrengthProblem> problems);

  // Tests whether the gateway of connected networks is pingable.
  GatewayCanBePinged() => (RoutineVerdict verdict,
      array<GatewayCanBePingedProblem> problems);

  // Tests whether the WiFi connection is secure. Note that if WiFi is not
  // connected, the routine will result in a |kNotRun| verdict.
  HasSecureWiFiConnection() => (RoutineVerdict verdict,
      array<HasSecureWiFiConnectionProblem> problems);

  // Tests whether a DNS resolver is available to the browser.
  DnsResolverPresent() => (RoutineVerdict verdict,
      array<DnsResolverPresentProblem> problems);

  // Tests whether the DNS latency is below an acceptable threshold.
  DnsLatency() => (RoutineVerdict verdict,
      array<DnsLatencyProblem> problem);

  // Tests whether a DNS resolution can be completed successfully.
  DnsResolution() => (RoutineVerdict verdict,
      array<DnsResolutionProblem> problems);

  // Tests whether the internet connection is behind a captive portal.
  CaptivePortal() => (RoutineVerdict verdict,
      array<CaptivePortalProblem> problems);

  // Tests whether a firewall is blocking HTTP port 80.
  HttpFirewall() => (RoutineVerdict verdict,
      array<HttpFirewallProblem> problems);

  // Tests whether a firewall is blocking HTTPS port 443.
  HttpsFirewall() => (RoutineVerdict verdict,
      array<HttpsFirewallProblem> problems);

  // Tests whether the HTTPS latency is within established tolerance levels for
  // the system.
  HttpsLatency() => (RoutineVerdict verdict,
      array<HttpsLatencyProblem> problems);

  // Tests the device's video conferencing capabalities by testing whether the
  // device can:
  // (1) Contact either a default or specified STUN server via UDP.
  // (2) Contact either a default or specified STUN server via TCP.
  // (3) Reach common media endpoints.
  VideoConferencing(string? stun_server_hostname) => (RoutineVerdict verdict,
      array<VideoConferencingProblem> problems, string? support_details);
};
