xref: /openssl/test/membio_test.c (revision da1c088f)
1 /*
2  * Copyright 2022-2023 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9 
10 #include <openssl/bio.h>
11 #include "testutil.h"
12 
13 #ifndef OPENSSL_NO_DGRAM
test_dgram(void)14 static int test_dgram(void)
15 {
16     BIO *bio = BIO_new(BIO_s_dgram_mem()), *rbio = NULL;
17     int testresult = 0;
18     const char msg1[] = "12345656";
19     const char msg2[] = "abcdefghijklmno";
20     const char msg3[] = "ABCDEF";
21     const char msg4[] = "FEDCBA";
22     char buf[80];
23 
24     if (!TEST_ptr(bio))
25         goto err;
26 
27     rbio = BIO_new_mem_buf(msg1, sizeof(msg1));
28     if (!TEST_ptr(rbio))
29         goto err;
30 
31     /* Setting the EOF return value on a non datagram mem BIO should be fine */
32     if (!TEST_int_gt(BIO_set_mem_eof_return(rbio, 0), 0))
33         goto err;
34 
35     /* Setting the EOF return value on a datagram mem BIO should fail */
36     if (!TEST_int_le(BIO_set_mem_eof_return(bio, 0), 0))
37         goto err;
38 
39     /* Write 4 dgrams */
40     if (!TEST_int_eq(BIO_write(bio, msg1, sizeof(msg1)), sizeof(msg1)))
41         goto err;
42     if (!TEST_int_eq(BIO_write(bio, msg2, sizeof(msg2)), sizeof(msg2)))
43         goto err;
44     if (!TEST_int_eq(BIO_write(bio, msg3, sizeof(msg3)), sizeof(msg3)))
45         goto err;
46     if (!TEST_int_eq(BIO_write(bio, msg4, sizeof(msg4)), sizeof(msg4)))
47         goto err;
48 
49     /* Reading all 4 dgrams out again should all be the correct size */
50     if (!TEST_int_eq(BIO_read(bio, buf, sizeof(buf)), sizeof(msg1))
51             || !TEST_mem_eq(buf, sizeof(msg1), msg1, sizeof(msg1))
52             || !TEST_int_eq(BIO_read(bio, buf, sizeof(buf)), sizeof(msg2))
53             || !TEST_mem_eq(buf, sizeof(msg2), msg2, sizeof(msg2))
54             || !TEST_int_eq(BIO_read(bio, buf, sizeof(buf)), sizeof(msg3))
55             || !TEST_mem_eq(buf, sizeof(msg3), msg3, sizeof(msg3))
56             || !TEST_int_eq(BIO_read(bio, buf, sizeof(buf)), sizeof(msg4))
57             || !TEST_mem_eq(buf, sizeof(msg4), msg4, sizeof(msg4)))
58         goto err;
59 
60     /* Interleaving writes and reads should be fine */
61     if (!TEST_int_eq(BIO_write(bio, msg1, sizeof(msg1)), sizeof(msg1)))
62         goto err;
63     if (!TEST_int_eq(BIO_write(bio, msg2, sizeof(msg2)), sizeof(msg2)))
64         goto err;
65     if (!TEST_int_eq(BIO_read(bio, buf, sizeof(buf)), sizeof(msg1))
66             || !TEST_mem_eq(buf, sizeof(msg1), msg1, sizeof(msg1)))
67         goto err;
68     if (!TEST_int_eq(BIO_write(bio, msg3, sizeof(msg3)), sizeof(msg3)))
69         goto err;
70     if (!TEST_int_eq(BIO_read(bio, buf, sizeof(buf)), sizeof(msg2))
71             || !TEST_mem_eq(buf, sizeof(msg2), msg2, sizeof(msg2))
72             || !TEST_int_eq(BIO_read(bio, buf, sizeof(buf)), sizeof(msg3))
73             || !TEST_mem_eq(buf, sizeof(msg3), msg3, sizeof(msg3)))
74         goto err;
75 
76     /*
77      * Requesting less than the available data in a dgram should not impact the
78      * next packet.
79      */
80     if (!TEST_int_eq(BIO_write(bio, msg1, sizeof(msg1)), sizeof(msg1)))
81         goto err;
82     if (!TEST_int_eq(BIO_write(bio, msg2, sizeof(msg2)), sizeof(msg2)))
83         goto err;
84     if (!TEST_int_eq(BIO_read(bio, buf, /* Short buffer */ 2), 2)
85             || !TEST_mem_eq(buf, 2, msg1, 2))
86         goto err;
87     if (!TEST_int_eq(BIO_read(bio, buf, sizeof(buf)), sizeof(msg2))
88             || !TEST_mem_eq(buf, sizeof(msg2), msg2, sizeof(msg2)))
89         goto err;
90 
91     /*
92      * Writing a zero length datagram will return zero, but no datagrams will
93      * be written. Attempting to read when there are no datagrams to read should
94      * return a negative result, but not eof. Retry flags will be set.
95      */
96     if (!TEST_int_eq(BIO_write(bio, NULL, 0), 0)
97             || !TEST_int_lt(BIO_read(bio, buf, sizeof(buf)), 0)
98             || !TEST_false(BIO_eof(bio))
99             || !TEST_true(BIO_should_retry(bio)))
100         goto err;
101 
102     if (!TEST_int_eq(BIO_dgram_set_mtu(bio, 123456), 1)
103             || !TEST_int_eq(BIO_dgram_get_mtu(bio), 123456))
104         goto err;
105 
106     testresult = 1;
107  err:
108     BIO_free(rbio);
109     BIO_free(bio);
110     return testresult;
111 }
112 #endif
113 
setup_tests(void)114 int setup_tests(void)
115 {
116     if (!test_skip_common_options()) {
117         TEST_error("Error parsing test options\n");
118         return 0;
119     }
120 
121 #ifndef OPENSSL_NO_DGRAM
122     ADD_TEST(test_dgram);
123 #endif
124 
125     return 1;
126 }
127