/*
 *
 *    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.
 *
 */

#ifndef __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS
#endif

#ifndef __STDC_LIMIT_MACROS
#define __STDC_LIMIT_MACROS
#endif

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

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

#include <nlunit-test.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_UNSUPPORTED_EXCHANGE_VERSION,
    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_TOO_MANY_KEYS,
    CHIP_ERROR_INTEGRITY_CHECK_FAILED,
    CHIP_ERROR_INVALID_SIGNATURE,
    CHIP_ERROR_UNSUPPORTED_MESSAGE_VERSION,
    CHIP_ERROR_UNSUPPORTED_ENCRYPTION_TYPE,
    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_WELL_UNINITIALIZED,
    CHIP_ERROR_WELL_EMPTY,
    CHIP_ERROR_INVALID_STRING_LENGTH,
    CHIP_ERROR_INVALID_LIST_LENGTH,
    CHIP_ERROR_INVALID_INTEGRITY_TYPE,
    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_TRANSFER_MODE,
    CHIP_ERROR_INVALID_PROFILE_ID,
    CHIP_ERROR_INVALID_MESSAGE_TYPE,
    CHIP_ERROR_UNEXPECTED_TLV_ELEMENT,
    CHIP_ERROR_STATUS_REPORT_RECEIVED,
    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_UNSUPPORTED_DEVICE_DESCRIPTOR_VERSION,
    CHIP_END_OF_INPUT,
    CHIP_ERROR_RATE_LIMIT_EXCEEDED,
    CHIP_ERROR_SECURITY_MANAGER_BUSY,
    CHIP_ERROR_INVALID_PASE_PARAMETER,
    CHIP_ERROR_PASE_SUPPORTS_ONLY_CONFIG1,
    CHIP_ERROR_KEY_CONFIRMATION_FAILED,
    CHIP_ERROR_INVALID_USE_OF_SESSION_KEY,
    CHIP_ERROR_CONNECTION_CLOSED_UNEXPECTEDLY,
    CHIP_ERROR_MISSING_TLV_ELEMENT,
    CHIP_ERROR_RANDOM_DATA_UNAVAILABLE,
    CHIP_ERROR_UNSUPPORTED_HOST_PORT_ELEMENT,
    CHIP_ERROR_INVALID_HOST_SUFFIX_INDEX,
    CHIP_ERROR_HOST_PORT_LIST_EMPTY,
    CHIP_ERROR_UNSUPPORTED_AUTH_MODE,
    CHIP_ERROR_INVALID_SERVICE_EP,
    CHIP_ERROR_INVALID_DIRECTORY_ENTRY_TYPE,
    CHIP_ERROR_FORCED_RESET,
    CHIP_ERROR_NO_ENDPOINT,
    CHIP_ERROR_INVALID_DESTINATION_NODE_ID,
    CHIP_ERROR_NOT_CONNECTED,
    CHIP_ERROR_NO_SW_UPDATE_AVAILABLE,
    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_CERT_NOT_USED,
    CHIP_ERROR_CERT_NOT_FOUND,
    CHIP_ERROR_INVALID_CASE_PARAMETER,
    CHIP_ERROR_UNSUPPORTED_CASE_CONFIGURATION,
    CHIP_ERROR_CERT_LOAD_FAILED,
    CHIP_ERROR_CERT_NOT_TRUSTED,
    CHIP_ERROR_INVALID_ACCESS_TOKEN,
    CHIP_ERROR_WRONG_CERT_DN,
    CHIP_ERROR_INVALID_PROVISIONING_BUNDLE,
    CHIP_ERROR_PROVISIONING_BUNDLE_DECRYPTION_ERROR,
    CHIP_ERROR_WRONG_NODE_ID,
    CHIP_ERROR_CONN_ACCEPTED_ON_WRONG_PORT,
    CHIP_ERROR_CALLBACK_REPLACED,
    CHIP_ERROR_NO_CASE_AUTH_DELEGATE,
    CHIP_ERROR_DEVICE_LOCATE_TIMEOUT,
    CHIP_ERROR_DEVICE_CONNECT_TIMEOUT,
    CHIP_ERROR_DEVICE_AUTH_TIMEOUT,
    CHIP_ERROR_MESSAGE_NOT_ACKNOWLEDGED,
    CHIP_ERROR_RETRANS_TABLE_FULL,
    CHIP_ERROR_INVALID_ACK_MESSAGE_COUNTER,
    CHIP_ERROR_SEND_THROTTLED,
    CHIP_ERROR_WRONG_MSG_VERSION_FOR_EXCHANGE,
    CHIP_ERROR_TRANSACTION_CANCELED,
    CHIP_ERROR_LISTENER_ALREADY_STARTED,
    CHIP_ERROR_LISTENER_ALREADY_STOPPED,
    CHIP_ERROR_INVALID_SUBSCRIPTION,
    CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE,
    CHIP_ERROR_PASE_RECONFIGURE_REQUIRED,
    CHIP_ERROR_INVALID_PASE_CONFIGURATION,
    CHIP_ERROR_NO_COMMON_PASE_CONFIGURATIONS,
    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_DRBG_ENTROPY_SOURCE_FAILED,
    CHIP_ERROR_TLV_TAG_NOT_FOUND,
    CHIP_ERROR_MISSING_SECURE_SESSION,
    CHIP_ERROR_INVALID_ADMIN_SUBJECT,
    CHIP_ERROR_INSUFFICIENT_PRIVILEGE,
    CHIP_ERROR_IM_MALFORMED_ATTRIBUTE_REPORT_IB,
    CHIP_ERROR_IM_MALFORMED_EVENT_STATUS_IB,
    CHIP_ERROR_IM_MALFORMED_STATUS_RESPONSE_MESSAGE,
    CHIP_ERROR_MESSAGE_COUNTER_EXHAUSTED,
    CHIP_ERROR_FABRIC_EXISTS,
    CHIP_ERROR_KEY_NOT_FOUND_FROM_PEER,
    CHIP_ERROR_WRONG_ENCRYPTION_TYPE_FROM_PEER,
    CHIP_ERROR_UNKNOWN_KEY_TYPE_FROM_PEER,
    CHIP_ERROR_INVALID_USE_OF_SESSION_KEY_FROM_PEER,
    CHIP_ERROR_UNSUPPORTED_ENCRYPTION_TYPE_FROM_PEER,
    CHIP_ERROR_INTERNAL_KEY_ERROR_FROM_PEER,
    CHIP_ERROR_INVALID_KEY_ID,
    CHIP_ERROR_INVALID_TIME,
    CHIP_ERROR_LOCKING_FAILURE,
    CHIP_ERROR_UNSUPPORTED_PASSCODE_CONFIG,
    CHIP_ERROR_PASSCODE_AUTHENTICATION_FAILED,
    CHIP_ERROR_PASSCODE_FINGERPRINT_FAILED,
    CHIP_ERROR_SERIALIZATION_ELEMENT_NULL,
    CHIP_ERROR_WRONG_CERT_SIGNATURE_ALGORITHM,
    CHIP_ERROR_WRONG_CHIP_SIGNATURE_ALGORITHM,
    CHIP_ERROR_SCHEMA_MISMATCH,
    CHIP_ERROR_INVALID_INTEGER_VALUE,
    CHIP_ERROR_CASE_RECONFIG_REQUIRED,
    CHIP_ERROR_TOO_MANY_CASE_RECONFIGURATIONS,
    CHIP_ERROR_BAD_REQUEST,
    CHIP_ERROR_INVALID_MESSAGE_FLAG,
    CHIP_ERROR_KEY_EXPORT_RECONFIGURE_REQUIRED,
    CHIP_ERROR_INVALID_KEY_EXPORT_CONFIGURATION,
    CHIP_ERROR_NO_COMMON_KEY_EXPORT_CONFIGURATIONS,
    CHIP_ERROR_NO_KEY_EXPORT_DELEGATE,
    CHIP_ERROR_UNAUTHORIZED_KEY_EXPORT_REQUEST,
    CHIP_ERROR_UNAUTHORIZED_KEY_EXPORT_RESPONSE,
    CHIP_ERROR_EXPORTED_KEY_AUTHENTICATION_FAILED,
    CHIP_ERROR_TOO_MANY_SHARED_SESSION_END_NODES,
    CHIP_ERROR_IM_MALFORMED_ATTRIBUTE_DATA_IB,
    CHIP_ERROR_WRONG_CERT_TYPE,
    CHIP_ERROR_DEFAULT_EVENT_HANDLER_NOT_CALLED,
    CHIP_ERROR_PERSISTED_STORAGE_FAILED,
    CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND,
    CHIP_ERROR_IM_FABRIC_DELETED,
    CHIP_ERROR_PROFILE_STRING_CONTEXT_NOT_REGISTERED,
    CHIP_ERROR_INCOMPATIBLE_SCHEMA_VERSION,
    CHIP_ERROR_ACCESS_DENIED,
    CHIP_ERROR_UNKNOWN_RESOURCE_ID,
    CHIP_ERROR_VERSION_MISMATCH,
    CHIP_ERROR_UNSUPPORTED_THREAD_NETWORK_CREATE,
    CHIP_ERROR_INCONSISTENT_CONDITIONALITY,
    CHIP_ERROR_LOCAL_DATA_INCONSISTENT,
    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_SESSION_KEY_SUSPENDED,
    CHIP_ERROR_UNSUPPORTED_WIRELESS_REGULATORY_DOMAIN,
    CHIP_ERROR_UNSUPPORTED_WIRELESS_OPERATING_LOCATION,
    CHIP_ERROR_MDNS_COLLISION,
    CHIP_ERROR_IM_MALFORMED_ATTRIBUTE_PATH_IB,
    CHIP_ERROR_IM_MALFORMED_EVENT_PATH_IB,
    CHIP_ERROR_IM_MALFORMED_COMMAND_PATH_IB,
    CHIP_ERROR_IM_MALFORMED_ATTRIBUTE_STATUS_IB,
    CHIP_ERROR_IM_MALFORMED_COMMAND_DATA_IB,
    CHIP_ERROR_IM_MALFORMED_EVENT_DATA_IB,
    CHIP_ERROR_IM_MALFORMED_STATUS_IB,
    CHIP_ERROR_PEER_NODE_NOT_FOUND,
    CHIP_ERROR_HSM,
    CHIP_ERROR_IM_STATUS_CODE_RECEIVED,
    CHIP_ERROR_IM_MALFORMED_COMMAND_STATUS_IB,
    CHIP_ERROR_IM_MALFORMED_INVOKE_RESPONSE_IB,
    CHIP_ERROR_IM_MALFORMED_INVOKE_REQUEST_MESSAGE,
    CHIP_ERROR_IM_MALFORMED_INVOKE_RESPONSE_MESSAGE,
    CHIP_ERROR_IM_MALFORMED_ATTRIBUTE_REPORT_MESSAGE,
    CHIP_ERROR_IM_MALFORMED_WRITE_REQUEST_MESSAGE,
    CHIP_ERROR_IM_MALFORMED_EVENT_FILTER_IB,
    CHIP_ERROR_IM_MALFORMED_READ_REQUEST_MESSAGE,
    CHIP_ERROR_IM_MALFORMED_SUBSCRIBE_REQUEST_MESSAGE,
    CHIP_ERROR_IM_MALFORMED_SUBSCRIBE_RESPONSE_MESSAGE,
    CHIP_ERROR_IM_MALFORMED_EVENT_REPORT_IB,
    CHIP_ERROR_IM_MALFORMED_CLUSTER_PATH_IB,
    CHIP_ERROR_IM_MALFORMED_DATA_VERSION_FILTER_IB,
    CHIP_ERROR_NOT_FOUND,
    CHIP_ERROR_IM_MALFORMED_TIMED_REQUEST_MESSAGE,
    CHIP_ERROR_INVALID_FILE_IDENTIFIER,
    CHIP_ERROR_BUSY,
    CHIP_ERROR_MAX_RETRY_EXCEEDED,
    CHIP_ERROR_PROVIDER_LIST_EXHAUSTED,
    CHIP_ERROR_ANOTHER_COMMISSIONING_IN_PROGRESS,
    CHIP_ERROR_INVALID_SCHEME_PREFIX,
    CHIP_ERROR_MISSING_URI_SEPARATOR,
    CHIP_ERROR_IM_MALFORMED_STATUS_RESPONSE_MESSAGE,
    CHIP_ERROR_IM_MALFORMED_TIMED_REQUEST_MESSAGE,
    CHIP_ERROR_INVALID_FILE_IDENTIFIER,
    CHIP_ERROR_BUSY,
    CHIP_ERROR_IM_MALFORMED_ATTRIBUTE_REPORT_IB,
    CHIP_ERROR_IM_MALFORMED_EVENT_STATUS_IB,
};
// clang-format on

static void CheckCoreErrorStr(nlTestSuite * inSuite, void * inContext)
{
    // 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()));
        NL_TEST_ASSERT(inSuite, (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.
        NL_TEST_ASSERT(inSuite, (strchr(errStr, ':') != nullptr));
#endif // !CHIP_CONFIG_SHORT_ERROR_STR
    }
}

/**
 *   Test Suite. It lists all the test functions.
 */

// clang-format off
static const nlTest sTests[] =
{
    NL_TEST_DEF("CoreErrorStr", CheckCoreErrorStr),

    NL_TEST_SENTINEL()
};
// clang-format on

int TestCHIPErrorStr()
{
    // clang-format off
    nlTestSuite theSuite =
	{
        "Core-Error-Strings",
        &sTests[0],
        nullptr,
        nullptr
    };
    // clang-format on

    // Run test suit againt one context.
    nlTestRunner(&theSuite, nullptr);

    return nlTestRunnerStats(&theSuite);
}

CHIP_REGISTER_TEST_SUITE(TestCHIPErrorStr)
