// 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.
//
// Next MinVersion: 1
//
// 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;

import "mojo/time.mojom";

// Enumeration of the possible network diagnostic routines. See
// NetworkDiagnosticsRoutines interface for more details.
[Stable, Extensible]
enum RoutineType {
  kLanConnectivity,
  kSignalStrength,
  kGatewayCanBePinged,
  kHasSecureWiFiConnection,
  kDnsResolverPresent,
  kDnsLatency,
  kDnsResolution,
  kCaptivePortal,
  kHttpFirewall,
  kHttpsFirewall,
  kHttpsLatency,
  kVideoConferencing,
  kArcHttp,
  kArcDnsResolution,
  kArcPing,
};

// Each routine can result in one of the possible verdicts.
[Stable, 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 LanConnectivity routine.
[Stable, Extensible]
enum LanConnectivityProblem {
  kNoLanConnectivity,
};

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

// Problems related to the GatewayCanBePinged routine.
[Stable, 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.
[Stable, Extensible]
enum HasSecureWiFiConnectionProblem {
  kSecurityTypeNone,
  kSecurityTypeWep8021x,
  kSecurityTypeWepPsk,
  kUnknownSecurityType,
};

// Problems related to the DnsResolverPresent routine.
[Stable, Extensible]
enum DnsResolverPresentProblem {
  kNoNameServersFound,
  kMalformedNameServers,
  DEPRECATED_kEmptyNameServers, // DEPRECATED: Use kNoNameServersFound instead
};

// Problems related to the DnsLatencyProblem routine.
[Stable, 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.
[Stable, Extensible]
enum DnsResolutionProblem {
  // The routine was unable to successfully resolve the test host
  kFailedToResolveHost,
};

// Problems related to the CaptivePortal routine.
[Stable, 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.
[Stable, Extensible]
enum HttpFirewallProblem {
  // DNS resolution failures above threshold.
  kDnsResolutionFailuresAboveThreshold,
  // Firewall detected.
  kFirewallDetected,
  // A firewall may potentially exist.
  kPotentialFirewall,
};

// Problems related to the HttpsFirewall routine.
[Stable, 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.
[Stable, 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.
[Stable, 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,
};

// Problems related to the ArcHttp routine.
[Stable, Extensible]
enum ArcHttpProblem {
  // Failed to get the ARC Service Manager.
  kFailedToGetArcServiceManager,
  // Failed to get instance of the NetInstance service.
  kFailedToGetNetInstanceForHttpTest,
  // HTTPS request latency is high.
  kHighLatency,
  // HTTPS request latency is very high.
  kVeryHighLatency,
  // One or more HTTP requests resulted in a failure.
  kFailedHttpRequests,
};

// Problems related to the ArcDnsResolution routine.
[Stable, Extensible]
enum ArcDnsResolutionProblem {
  // Failed to get the ARC Service Manager.
  kFailedToGetArcServiceManager,
  // Failed to get instance of the NetInstance service.
  kFailedToGetNetInstanceForDnsResolutionTest,
  // DNS query latency is high.
  kHighLatency,
  // DNS query latency is very high.
  kVeryHighLatency,
  // One or more DNS queries resulted in a failure.
  kFailedDnsQueries,
};

// Problems related to the ArcPing routine.
[Stable, Extensible]
enum ArcPingProblem {
  // Failed to get the ARC Service Manager.
  kFailedToGetArcServiceManager,
  // Failed to get instance of the NetInstance service.
  kFailedToGetNetInstanceForPingTest,
  // Timeout failure when getting managed properties of networks.
  kGetManagedPropertiesTimeoutFailure,
  // 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 of more of the non-default networks has a latency above the threshold.
  kNonDefaultNetworksAboveLatencyThreshold,
};

// Union of all possible routine problems. See each problem enum definition for
// more details.
[Stable]
union RoutineProblems {
  array<LanConnectivityProblem> lan_connectivity_problems;
  array<SignalStrengthProblem> signal_strength_problems;
  array<GatewayCanBePingedProblem> gateway_can_be_pinged_problems;
  array<HasSecureWiFiConnectionProblem> has_secure_wifi_connection_problems;
  array<DnsResolverPresentProblem> dns_resolver_present_problems;
  array<DnsLatencyProblem> dns_latency_problems;
  array<DnsResolutionProblem> dns_resolution_problems;
  array<CaptivePortalProblem> captive_portal_problems;
  array<HttpFirewallProblem> http_firewall_problems;
  array<HttpsFirewallProblem> https_firewall_problems;
  array<HttpsLatencyProblem> https_latency_problems;
  array<VideoConferencingProblem> video_conferencing_problems;
  array<ArcHttpProblem> arc_http_problems;
  array<ArcDnsResolutionProblem> arc_dns_resolution_problems;
  array<ArcPingProblem> arc_ping_problems;
};

// A single routine's result.
[Stable]
struct RoutineResult {
  // The result of the routine.
  RoutineVerdict verdict;
  // The list of detected problems, if any.
  RoutineProblems problems;
  // The timestamp when the routine was completed.
  mojo_base.mojom.Time timestamp;
};

// 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.
// Deprecated Methods: 1 - 11
// Next Method ID: 29
[Stable]
interface NetworkDiagnosticsRoutines {
  // Returns the most recent result for the specified routine type, if it has
  // been run.
  GetResult@27(RoutineType routine) => (RoutineResult? result);

  // Returns a map of all previously run routine types and their most recent
  // result.
  GetAllResults@28() => (map<RoutineType, RoutineResult> results);

  // 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.
  RunLanConnectivity@12() => (RoutineResult result);

  // Tests whether there is an acceptable signal strength on wireless networks.
  RunSignalStrength@13() => (RoutineResult result);

  // Tests whether the gateway of connected networks is pingable.
  RunGatewayCanBePinged@14() => (RoutineResult result);

  // Tests whether the WiFi connection is secure. Note that if WiFi is not
  // connected, the routine will result in a |kNotRun| verdict.
  RunHasSecureWiFiConnection@15() => (RoutineResult result);

  // Tests whether a DNS resolver is available to the browser.
  RunDnsResolverPresent@16() => (RoutineResult result);

  // Tests whether the DNS latency is below an acceptable threshold.
  RunDnsLatency@17() => (RoutineResult result);

  // Tests whether a DNS resolution can be completed successfully.
  RunDnsResolution@18() => (RoutineResult result);

  // Tests whether the internet connection is behind a captive portal.
  RunCaptivePortal@19() => (RoutineResult result);

  // Tests whether a firewall is blocking HTTP port 80.
  RunHttpFirewall@20() => (RoutineResult result);

  // Tests whether a firewall is blocking HTTPS port 443.
  RunHttpsFirewall@21() => (RoutineResult result);

  // Tests whether the HTTPS latency is within established tolerance levels for
  // the system.
  RunHttpsLatency@22() => (RoutineResult result);

  // Tests the device's video conferencing capabilities 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.
  RunVideoConferencing@23(string? stun_server_hostname)
      => (RoutineResult result);

  // Tests whether ARC can make successful HTTP GET requests to the resources
  // needed during the ARC Provisioning step.
  RunArcHttp@24() => (RoutineResult result);

  // Tests whether ARC can reach the connected networks' gateways.
  RunArcPing@25() => (RoutineResult result);

  // Tests whether ARC can make successful DNS queries to the hostnames
  // needed during the ARC Provisioning step.
  RunArcDnsResolution@26() => (RoutineResult result);
};
