/*
 *
 *    Copyright (c) 2020-2022 Project CHIP Authors
 *    Copyright (c) 2016-2017 Nest Labs, Inc.
 *    All rights reserved.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

/**
 *    @file
 *      This file implements a process to effect a functional test for
 *      the CHIP Core library error string support interfaces.
 *
 */

#include <inttypes.h>
#include <stdint.h>
#include <string.h>

#include <gtest/gtest.h>

#include <lib/core/CHIPError.h>
#include <lib/core/ErrorStr.h>

using namespace chip;

// Test input data.

// clang-format off
static const CHIP_ERROR kTestElements[] =
{
    CHIP_ERROR_SENDING_BLOCKED,
    CHIP_ERROR_CONNECTION_ABORTED,
    CHIP_ERROR_INCORRECT_STATE,
    CHIP_ERROR_MESSAGE_TOO_LONG,
    CHIP_ERROR_RECURSION_DEPTH_LIMIT,
    CHIP_ERROR_TOO_MANY_UNSOLICITED_MESSAGE_HANDLERS,
    CHIP_ERROR_NO_UNSOLICITED_MESSAGE_HANDLER,
    CHIP_ERROR_NO_CONNECTION_HANDLER,
    CHIP_ERROR_TOO_MANY_PEER_NODES,
    CHIP_ERROR_SENTINEL,
    CHIP_ERROR_NO_MEMORY,
    CHIP_ERROR_NO_MESSAGE_HANDLER,
    CHIP_ERROR_MESSAGE_INCOMPLETE,
    CHIP_ERROR_DATA_NOT_ALIGNED,
    CHIP_ERROR_UNKNOWN_KEY_TYPE,
    CHIP_ERROR_KEY_NOT_FOUND,
    CHIP_ERROR_WRONG_ENCRYPTION_TYPE,
    CHIP_ERROR_INVALID_UTF8,
    CHIP_ERROR_INTEGRITY_CHECK_FAILED,
    CHIP_ERROR_INVALID_SIGNATURE,
    CHIP_ERROR_INVALID_TLV_CHAR_STRING,
    CHIP_ERROR_UNSUPPORTED_SIGNATURE_TYPE,
    CHIP_ERROR_INVALID_MESSAGE_LENGTH,
    CHIP_ERROR_BUFFER_TOO_SMALL,
    CHIP_ERROR_DUPLICATE_KEY_ID,
    CHIP_ERROR_WRONG_KEY_TYPE,
    CHIP_ERROR_UNINITIALIZED,
    CHIP_ERROR_INVALID_STRING_LENGTH,
    CHIP_ERROR_INVALID_LIST_LENGTH,
    CHIP_END_OF_TLV,
    CHIP_ERROR_TLV_UNDERRUN,
    CHIP_ERROR_INVALID_TLV_ELEMENT,
    CHIP_ERROR_INVALID_TLV_TAG,
    CHIP_ERROR_UNKNOWN_IMPLICIT_TLV_TAG,
    CHIP_ERROR_WRONG_TLV_TYPE,
    CHIP_ERROR_TLV_CONTAINER_OPEN,
    CHIP_ERROR_INVALID_MESSAGE_TYPE,
    CHIP_ERROR_UNEXPECTED_TLV_ELEMENT,
    CHIP_ERROR_NOT_IMPLEMENTED,
    CHIP_ERROR_INVALID_ADDRESS,
    CHIP_ERROR_INVALID_ARGUMENT,
    CHIP_ERROR_INVALID_PATH_LIST,
    CHIP_ERROR_INVALID_DATA_LIST,
    CHIP_ERROR_TIMEOUT,
    CHIP_ERROR_INVALID_DEVICE_DESCRIPTOR,
    CHIP_ERROR_INVALID_PASE_PARAMETER,
    CHIP_ERROR_INVALID_USE_OF_SESSION_KEY,
    CHIP_ERROR_CONNECTION_CLOSED_UNEXPECTEDLY,
    CHIP_ERROR_MISSING_TLV_ELEMENT,
    CHIP_ERROR_RANDOM_DATA_UNAVAILABLE,
    CHIP_ERROR_HOST_PORT_LIST_EMPTY,
    CHIP_ERROR_FORCED_RESET,
    CHIP_ERROR_NO_ENDPOINT,
    CHIP_ERROR_INVALID_DESTINATION_NODE_ID,
    CHIP_ERROR_NOT_CONNECTED,
    CHIP_ERROR_CA_CERT_NOT_FOUND,
    CHIP_ERROR_CERT_PATH_LEN_CONSTRAINT_EXCEEDED,
    CHIP_ERROR_CERT_PATH_TOO_LONG,
    CHIP_ERROR_CERT_USAGE_NOT_ALLOWED,
    CHIP_ERROR_CERT_EXPIRED,
    CHIP_ERROR_CERT_NOT_VALID_YET,
    CHIP_ERROR_UNSUPPORTED_CERT_FORMAT,
    CHIP_ERROR_UNSUPPORTED_ELLIPTIC_CURVE,
    CHIP_ERROR_CERT_NOT_FOUND,
    CHIP_ERROR_INVALID_CASE_PARAMETER,
    CHIP_ERROR_CERT_LOAD_FAILED,
    CHIP_ERROR_CERT_NOT_TRUSTED,
    CHIP_ERROR_WRONG_CERT_DN,
    CHIP_ERROR_WRONG_NODE_ID,
    CHIP_ERROR_RETRANS_TABLE_FULL,
    CHIP_ERROR_TRANSACTION_CANCELED,
    CHIP_ERROR_INVALID_SUBSCRIPTION,
    CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE,
    CHIP_ERROR_UNSOLICITED_MSG_NO_ORIGINATOR,
    CHIP_ERROR_INVALID_FABRIC_INDEX,
    CHIP_ERROR_TOO_MANY_CONNECTIONS,
    CHIP_ERROR_SHUT_DOWN,
    CHIP_ERROR_CANCELLED,
    CHIP_ERROR_TLV_TAG_NOT_FOUND,
    CHIP_ERROR_MISSING_SECURE_SESSION,
    CHIP_ERROR_INVALID_ADMIN_SUBJECT,
    CHIP_ERROR_INSUFFICIENT_PRIVILEGE,
    CHIP_ERROR_MESSAGE_COUNTER_EXHAUSTED,
    CHIP_ERROR_FABRIC_EXISTS,
    CHIP_ERROR_ENDPOINT_EXISTS,
    CHIP_ERROR_WRONG_ENCRYPTION_TYPE_FROM_PEER,
    CHIP_ERROR_INVALID_KEY_ID,
    CHIP_ERROR_INVALID_TIME,
    CHIP_ERROR_SCHEMA_MISMATCH,
    CHIP_ERROR_INVALID_INTEGER_VALUE,
    CHIP_ERROR_BAD_REQUEST,
    CHIP_ERROR_WRONG_CERT_TYPE,
    CHIP_ERROR_PERSISTED_STORAGE_FAILED,
    CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND,
    CHIP_ERROR_IM_FABRIC_DELETED,
    CHIP_ERROR_ACCESS_DENIED,
    CHIP_ERROR_UNKNOWN_RESOURCE_ID,
    CHIP_ERROR_VERSION_MISMATCH,
    CHIP_EVENT_ID_FOUND,
    CHIP_ERROR_INTERNAL,
    CHIP_ERROR_OPEN_FAILED,
    CHIP_ERROR_READ_FAILED,
    CHIP_ERROR_WRITE_FAILED,
    CHIP_ERROR_DECODE_FAILED,
    CHIP_ERROR_MDNS_COLLISION,
    CHIP_ERROR_IM_MALFORMED_ATTRIBUTE_PATH_IB,
    CHIP_ERROR_IM_MALFORMED_EVENT_PATH_IB,
    CHIP_ERROR_IM_MALFORMED_COMMAND_DATA_IB,
    CHIP_ERROR_IM_MALFORMED_EVENT_DATA_IB,
    CHIP_ERROR_PEER_NODE_NOT_FOUND,
    CHIP_ERROR_HSM,
    CHIP_ERROR_IM_STATUS_CODE_RECEIVED,
    CHIP_ERROR_IM_MALFORMED_DATA_VERSION_FILTER_IB,
    CHIP_ERROR_NOT_FOUND,
    CHIP_ERROR_INVALID_FILE_IDENTIFIER,
    CHIP_ERROR_BUSY,
    CHIP_ERROR_MAX_RETRY_EXCEEDED,
    CHIP_ERROR_PROVIDER_LIST_EXHAUSTED,
    CHIP_ERROR_INVALID_SCHEME_PREFIX,
    CHIP_ERROR_MISSING_URI_SEPARATOR,
    CHIP_ERROR_INVALID_FILE_IDENTIFIER,
    CHIP_ERROR_BUSY,
    CHIP_ERROR_HANDLER_NOT_SET,
    CHIP_ERROR_IN_PROGRESS,
};
// clang-format on

TEST(TestCHIPErrorStr, CheckCoreErrorStr)
{
    // Register the layer error formatter

    RegisterCHIPLayerErrorFormatter();

    // For each defined error...
    for (const auto & err : kTestElements)
    {
        const char * errStr = ErrorStr(err);
        char expectedText[9];

        // Assert that the error string contains the error number in hex.
        snprintf(expectedText, sizeof(expectedText), "%08" PRIX32, static_cast<uint32_t>(err.AsInteger()));
        EXPECT_TRUE((strstr(errStr, expectedText) != nullptr));

#if !CHIP_CONFIG_SHORT_ERROR_STR
        // Assert that the error string contains a description, which is signaled
        // by a presence of a colon proceeding the description.
        EXPECT_TRUE((strchr(errStr, ':') != nullptr));
#endif // !CHIP_CONFIG_SHORT_ERROR_STR

#if CHIP_CONFIG_ERROR_SOURCE
        // GetFile() should be relative to ${chip_root}
        char const * const file = err.GetFile();
        ASSERT_NE(file, nullptr);
        EXPECT_EQ(strstr(file, "src/lib/core/"), file);
#endif // CHIP_CONFIG_ERROR_SOURCE
    }
}
