Add conditional unit testing interface.
[openssl.git] / ssl / heartbeat_test.c
index 76496c8b465c2bf1ae7010c8936ff008b61a414d..a98372f959de6938651833d8628111340b729962 100644 (file)
  * http://mike-bland.com/tags/heartbleed.html
  */
 
+#define OPENSSL_UNIT_TEST
+
+#include "../test/testutil.h"
+
 #include "../ssl/ssl_locl.h"
 #include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
+#if !defined(OPENSSL_NO_HEARTBEATS) && !defined(OPENSSL_NO_UNIT_TEST)
+
 /* As per https://tools.ietf.org/html/rfc6520#section-4 */
 #define MIN_PADDING_SIZE       16
 
@@ -236,7 +242,7 @@ static int execute_heartbeat(HEARTBEAT_TEST_FIXTURE fixture)
                }
        else
                {
-               char* actual_payload = strndup((const char*)p, actual_payload_len);
+               char* actual_payload = BUF_strndup((const char*)p, actual_payload_len);
                if (strcmp(actual_payload, fixture.expected_return_payload) != 0)
                        {
                        printf("%s failed:\n  expected payload: \"%s\"\n  received: \"%s\"\n",
@@ -244,7 +250,7 @@ static int execute_heartbeat(HEARTBEAT_TEST_FIXTURE fixture)
                                                 actual_payload);
                        result = 1;
                        }
-               free(actual_payload);
+               OPENSSL_free(actual_payload);
                }
 
        if (result != 0)
@@ -261,19 +267,17 @@ static int honest_payload_size(unsigned char payload_buf[])
        }
 
 #define SETUP_HEARTBEAT_TEST_FIXTURE(type)\
