Loading...
tests/qsort.c /dev/null Libc-1506.40.4
--- /dev/null
+++ Libc/Libc-1506.40.4/tests/qsort.c
@@ -0,0 +1,54 @@
+/*
+ * Randomized test for qsort() routine.
+ */
+
+#include <sys/cdefs.h>
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <darwintest.h>
+#include <darwintest_utils.h>
+
+#include "freebsd_qsort.h"
+
+#define BUFLEN (32 * 1024)
+
+static int tests = 10;
+
+T_DECL(qsort_random, "qsort random test", T_META_CHECK_LEAKS(NO))
+{
+	char testvector[BUFLEN];
+	char sresvector[BUFLEN];
+    size_t i;
+
+    while (--tests >= 0) {
+        size_t elmsize = (tests % 32) + 1;
+        size_t elmcount = sizeof(testvector) / elmsize;
+        T_LOG("%d: size = %zu, count = %zu", tests, elmsize, elmcount);
+
+        /* Populate test vectors */
+        arc4random_buf(testvector, sizeof(testvector));
+        memcpy(sresvector, testvector, sizeof(testvector));
+
+        /* Sort using qsort(3) */
+        qsort_r(testvector, elmcount, elmsize, (void*)elmsize, szsorthelp);
+        /* Sort using reference slow sorting routine */
+        szsort(sresvector, elmcount, elmsize);
+
+        /* Compare results */
+        for (i = 0; i < elmcount; i++){
+            if (memcmp(testvector + (i * elmsize), sresvector + (i * elmsize), elmsize) != 0) {
+                T_LOG("testvector =");
+                dt_print_hex_dump((uint8_t*)testvector, sizeof(testvector));
+                T_LOG("sresvector =");
+                dt_print_hex_dump((uint8_t*)sresvector, sizeof(sresvector));
+                T_ASSERT_FAIL("%d: item at index %zd should match", tests, i);
+                break;
+            }
+        }
+        if (i == elmcount) {
+            T_PASS("%d: Sorted successfully.", tests);
+        }
+    }
+}