Commit | Line | Data |
---|---|---|
897b8e23 | 1 | /* |
21cf9b6b | 2 | * Copyright (C) 2011 EfficiOS Inc. |
897b8e23 | 3 | * |
9d16b343 | 4 | * SPDX-License-Identifier: GPL-2.0-only |
897b8e23 | 5 | * |
897b8e23 DG |
6 | */ |
7 | ||
c9e313bc | 8 | #include <common/compat/errno.hpp> |
c9e313bc | 9 | #include <common/defaults.hpp> |
10a8a223 | 10 | |
28ab034a JG |
11 | #include <bin/lttng-sessiond/trace-kernel.hpp> |
12 | #include <stdio.h> | |
13 | #include <stdlib.h> | |
14 | #include <string.h> | |
23aaa19e | 15 | #include <tap/tap.h> |
28ab034a JG |
16 | #include <time.h> |
17 | #include <unistd.h> | |
897b8e23 | 18 | |
28ab034a | 19 | #define RANDOM_STRING_LEN 11 |
98612240 | 20 | |
23aaa19e | 21 | /* Number of TAP tests in this file */ |
1c0733db | 22 | #define NUM_TESTS 11 |
23aaa19e | 23 | |
48c6e03e | 24 | #ifdef HAVE_LIBLTTNG_UST_CTL |
4bd69c5f | 25 | #include <lttng/lttng-export.h> |
48c6e03e | 26 | #include <lttng/ust-sigbus.h> |
4bd69c5f | 27 | LTTNG_EXPORT DEFINE_LTTNG_UST_SIGBUS_STATE(); |
48c6e03e | 28 | #endif |
e207fe73 | 29 | |
28ab034a JG |
30 | static const char alphanum[] = "0123456789" |
31 | "ABCDEFGHIJKLMNOPQRSTUVWXYZ" | |
32 | "abcdefghijklmnopqrstuvwxyz"; | |
897b8e23 DG |
33 | |
34 | static struct ltt_kernel_session *kern; | |
98612240 | 35 | static char random_string[RANDOM_STRING_LEN]; |
897b8e23 DG |
36 | |
37 | /* | |
38 | * Return random string of 10 characters. | |
98612240 | 39 | * Not thread-safe. |
897b8e23 | 40 | */ |
cd9adb8b | 41 | static char *get_random_string() |
897b8e23 DG |
42 | { |
43 | int i; | |
897b8e23 | 44 | |
98612240 MD |
45 | for (i = 0; i < RANDOM_STRING_LEN - 1; i++) { |
46 | random_string[i] = alphanum[rand() % (sizeof(alphanum) - 1)]; | |
897b8e23 DG |
47 | } |
48 | ||
98612240 | 49 | random_string[RANDOM_STRING_LEN - 1] = '\0'; |
897b8e23 | 50 | |
98612240 | 51 | return random_string; |
897b8e23 DG |
52 | } |
53 | ||
cd9adb8b | 54 | static void test_create_one_kernel_session() |
897b8e23 | 55 | { |
dec56f6c | 56 | kern = trace_kernel_create_session(); |
cd9adb8b | 57 | ok(kern != nullptr, "Create kernel session"); |
897b8e23 | 58 | |
84a7eb73 JR |
59 | if (!kern) { |
60 | skip(1, "Kernel session is null"); | |
61 | return; | |
62 | } | |
28ab034a JG |
63 | ok(kern->fd == -1 && kern->metadata_stream_fd == -1 && kern->consumer_fds_sent == 0 && |
64 | kern->channel_count == 0 && kern->stream_count_global == 0 && | |
cd9adb8b | 65 | kern->metadata == nullptr, |
23aaa19e | 66 | "Validate kernel session"); |
897b8e23 DG |
67 | } |
68 | ||
cd9adb8b | 69 | static void test_create_kernel_metadata() |
897b8e23 | 70 | { |
cd9adb8b | 71 | LTTNG_ASSERT(kern != nullptr); |
897b8e23 | 72 | |
a4b92340 | 73 | kern->metadata = trace_kernel_create_metadata(); |
cd9adb8b | 74 | ok(kern->metadata != nullptr, "Create kernel metadata"); |
23aaa19e | 75 | |
cd9adb8b | 76 | ok(kern->metadata->fd == -1 && kern->metadata->conf != nullptr && |
28ab034a JG |
77 | kern->metadata->conf->attr.overwrite == DEFAULT_METADATA_OVERWRITE && |
78 | kern->metadata->conf->attr.subbuf_size == default_get_metadata_subbuf_size() && | |
79 | kern->metadata->conf->attr.num_subbuf == DEFAULT_METADATA_SUBBUF_NUM && | |
80 | kern->metadata->conf->attr.switch_timer_interval == | |
81 | DEFAULT_METADATA_SWITCH_TIMER && | |
82 | kern->metadata->conf->attr.read_timer_interval == DEFAULT_METADATA_READ_TIMER && | |
83 | kern->metadata->conf->attr.output == LTTNG_EVENT_MMAP, | |
23aaa19e | 84 | "Validate kernel session metadata"); |
897b8e23 | 85 | |
3f43a221 | 86 | trace_kernel_destroy_metadata(kern->metadata); |
897b8e23 DG |
87 | } |
88 | ||
cd9adb8b | 89 | static void test_create_kernel_channel() |
897b8e23 DG |
90 | { |
91 | struct ltt_kernel_channel *chan; | |
92 | struct lttng_channel attr; | |
63aaa3dc | 93 | struct lttng_channel_extended extended; |
897b8e23 | 94 | |
441c16a7 | 95 | memset(&attr, 0, sizeof(attr)); |
63aaa3dc JG |
96 | memset(&extended, 0, sizeof(extended)); |
97 | attr.attr.extended.ptr = &extended; | |
441c16a7 | 98 | |
fdd9eb17 | 99 | chan = trace_kernel_create_channel(&attr); |
cd9adb8b | 100 | ok(chan != nullptr, "Create kernel channel"); |
897b8e23 | 101 | |
84a7eb73 JR |
102 | if (!chan) { |
103 | skip(1, "Channel is null"); | |
104 | return; | |
105 | } | |
106 | ||
66cefebd | 107 | ok(chan->fd == -1 && chan->enabled && chan->stream_count == 0 && |
28ab034a | 108 | chan->channel->attr.overwrite == attr.attr.overwrite, |
23aaa19e | 109 | "Validate kernel channel"); |
897b8e23 DG |
110 | |
111 | /* Init list in order to avoid sefaults from cds_list_del */ | |
112 | CDS_INIT_LIST_HEAD(&chan->list); | |
3f43a221 | 113 | trace_kernel_destroy_channel(chan); |
897b8e23 DG |
114 | } |
115 | ||
cd9adb8b | 116 | static void test_create_kernel_event() |
897b8e23 | 117 | { |
71a3bb01 | 118 | enum lttng_error_code ret; |
897b8e23 DG |
119 | struct ltt_kernel_event *event; |
120 | struct lttng_event ev; | |
121 | ||
441c16a7 | 122 | memset(&ev, 0, sizeof(ev)); |
28ab034a JG |
123 | ok(!lttng_strncpy(ev.name, get_random_string(), RANDOM_STRING_LEN), |
124 | "Validate string length"); | |
897b8e23 | 125 | ev.type = LTTNG_EVENT_TRACEPOINT; |
441c16a7 | 126 | ev.loglevel_type = LTTNG_EVENT_LOGLEVEL_ALL; |
897b8e23 | 127 | |
cd9adb8b | 128 | ret = trace_kernel_create_event(&ev, nullptr, nullptr, &event); |
71a3bb01 | 129 | ok(ret == LTTNG_OK, "Create kernel event"); |
897b8e23 | 130 | |
84a7eb73 JR |
131 | if (!event) { |
132 | skip(1, "Event is null"); | |
133 | return; | |
134 | } | |
135 | ||
66cefebd | 136 | ok(event->fd == -1 && event->enabled && |
28ab034a JG |
137 | event->event->instrumentation == LTTNG_KERNEL_ABI_TRACEPOINT && |
138 | strlen(event->event->name), | |
23aaa19e | 139 | "Validate kernel event"); |
897b8e23 DG |
140 | |
141 | /* Init list in order to avoid sefaults from cds_list_del */ | |
142 | CDS_INIT_LIST_HEAD(&event->list); | |
3f43a221 | 143 | trace_kernel_destroy_event(event); |
897b8e23 DG |
144 | } |
145 | ||
cd9adb8b | 146 | static void test_create_kernel_stream() |
897b8e23 DG |
147 | { |
148 | struct ltt_kernel_stream *stream; | |
149 | ||
00e2e675 | 150 | stream = trace_kernel_create_stream("stream1", 0); |
cd9adb8b | 151 | ok(stream != nullptr, "Create kernel stream"); |
897b8e23 | 152 | |
84a7eb73 JR |
153 | if (!stream) { |
154 | skip(1, "Stream is null"); | |
155 | return; | |
156 | } | |
157 | ||
28ab034a | 158 | ok(stream->fd == -1 && stream->state == 0, "Validate kernel stream"); |
897b8e23 DG |
159 | |
160 | /* Init list in order to avoid sefaults from cds_list_del */ | |
161 | CDS_INIT_LIST_HEAD(&stream->list); | |
3f43a221 | 162 | trace_kernel_destroy_stream(stream); |
897b8e23 DG |
163 | } |
164 | ||
cd9adb8b | 165 | int main() |
897b8e23 | 166 | { |
23aaa19e | 167 | plan_tests(NUM_TESTS); |
897b8e23 | 168 | |
e3bef725 CB |
169 | diag("Kernel data structure unit test"); |
170 | ||
23aaa19e CB |
171 | test_create_one_kernel_session(); |
172 | test_create_kernel_metadata(); | |
173 | test_create_kernel_channel(); | |
174 | test_create_kernel_event(); | |
175 | test_create_kernel_stream(); | |
897b8e23 | 176 | |
674c3e2c | 177 | return exit_status(); |
897b8e23 | 178 | } |