diff --git a/include/test_execution_config.h b/include/test_execution_config.h index 7dde81b..95fef44 100644 --- a/include/test_execution_config.h +++ b/include/test_execution_config.h @@ -1,7 +1,41 @@ -#ifndef _TEST_EXECUTION_CONFIG_H_ -#define _TEST_EXECUTION_CONFIG_H_ +/* + * FreeRTOS FreeRTOS LTS Qualification Tests preview + * Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +/** + * @file test_execution_config.h + * @brief This setup the execution configurations for LTS qualification test. + */ + +#ifndef TEST_EXECUTION_CONFIG_H +#define TEST_EXECUTION_CONFIG_H + +/** + * @brief Configuration to enable the MQTT test. + */ #define MQTT_TEST_ENABLED (0) + +/** + * @brief Configuration to enable the transport interface test. + */ #define TRANSPORT_INTERFACE_TEST_ENABLED (0) -#endif /* _TEST_EXECUTION_CONFIG_H_ */ +#endif /* TEST_EXECUTION_CONFIG_H */ diff --git a/include/test_param_config.h b/include/test_param_config.h index c6617aa..547cd81 100644 --- a/include/test_param_config.h +++ b/include/test_param_config.h @@ -1,19 +1,65 @@ -#ifndef _TEST_PARAM_CONFIG_H_ -#define _TEST_PARAM_CONFIG_H_ +/* + * FreeRTOS FreeRTOS LTS Qualification Tests preview + * Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ -/* When FORCE_GENERATE_NEW_KEY_PAIR is set to 1, the device should generate +/** + * @file test_param_config.h + * @brief This setup the test parameters for LTS qualification test. + */ + +#ifndef TEST_PARAM_CONFIG_H +#define TEST_PARAM_CONFIG_H + +/** + * @brief Configuration that indicates if the device should generate a key pair. + * + * @note When FORCE_GENERATE_NEW_KEY_PAIR is set to 1, the device should generate * a new on-device key pair and output public key. When set to 0, the device * should keep existing key pair. */ #define FORCE_GENERATE_NEW_KEY_PAIR 0 +/** + * @brief Endpoint of the MQTT broker to connect to in mqtt test. + */ #define MQTT_SERVER_ENDPOINT "PLACE_HOLDER" + +/** + * @brief Port of the MQTT broker to connect to in mqtt test. + */ #define MQTT_SERVER_PORT (8883) +/** + * @brief Endpoint of the echo server to connect to in transport interface test. + */ #define ECHO_SERVER_ENDPOINT "PLACE_HOLDER" + +/** + * @brief Port of the echo server to connect to in transport interface test. + */ #define ECHO_SERVER_PORT (9000) -/* Root certificate of the echo server. +/** + * @brief Root certificate of the echo server. + * * @note This certificate should be PEM-encoded. * * Must include the PEM header and footer: @@ -23,7 +69,9 @@ */ #define ECHO_SERVER_ROOT_CA "PLACE_HOLDER" -/* Client certificate to connect to echo server. +/** + * @brief Client certificate to connect to echo server. + * * @note This certificate should be PEM-encoded. * * Must include the PEM header and footer: @@ -33,11 +81,13 @@ */ #define TRANSPORT_CLIENT_CA NULL -/* Client private key to connect to echo server. +/** + * @brief Client private key to connect to echo server. + * * @note This is should only be used for testing purpose. + * * For qualification, the key should be generated on-device. */ #define TRANSPORT_CLIENT_KEY NULL - -#endif /* _TEST_PARAM_CONFIG_H_ */ +#endif /* TEST_PARAM_CONFIG_H */ diff --git a/src/common/network_connection.h b/src/common/network_connection.h index 12ac87d..de37735 100644 --- a/src/common/network_connection.h +++ b/src/common/network_connection.h @@ -1,6 +1,35 @@ -#ifndef _NETWORK_CONNECTION_H_ -#define _NETWORK_CONNECTION_H_ +/* + * FreeRTOS FreeRTOS LTS Qualification Tests preview + * Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/** + * @file network_connection.h + * @brief Network connect/disconnect functions for test appliction. + */ +#ifndef NETWORK_CONNECTION_H +#define NETWORK_CONNECTION_H +/** + * @brief Struct to hold the host information for connection. + */ typedef struct TestHostInfo { const char * pHostName; /**< @brief Server host name. The string should be nul terminated. */ @@ -8,23 +37,40 @@ typedef struct TestHostInfo } TestHostInfo_t; /** - * NetworkConnectFunc is a function pointer type for functions that - * establish a network connection with a server. It takes three arguments: - * a void * network context, - * a TestHostInfo_t * host info about which server to connect to, - * a void * network credentials. + * @brief Network connect return status. + */ +typedef enum NetworkConnectStatus +{ + NETWORK_CONNECT_SUCCESS = 0, /**< @brief Function successfully completed. */ + NETWORK_CONNECT_INVALID_PARAMETER, /**< @brief At least one parameter was invalid. */ + NETWORK_CONNECT_INSUFFICIENT_MEMORY, /**< @brief Insufficient memory required to establish connection. */ + NETWORK_CONNECT_INVALID_CREDENTIALS, /**< @brief Provided credentials were invalid. */ + NETWORK_CONNECT_HANDSHAKE_FAILED, /**< @brief Performing TLS handshake with server failed. */ + NETWORK_CONNECT_INTERNAL_ERROR, /**< @brief A call to a system API resulted in an internal error. */ + NETWORK_CONNECT_FAILURE /**< @brief Initial connection to the server failed. */ +} NetworkConnectStatus_t; + +/** + * @brief A function pointer type for function that establish a network connection + * with a server. + * + * @param[in] pNetworkContext Network context to setup the connection. + * @param[in] pHostInfo Host information for the connection. + * @param[in] pNetworkCredentials Network credentials for the connection. * - * Network context and crendentials are defined by application implementations. + * @return NETWORK_CONNECT_SUCCESS if the network connection is established successfully. + * Otherwise, return other network connect status to indicate error. */ -typedef int (*NetworkConnectFunc)( void *, TestHostInfo_t *, void * ); +typedef NetworkConnectStatus_t ( * NetworkConnectFunc_t )( void * pNetworkContext, + TestHostInfo_t * pHostInfo, + void * pNetworkCredentials ); /** - * NetworkDisconnectFunc is a function pointer type for functions that - * disconnect a previously established network connection. It takes one argument: - * a void * network context. + * @brief A function pointer type for function that disconnect a previously established + * network connection with a server. * - * Network context is defined by application implementations. + * @param[in] pNetworkContext Network context to disconnect the connection. */ -typedef void (*NetworkDisconnectFunc)( void * ); +typedef void ( * NetworkDisconnectFunc_t )( void * pNetworkContext ); -#endif /* _NETWORK_CONNECTION_H_ */ +#endif /* NETWORK_CONNECTION_H */ diff --git a/src/mqtt/mqtt_test.c b/src/mqtt/mqtt_test.c index 2fd79c2..ca357b1 100644 --- a/src/mqtt/mqtt_test.c +++ b/src/mqtt/mqtt_test.c @@ -1,3 +1,29 @@ +/* + * FreeRTOS FreeRTOS LTS Qualification Tests preview + * Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/** + * @file mqtt_test.c + * @brief Implements test functions for MQTT test. + */ #include #include #include @@ -6,7 +32,6 @@ #include "demo_config.h" #include "core_mqtt.h" #include "core_mqtt_state.h" -#include "tls_freertos.h" #include "clock.h" #include "unity.h" @@ -14,6 +39,8 @@ #include "test_execution_config.h" #include "test_param_config.h" +/*-----------------------------------------------------------*/ + /** * @brief Length of MQTT server host name. */ @@ -80,7 +107,6 @@ */ #define TEST_MQTT_LWT_TOPIC_LENGTH ( sizeof( TEST_MQTT_LWT_TOPIC ) - 1 ) - /** * @brief Client identifier for MQTT session in the tests. */ @@ -119,13 +145,13 @@ /** * @brief Timeout for receiving CONNACK packet in milli seconds. */ -#define CONNACK_RECV_TIMEOUT_MS ( 1000U ) +#define CONNACK_RECV_TIMEOUT_MS ( 1000U ) /** * @brief Time interval in seconds at which an MQTT PINGREQ need to be sent to * broker. */ -#define MQTT_KEEP_ALIVE_INTERVAL_SECONDS ( 5U ) +#define MQTT_KEEP_ALIVE_INTERVAL_SECONDS ( 5U ) /** * @brief Timeout for MQTT_ProcessLoop() function in milliseconds. @@ -133,12 +159,14 @@ * PUBLISH message and ack responses for QoS 1 and QoS 2 communications * with the broker. */ -#define MQTT_PROCESS_LOOP_TIMEOUT_MS ( 700U ) +#define MQTT_PROCESS_LOOP_TIMEOUT_MS ( 700U ) /** * @brief The MQTT message published in this example. */ -#define MQTT_EXAMPLE_MESSAGE "Hello World!" +#define MQTT_EXAMPLE_MESSAGE "Hello World!" + +/*-----------------------------------------------------------*/ /** * @brief a struct of test parameters filled in by user. @@ -243,6 +271,7 @@ static uint8_t packetTypeForDisconnection = MQTT_PACKET_TYPE_INVALID; */ static int clientIdRandNumber; +/*-----------------------------------------------------------*/ /** * @brief Sends an MQTT CONNECT packet over the already connected TCP socket. @@ -312,6 +341,7 @@ static void startPersistentSession(); */ static void resumePersistentSession(); +/*-----------------------------------------------------------*/ static void establishMqttSession( MQTTContext_t * pContext, void * pNetworkContext, @@ -407,6 +437,8 @@ static void establishMqttSession( MQTTContext_t * pContext, pSessionPresent ) ); } +/*-----------------------------------------------------------*/ + static void eventCallback( MQTTContext_t * pContext, MQTTPacketInfo_t * pPacketInfo, MQTTDeserializedInfo_t * pDeserializedInfo ) @@ -428,7 +460,7 @@ static void eventCallback( MQTTContext_t * pContext, { /* Terminate TLS session and TCP connection to test session restoration * across network connection. */ - (*testParam.pNetworkDisconnect)( testParam.pNetworkContext ); + ( *testParam.pNetworkDisconnect )( testParam.pNetworkContext ); } else { @@ -464,6 +496,8 @@ static void eventCallback( MQTTContext_t * pContext, } } +/*-----------------------------------------------------------*/ + static int32_t failedRecv( NetworkContext_t * pNetworkContext, void * pBuffer, size_t bytesToRecv ) @@ -472,37 +506,40 @@ static int32_t failedRecv( NetworkContext_t * pNetworkContext, ( void ) bytesToRecv; /* Terminate the TLS+TCP connection with the broker for the test. */ - ( void ) (*testParam.pNetworkDisconnect)( pNetworkContext ); + ( void ) ( *testParam.pNetworkDisconnect )( pNetworkContext ); return -1; } +/*-----------------------------------------------------------*/ + static void startPersistentSession() { /* Terminate TLS session and TCP network connection to discard the current MQTT session * that was created as a "clean session". */ - ESP_LOGI("MQTT", "startpersistentsession"); - ( void ) (*testParam.pNetworkDisconnect)( testParam.pNetworkContext ); + ( void ) ( *testParam.pNetworkDisconnect )( testParam.pNetworkContext ); /* Establish a new MQTT connection over TLS with the broker with the "clean session" flag set to 0 * to start a persistent session with the broker. */ /* Create the TLS+TCP connection with the broker. */ - TEST_ASSERT_EQUAL( pdPASS, (*testParam.pNetworkConnect)( testParam.pNetworkContext, - &testHostInfo, - testParam.pNetworkCredentials ) ); + TEST_ASSERT_EQUAL( NETWORK_CONNECT_SUCCESS, ( *testParam.pNetworkConnect )( testParam.pNetworkContext, + &testHostInfo, + testParam.pNetworkCredentials ) ); /* Establish a new MQTT connection for a persistent session with the broker. */ establishMqttSession( &context, testParam.pNetworkContext, false, &persistentSession ); TEST_ASSERT_FALSE( persistentSession ); } +/*-----------------------------------------------------------*/ + static void resumePersistentSession() { /* Create a new TLS+TCP network connection with the server. */ - TEST_ASSERT_EQUAL( pdPASS, (*testParam.pNetworkConnect)( testParam.pNetworkContext, - &testHostInfo, - testParam.pNetworkCredentials ) ); + TEST_ASSERT_EQUAL( NETWORK_CONNECT_SUCCESS, ( *testParam.pNetworkConnect )( testParam.pNetworkContext, + &testHostInfo, + testParam.pNetworkCredentials ) ); /* Re-establish the persistent session with the broker by connecting with "clean session" flag set to 0. */ TEST_ASSERT_FALSE( persistentSession ); @@ -512,6 +549,8 @@ static void resumePersistentSession() TEST_ASSERT_TRUE( persistentSession ); } +/*-----------------------------------------------------------*/ + static void handleAckEvents( MQTTPacketInfo_t * pPacketInfo, uint16_t packetIdentifier ) { @@ -597,6 +636,8 @@ static void handleAckEvents( MQTTPacketInfo_t * pPacketInfo, } } +/*-----------------------------------------------------------*/ + static MQTTStatus_t subscribeToTopic( MQTTContext_t * pContext, const char * pTopic, MQTTQoS_t qos ) @@ -622,6 +663,8 @@ static MQTTStatus_t subscribeToTopic( MQTTContext_t * pContext, globalSubscribePacketIdentifier ); } +/*-----------------------------------------------------------*/ + static MQTTStatus_t unsubscribeFromTopic( MQTTContext_t * pContext, const char * pTopic, MQTTQoS_t qos ) @@ -647,6 +690,8 @@ static MQTTStatus_t unsubscribeFromTopic( MQTTContext_t * pContext, globalUnsubscribePacketIdentifier ); } +/*-----------------------------------------------------------*/ + static MQTTStatus_t publishToTopic( MQTTContext_t * pContext, const char * pTopic, bool setRetainFlag, @@ -675,7 +720,9 @@ static MQTTStatus_t publishToTopic( MQTTContext_t * pContext, packetId ); } -void setUp(void) +/*-----------------------------------------------------------*/ + +void setUp( void ) { struct timespec tp; @@ -703,15 +750,18 @@ void setUp(void) /* Establish a TCP connection with the server endpoint, then * establish TLS session on top of TCP connection. */ - TEST_ASSERT_EQUAL( pdPASS, (*testParam.pNetworkConnect)( testParam.pNetworkContext, - &testHostInfo, - testParam.pNetworkCredentials ) ); + TEST_ASSERT_EQUAL( NETWORK_CONNECT_SUCCESS, ( *testParam.pNetworkConnect )( testParam.pNetworkContext, + &testHostInfo, + testParam.pNetworkCredentials ) ); /* Establish MQTT session on top of the TCP+TLS connection. */ establishMqttSession( &context, testParam.pNetworkContext, true, &persistentSession ); } -void tearDown(void) { +/*-----------------------------------------------------------*/ + +void tearDown( void ) +{ MQTTStatus_t mqttStatus; /* Free memory, if allocated during test case execution. */ @@ -728,13 +778,15 @@ void tearDown(void) { /* Terminate MQTT connection. */ mqttStatus = MQTT_Disconnect( &context ); - (*testParam.pNetworkDisconnect)( testParam.pNetworkContext ); + ( *testParam.pNetworkDisconnect )( testParam.pNetworkContext ); /* Make any assertions at the end so that all memory is deallocated before * the end of this function. */ TEST_ASSERT_EQUAL( MQTTSuccess, mqttStatus ); } +/*-----------------------------------------------------------*/ + void test_MQTT_Subscribe_Publish_With_Qos_0( void ) { /* Subscribe to a topic with Qos 0. */ @@ -786,6 +838,8 @@ void test_MQTT_Subscribe_Publish_With_Qos_0( void ) TEST_ASSERT_TRUE( receivedUnsubAck ); } +/*-----------------------------------------------------------*/ + /** * @brief Tests Subscribe and Publish operations with the MQTT broken using QoS 1. * The test subscribes to a topic, and then publishes to the same topic. The @@ -847,6 +901,8 @@ void test_MQTT_Subscribe_Publish_With_Qos_1( void ) TEST_ASSERT_TRUE( receivedUnsubAck ); } +/*-----------------------------------------------------------*/ + /** * @brief Tests Subscribe and Publish operations with the MQTT broken using QoS 1. * The test subscribes to a topic, and then publishes to the same topic. The @@ -859,9 +915,9 @@ void test_MQTT_Connect_LWT( void ) /* Establish a second TCP connection with the server endpoint, then * a TLS session. The server info and credentials can be reused. */ - TEST_ASSERT_EQUAL( pdPASS, (*testParam.pNetworkConnect)( testParam.pSecondNetworkContext, - &testHostInfo, - testParam.pNetworkCredentials ) ); + TEST_ASSERT_EQUAL( NETWORK_CONNECT_SUCCESS, ( *testParam.pNetworkConnect )( testParam.pSecondNetworkContext, + &testHostInfo, + testParam.pNetworkCredentials ) ); /* Establish MQTT session on top of the TCP+TLS connection. */ useLWTClientIdentifier = true; @@ -877,7 +933,7 @@ void test_MQTT_Connect_LWT( void ) TEST_ASSERT_TRUE( receivedSubAck ); /* Abruptly terminate TCP connection. */ - ( void ) (*testParam.pNetworkDisconnect)( testParam.pSecondNetworkContext ); + ( void ) ( *testParam.pNetworkDisconnect )( testParam.pSecondNetworkContext ); /* Run the process loop to receive the LWT. Allow some more time for the * server to realize the connection is closed. */ @@ -906,6 +962,8 @@ void test_MQTT_Connect_LWT( void ) TEST_ASSERT_TRUE( receivedUnsubAck ); } +/*-----------------------------------------------------------*/ + /** * @brief Verifies that the MQTT library sends a Ping Request packet if the connection is * idle for more than the keep-alive period. @@ -928,6 +986,8 @@ void test_MQTT_ProcessLoop_KeepAlive( void ) TEST_ASSERT_LESS_OR_EQUAL( MQTT_KEEP_ALIVE_INTERVAL_SECONDS * 1500, elapsedTime ); } +/*-----------------------------------------------------------*/ + /** * @brief Verifies that the MQTT library supports resending a PUBLISH QoS 1 packet which is * un-acknowledged in its first attempt. @@ -971,6 +1031,7 @@ void test_MQTT_Resend_Unacked_Publish_QoS1( void ) /* Obtain the packet ID of the PUBLISH packet that didn't complete in the previous connection. */ MQTTStateCursor_t cursor = MQTT_STATE_CURSOR_INITIALIZER; uint16_t publishPackedId = MQTT_PublishToResend( &context, &cursor ); + TEST_ASSERT_NOT_EQUAL( MQTT_PACKET_ID_INVALID, publishPackedId ); /* Make sure that the packet ID is maintained in the outgoing publish state records. */ @@ -997,6 +1058,8 @@ void test_MQTT_Resend_Unacked_Publish_QoS1( void ) TEST_ASSERT_EQUAL( MQTT_PACKET_ID_INVALID, context.outgoingPublishRecords[ 0 ].packetId ); } +/*-----------------------------------------------------------*/ + /** * @brief Verifies the behavior of the MQTT library on receiving a duplicate * QoS 1 PUBLISH packet from the broker in a restored session connection. @@ -1049,11 +1112,12 @@ void test_MQTT_Restore_Session_Duplicate_Incoming_Publish_Qos1( void ) * to re-attempt the PUBLISH operation. */ TEST_ASSERT_EQUAL( MQTTSuccess, MQTT_ProcessLoop( &context, 2 * MQTT_PROCESS_LOOP_TIMEOUT_MS ) ); - ESP_LOGI("MQTT", "before last assert"); /* Make sure that the library cleared the record for the incoming QoS 1 PUBLISH packet. */ TEST_ASSERT_EQUAL( MQTT_PACKET_ID_INVALID, context.incomingPublishRecords[ 0 ].packetId ); } +/*-----------------------------------------------------------*/ + /** * @brief Verifies that the library supports notifying the broker to retain a PUBLISH message * for a topic using the retain flag. @@ -1120,23 +1184,28 @@ void test_MQTT_Publish_With_Retain_Flag( void ) TEST_ASSERT_FALSE( receivedRetainedMessage ); } -int runMqttTest() +/*-----------------------------------------------------------*/ + +int RunMqttTest( void ) { int status = -1; -#if ( MQTT_TEST_ENABLED == 1 ) - /* Calls user-implemented setupMqttTestParam to fill in testParam */ - setupMqttTestParam( &testParam ); - testHostInfo.pHostName = MQTT_SERVER_ENDPOINT; - testHostInfo.port = MQTT_SERVER_PORT; - UNITY_BEGIN(); - RUN_TEST( test_MQTT_Subscribe_Publish_With_Qos_0 ); - RUN_TEST( test_MQTT_Subscribe_Publish_With_Qos_1 ); - RUN_TEST( test_MQTT_Connect_LWT ); - RUN_TEST( test_MQTT_ProcessLoop_KeepAlive ); - RUN_TEST( test_MQTT_Resend_Unacked_Publish_QoS1 ); - RUN_TEST( test_MQTT_Restore_Session_Duplicate_Incoming_Publish_Qos1 ); - RUN_TEST( test_MQTT_Publish_With_Retain_Flag ); - status = UNITY_END(); -#endif + + #if ( MQTT_TEST_ENABLED == 1 ) + /* Calls user-implemented SetupMqttTestParam to fill in testParam */ + SetupMqttTestParam( &testParam ); + testHostInfo.pHostName = MQTT_SERVER_ENDPOINT; + testHostInfo.port = MQTT_SERVER_PORT; + UNITY_BEGIN(); + RUN_TEST( test_MQTT_Subscribe_Publish_With_Qos_0 ); + RUN_TEST( test_MQTT_Subscribe_Publish_With_Qos_1 ); + RUN_TEST( test_MQTT_Connect_LWT ); + RUN_TEST( test_MQTT_ProcessLoop_KeepAlive ); + RUN_TEST( test_MQTT_Resend_Unacked_Publish_QoS1 ); + RUN_TEST( test_MQTT_Restore_Session_Duplicate_Incoming_Publish_Qos1 ); + RUN_TEST( test_MQTT_Publish_With_Retain_Flag ); + status = UNITY_END(); + #endif /* if ( MQTT_TEST_ENABLED == 1 ) */ return status; } + +/*-----------------------------------------------------------*/ diff --git a/src/mqtt/mqtt_test.h b/src/mqtt/mqtt_test.h index 1279584..a91e6ec 100644 --- a/src/mqtt/mqtt_test.h +++ b/src/mqtt/mqtt_test.h @@ -1,4 +1,31 @@ -#pragma once +/* + * FreeRTOS FreeRTOS LTS Qualification Tests preview + * Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/** + * @file mqtt_test.h + * @brief Test functions for MQTT test. + */ +#ifndef MQTT_TEST_H +#define MQTT_TEST_H #include "transport_interface.h" #include "network_connection.h" @@ -6,8 +33,8 @@ typedef struct MqttTestParam { TransportInterface_t * pTransport; /**< @brief pNetworkContext, send, receive fields of the TransportInterface_t struct should be filled out. */ - NetworkConnectFunc pNetworkConnect; - NetworkDisconnectFunc pNetworkDisconnect; + NetworkConnectFunc_t pNetworkConnect; + NetworkDisconnectFunc_t pNetworkDisconnect; void * pNetworkCredentials; void * pNetworkContext; void * pSecondNetworkContext; @@ -21,9 +48,14 @@ typedef struct MqttTestParam * caller. * */ -void setupMqttTestParam( MqttTestParam_t * pTestParam ); +void SetupMqttTestParam( MqttTestParam_t * pTestParam ); /** - * @brief Run MQTT test. This function should be called after calling `setupMqttTest()`. + * @brief Run MQTT test. This function should be called after calling `SetupMqttTest()`. + * + * @return Negative value if the transport test execution config is not set. Otherwise, + * number of failure test cases is returned. */ -int runMqttTest(); +int RunMqttTest( void ); + +#endif /* MQTT_TEST_H */ diff --git a/src/qualification_test.c b/src/qualification_test.c index 8d3ee4b..e50e89e 100644 --- a/src/qualification_test.c +++ b/src/qualification_test.c @@ -1,3 +1,29 @@ +/* + * FreeRTOS FreeRTOS LTS Qualification Tests preview + * Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/** + * @file qualification_test.c + * @brief Implements the entry function for LTS qualification test. + */ #include "test_execution_config.h" #if ( MQTT_TEST_ENABLED == 1 ) @@ -5,16 +31,20 @@ #endif #if ( TRANSPORT_INTERFACE_TEST_ENABLED == 1 ) - #include "transport_interface_tests.h" + #include "transport_interface_test.h" #endif -void runQualificationTest( void ) +/*-----------------------------------------------------------*/ + +void RunQualificationTest( void ) { #if ( TRANSPORT_INTERFACE_TEST_ENABLED == 1 ) - RunTransportInterfaceTests(); + RunTransportInterfaceTest(); #endif #if ( MQTT_TEST_ENABLED == 1 ) - runMqttTest(); + RunMqttTest(); #endif } + +/*-----------------------------------------------------------*/ diff --git a/src/qualification_test.h b/src/qualification_test.h index 24f4e0a..665b801 100644 --- a/src/qualification_test.h +++ b/src/qualification_test.h @@ -1,6 +1,35 @@ -#ifndef _QUALIFICATION_TEST_H_ -#define _QUALIFICATION_TEST_H_ +/* + * FreeRTOS FreeRTOS LTS Qualification Tests preview + * Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ -void runQualificationTest(void); +/** + * @file qualification_test.h + * @brief LTS qualification test entry function. + */ +#ifndef QUALIFICATION_TEST_H +#define QUALIFICATION_TEST_H -#endif /* _QUALIFICATION_TEST_H_ */ +/** + * @brief Entry function for the LTS qualification test. + */ +void RunQualificationTest( void ); + +#endif /* QUALIFICATION_TEST_H */ diff --git a/src/transport_interface/transport_interface_tests.c b/src/transport_interface/transport_interface_test.c similarity index 96% rename from src/transport_interface/transport_interface_tests.c rename to src/transport_interface/transport_interface_test.c index 32c37c3..7698501 100644 --- a/src/transport_interface/transport_interface_tests.c +++ b/src/transport_interface/transport_interface_test.c @@ -29,7 +29,7 @@ #include /* Include for init and de-init functions. */ -#include "transport_interface_tests.h" +#include "transport_interface_test.h" /* Include for test parameter and execution configs. */ #include "test_execution_config.h" @@ -126,7 +126,6 @@ TEST_GROUP( Full_TransportInterfaceTest ); /*-----------------------------------------------------------*/ - /** * @brief Initialize the test data with 0,1,...,255,0,1,... */ @@ -276,7 +275,7 @@ static void prvTransportRecvData( TransportInterface_t * pTransport, */ TEST_SETUP( Full_TransportInterfaceTest ) { - int32_t networkConnectResult = 0; + NetworkConnectStatus_t networkConnectResult = NETWORK_CONNECT_SUCCESS; /* Ensure the tranpsort interface is valid. */ TEST_ASSERT_NOT_NULL_MESSAGE( testParam.pTransport, "testParam.pTransport should not be NULL." ); @@ -295,7 +294,7 @@ TEST_SETUP( Full_TransportInterfaceTest ) /* Call the hook function implemented by the application to initialize the transport interface. */ networkConnectResult = testParam.pNetworkConnect( pTestTransport->pNetworkContext, &testHostInfo, testParam.pNetworkCredentials ); - TEST_ASSERT_EQUAL_INT32_MESSAGE( 0, networkConnectResult, "Network connect failed." ); + TEST_ASSERT_EQUAL_INT32_MESSAGE( NETWORK_CONNECT_SUCCESS, networkConnectResult, "Network connect failed." ); } /*-----------------------------------------------------------*/ @@ -693,7 +692,7 @@ TEST_GROUP_RUNNER( Full_TransportInterfaceTest ) /*-----------------------------------------------------------*/ -int RunTransportInterfaceTests( void ) +int RunTransportInterfaceTest( void ) { int status = -1; diff --git a/src/transport_interface/transport_interface_tests.h b/src/transport_interface/transport_interface_test.h similarity index 65% rename from src/transport_interface/transport_interface_tests.h rename to src/transport_interface/transport_interface_test.h index cdafe5b..3874469 100644 --- a/src/transport_interface/transport_interface_tests.h +++ b/src/transport_interface/transport_interface_test.h @@ -1,6 +1,6 @@ /* - * FreeRTOS Integration Toolkit preview - * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * FreeRTOS FreeRTOS LTS Qualification Tests preview + * Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -20,8 +20,12 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#ifndef TRANSPORT_INTERFACE_TESTS_H_ -#define TRANSPORT_INTERFACE_TESTS_H_ +/** + * @file transport_interface_test.h + * @brief Test function for transport interface test. + */ +#ifndef TRANSPORT_INTERFACE_TEST_H +#define TRANSPORT_INTERFACE_TEST_H /* Standard header includes. */ #include @@ -37,19 +41,19 @@ * * @param[in] delayMs Delay in milliseconds. */ -typedef void (* TransportTestDelayFunc)( uint32_t delayMs ); +typedef void (* TransportTestDelayFunc_t )( uint32_t delayMs ); /** * @brief A struct representing transport interface test parameters. */ typedef struct TransportTestParam { - TransportInterface_t * pTransport; /**< @brief Transport interface structure to test. */ - NetworkConnectFunc pNetworkConnect; /**< @brief Network connect function pointer. */ - NetworkDisconnectFunc pNetworkDisconnect; /**< @brief Network disconnect function pointer. */ - TransportTestDelayFunc pTransportTestDelay; /**< @brief Transport test delay function pointer. */ - void * pNetworkCredentials; /**< @brief Network credentials for network connection. */ - void * pNetworkContext; /**< @brief Primary network context. */ + TransportInterface_t * pTransport; /**< @brief Transport interface structure to test. */ + NetworkConnectFunc_t pNetworkConnect; /**< @brief Network connect function pointer. */ + NetworkDisconnectFunc_t pNetworkDisconnect; /**< @brief Network disconnect function pointer. */ + TransportTestDelayFunc_t pTransportTestDelay; /**< @brief Transport test delay function pointer. */ + void * pNetworkCredentials; /**< @brief Network credentials for network connection. */ + void * pNetworkContext; /**< @brief Primary network context. */ } TransportTestParam_t; /** @@ -67,6 +71,6 @@ void SetupTransportTestParam( TransportTestParam_t * pTestParam ); * @return Negative value if the transport test execution config is not set. Otherwise, * number of failure test cases is returned. */ -int RunTransportInterfaceTests( void ); +int RunTransportInterfaceTest( void ); -#endif /* TRANSPORT_INTERFACE_TESTS_H_ */ +#endif /* TRANSPORT_INTERFACE_TEST_H */ diff --git a/tools/uncrustify.cfg b/tools/uncrustify.cfg new file mode 100644 index 0000000..3f4c40c --- /dev/null +++ b/tools/uncrustify.cfg @@ -0,0 +1,673 @@ +# Uncrustify-0.69.0 + +newlines = auto # lf/crlf/cr/auto +input_tab_size = 4 # unsigned number +output_tab_size = 4 # unsigned number +string_escape_char = 92 # unsigned number +string_escape_char2 = 0 # unsigned number +string_replace_tab_chars = false # true/false +tok_split_gte = false # true/false +disable_processing_cmt = " *INDENT-OFF*" # string +enable_processing_cmt = " *INDENT-ON*" # string +enable_digraphs = false # true/false +utf8_bom = ignore # ignore/add/remove/force +utf8_byte = false # true/false +utf8_force = false # true/false +sp_arith = force # ignore/add/remove/force +sp_arith_additive = ignore # ignore/add/remove/force +sp_assign = force # ignore/add/remove/force +sp_cpp_lambda_assign = ignore # ignore/add/remove/force +sp_cpp_lambda_paren = ignore # ignore/add/remove/force +sp_assign_default = force # ignore/add/remove/force +sp_before_assign = force # ignore/add/remove/force +sp_after_assign = force # ignore/add/remove/force +sp_enum_paren = ignore # ignore/add/remove/force +sp_enum_assign = force # ignore/add/remove/force +sp_enum_before_assign = force # ignore/add/remove/force +sp_enum_after_assign = force # ignore/add/remove/force +sp_enum_colon = ignore # ignore/add/remove/force +sp_pp_concat = add # ignore/add/remove/force +sp_pp_stringify = add # ignore/add/remove/force +sp_before_pp_stringify = ignore # ignore/add/remove/force +sp_bool = force # ignore/add/remove/force +sp_compare = force # ignore/add/remove/force +sp_inside_paren = force # ignore/add/remove/force +sp_paren_paren = force # ignore/add/remove/force +sp_cparen_oparen = ignore # ignore/add/remove/force +sp_balance_nested_parens = false # true/false +sp_paren_brace = force # ignore/add/remove/force +sp_brace_brace = ignore # ignore/add/remove/force +sp_before_ptr_star = force # ignore/add/remove/force +sp_before_unnamed_ptr_star = force # ignore/add/remove/force +sp_between_ptr_star = remove # ignore/add/remove/force +sp_after_ptr_star = force # ignore/add/remove/force +sp_after_ptr_block_caret = ignore # ignore/add/remove/force +sp_after_ptr_star_qualifier = ignore # ignore/add/remove/force +sp_after_ptr_star_func = ignore # ignore/add/remove/force +sp_ptr_star_paren = ignore # ignore/add/remove/force +sp_before_ptr_star_func = ignore # ignore/add/remove/force +sp_before_byref = force # ignore/add/remove/force +sp_before_unnamed_byref = ignore # ignore/add/remove/force +sp_after_byref = remove # ignore/add/remove/force +sp_after_byref_func = remove # ignore/add/remove/force +sp_before_byref_func = ignore # ignore/add/remove/force +sp_after_type = force # ignore/add/remove/force +sp_after_decltype = ignore # ignore/add/remove/force +sp_before_template_paren = ignore # ignore/add/remove/force +sp_template_angle = ignore # ignore/add/remove/force +sp_before_angle = remove # ignore/add/remove/force +sp_inside_angle = remove # ignore/add/remove/force +sp_inside_angle_empty = ignore # ignore/add/remove/force +sp_angle_colon = ignore # ignore/add/remove/force +sp_after_angle = force # ignore/add/remove/force +sp_angle_paren = ignore # ignore/add/remove/force +sp_angle_paren_empty = ignore # ignore/add/remove/force +sp_angle_word = ignore # ignore/add/remove/force +sp_angle_shift = add # ignore/add/remove/force +sp_permit_cpp11_shift = false # true/false +sp_before_sparen = remove # ignore/add/remove/force +sp_inside_sparen = force # ignore/add/remove/force +sp_inside_sparen_open = ignore # ignore/add/remove/force +sp_inside_sparen_close = ignore # ignore/add/remove/force +sp_after_sparen = force # ignore/add/remove/force +sp_sparen_brace = force # ignore/add/remove/force +sp_invariant_paren = ignore # ignore/add/remove/force +sp_after_invariant_paren = ignore # ignore/add/remove/force +sp_special_semi = ignore # ignore/add/remove/force +sp_before_semi = remove # ignore/add/remove/force +sp_before_semi_for = remove # ignore/add/remove/force +sp_before_semi_for_empty = add # ignore/add/remove/force +sp_after_semi = add # ignore/add/remove/force +sp_after_semi_for = force # ignore/add/remove/force +sp_after_semi_for_empty = force # ignore/add/remove/force +sp_before_square = remove # ignore/add/remove/force +sp_before_squares = remove # ignore/add/remove/force +sp_cpp_before_struct_binding = ignore # ignore/add/remove/force +sp_inside_square = force # ignore/add/remove/force +sp_inside_square_oc_array = ignore # ignore/add/remove/force +sp_after_comma = force # ignore/add/remove/force +sp_before_comma = remove # ignore/add/remove/force +sp_after_mdatype_commas = ignore # ignore/add/remove/force +sp_before_mdatype_commas = ignore # ignore/add/remove/force +sp_between_mdatype_commas = ignore # ignore/add/remove/force +sp_paren_comma = force # ignore/add/remove/force +sp_before_ellipsis = ignore # ignore/add/remove/force +sp_type_ellipsis = ignore # ignore/add/remove/force +sp_type_question = ignore # ignore/add/remove/force +sp_paren_ellipsis = ignore # ignore/add/remove/force +sp_paren_qualifier = ignore # ignore/add/remove/force +sp_paren_noexcept = ignore # ignore/add/remove/force +sp_after_class_colon = ignore # ignore/add/remove/force +sp_before_class_colon = ignore # ignore/add/remove/force +sp_after_constr_colon = ignore # ignore/add/remove/force +sp_before_constr_colon = ignore # ignore/add/remove/force +sp_before_case_colon = remove # ignore/add/remove/force +sp_after_operator = ignore # ignore/add/remove/force +sp_after_operator_sym = ignore # ignore/add/remove/force +sp_after_operator_sym_empty = ignore # ignore/add/remove/force +sp_after_cast = force # ignore/add/remove/force +sp_inside_paren_cast = force # ignore/add/remove/force +sp_cpp_cast_paren = ignore # ignore/add/remove/force +sp_sizeof_paren = remove # ignore/add/remove/force +sp_sizeof_ellipsis = ignore # ignore/add/remove/force +sp_sizeof_ellipsis_paren = ignore # ignore/add/remove/force +sp_decltype_paren = ignore # ignore/add/remove/force +sp_after_tag = ignore # ignore/add/remove/force +sp_inside_braces_enum = force # ignore/add/remove/force +sp_inside_braces_struct = force # ignore/add/remove/force +sp_inside_braces_oc_dict = ignore # ignore/add/remove/force +sp_after_type_brace_init_lst_open = ignore # ignore/add/remove/force +sp_before_type_brace_init_lst_close = ignore # ignore/add/remove/force +sp_inside_type_brace_init_lst = ignore # ignore/add/remove/force +sp_inside_braces = force # ignore/add/remove/force +sp_inside_braces_empty = remove # ignore/add/remove/force +sp_type_func = force # ignore/add/remove/force +sp_type_brace_init_lst = ignore # ignore/add/remove/force +sp_func_proto_paren = remove # ignore/add/remove/force +sp_func_proto_paren_empty = ignore # ignore/add/remove/force +sp_func_def_paren = remove # ignore/add/remove/force +sp_func_def_paren_empty = ignore # ignore/add/remove/force +sp_inside_fparens = remove # ignore/add/remove/force +sp_inside_fparen = force # ignore/add/remove/force +sp_inside_tparen = ignore # ignore/add/remove/force +sp_after_tparen_close = ignore # ignore/add/remove/force +sp_square_fparen = ignore # ignore/add/remove/force +sp_fparen_brace = add # ignore/add/remove/force +sp_fparen_brace_initializer = ignore # ignore/add/remove/force +sp_fparen_dbrace = ignore # ignore/add/remove/force +sp_func_call_paren = remove # ignore/add/remove/force +sp_func_call_paren_empty = ignore # ignore/add/remove/force +sp_func_call_user_paren = ignore # ignore/add/remove/force +sp_func_call_user_inside_fparen = ignore # ignore/add/remove/force +sp_func_call_user_paren_paren = ignore # ignore/add/remove/force +sp_func_class_paren = remove # ignore/add/remove/force +sp_func_class_paren_empty = ignore # ignore/add/remove/force +sp_return_paren = remove # ignore/add/remove/force +sp_return_brace = ignore # ignore/add/remove/force +sp_attribute_paren = remove # ignore/add/remove/force +sp_defined_paren = remove # ignore/add/remove/force +sp_throw_paren = ignore # ignore/add/remove/force +sp_after_throw = ignore # ignore/add/remove/force +sp_catch_paren = ignore # ignore/add/remove/force +sp_oc_catch_paren = ignore # ignore/add/remove/force +sp_oc_classname_paren = ignore # ignore/add/remove/force +sp_version_paren = ignore # ignore/add/remove/force +sp_scope_paren = ignore # ignore/add/remove/force +sp_super_paren = remove # ignore/add/remove/force +sp_this_paren = remove # ignore/add/remove/force +sp_macro = force # ignore/add/remove/force +sp_macro_func = force # ignore/add/remove/force +sp_else_brace = ignore # ignore/add/remove/force +sp_brace_else = ignore # ignore/add/remove/force +sp_brace_typedef = force # ignore/add/remove/force +sp_catch_brace = ignore # ignore/add/remove/force +sp_oc_catch_brace = ignore # ignore/add/remove/force +sp_brace_catch = ignore # ignore/add/remove/force +sp_oc_brace_catch = ignore # ignore/add/remove/force +sp_finally_brace = ignore # ignore/add/remove/force +sp_brace_finally = ignore # ignore/add/remove/force +sp_try_brace = ignore # ignore/add/remove/force +sp_getset_brace = ignore # ignore/add/remove/force +sp_word_brace = add # ignore/add/remove/force +sp_word_brace_ns = add # ignore/add/remove/force +sp_before_dc = remove # ignore/add/remove/force +sp_after_dc = remove # ignore/add/remove/force +sp_d_array_colon = ignore # ignore/add/remove/force +sp_not = remove # ignore/add/remove/force +sp_inv = remove # ignore/add/remove/force +sp_addr = remove # ignore/add/remove/force +sp_member = remove # ignore/add/remove/force +sp_deref = remove # ignore/add/remove/force +sp_sign = remove # ignore/add/remove/force +sp_incdec = remove # ignore/add/remove/force +sp_before_nl_cont = add # ignore/add/remove/force +sp_after_oc_scope = ignore # ignore/add/remove/force +sp_after_oc_colon = ignore # ignore/add/remove/force +sp_before_oc_colon = ignore # ignore/add/remove/force +sp_after_oc_dict_colon = ignore # ignore/add/remove/force +sp_before_oc_dict_colon = ignore # ignore/add/remove/force +sp_after_send_oc_colon = ignore # ignore/add/remove/force +sp_before_send_oc_colon = ignore # ignore/add/remove/force +sp_after_oc_type = ignore # ignore/add/remove/force +sp_after_oc_return_type = ignore # ignore/add/remove/force +sp_after_oc_at_sel = ignore # ignore/add/remove/force +sp_after_oc_at_sel_parens = ignore # ignore/add/remove/force +sp_inside_oc_at_sel_parens = ignore # ignore/add/remove/force +sp_before_oc_block_caret = ignore # ignore/add/remove/force +sp_after_oc_block_caret = ignore # ignore/add/remove/force +sp_after_oc_msg_receiver = ignore # ignore/add/remove/force +sp_after_oc_property = ignore # ignore/add/remove/force +sp_after_oc_synchronized = ignore # ignore/add/remove/force +sp_cond_colon = force # ignore/add/remove/force +sp_cond_colon_before = ignore # ignore/add/remove/force +sp_cond_colon_after = ignore # ignore/add/remove/force +sp_cond_question = force # ignore/add/remove/force +sp_cond_question_before = ignore # ignore/add/remove/force +sp_cond_question_after = ignore # ignore/add/remove/force +sp_cond_ternary_short = ignore # ignore/add/remove/force +sp_case_label = force # ignore/add/remove/force +sp_range = ignore # ignore/add/remove/force +sp_after_for_colon = ignore # ignore/add/remove/force +sp_before_for_colon = ignore # ignore/add/remove/force +sp_extern_paren = ignore # ignore/add/remove/force +sp_cmt_cpp_start = ignore # ignore/add/remove/force +sp_cmt_cpp_doxygen = false # true/false +sp_cmt_cpp_qttr = false # true/false +sp_endif_cmt = force # ignore/add/remove/force +sp_after_new = ignore # ignore/add/remove/force +sp_between_new_paren = ignore # ignore/add/remove/force +sp_after_newop_paren = ignore # ignore/add/remove/force +sp_inside_newop_paren = ignore # ignore/add/remove/force +sp_inside_newop_paren_open = ignore # ignore/add/remove/force +sp_inside_newop_paren_close = ignore # ignore/add/remove/force +sp_before_tr_emb_cmt = force # ignore/add/remove/force +sp_num_before_tr_emb_cmt = 1 # unsigned number +sp_annotation_paren = ignore # ignore/add/remove/force +sp_skip_vbrace_tokens = false # true/false +sp_after_noexcept = ignore # ignore/add/remove/force +sp_vala_after_translation = ignore # ignore/add/remove/force +force_tab_after_define = false # true/false +indent_columns = 4 # unsigned number +indent_continue = 0 # number +indent_continue_class_head = 0 # unsigned number +indent_single_newlines = false # true/false +indent_param = 0 # unsigned number +indent_with_tabs = 0 # unsigned number +indent_cmt_with_tabs = false # true/false +indent_align_string = true # true/false +indent_xml_string = 0 # unsigned number +indent_brace = 0 # unsigned number +indent_braces = false # true/false +indent_braces_no_func = false # true/false +indent_braces_no_class = false # true/false +indent_braces_no_struct = false # true/false +indent_brace_parent = false # true/false +indent_paren_open_brace = false # true/false +indent_cs_delegate_brace = false # true/false +indent_cs_delegate_body = false # true/false +indent_namespace = false # true/false +indent_namespace_single_indent = false # true/false +indent_namespace_level = 0 # unsigned number +indent_namespace_limit = 0 # unsigned number +indent_extern = false # true/false +indent_class = true # true/false +indent_class_colon = true # true/false +indent_class_on_colon = false # true/false +indent_constr_colon = false # true/false +indent_ctor_init_leading = 2 # unsigned number +indent_ctor_init = 0 # number +indent_else_if = false # true/false +indent_var_def_blk = 0 # number +indent_var_def_cont = false # true/false +indent_shift = false # true/false +indent_func_def_force_col1 = false # true/false +indent_func_call_param = false # true/false +indent_func_def_param = false # true/false +indent_func_proto_param = false # true/false +indent_func_class_param = false # true/false +indent_func_ctor_var_param = false # true/false +indent_template_param = false # true/false +indent_func_param_double = false # true/false +indent_func_const = 0 # unsigned number +indent_func_throw = 0 # unsigned number +indent_member = 3 # unsigned number +indent_member_single = false # true/false +indent_sing_line_comments = 0 # unsigned number +indent_relative_single_line_comments = false # true/false +indent_switch_case = 4 # unsigned number +indent_switch_pp = true # true/false +indent_case_shift = 0 # unsigned number +indent_case_brace = 3 # number +indent_col1_comment = false # true/false +indent_col1_multi_string_literal = false # true/false +indent_label = 1 # number +indent_access_spec = 1 # number +indent_access_spec_body = false # true/false +indent_paren_nl = false # true/false +indent_paren_close = 0 # unsigned number +indent_paren_after_func_def = false # true/false +indent_paren_after_func_decl = false # true/false +indent_paren_after_func_call = false # true/false +indent_comma_paren = false # true/false +indent_bool_paren = false # true/false +indent_semicolon_for_paren = false # true/false +indent_first_bool_expr = false # true/false +indent_first_for_expr = false # true/false +indent_square_nl = false # true/false +indent_preserve_sql = false # true/false +indent_align_assign = true # true/false +indent_align_paren = true # true/false +indent_oc_block = false # true/false +indent_oc_block_msg = 0 # unsigned number +indent_oc_msg_colon = 0 # unsigned number +indent_oc_msg_prioritize_first_colon = true # true/false +indent_oc_block_msg_xcode_style = false # true/false +indent_oc_block_msg_from_keyword = false # true/false +indent_oc_block_msg_from_colon = false # true/false +indent_oc_block_msg_from_caret = false # true/false +indent_oc_block_msg_from_brace = false # true/false +indent_min_vbrace_open = 0 # unsigned number +indent_vbrace_open_on_tabstop = false # true/false +indent_token_after_brace = true # true/false +indent_cpp_lambda_body = false # true/false +indent_using_block = true # true/false +indent_ternary_operator = 0 # unsigned number +indent_off_after_return_new = false # true/false +indent_single_after_return = false # true/false +indent_ignore_asm_block = false # true/false +nl_collapse_empty_body = false # true/false +nl_assign_leave_one_liners = true # true/false +nl_class_leave_one_liners = true # true/false +nl_enum_leave_one_liners = false # true/false +nl_getset_leave_one_liners = false # true/false +nl_cs_property_leave_one_liners = false # true/false +nl_func_leave_one_liners = false # true/false +nl_cpp_lambda_leave_one_liners = false # true/false +nl_if_leave_one_liners = false # true/false +nl_while_leave_one_liners = false # true/false +nl_for_leave_one_liners = false # true/false +nl_oc_msg_leave_one_liner = false # true/false +nl_oc_mdef_brace = ignore # ignore/add/remove/force +nl_oc_block_brace = ignore # ignore/add/remove/force +nl_oc_interface_brace = ignore # ignore/add/remove/force +nl_oc_implementation_brace = ignore # ignore/add/remove/force +nl_start_of_file = remove # ignore/add/remove/force +nl_start_of_file_min = 0 # unsigned number +nl_end_of_file = force # ignore/add/remove/force +nl_end_of_file_min = 1 # unsigned number +nl_assign_brace = add # ignore/add/remove/force +nl_assign_square = ignore # ignore/add/remove/force +nl_tsquare_brace = ignore # ignore/add/remove/force +nl_after_square_assign = ignore # ignore/add/remove/force +nl_fcall_brace = add # ignore/add/remove/force +nl_enum_brace = force # ignore/add/remove/force +nl_enum_class = ignore # ignore/add/remove/force +nl_enum_class_identifier = ignore # ignore/add/remove/force +nl_enum_identifier_colon = ignore # ignore/add/remove/force +nl_enum_colon_type = ignore # ignore/add/remove/force +nl_struct_brace = force # ignore/add/remove/force +nl_union_brace = force # ignore/add/remove/force +nl_if_brace = add # ignore/add/remove/force +nl_brace_else = add # ignore/add/remove/force +nl_elseif_brace = ignore # ignore/add/remove/force +nl_else_brace = add # ignore/add/remove/force +nl_else_if = ignore # ignore/add/remove/force +nl_before_if_closing_paren = ignore # ignore/add/remove/force +nl_brace_finally = ignore # ignore/add/remove/force +nl_finally_brace = ignore # ignore/add/remove/force +nl_try_brace = ignore # ignore/add/remove/force +nl_getset_brace = force # ignore/add/remove/force +nl_for_brace = add # ignore/add/remove/force +nl_catch_brace = ignore # ignore/add/remove/force +nl_oc_catch_brace = ignore # ignore/add/remove/force +nl_brace_catch = ignore # ignore/add/remove/force +nl_oc_brace_catch = ignore # ignore/add/remove/force +nl_brace_square = ignore # ignore/add/remove/force +nl_brace_fparen = ignore # ignore/add/remove/force +nl_while_brace = add # ignore/add/remove/force +nl_scope_brace = ignore # ignore/add/remove/force +nl_unittest_brace = ignore # ignore/add/remove/force +nl_version_brace = ignore # ignore/add/remove/force +nl_using_brace = ignore # ignore/add/remove/force +nl_brace_brace = ignore # ignore/add/remove/force +nl_do_brace = add # ignore/add/remove/force +nl_brace_while = ignore # ignore/add/remove/force +nl_switch_brace = add # ignore/add/remove/force +nl_synchronized_brace = ignore # ignore/add/remove/force +nl_multi_line_cond = false # true/false +nl_multi_line_define = true # true/false +nl_before_case = true # true/false +nl_after_case = true # true/false +nl_case_colon_brace = ignore # ignore/add/remove/force +nl_before_throw = ignore # ignore/add/remove/force +nl_namespace_brace = ignore # ignore/add/remove/force +nl_template_class = ignore # ignore/add/remove/force +nl_class_brace = ignore # ignore/add/remove/force +nl_class_init_args = ignore # ignore/add/remove/force +nl_constr_init_args = ignore # ignore/add/remove/force +nl_enum_own_lines = ignore # ignore/add/remove/force +nl_func_type_name = remove # ignore/add/remove/force +nl_func_type_name_class = ignore # ignore/add/remove/force +nl_func_class_scope = ignore # ignore/add/remove/force +nl_func_scope_name = ignore # ignore/add/remove/force +nl_func_proto_type_name = remove # ignore/add/remove/force +nl_func_paren = remove # ignore/add/remove/force +nl_func_paren_empty = ignore # ignore/add/remove/force +nl_func_def_paren = remove # ignore/add/remove/force +nl_func_def_paren_empty = ignore # ignore/add/remove/force +nl_func_call_paren = ignore # ignore/add/remove/force +nl_func_call_paren_empty = ignore # ignore/add/remove/force +nl_func_decl_start = remove # ignore/add/remove/force +nl_func_def_start = remove # ignore/add/remove/force +nl_func_decl_start_single = ignore # ignore/add/remove/force +nl_func_def_start_single = ignore # ignore/add/remove/force +nl_func_decl_start_multi_line = false # true/false +nl_func_def_start_multi_line = false # true/false +nl_func_decl_args = add # ignore/add/remove/force +nl_func_def_args = add # ignore/add/remove/force +nl_func_decl_args_multi_line = false # true/false +nl_func_def_args_multi_line = false # true/false +nl_func_decl_end = remove # ignore/add/remove/force +nl_func_def_end = remove # ignore/add/remove/force +nl_func_decl_end_single = ignore # ignore/add/remove/force +nl_func_def_end_single = ignore # ignore/add/remove/force +nl_func_decl_end_multi_line = false # true/false +nl_func_def_end_multi_line = false # true/false +nl_func_decl_empty = ignore # ignore/add/remove/force +nl_func_def_empty = ignore # ignore/add/remove/force +nl_func_call_empty = ignore # ignore/add/remove/force +nl_func_call_start = ignore # ignore/add/remove/force +nl_func_call_start_multi_line = false # true/false +nl_func_call_args_multi_line = false # true/false +nl_func_call_end_multi_line = false # true/false +nl_oc_msg_args = false # true/false +nl_fdef_brace = add # ignore/add/remove/force +nl_fdef_brace_cond = ignore # ignore/add/remove/force +nl_cpp_ldef_brace = ignore # ignore/add/remove/force +nl_return_expr = ignore # ignore/add/remove/force +nl_after_semicolon = true # true/false +nl_paren_dbrace_open = ignore # ignore/add/remove/force +nl_type_brace_init_lst = ignore # ignore/add/remove/force +nl_type_brace_init_lst_open = ignore # ignore/add/remove/force +nl_type_brace_init_lst_close = ignore # ignore/add/remove/force +nl_after_brace_open = true # true/false +nl_after_brace_open_cmt = false # true/false +nl_after_vbrace_open = false # true/false +nl_after_vbrace_open_empty = false # true/false +nl_after_brace_close = true # true/false +nl_after_vbrace_close = false # true/false +nl_brace_struct_var = ignore # ignore/add/remove/force +nl_define_macro = false # true/false +nl_squeeze_paren_close = false # true/false +nl_squeeze_ifdef = true # true/false +nl_squeeze_ifdef_top_level = false # true/false +nl_before_if = force # ignore/add/remove/force +nl_after_if = force # ignore/add/remove/force +nl_before_for = force # ignore/add/remove/force +nl_after_for = force # ignore/add/remove/force +nl_before_while = force # ignore/add/remove/force +nl_after_while = force # ignore/add/remove/force +nl_before_switch = force # ignore/add/remove/force +nl_after_switch = force # ignore/add/remove/force +nl_before_synchronized = ignore # ignore/add/remove/force +nl_after_synchronized = ignore # ignore/add/remove/force +nl_before_do = force # ignore/add/remove/force +nl_after_do = force # ignore/add/remove/force +nl_before_return = false # true/false +nl_after_return = true # true/false +nl_ds_struct_enum_cmt = false # true/false +nl_ds_struct_enum_close_brace = false # true/false +nl_class_colon = ignore # ignore/add/remove/force +nl_constr_colon = ignore # ignore/add/remove/force +nl_namespace_two_to_one_liner = false # true/false +nl_create_if_one_liner = false # true/false +nl_create_for_one_liner = false # true/false +nl_create_while_one_liner = false # true/false +nl_create_func_def_one_liner = false # true/false +nl_split_if_one_liner = false # true/false +nl_split_for_one_liner = false # true/false +nl_split_while_one_liner = false # true/false +nl_max = 4 # unsigned number +nl_max_blank_in_func = 0 # unsigned number +nl_before_func_body_proto = 0 # unsigned number +nl_before_func_body_def = 0 # unsigned number +nl_before_func_class_proto = 0 # unsigned number +nl_before_func_class_def = 0 # unsigned number +nl_after_func_proto = 0 # unsigned number +nl_after_func_proto_group = 1 # unsigned number +nl_after_func_class_proto = 0 # unsigned number +nl_after_func_class_proto_group = 0 # unsigned number +nl_class_leave_one_liner_groups = false # true/false +nl_after_func_body = 0 # unsigned number +nl_after_func_body_class = 2 # unsigned number +nl_after_func_body_one_liner = 0 # unsigned number +nl_func_var_def_blk = 1 # unsigned number +nl_typedef_blk_start = 0 # unsigned number +nl_typedef_blk_end = 0 # unsigned number +nl_typedef_blk_in = 0 # unsigned number +nl_var_def_blk_start = 0 # unsigned number +nl_var_def_blk_end = 0 # unsigned number +nl_var_def_blk_in = 0 # unsigned number +nl_before_block_comment = 2 # unsigned number +nl_before_c_comment = 0 # unsigned number +nl_before_cpp_comment = 0 # unsigned number +nl_after_multiline_comment = false # true/false +nl_after_label_colon = false # true/false +nl_after_struct = 0 # unsigned number +nl_before_class = 0 # unsigned number +nl_after_class = 0 # unsigned number +nl_before_access_spec = 0 # unsigned number +nl_after_access_spec = 0 # unsigned number +nl_comment_func_def = 0 # unsigned number +nl_after_try_catch_finally = 0 # unsigned number +nl_around_cs_property = 0 # unsigned number +nl_between_get_set = 0 # unsigned number +nl_property_brace = ignore # ignore/add/remove/force +nl_inside_namespace = 0 # unsigned number +eat_blanks_after_open_brace = true # true/false +eat_blanks_before_close_brace = true # true/false +nl_remove_extra_newlines = 0 # unsigned number +nl_after_annotation = ignore # ignore/add/remove/force +nl_between_annotation = ignore # ignore/add/remove/force +pos_arith = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force +pos_assign = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force +pos_bool = trail # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force +pos_compare = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force +pos_conditional = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force +pos_comma = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force +pos_enum_comma = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force +pos_class_comma = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force +pos_constr_comma = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force +pos_class_colon = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force +pos_constr_colon = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force +code_width = 0 # unsigned number +ls_for_split_full = false # true/false +ls_func_split_full = false # true/false +ls_code_width = false # true/false +align_keep_tabs = false # true/false +align_with_tabs = false # true/false +align_on_tabstop = false # true/false +align_number_right = false # true/false +align_keep_extra_space = false # true/false +align_func_params = false # true/false +align_func_params_span = 0 # unsigned number +align_func_params_thresh = 0 # number +align_func_params_gap = 0 # unsigned number +align_constr_value_span = 0 # unsigned number +align_constr_value_thresh = 0 # number +align_constr_value_gap = 0 # unsigned number +align_same_func_call_params = false # true/false +align_same_func_call_params_span = 0 # unsigned number +align_same_func_call_params_thresh = 0 # number +align_var_def_span = 0 # unsigned number +align_var_def_star_style = 0 # unsigned number +align_var_def_amp_style = 1 # unsigned number +align_var_def_thresh = 16 # number +align_var_def_gap = 0 # unsigned number +align_var_def_colon = false # true/false +align_var_def_colon_gap = 0 # unsigned number +align_var_def_attribute = false # true/false +align_var_def_inline = false # true/false +align_assign_span = 0 # unsigned number +align_assign_func_proto_span = 0 # unsigned number +align_assign_thresh = 12 # number +align_assign_decl_func = 0 # unsigned number +align_enum_equ_span = 0 # unsigned number +align_enum_equ_thresh = 0 # number +align_var_class_span = 0 # unsigned number +align_var_class_thresh = 0 # number +align_var_class_gap = 0 # unsigned number +align_var_struct_span = 0 # unsigned number +align_var_struct_thresh = 0 # number +align_var_struct_gap = 0 # unsigned number +align_struct_init_span = 3 # unsigned number +align_typedef_span = 5 # unsigned number +align_typedef_gap = 3 # unsigned number +align_typedef_func = 0 # unsigned number +align_typedef_star_style = 1 # unsigned number +align_typedef_amp_style = 1 # unsigned number +align_right_cmt_span = 3 # unsigned number +align_right_cmt_gap = 0 # unsigned number +align_right_cmt_mix = false # true/false +align_right_cmt_same_level = false # true/false +align_right_cmt_at_col = 0 # unsigned number +align_func_proto_span = 0 # unsigned number +align_func_proto_thresh = 0 # number +align_func_proto_gap = 0 # unsigned number +align_on_operator = false # true/false +align_mix_var_proto = false # true/false +align_single_line_func = false # true/false +align_single_line_brace = false # true/false +align_single_line_brace_gap = 0 # unsigned number +align_oc_msg_spec_span = 0 # unsigned number +align_nl_cont = true # true/false +align_pp_define_together = false # true/false +align_pp_define_span = 3 # unsigned number +align_pp_define_gap = 4 # unsigned number +align_left_shift = true # true/false +align_asm_colon = false # true/false +align_oc_msg_colon_span = 0 # unsigned number +align_oc_msg_colon_first = false # true/false +align_oc_decl_colon = false # true/false +cmt_width = 0 # unsigned number +cmt_reflow_mode = 0 # unsigned number +cmt_convert_tab_to_spaces = false # true/false +cmt_indent_multi = true # true/false +cmt_c_group = false # true/false +cmt_c_nl_start = false # true/false +cmt_c_nl_end = false # true/false +cmt_cpp_to_c = true # true/false +cmt_cpp_group = false # true/false +cmt_cpp_nl_start = false # true/false +cmt_cpp_nl_end = false # true/false +cmt_star_cont = true # true/false +cmt_sp_before_star_cont = 0 # unsigned number +cmt_sp_after_star_cont = 0 # unsigned number +cmt_multi_check_last = true # true/false +cmt_multi_first_len_minimum = 4 # unsigned number +cmt_insert_file_header = "" # string +cmt_insert_file_footer = "" # string +cmt_insert_func_header = "" # string +cmt_insert_class_header = "" # string +cmt_insert_oc_msg_header = "" # string +cmt_insert_before_preproc = false # true/false +cmt_insert_before_inlines = true # true/false +cmt_insert_before_ctor_dtor = false # true/false +mod_full_brace_do = add # ignore/add/remove/force +mod_full_brace_for = add # ignore/add/remove/force +mod_full_brace_function = ignore # ignore/add/remove/force +mod_full_brace_if = add # ignore/add/remove/force +mod_full_brace_if_chain = false # true/false +mod_full_brace_if_chain_only = false # true/false +mod_full_brace_while = add # ignore/add/remove/force +mod_full_brace_using = ignore # ignore/add/remove/force +mod_full_brace_nl = 0 # unsigned number +mod_full_brace_nl_block_rem_mlcond = false # true/false +mod_paren_on_return = ignore # ignore/add/remove/force +mod_pawn_semicolon = false # true/false +mod_full_paren_if_bool = true # true/false +mod_remove_extra_semicolon = true # true/false +mod_add_long_function_closebrace_comment = 0 # unsigned number +mod_add_long_namespace_closebrace_comment = 0 # unsigned number +mod_add_long_class_closebrace_comment = 0 # unsigned number +mod_add_long_switch_closebrace_comment = 0 # unsigned number +mod_add_long_ifdef_endif_comment = 10 # unsigned number +mod_add_long_ifdef_else_comment = 10 # unsigned number +mod_sort_import = false # true/false +mod_sort_using = false # true/false +mod_sort_include = false # true/false +mod_move_case_break = false # true/false +mod_case_brace = remove # ignore/add/remove/force +mod_remove_empty_return = true # true/false +mod_enum_last_comma = ignore # ignore/add/remove/force +mod_sort_oc_properties = false # true/false +mod_sort_oc_property_class_weight = 0 # number +mod_sort_oc_property_thread_safe_weight = 0 # number +mod_sort_oc_property_readwrite_weight = 0 # number +mod_sort_oc_property_reference_weight = 0 # number +mod_sort_oc_property_getter_weight = 0 # number +mod_sort_oc_property_setter_weight = 0 # number +mod_sort_oc_property_nullability_weight = 0 # number +pp_indent = force # ignore/add/remove/force +pp_indent_at_level = true # true/false +pp_indent_count = 4 # unsigned number +pp_space = remove # ignore/add/remove/force +pp_space_count = 0 # unsigned number +pp_indent_region = 0 # number +pp_region_indent_code = false # true/false +pp_indent_if = 0 # number +pp_if_indent_code = true # true/false +pp_define_at_level = false # true/false +pp_ignore_define_body = false # true/false +pp_indent_case = true # true/false +pp_indent_func_def = true # true/false +pp_indent_extern = true # true/false +pp_indent_brace = false # true/false +include_category_0 = "" # string +include_category_1 = "" # string +include_category_2 = "" # string +use_indent_func_call_param = true # true/false +use_indent_continue_only_once = false # true/false +indent_cpp_lambda_only_once = false # true/false +use_options_overriding_for_qt_macros = true # true/false +warn_level_tabs_found_in_verbatim_string_literals = 2 # unsigned number