]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-dcrypt: Added unit tests to nonblocking istream-decrypt
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 4 Aug 2016 18:44:08 +0000 (21:44 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 4 Aug 2016 18:44:27 +0000 (21:44 +0300)
src/lib-dcrypt/test-stream.c

index 63e0de4f2401499f359f11b9cac4945f01996921..1aa31aa5d3a3068a6d276ebfdaca66a81f35487f 100644 (file)
@@ -198,9 +198,13 @@ void test_write_read_v1(void)
 
        struct istream *is = test_istream_create_data(buf->data, buf->used);
        struct istream *is_2 = i_stream_create_decrypt(is, test_v2_kp.priv);
-       i_stream_unref(&is);
 
-       while(i_stream_read_data(is_2, &ptr, &siz, 0)>0) {
+       size_t offset = 0;
+       while(i_stream_read_data(is_2, &ptr, &siz, 0)>=0) {
+               if (offset == buf->used)
+                       test_istream_set_allow_eof(is, TRUE);
+               test_istream_set_size(is, offset);
+
                test_assert_idx(pos + siz <= sizeof(payload), pos);
                if (pos + siz > sizeof(payload)) break;
                test_assert_idx(memcmp(ptr, payload + pos, siz) == 0, pos);
@@ -209,6 +213,7 @@ void test_write_read_v1(void)
 
        test_assert(is_2->stream_errno == 0);
 
+       i_stream_unref(&is);
        i_stream_unref(&is_2);
        buffer_free(&buf);
 
@@ -240,9 +245,13 @@ void test_write_read_v1_short(void)
 
        struct istream *is = test_istream_create_data(buf->data, buf->used);
        struct istream *is_2 = i_stream_create_decrypt(is, test_v2_kp.priv);
-       i_stream_unref(&is);
 
-       while(i_stream_read_data(is_2, &ptr, &siz, 0)>0) {
+       size_t offset = 0;
+       while(i_stream_read_data(is_2, &ptr, &siz, 0)>=0) {
+               if (offset == buf->used)
+                       test_istream_set_allow_eof(is, TRUE);
+               test_istream_set_size(is, offset);
+
                test_assert_idx(pos + siz <= sizeof(payload), pos);
                if (pos + siz > sizeof(payload)) break;
                test_assert_idx(memcmp(ptr, payload + pos, siz) == 0, pos);
@@ -251,6 +260,7 @@ void test_write_read_v1_short(void)
 
        test_assert(is_2->stream_errno == 0);
 
+       i_stream_unref(&is);
        i_stream_unref(&is_2);
        buffer_free(&buf);
 
@@ -275,16 +285,21 @@ void test_write_read_v1_empty(void)
 
        struct istream *is = test_istream_create_data(buf->data, buf->used);
        struct istream *is_2 = i_stream_create_decrypt(is, test_v1_kp.priv);
-       i_stream_unref(&is);
 
        /* read should not fail */
-       while(i_stream_read_data(is_2, &ptr, &siz, 0)>0) {
-               test_assert(FALSE); /* should never be reached */
+       size_t offset = 0;
+       ssize_t ret;
+       while ((ret = i_stream_read_data(is_2, &ptr, &siz, 0)) >= 0) {
+               test_assert(ret == 0);
+               if (offset == buf->used)
+                       test_istream_set_allow_eof(is, TRUE);
+               test_istream_set_size(is, offset);
        };
 
        test_assert(is_2->stream_errno == 0);
        if (is_2->stream_errno != 0)
                i_debug("error: %s", i_stream_get_error(is_2));
+       i_stream_unref(&is);
        i_stream_unref(&is_2);
        buffer_free(&buf);
        test_end();
@@ -311,9 +326,13 @@ void test_write_read_v2(void)
 
        struct istream *is = test_istream_create_data(buf->data, buf->used);
        struct istream *is_2 = i_stream_create_decrypt(is, test_v1_kp.priv);
-       i_stream_unref(&is);
 
-       while(i_stream_read_data(is_2, &ptr, &siz, 0)>0) {
+       size_t offset = 0;
+       while(i_stream_read_data(is_2, &ptr, &siz, 0)>=0) {
+               if (offset == buf->used)
+                       test_istream_set_allow_eof(is, TRUE);
+               test_istream_set_size(is, offset);
+
                test_assert_idx(pos + siz <= sizeof(payload), pos);
                if (pos + siz > sizeof(payload)) break;
                test_assert_idx(memcmp(ptr, payload + pos, siz) == 0, pos);
@@ -324,6 +343,7 @@ void test_write_read_v2(void)
        if (is_2->stream_errno != 0)
                i_debug("error: %s", i_stream_get_error(is_2));
 
+       i_stream_unref(&is);
        i_stream_unref(&is_2);
        buffer_free(&buf);
 
@@ -351,9 +371,13 @@ void test_write_read_v2_short(void)
 
        struct istream *is = test_istream_create_data(buf->data, buf->used);
        struct istream *is_2 = i_stream_create_decrypt(is, test_v1_kp.priv);
-       i_stream_unref(&is);
 
-       while(i_stream_read_data(is_2, &ptr, &siz, 0)>0) {
+       size_t offset = 0;
+       while(i_stream_read_data(is_2, &ptr, &siz, 0)>=0) {
+               if (offset == buf->used)
+                       test_istream_set_allow_eof(is, TRUE);
+               test_istream_set_size(is, offset);
+
                test_assert_idx(pos + siz <= sizeof(payload), pos);
                if (pos + siz > sizeof(payload)) break;
                test_assert_idx(memcmp(ptr, payload + pos, siz) == 0, pos);
@@ -364,6 +388,7 @@ void test_write_read_v2_short(void)
        if (is_2->stream_errno != 0)
                i_debug("error: %s", i_stream_get_error(is_2));
 
+       i_stream_unref(&is);
        i_stream_unref(&is_2);
        buffer_free(&buf);
 
@@ -388,16 +413,21 @@ void test_write_read_v2_empty(void)
 
        struct istream *is = test_istream_create_data(buf->data, buf->used);
        struct istream *is_2 = i_stream_create_decrypt(is, test_v1_kp.priv);
-       i_stream_unref(&is);
 
        /* read should not fail */
-       while(i_stream_read_data(is_2, &ptr, &siz, 0)>0) {
-               test_assert(FALSE); /* should never be reached */
+       size_t offset = 0;
+       ssize_t ret;
+       while ((ret = i_stream_read_data(is_2, &ptr, &siz, 0)) >= 0) {
+               test_assert(ret == 0);
+               if (offset == buf->used)
+                       test_istream_set_allow_eof(is, TRUE);
+               test_istream_set_size(is, offset);
        };
 
        test_assert(is_2->stream_errno == 0);
        if (is_2->stream_errno != 0)
                i_debug("error: %s", i_stream_get_error(is_2));
+       i_stream_unref(&is);
        i_stream_unref(&is_2);
        buffer_free(&buf);
        test_end();
@@ -419,11 +449,18 @@ static void test_read_0_to_400_byte_garbage(void)
        memset(data, 0, sizeof(data));
 
        for (size_t s = 0; s <= 400; ++s) {
-               struct istream *is = i_stream_create_from_data(data, s);
+               struct istream *is = test_istream_create_data(data, s);
                struct istream *ds = i_stream_create_decrypt_callback(is,
                                no_op_cb, NULL);
-               ssize_t siz = i_stream_read(ds);
-               test_assert(siz < 0);
+               test_istream_set_allow_eof(is, FALSE);
+               ssize_t siz = 0;
+               for (size_t offset = 0; offset <= s && siz == 0; offset++) {
+                       if (offset == s)
+                               test_istream_set_allow_eof(is, TRUE);
+                       test_istream_set_size(is, offset);
+                       siz = i_stream_read(ds);
+               }
+               test_assert_idx(siz < 0, s);
                i_stream_unref(&ds);
                i_stream_unref(&is);
        }