source: test/test-datastruct-vector.c @ 0af3a4e

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivelibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 0af3a4e was df668eb, checked in by Richard Sanger <rsangerarj@…>, 7 years ago

Add tests for deque, ring_buffer and vector.

  • Property mode set to 100644
File size: 2.2 KB
Line 
1#include "data-struct/vector.h"
2#include <pthread.h>
3#include <assert.h>
4
5// Note producer consumer is not very efficient using a vector
6#define TEST_SIZE 100000
7
8static void * producer(void * a) {
9        libtrace_vector_t * vec = (libtrace_vector_t *) a;
10        int i;
11        for (i = 0; i < TEST_SIZE; i++)
12                libtrace_vector_push_back(vec, &i);
13        return 0;
14}
15
16static void * consumer(void * a) {
17        libtrace_vector_t * vec = (libtrace_vector_t *) a;
18        int i, value;
19        for (i = 0; i < TEST_SIZE; i++) {
20                /* We are going to be running quite slow */
21                while (libtrace_vector_get(vec, 0, &value) == 0);
22                assert(value == i);
23                libtrace_vector_remove_front(vec);
24        }
25        return 0;
26}
27
28/**
29 * Tests the vector data structure, first this establishes that single
30 * threaded operations work correctly, then does a basic consumer producer
31 * thread-safety test.
32 */
33int main() {
34        int i, value;
35        pthread_t t[4];
36        libtrace_vector_t vector, vector2;
37
38        libtrace_vector_init(&vector, sizeof(int));
39        assert(libtrace_vector_get_size(&vector) == 0);
40
41        for (i = 0; i < TEST_SIZE; i++)
42                libtrace_vector_push_back(&vector, &i);
43
44        assert(libtrace_vector_get_size(&vector) == TEST_SIZE);
45
46        for (i = 0; i < TEST_SIZE; i++) {
47                assert(libtrace_vector_get(&vector, i, &value));
48                assert (value == i);
49        }
50
51        assert(!libtrace_vector_get(&vector, -1, &value));
52        assert(!libtrace_vector_get(&vector, TEST_SIZE, &value));
53
54        for (i = 0; i < TEST_SIZE; i++) {
55                assert(libtrace_vector_get(&vector, 0, &value));
56                assert (value == i);
57                libtrace_vector_remove_front(&vector);
58        }
59        assert(!libtrace_vector_get(&vector, 0, &value));
60        assert(libtrace_vector_get_size(&vector) == 0);
61
62        libtrace_vector_init(&vector2, sizeof(int));
63        i = 500;
64        libtrace_vector_push_back(&vector2, &i);
65        libtrace_vector_append(&vector, &vector2);
66
67        assert(libtrace_vector_get_size(&vector) == 1);
68        // The other vector ends up empty
69        assert(libtrace_vector_get_size(&vector2) == 0);
70        assert(libtrace_vector_remove_front(&vector));
71
72        // Test thread safety - We only really care about the single producer single
73        // consumer case
74        pthread_create(&t[0], NULL, &producer, (void *) &vector);
75        pthread_create(&t[1], NULL, &consumer, (void *) &vector);
76
77        pthread_join(t[0], NULL);
78        pthread_join(t[1], NULL);
79        assert(libtrace_vector_get_size(&vector) == 0);
80
81        return 0;
82}
Note: See TracBrowser for help on using the repository browser.