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

#include "net/base/net_errors.h"

#include "testing/gtest/include/gtest/gtest.h"

namespace net {

namespace {

TEST(NetErrorsTest, IsCertificateError) {
  // Positive tests.
  EXPECT_TRUE(IsCertificateError(ERR_CERT_AUTHORITY_INVALID));
  EXPECT_TRUE(IsCertificateError(ERR_CERT_COMMON_NAME_INVALID));
  EXPECT_TRUE(IsCertificateError(ERR_CERT_CONTAINS_ERRORS));
  EXPECT_TRUE(IsCertificateError(ERR_CERT_DATE_INVALID));
  EXPECT_TRUE(IsCertificateError(ERR_CERTIFICATE_TRANSPARENCY_REQUIRED));
  EXPECT_TRUE(IsCertificateError(ERR_CERT_INVALID));
  EXPECT_TRUE(IsCertificateError(ERR_CERT_NAME_CONSTRAINT_VIOLATION));
  EXPECT_TRUE(IsCertificateError(ERR_CERT_NON_UNIQUE_NAME));
  EXPECT_TRUE(IsCertificateError(ERR_CERT_NO_REVOCATION_MECHANISM));
  EXPECT_TRUE(IsCertificateError(ERR_CERT_REVOKED));
  EXPECT_TRUE(IsCertificateError(ERR_CERT_UNABLE_TO_CHECK_REVOCATION));
  EXPECT_TRUE(IsCertificateError(ERR_CERT_VALIDITY_TOO_LONG));
  EXPECT_TRUE(IsCertificateError(ERR_CERT_WEAK_KEY));
  EXPECT_TRUE(IsCertificateError(ERR_CERT_WEAK_SIGNATURE_ALGORITHM));
  EXPECT_TRUE(IsCertificateError(ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN));
  EXPECT_TRUE(IsCertificateError(ERR_CERT_KNOWN_INTERCEPTION_BLOCKED));
  EXPECT_TRUE(IsCertificateError(ERR_CERT_SELF_SIGNED_LOCAL_NETWORK));

  // Negative tests.
  EXPECT_FALSE(IsCertificateError(ERR_SSL_PROTOCOL_ERROR));
  EXPECT_FALSE(IsCertificateError(ERR_SSL_KEY_USAGE_INCOMPATIBLE));
  EXPECT_FALSE(
      IsCertificateError(ERR_SSL_CLIENT_AUTH_PRIVATE_KEY_ACCESS_DENIED));
  EXPECT_FALSE(IsCertificateError(ERR_QUIC_CERT_ROOT_NOT_KNOWN));
  EXPECT_FALSE(IsCertificateError(ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY));
  EXPECT_FALSE(IsCertificateError(ERR_FAILED));
  EXPECT_FALSE(IsCertificateError(OK));

  // Trigger a failure whenever ERR_CERT_END is changed, forcing developers to
  // update this test.
  EXPECT_EQ(ERR_CERT_END, -220)
      << "It looks like you added a new certificate error code ("
      << ErrorToString(ERR_CERT_END + 1)
      << ").\n"
         "\n"
         "Because this code is between ERR_CERT_BEGIN and ERR_CERT_END, it "
         "will be matched by net::IsCertificateError().\n"
         "\n"
         " (1) Please add a new test case to "
         "NetErrorsTest.IsCertificateError()."
         "\n"
         " (2) Review the existing consumers of IsCertificateError(). "
         "//content for instance has specialized handling of "
         "IsCertificateError() that may need to be updated.";
}

TEST(NetErrorsTest, IsClientCertificateError) {
  // Positive tests.
  EXPECT_TRUE(IsClientCertificateError(ERR_BAD_SSL_CLIENT_AUTH_CERT));
  EXPECT_TRUE(
      IsClientCertificateError(ERR_SSL_CLIENT_AUTH_PRIVATE_KEY_ACCESS_DENIED));
  EXPECT_TRUE(
      IsClientCertificateError(ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY));
  EXPECT_TRUE(IsClientCertificateError(ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED));
  EXPECT_TRUE(
      IsClientCertificateError(ERR_SSL_CLIENT_AUTH_NO_COMMON_ALGORITHMS));

  // Negative tests.
  EXPECT_FALSE(IsClientCertificateError(ERR_CERT_REVOKED));
  EXPECT_FALSE(IsClientCertificateError(ERR_SSL_PROTOCOL_ERROR));
  EXPECT_FALSE(IsClientCertificateError(ERR_CERT_WEAK_KEY));
}

TEST(NetErrorsTest, IsOkOrDefinedError) {
  EXPECT_TRUE(IsOkOrDefinedError(OK));
#define NET_ERROR(label, value) EXPECT_TRUE(IsOkOrDefinedError(value));
#include "net/base/net_error_list.h"
#undef NET_ERROR

  // Error -813 was removed and is not defined.
  EXPECT_FALSE(IsOkOrDefinedError(-813));
}

}  // namespace

}  // namespace net