-       HEARTBEAT_TEST_FIXTURE fixture = set_up_##type(__func__);\
-       int result = 0
+  SETUP_TEST_FIXTURE(HEARTBEAT_TEST_FIXTURE, set_up_##type)
 
 #define EXECUTE_HEARTBEAT_TEST()\
-       if (execute_heartbeat(fixture) != 0) result = 1;\
-       tear_down(fixture);\
-       return result
+  EXECUTE_TEST(execute_heartbeat, tear_down)
 
 static int test_dtls1_not_bleeding()
        {
        SETUP_HEARTBEAT_TEST_FIXTURE(dtls);
        /* Three-byte pad at the beginning for type and payload length */
-       unsigned char payload_buf[] = "   Not bleeding, sixteen spaces of padding"
+       unsigned char payload_buf[MAX_PRINTABLE_CHARACTERS+4] =
+               "   Not bleeding, sixteen spaces of padding"
                "                ";
        const int payload_buf_len = honest_payload_size(payload_buf);
 
@@ -292,9 +296,9 @@ static int test_dtls1_not_bleeding_empty_payload()
        SETUP_HEARTBEAT_TEST_FIXTURE(dtls);
        /* Three-byte pad at the beginning for type and payload length, plus a NUL
         * at the end */
-       unsigned char payload_buf[4 + MIN_PADDING_SIZE];
-       memset(payload_buf, ' ', sizeof(payload_buf));
-       payload_buf[sizeof(payload_buf) - 1] = '\0';
+       unsigned char payload_buf[4 + MAX_PRINTABLE_CHARACTERS];
+       memset(payload_buf, ' ', MIN_PADDING_SIZE+3);
+       payload_buf[MIN_PADDING_SIZE+3] = '\0';
        payload_buf_len = honest_payload_size(payload_buf);
 
        fixture.payload = &payload_buf[0];
@@ -309,7 +313,8 @@ static int test_dtls1_heartbleed()
        {
        SETUP_HEARTBEAT_TEST_FIXTURE(dtls);
        /* Three-byte pad at the beginning for type and payload length */
-       unsigned char payload_buf[] = "   HEARTBLEED                ";
+       unsigned char payload_buf[4+MAX_PRINTABLE_CHARACTERS] =
+               "   HEARTBLEED                ";
 
        fixture.payload = &payload_buf[0];
        fixture.sent_payload_len = MAX_PRINTABLE_CHARACTERS;
@@ -324,9 +329,9 @@ static int test_dtls1_heartbleed_empty_payload()
        SETUP_HEARTBEAT_TEST_FIXTURE(dtls);
        /* Excluding the NUL at the end, one byte short of type + payload length +
         * minimum padding */
-       unsigned char payload_buf[MIN_PADDING_SIZE + 3];
-       memset(payload_buf, ' ', sizeof(payload_buf));
-       payload_buf[sizeof(payload_buf) - 1] = '\0';
+       unsigned char payload_buf[MAX_PRINTABLE_CHARACTERS + 4];
+       memset(payload_buf, ' ', MIN_PADDING_SIZE+2);
+       payload_buf[MIN_PADDING_SIZE+2] = '\0';
 
        fixture.payload = &payload_buf[0];
        fixture.sent_payload_len = MAX_PRINTABLE_CHARACTERS;
@@ -357,8 +362,9 @@ static int test_tls1_not_bleeding()
        {
        SETUP_HEARTBEAT_TEST_FIXTURE(tls);
        /* Three-byte pad at the beginning for type and payload length */
-       unsigned char payload_buf[] = "   Not bleeding, sixteen spaces of padding"
-                                       "                ";
+       unsigned char payload_buf[MAX_PRINTABLE_CHARACTERS+4] =
+                       "   Not bleeding, sixteen spaces of padding"
+                       "                ";
        const int payload_buf_len = honest_payload_size(payload_buf);
 
        fixture.payload = &payload_buf[0];
@@ -376,9 +382,9 @@ static int test_tls1_not_bleeding_empty_payload()
        SETUP_HEARTBEAT_TEST_FIXTURE(tls);
        /* Three-byte pad at the beginning for type and payload length, plus a NUL
         * at the end */
-       unsigned char payload_buf[4 + MIN_PADDING_SIZE];
-       memset(payload_buf, ' ', sizeof(payload_buf));
-       payload_buf[sizeof(payload_buf) - 1] = '\0';
+       unsigned char payload_buf[4 + MAX_PRINTABLE_CHARACTERS];
+       memset(payload_buf, ' ', MIN_PADDING_SIZE+3);
+       payload_buf[MIN_PADDING_SIZE+3] = '\0';
        payload_buf_len = honest_payload_size(payload_buf);
 
        fixture.payload = &payload_buf[0];
@@ -393,7 +399,8 @@ static int test_tls1_heartbleed()
        {
        SETUP_HEARTBEAT_TEST_FIXTURE(tls);
        /* Three-byte pad at the beginning for type and payload length */
-       unsigned char payload_buf[] = "   HEARTBLEED                ";
+       unsigned char payload_buf[MAX_PRINTABLE_CHARACTERS+4] =
+                       "   HEARTBLEED                ";
 
        fixture.payload = &payload_buf[0];
        fixture.sent_payload_len = MAX_PRINTABLE_CHARACTERS;
@@ -408,9 +415,9 @@ static int test_tls1_heartbleed_empty_payload()
        SETUP_HEARTBEAT_TEST_FIXTURE(tls);
        /* Excluding the NUL at the end, one byte short of type + payload length +
         * minimum padding */
-       unsigned char payload_buf[MIN_PADDING_SIZE + 3];
-       memset(payload_buf, ' ', sizeof(payload_buf));
-       payload_buf[sizeof(payload_buf) - 1] = '\0';
+       unsigned char payload_buf[MAX_PRINTABLE_CHARACTERS + 4];
+       memset(payload_buf, ' ', MIN_PADDING_SIZE+2);
+       payload_buf[MIN_PADDING_SIZE+2] = '\0';
 
        fixture.payload = &payload_buf[0];
        fixture.sent_payload_len = MAX_PRINTABLE_CHARACTERS;
@@ -453,3 +460,11 @@ int main(int argc, char *argv[])
                }
        return EXIT_SUCCESS;
        }
+
+#else /* OPENSSL_NO_HEARTBEATS*/
+
+int main(int argc, char *argv[])
+       {
+               return EXIT_SUCCESS;
+       }
+#endif /* OPENSSL_NO_HEARTBEATS */