| /* |
| * |
| * 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 Weave error string support library interfaces. |
| * |
| */ |
| |
| #ifndef __STDC_FORMAT_MACROS |
| #define __STDC_FORMAT_MACROS |
| #endif |
| |
| #ifndef __STDC_LIMIT_MACROS |
| #define __STDC_LIMIT_MACROS |
| #endif |
| |
| #include <stdint.h> |
| #include <string.h> |
| #include <Weave/Support/ASN1Error.h> |
| #include <InetLayer/InetError.h> |
| #include <BleLayer/BleError.h> |
| #include <Weave/Core/WeaveError.h> |
| #include <Weave/Support/ErrorStr.h> |
| |
| #include <nlunit-test.h> |
| |
| #include "ToolCommon.h" |
| |
| |
| // Test input data. |
| |
| |
| static int32_t sContext[] = |
| { |
| WEAVE_SYSTEM_ERROR_NOT_IMPLEMENTED, |
| WEAVE_SYSTEM_ERROR_NOT_SUPPORTED, |
| WEAVE_SYSTEM_ERROR_BAD_ARGS, |
| WEAVE_SYSTEM_ERROR_UNEXPECTED_STATE, |
| WEAVE_SYSTEM_ERROR_UNEXPECTED_EVENT, |
| WEAVE_SYSTEM_ERROR_NO_MEMORY, |
| WEAVE_SYSTEM_ERROR_REAL_TIME_NOT_SYNCED, |
| WEAVE_SYSTEM_ERROR_ACCESS_DENIED, |
| |
| INET_ERROR_WRONG_ADDRESS_TYPE, |
| INET_ERROR_CONNECTION_ABORTED, |
| INET_ERROR_PEER_DISCONNECTED, |
| INET_ERROR_INCORRECT_STATE, |
| INET_ERROR_MESSAGE_TOO_LONG, |
| INET_ERROR_NO_CONNECTION_HANDLER, |
| INET_ERROR_NO_MEMORY, |
| INET_ERROR_OUTBOUND_MESSAGE_TRUNCATED, |
| INET_ERROR_INBOUND_MESSAGE_TOO_BIG, |
| INET_ERROR_HOST_NOT_FOUND, |
| INET_ERROR_DNS_TRY_AGAIN, |
| INET_ERROR_DNS_NO_RECOVERY, |
| INET_ERROR_BAD_ARGS, |
| INET_ERROR_WRONG_PROTOCOL_TYPE, |
| INET_ERROR_UNKNOWN_INTERFACE, |
| INET_ERROR_NOT_IMPLEMENTED, |
| INET_ERROR_ADDRESS_NOT_FOUND, |
| INET_ERROR_HOST_NAME_TOO_LONG, |
| INET_ERROR_INVALID_HOST_NAME, |
| INET_ERROR_NOT_SUPPORTED, |
| INET_ERROR_NO_ENDPOINTS, |
| INET_ERROR_IDLE_TIMEOUT, |
| INET_ERROR_UNEXPECTED_EVENT, |
| INET_ERROR_INVALID_IPV6_PKT, |
| INET_ERROR_INTERFACE_INIT_FAILURE, |
| INET_ERROR_TCP_USER_TIMEOUT, |
| INET_ERROR_TCP_CONNECT_TIMEOUT, |
| INET_ERROR_INCOMPATIBLE_IP_ADDRESS_TYPE, |
| |
| BLE_ERROR_BAD_ARGS, |
| BLE_ERROR_INCORRECT_STATE, |
| BLE_ERROR_NO_ENDPOINTS, |
| BLE_ERROR_NO_CONNECTION_RECEIVED_CALLBACK, |
| BLE_ERROR_CENTRAL_UNSUBSCRIBED, |
| BLE_ERROR_GATT_SUBSCRIBE_FAILED, |
| BLE_ERROR_GATT_UNSUBSCRIBE_FAILED, |
| BLE_ERROR_GATT_WRITE_FAILED, |
| BLE_ERROR_GATT_INDICATE_FAILED, |
| BLE_ERROR_NOT_IMPLEMENTED, |
| BLE_ERROR_WOBLE_PROTOCOL_ABORT, |
| BLE_ERROR_REMOTE_DEVICE_DISCONNECTED, |
| BLE_ERROR_APP_CLOSED_CONNECTION, |
| BLE_ERROR_OUTBOUND_MESSAGE_TOO_BIG, |
| BLE_ERROR_NOT_WEAVE_DEVICE, |
| BLE_ERROR_INCOMPATIBLE_PROTOCOL_VERSIONS, |
| BLE_ERROR_NO_MEMORY, |
| BLE_ERROR_MESSAGE_INCOMPLETE, |
| BLE_ERROR_INVALID_FRAGMENT_SIZE, |
| BLE_ERROR_START_TIMER_FAILED, |
| BLE_ERROR_CONNECT_TIMED_OUT, |
| BLE_ERROR_RECEIVE_TIMED_OUT, |
| BLE_ERROR_INVALID_MESSAGE, |
| BLE_ERROR_FRAGMENT_ACK_TIMED_OUT, |
| BLE_ERROR_KEEP_ALIVE_TIMED_OUT, |
| BLE_ERRROR_NO_CONNECT_COMPLETE_CALLBACK, |
| BLE_ERROR_INVALID_ACK, |
| BLE_ERROR_REASSEMBLER_MISSING_DATA, |
| BLE_ERROR_INVALID_BTP_HEADER_FLAGS, |
| BLE_ERROR_INVALID_BTP_SEQUENCE_NUMBER, |
| BLE_ERROR_REASSEMBLER_INCORRECT_STATE, |
| BLE_ERROR_RECEIVED_MESSAGE_TOO_BIG, |
| |
| WEAVE_ERROR_TOO_MANY_CONNECTIONS, |
| WEAVE_ERROR_SENDING_BLOCKED, |
| WEAVE_ERROR_CONNECTION_ABORTED, |
| WEAVE_ERROR_INCORRECT_STATE, |
| WEAVE_ERROR_MESSAGE_TOO_LONG, |
| WEAVE_ERROR_UNSUPPORTED_EXCHANGE_VERSION, |
| WEAVE_ERROR_TOO_MANY_UNSOLICITED_MESSAGE_HANDLERS, |
| WEAVE_ERROR_NO_UNSOLICITED_MESSAGE_HANDLER, |
| WEAVE_ERROR_NO_CONNECTION_HANDLER, |
| WEAVE_ERROR_TOO_MANY_PEER_NODES, |
| WEAVE_ERROR_NO_MEMORY, |
| WEAVE_ERROR_NO_MESSAGE_HANDLER, |
| WEAVE_ERROR_MESSAGE_INCOMPLETE, |
| WEAVE_ERROR_DATA_NOT_ALIGNED, |
| WEAVE_ERROR_UNKNOWN_KEY_TYPE, |
| WEAVE_ERROR_KEY_NOT_FOUND, |
| WEAVE_ERROR_WRONG_ENCRYPTION_TYPE, |
| WEAVE_ERROR_TOO_MANY_KEYS, |
| WEAVE_ERROR_INTEGRITY_CHECK_FAILED, |
| WEAVE_ERROR_INVALID_SIGNATURE, |
| WEAVE_ERROR_UNSUPPORTED_MESSAGE_VERSION, |
| WEAVE_ERROR_UNSUPPORTED_ENCRYPTION_TYPE, |
| WEAVE_ERROR_UNSUPPORTED_SIGNATURE_TYPE, |
| WEAVE_ERROR_INVALID_MESSAGE_LENGTH, |
| WEAVE_ERROR_BUFFER_TOO_SMALL, |
| WEAVE_ERROR_DUPLICATE_KEY_ID, |
| WEAVE_ERROR_WRONG_KEY_TYPE, |
| WEAVE_ERROR_WELL_UNINITIALIZED, |
| WEAVE_ERROR_WELL_EMPTY, |
| WEAVE_ERROR_INVALID_STRING_LENGTH, |
| WEAVE_ERROR_INVALID_LIST_LENGTH, |
| WEAVE_ERROR_INVALID_INTEGRITY_TYPE, |
| WEAVE_END_OF_TLV, |
| WEAVE_ERROR_TLV_UNDERRUN, |
| WEAVE_ERROR_INVALID_TLV_ELEMENT, |
| WEAVE_ERROR_INVALID_TLV_TAG, |
| WEAVE_ERROR_UNKNOWN_IMPLICIT_TLV_TAG, |
| WEAVE_ERROR_WRONG_TLV_TYPE, |
| WEAVE_ERROR_TLV_CONTAINER_OPEN, |
| WEAVE_ERROR_INVALID_TRANSFER_MODE, |
| WEAVE_ERROR_INVALID_PROFILE_ID, |
| WEAVE_ERROR_INVALID_MESSAGE_TYPE, |
| WEAVE_ERROR_UNEXPECTED_TLV_ELEMENT, |
| WEAVE_ERROR_STATUS_REPORT_RECEIVED, |
| WEAVE_ERROR_NOT_IMPLEMENTED, |
| WEAVE_ERROR_INVALID_ADDRESS, |
| WEAVE_ERROR_INVALID_ARGUMENT, |
| WEAVE_ERROR_TLV_TAG_NOT_FOUND, |
| WEAVE_ERROR_INVALID_PATH_LIST, |
| WEAVE_ERROR_INVALID_DATA_LIST, |
| WEAVE_ERROR_TRANSACTION_CANCELED, |
| WEAVE_ERROR_LISTENER_ALREADY_STARTED, |
| WEAVE_ERROR_LISTENER_ALREADY_STOPPED, |
| WEAVE_ERROR_UNKNOWN_TOPIC, |
| |
| WEAVE_ERROR_TIMEOUT, |
| WEAVE_ERROR_INVALID_DEVICE_DESCRIPTOR, |
| WEAVE_ERROR_UNSUPPORTED_DEVICE_DESCRIPTOR_VERSION, |
| WEAVE_END_OF_INPUT, |
| WEAVE_ERROR_RATE_LIMIT_EXCEEDED, |
| WEAVE_ERROR_SECURITY_MANAGER_BUSY, |
| WEAVE_ERROR_INVALID_PASE_PARAMETER, |
| WEAVE_ERROR_PASE_SUPPORTS_ONLY_CONFIG1, |
| WEAVE_ERROR_NO_COMMON_PASE_CONFIGURATIONS, |
| WEAVE_ERROR_INVALID_PASE_CONFIGURATION, |
| WEAVE_ERROR_KEY_CONFIRMATION_FAILED, |
| WEAVE_ERROR_INVALID_USE_OF_SESSION_KEY, |
| WEAVE_ERROR_CONNECTION_CLOSED_UNEXPECTEDLY, |
| WEAVE_ERROR_MISSING_TLV_ELEMENT, |
| WEAVE_ERROR_RANDOM_DATA_UNAVAILABLE, |
| WEAVE_ERROR_UNSUPPORTED_HOST_PORT_ELEMENT, |
| WEAVE_ERROR_INVALID_HOST_SUFFIX_INDEX, |
| WEAVE_ERROR_HOST_PORT_LIST_EMPTY, |
| WEAVE_ERROR_UNSUPPORTED_AUTH_MODE, |
| |
| WEAVE_ERROR_INVALID_SERVICE_EP, |
| WEAVE_ERROR_INVALID_DIRECTORY_ENTRY_TYPE, |
| WEAVE_ERROR_FORCED_RESET, |
| WEAVE_ERROR_NO_ENDPOINT, |
| WEAVE_ERROR_INVALID_DESTINATION_NODE_ID, |
| WEAVE_ERROR_NOT_CONNECTED, |
| WEAVE_ERROR_NO_SW_UPDATE_AVAILABLE, |
| WEAVE_ERROR_CA_CERT_NOT_FOUND, |
| WEAVE_ERROR_CERT_PATH_LEN_CONSTRAINT_EXCEEDED, |
| WEAVE_ERROR_CERT_PATH_TOO_LONG, |
| WEAVE_ERROR_CERT_USAGE_NOT_ALLOWED, |
| WEAVE_ERROR_CERT_EXPIRED, |
| WEAVE_ERROR_CERT_NOT_VALID_YET, |
| WEAVE_ERROR_UNSUPPORTED_CERT_FORMAT, |
| WEAVE_ERROR_UNSUPPORTED_ELLIPTIC_CURVE, |
| WEAVE_CERT_NOT_USED, |
| WEAVE_ERROR_CERT_NOT_FOUND, |
| WEAVE_ERROR_INVALID_CASE_PARAMETER, |
| WEAVE_ERROR_UNSUPPORTED_CASE_CONFIGURATION, |
| WEAVE_ERROR_CERT_LOAD_FAIL, |
| WEAVE_ERROR_CERT_NOT_TRUSTED, |
| WEAVE_ERROR_INVALID_ACCESS_TOKEN, |
| WEAVE_ERROR_WRONG_CERT_SUBJECT, |
| WEAVE_ERROR_WRONG_NODE_ID, |
| WEAVE_ERROR_CONN_ACCEPTED_ON_WRONG_PORT, |
| WEAVE_ERROR_CALLBACK_REPLACED, |
| WEAVE_ERROR_NO_CASE_AUTH_DELEGATE, |
| WEAVE_ERROR_DEVICE_LOCATE_TIMEOUT, |
| WEAVE_ERROR_DEVICE_CONNECT_TIMEOUT, |
| WEAVE_ERROR_DEVICE_AUTH_TIMEOUT, |
| WEAVE_ERROR_MESSAGE_NOT_ACKNOWLEDGED, |
| WEAVE_ERROR_RETRANS_TABLE_FULL, |
| WEAVE_ERROR_INVALID_ACK_ID, |
| WEAVE_ERROR_SEND_THROTTLED, |
| WEAVE_ERROR_WRONG_MSG_VERSION_FOR_EXCHANGE, |
| WEAVE_ERROR_UNSUPPORTED_WEAVE_FEATURE, |
| WEAVE_ERROR_UNSOLICITED_MSG_NO_ORIGINATOR, |
| WEAVE_ERROR_UNSUPPORTED_TUNNEL_VERSION, |
| WEAVE_ERROR_INVALID_FABRIC_ID, |
| WEAVE_ERROR_TUNNEL_NEXTHOP_TABLE_FULL, |
| WEAVE_ERROR_TUNNEL_SERVICE_QUEUE_FULL, |
| WEAVE_ERROR_TUNNEL_PEER_ENTRY_NOT_FOUND, |
| WEAVE_ERROR_TUNNEL_FORCE_ABORT, |
| WEAVE_ERROR_DRBG_ENTROPY_SOURCE_FAILED, |
| WEAVE_ERROR_NO_TAKE_AUTH_DELEGATE, |
| WEAVE_ERROR_TAKE_RECONFIGURE_REQUIRED, |
| WEAVE_ERROR_TAKE_REAUTH_POSSIBLE, |
| WEAVE_ERROR_INVALID_TAKE_PARAMETER, |
| WEAVE_ERROR_UNSUPPORTED_TAKE_CONFIGURATION, |
| WEAVE_ERROR_TAKE_TOKEN_IDENTIFICATION_FAILED, |
| |
| WEAVE_ERROR_INVALID_TOKENPAIRINGBUNDLE, |
| WEAVE_ERROR_UNSUPPORTED_TOKENPAIRINGBUNDLE_VERSION, |
| |
| WEAVE_ERROR_KEY_NOT_FOUND_FROM_PEER, |
| WEAVE_ERROR_WRONG_ENCRYPTION_TYPE_FROM_PEER, |
| WEAVE_ERROR_UNKNOWN_KEY_TYPE_FROM_PEER, |
| WEAVE_ERROR_INVALID_USE_OF_SESSION_KEY_FROM_PEER, |
| WEAVE_ERROR_UNSUPPORTED_ENCRYPTION_TYPE_FROM_PEER, |
| WEAVE_ERROR_INTERNAL_KEY_ERROR_FROM_PEER, |
| WEAVE_ERROR_INVALID_KEY_ID, |
| WEAVE_ERROR_INVALID_TIME, |
| WEAVE_ERROR_LOCKING_FAILURE, |
| WEAVE_ERROR_UNSUPPORTED_PASSCODE_CONFIG, |
| WEAVE_ERROR_PASSCODE_AUTHENTICATION_FAILED, |
| WEAVE_ERROR_PASSCODE_FINGERPRINT_FAILED, |
| WEAVE_ERROR_INVALID_INTEGER_VALUE, |
| WEAVE_ERROR_TOO_MANY_CASE_RECONFIGURATIONS, |
| WEAVE_ERROR_INVALID_MESSAGE_FLAG, |
| |
| WEAVE_ERROR_SERIALIZATION_ELEMENT_NULL, |
| WEAVE_ERROR_KEY_EXPORT_RECONFIGURE_REQUIRED, |
| WEAVE_ERROR_INVALID_KEY_EXPORT_CONFIGURATION, |
| WEAVE_ERROR_NO_COMMON_KEY_EXPORT_CONFIGURATIONS, |
| WEAVE_ERROR_NO_KEY_EXPORT_DELEGATE, |
| WEAVE_ERROR_UNAUTHORIZED_KEY_EXPORT_REQUEST, |
| WEAVE_ERROR_UNAUTHORIZED_KEY_EXPORT_RESPONSE, |
| WEAVE_ERROR_EXPORTED_KEY_AUTHENTICATION_FAILED, |
| WEAVE_ERROR_TOO_MANY_SHARED_SESSION_END_NODES, |
| WEAVE_ERROR_WDM_MALFORMED_DATA_ELEMENT, |
| WEAVE_ERROR_WRONG_CERT_TYPE, |
| WEAVE_ERROR_DEFAULT_EVENT_HANDLER_NOT_CALLED, |
| WEAVE_ERROR_PERSISTED_STORAGE_FAIL, |
| WEAVE_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND, |
| WEAVE_ERROR_TUNNEL_RESET_RECONNECT_ALREADY_ARMED, |
| WEAVE_ERROR_MISMATCH_UPDATE_REQUIRED_VERSION, |
| WEAVE_ERROR_WDM_MALFORMED_STATUS_ELEMENT, |
| WEAVE_ERROR_WDM_SUBSCRIPTIONLESS_NOTIFY_PARTIAL, |
| WEAVE_ERROR_ACCESS_DENIED, |
| WEAVE_ERROR_UNKNOWN_RESOURCE_ID, |
| WEAVE_ERROR_WDM_MALFORMED_UPDATE_RESPONSE, |
| WEAVE_ERROR_WDM_VERSION_MISMATCH, |
| WEAVE_ERROR_WDM_POTENTIAL_DATA_LOSS, |
| WEAVE_ERROR_WDM_INCONSISTENT_CONDITIONALITY, |
| WEAVE_ERROR_WDM_LOCAL_DATA_INCONSISTENT, |
| WEAVE_ERROR_WDM_PATH_STORE_FULL, |
| |
| WEAVE_ERROR_TUNNEL_ROUTING_RESTRICTED, |
| |
| ASN1_END, |
| ASN1_ERROR_UNDERRUN, |
| ASN1_ERROR_OVERFLOW, |
| ASN1_ERROR_INVALID_STATE, |
| ASN1_ERROR_MAX_DEPTH_EXCEEDED, |
| ASN1_ERROR_INVALID_ENCODING, |
| ASN1_ERROR_UNSUPPORTED_ENCODING, |
| ASN1_ERROR_TAG_OVERFLOW, |
| ASN1_ERROR_LENGTH_OVERFLOW, |
| ASN1_ERROR_VALUE_OVERFLOW, |
| ASN1_ERROR_UNKNOWN_OBJECT_ID, |
| }; |
| |
| static const size_t kTestElements = sizeof(sContext) / sizeof(sContext[0]); |
| |
| |
| static void CheckErrorStrStart(nlTestSuite *inSuite, void *inContext) |
| { |
| nl::Weave::System::RegisterSystemLayerErrorFormatter(); |
| nl::Inet::RegisterInetLayerErrorFormatter(); |
| nl::Ble::RegisterBleLayerErrorFormatter(); |
| |
| // For each defined error... |
| for (size_t i = 0; i < kTestElements; i++) |
| { |
| int32_t err = sContext[i]; |
| const char * errStr = ErrorStr(err); |
| |
| // Assert that the error string contains the error number in hex. |
| char expectedText[9]; |
| snprintf(expectedText, sizeof(expectedText), "%08" PRIX32, err); |
| NL_TEST_ASSERT(inSuite, (strstr(errStr, expectedText) != NULL)); |
| |
| #if !WEAVE_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, ':') != NULL)); |
| #endif // !WEAVE_CONFIG_SHORT_ERROR_STR |
| } |
| } |
| |
| /** |
| * Test Suite. It lists all the test functions. |
| */ |
| static const nlTest sTests[] = { |
| NL_TEST_DEF("ErrorStr", CheckErrorStrStart), |
| |
| NL_TEST_SENTINEL() |
| }; |
| |
| /** |
| * Set up the test suite. |
| * This is a work-around to initiate InetBuffer protected class instance's |
| * data and set it to a known state, before an instance is created. |
| */ |
| static int TestSetup(void *inContext) |
| { |
| return (SUCCESS); |
| } |
| |
| /** |
| * Tear down the test suite. |
| * Free memory reserved at TestSetup. |
| */ |
| static int TestTeardown(void *inContext) |
| { |
| |
| return (SUCCESS); |
| } |
| |
| int main(void) |
| { |
| nlTestSuite theSuite = { |
| "Error-Strings", |
| &sTests[0], |
| TestSetup, |
| TestTeardown |
| }; |
| |
| // Generate machine-readable, comma-separated value (CSV) output. |
| nl_test_set_output_style(OUTPUT_CSV); |
| |
| // Run test suit againt one context. |
| nlTestRunner(&theSuite, &sContext); |
| |
| return nlTestRunnerStats(&theSuite); |
| } |