|  | // Copyright (c) 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. | 
|  |  | 
|  | #ifndef QUICHE_COMMON_TEST_TOOLS_QUICHE_TEST_UTILS_H_ | 
|  | #define QUICHE_COMMON_TEST_TOOLS_QUICHE_TEST_UTILS_H_ | 
|  |  | 
|  | #include <string> | 
|  |  | 
|  | #include "absl/status/status.h" | 
|  | #include "absl/status/statusor.h" | 
|  | #include "absl/strings/string_view.h" | 
|  | #include "quiche/common/platform/api/quiche_iovec.h" | 
|  | #include "quiche/common/platform/api/quiche_test.h" | 
|  |  | 
|  | namespace quiche { | 
|  | namespace test { | 
|  |  | 
|  | void CompareCharArraysWithHexError(const std::string& description, | 
|  | const char* actual, const int actual_len, | 
|  | const char* expected, | 
|  | const int expected_len); | 
|  |  | 
|  | // Create iovec that points to that data that `str` points to. | 
|  | iovec MakeIOVector(absl::string_view str); | 
|  |  | 
|  | // Due to binary size considerations, googleurl library can be built with or | 
|  | // without IDNA support, meaning that we have to adjust our tests accordingly. | 
|  | // This function checks if IDNAs are supported. | 
|  | bool GoogleUrlSupportsIdnaForTest(); | 
|  |  | 
|  | // Takes either a Status or StatusOr<T>, and returns just the Status. | 
|  | inline const absl::Status& ExtractStatus(const absl::Status& status) { | 
|  | return status; | 
|  | } | 
|  | template <typename T> | 
|  | const absl::Status& ExtractStatus(const absl::StatusOr<T>& status_or) { | 
|  | return status_or.status(); | 
|  | } | 
|  |  | 
|  | // Abseil does not provide absl::Status-related macros, so we have to provide | 
|  | // those instead. | 
|  | MATCHER(IsOk, "Checks if an instance of absl::Status is ok.") { | 
|  | if (arg.ok()) { | 
|  | return true; | 
|  | } | 
|  | *result_listener << "Expected status OK, got " << ExtractStatus(arg); | 
|  | return false; | 
|  | } | 
|  |  | 
|  | MATCHER_P(IsOkAndHolds, matcher, | 
|  | "Matcher against the inner value of absl::StatusOr") { | 
|  | if (!arg.ok()) { | 
|  | *result_listener << "Expected status OK, got " << arg.status(); | 
|  | return false; | 
|  | } | 
|  | return ::testing::ExplainMatchResult(matcher, arg.value(), result_listener); | 
|  | } | 
|  |  | 
|  | MATCHER_P(StatusIs, code, "Matcher against only a specific status code") { | 
|  | if (ExtractStatus(arg).code() != code) { | 
|  | *result_listener << "Expected status " << absl::StatusCodeToString(code) | 
|  | << ", got " << ExtractStatus(arg); | 
|  | return false; | 
|  | } | 
|  | return true; | 
|  | } | 
|  |  | 
|  | MATCHER_P2(StatusIs, code, matcher, "Matcher against a specific status code") { | 
|  | if (ExtractStatus(arg).code() != code) { | 
|  | *result_listener << "Expected status " << absl::StatusCodeToString(code) | 
|  | << ", got " << ExtractStatus(arg); | 
|  | return false; | 
|  | } | 
|  | return ::testing::ExplainMatchResult(matcher, ExtractStatus(arg).message(), | 
|  | result_listener); | 
|  | } | 
|  |  | 
|  | #define QUICHE_EXPECT_OK(arg) EXPECT_THAT((arg), ::quiche::test::IsOk()) | 
|  | #define QUICHE_ASSERT_OK(arg) ASSERT_THAT((arg), ::quiche::test::IsOk()) | 
|  |  | 
|  | }  // namespace test | 
|  | }  // namespace quiche | 
|  |  | 
|  | #endif  // QUICHE_COMMON_TEST_TOOLS_QUICHE_TEST_UTILS_H_ |