|
@@ -569,6 +569,71 @@ test_socks_5_auth_before_negotiation(void *ptr)
|
|
|
;
|
|
|
}
|
|
|
|
|
|
+static void
|
|
|
+test_buffer_copy(void *arg)
|
|
|
+{
|
|
|
+ generic_buffer_t *buf=NULL, *buf2=NULL;
|
|
|
+ const char *s;
|
|
|
+ size_t len;
|
|
|
+ char b[256];
|
|
|
+ int i;
|
|
|
+ (void)arg;
|
|
|
+
|
|
|
+ buf = generic_buffer_new();
|
|
|
+ tt_assert(buf);
|
|
|
+
|
|
|
+ /* Copy an empty buffer. */
|
|
|
+ tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
|
|
|
+ tt_assert(buf2);
|
|
|
+ tt_int_op(0, ==, generic_buffer_len(buf2));
|
|
|
+
|
|
|
+ /* Now try with a short buffer. */
|
|
|
+ s = "And now comes an act of enormous enormance!";
|
|
|
+ len = strlen(s);
|
|
|
+ generic_buffer_add(buf, s, len);
|
|
|
+ tt_int_op(len, ==, generic_buffer_len(buf));
|
|
|
+ /* Add junk to buf2 so we can test replacing.*/
|
|
|
+ generic_buffer_add(buf2, "BLARG", 5);
|
|
|
+ tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
|
|
|
+ tt_int_op(len, ==, generic_buffer_len(buf2));
|
|
|
+ generic_buffer_get(buf2, b, len);
|
|
|
+ test_mem_op(b, ==, s, len);
|
|
|
+ /* Now free buf2 and retry so we can test allocating */
|
|
|
+ generic_buffer_free(buf2);
|
|
|
+ buf2 = NULL;
|
|
|
+ tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
|
|
|
+ tt_int_op(len, ==, generic_buffer_len(buf2));
|
|
|
+ generic_buffer_get(buf2, b, len);
|
|
|
+ test_mem_op(b, ==, s, len);
|
|
|
+ /* Clear buf for next test */
|
|
|
+ generic_buffer_get(buf, b, len);
|
|
|
+ tt_int_op(generic_buffer_len(buf),==,0);
|
|
|
+
|
|
|
+ /* Okay, now let's try a bigger buffer. */
|
|
|
+ s = "Quis autem vel eum iure reprehenderit qui in ea voluptate velit "
|
|
|
+ "esse quam nihil molestiae consequatur, vel illum qui dolorem eum "
|
|
|
+ "fugiat quo voluptas nulla pariatur?";
|
|
|
+ len = strlen(s);
|
|
|
+ for (i = 0; i < 256; ++i) {
|
|
|
+ b[0]=i;
|
|
|
+ generic_buffer_add(buf, b, 1);
|
|
|
+ generic_buffer_add(buf, s, len);
|
|
|
+ }
|
|
|
+ tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
|
|
|
+ tt_int_op(generic_buffer_len(buf2), ==, generic_buffer_len(buf));
|
|
|
+ for (i = 0; i < 256; ++i) {
|
|
|
+ generic_buffer_get(buf2, b, len+1);
|
|
|
+ tt_int_op((unsigned char)b[0],==,i);
|
|
|
+ test_mem_op(b+1, ==, s, len);
|
|
|
+ }
|
|
|
+
|
|
|
+ done:
|
|
|
+ if (buf)
|
|
|
+ generic_buffer_free(buf);
|
|
|
+ if (buf2)
|
|
|
+ generic_buffer_free(buf2);
|
|
|
+}
|
|
|
+
|
|
|
/** Run unit tests for buffers.c */
|
|
|
static void
|
|
|
test_buffers(void)
|
|
@@ -1612,6 +1677,7 @@ const struct testcase_setup_t legacy_setup = {
|
|
|
|
|
|
static struct testcase_t test_array[] = {
|
|
|
ENT(buffers),
|
|
|
+ { "buffer_copy", test_buffer_copy, 0, NULL, NULL },
|
|
|
ENT(onion_handshake),
|
|
|
ENT(circuit_timeout),
|
|
|
ENT(policies),
|