clang-tidy: add Chrome-inspired checks
[lttng-tools.git] / tests / unit / test_action.cpp
CommitLineData
9cff59ec
JR
1/*
2 * test_action.c
3 *
4 * Unit tests for the notification API.
5 *
6 * Copyright (C) 2017 Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
7 *
8 * SPDX-License-Identifier: MIT
9 *
10 */
11
c9e313bc
SM
12#include <common/payload-view.hpp>
13#include <common/payload.hpp>
28ab034a 14
c9e313bc 15#include <lttng/action/action-internal.hpp>
9cff59ec 16#include <lttng/action/action.h>
9cff59ec 17#include <lttng/action/notify.h>
c9e313bc 18#include <lttng/action/rate-policy-internal.hpp>
7f4d5b07 19#include <lttng/action/rate-policy.h>
ce1c2b5d 20#include <lttng/action/rotate-session.h>
5b2c0a3e 21#include <lttng/action/snapshot-session.h>
ea453cf4 22#include <lttng/action/start-session.h>
3474dcb1 23#include <lttng/action/stop-session.h>
9cff59ec 24
28ab034a
JG
25#include <inttypes.h>
26#include <stdio.h>
27#include <string.h>
28#include <tap/tap.h>
29#include <unistd.h>
30
9cff59ec
JR
31/* For error.h */
32int lttng_opt_quiet = 1;
33int lttng_opt_verbose;
34int lttng_opt_mi;
35
5b2c0a3e 36#define NUM_TESTS 60
9cff59ec 37
cd9adb8b 38static void test_action_notify()
9cff59ec 39{
193cc911
JR
40 int ret;
41 enum lttng_action_status status;
cd9adb8b
JG
42 struct lttng_action *notify_action = nullptr, *notify_action_from_buffer = nullptr;
43 struct lttng_rate_policy *policy = nullptr, *default_policy;
193cc911
JR
44 struct lttng_payload payload;
45
46 lttng_payload_init(&payload);
47
48 /* To set. */
7f4d5b07 49 policy = lttng_rate_policy_every_n_create(100);
193cc911 50 /* For comparison. */
7f4d5b07 51 default_policy = lttng_rate_policy_every_n_create(1);
193cc911 52
a0377dfe 53 LTTNG_ASSERT(policy && default_policy);
9cff59ec
JR
54
55 notify_action = lttng_action_notify_create();
56 ok(notify_action, "Create notify action");
57 ok(lttng_action_get_type(notify_action) == LTTNG_ACTION_TYPE_NOTIFY,
28ab034a 58 "Action has type LTTNG_ACTION_TYPE_NOTIFY");
193cc911
JR
59
60 /* Validate the default policy for a notify action. */
61 {
cd9adb8b 62 const struct lttng_rate_policy *cur_policy = nullptr;
28ab034a 63 status = lttng_action_notify_get_rate_policy(notify_action, &cur_policy);
193cc911 64 ok(status == LTTNG_ACTION_STATUS_OK &&
28ab034a
JG
65 lttng_rate_policy_is_equal(default_policy, cur_policy),
66 "Default policy is every n=1");
193cc911
JR
67 }
68
69 /* Set a custom policy. */
7f4d5b07
JR
70 status = lttng_action_notify_set_rate_policy(notify_action, policy);
71 ok(status == LTTNG_ACTION_STATUS_OK, "Set rate policy");
193cc911
JR
72
73 /* Validate the custom policy for a notify action. */
74 {
cd9adb8b 75 const struct lttng_rate_policy *cur_policy = nullptr;
28ab034a 76 status = lttng_action_notify_get_rate_policy(notify_action, &cur_policy);
193cc911 77 ok(status == LTTNG_ACTION_STATUS_OK &&
28ab034a
JG
78 lttng_rate_policy_is_equal(policy, cur_policy),
79 "Notify action policy get");
193cc911
JR
80 }
81
82 ret = lttng_action_serialize(notify_action, &payload);
83 ok(ret == 0, "Action notify serialized");
84
85 {
28ab034a
JG
86 struct lttng_payload_view view = lttng_payload_view_from_payload(&payload, 0, -1);
87 (void) lttng_action_create_from_payload(&view, &notify_action_from_buffer);
193cc911 88 }
28ab034a 89 ok(notify_action_from_buffer, "Notify action created from payload is non-null");
193cc911
JR
90
91 ok(lttng_action_is_equal(notify_action, notify_action_from_buffer),
28ab034a 92 "Serialized and de-serialized notify action are equal");
193cc911 93
7f4d5b07
JR
94 lttng_rate_policy_destroy(default_policy);
95 lttng_rate_policy_destroy(policy);
9cff59ec 96 lttng_action_destroy(notify_action);
193cc911
JR
97 lttng_action_destroy(notify_action_from_buffer);
98 lttng_payload_reset(&payload);
9cff59ec
JR
99}
100
cd9adb8b 101static void test_action_rotate_session()
ce1c2b5d
JR
102{
103 int ret;
104 enum lttng_action_status status;
cd9adb8b
JG
105 struct lttng_action *rotate_session_action = nullptr,
106 *rotate_session_action_from_buffer = nullptr;
107 struct lttng_rate_policy *policy = nullptr, *default_policy;
ce1c2b5d
JR
108 struct lttng_payload payload;
109 const char *session_name = "my_session_name";
110 const char *get_session_name;
111
112 lttng_payload_init(&payload);
113
114 /* To set. */
7f4d5b07 115 policy = lttng_rate_policy_every_n_create(100);
ce1c2b5d 116 /* For comparison. */
7f4d5b07 117 default_policy = lttng_rate_policy_every_n_create(1);
ce1c2b5d 118
a0377dfe 119 LTTNG_ASSERT(policy && default_policy);
ce1c2b5d
JR
120
121 rotate_session_action = lttng_action_rotate_session_create();
122 ok(rotate_session_action, "Create rotate_session action");
28ab034a
JG
123 ok(lttng_action_get_type(rotate_session_action) == LTTNG_ACTION_TYPE_ROTATE_SESSION,
124 "Action has type LTTNG_ACTION_TYPE_ROTATE_SESSION");
ce1c2b5d
JR
125
126 /* Session name setter. */
cd9adb8b 127 status = lttng_action_rotate_session_set_session_name(nullptr, nullptr);
28ab034a 128 ok(status == LTTNG_ACTION_STATUS_INVALID, "Set session name (NULL,NULL) expect invalid");
cd9adb8b 129 status = lttng_action_rotate_session_set_session_name(rotate_session_action, nullptr);
28ab034a 130 ok(status == LTTNG_ACTION_STATUS_INVALID, "Set session name (object,NULL) expect invalid");
cd9adb8b 131 status = lttng_action_rotate_session_set_session_name(nullptr, session_name);
28ab034a 132 ok(status == LTTNG_ACTION_STATUS_INVALID, "Set session name (NULL,object) expect invalid");
ce1c2b5d
JR
133
134 /* Set the session name */
28ab034a 135 status = lttng_action_rotate_session_set_session_name(rotate_session_action, session_name);
ce1c2b5d
JR
136 ok(status == LTTNG_ACTION_STATUS_OK, "Set session name");
137
28ab034a
JG
138 status = lttng_action_rotate_session_get_session_name(rotate_session_action,
139 &get_session_name);
140 ok(status == LTTNG_ACTION_STATUS_OK && !strcmp(session_name, get_session_name),
141 "Get session name, expected `%s` got `%s`",
142 session_name,
143 get_session_name);
ce1c2b5d
JR
144
145 /* Validate the default policy for a rotate_session action. */
146 {
cd9adb8b 147 const struct lttng_rate_policy *cur_policy = nullptr;
28ab034a
JG
148 status = lttng_action_rotate_session_get_rate_policy(rotate_session_action,
149 &cur_policy);
ce1c2b5d 150 ok(status == LTTNG_ACTION_STATUS_OK &&
28ab034a
JG
151 lttng_rate_policy_is_equal(default_policy, cur_policy),
152 "Default policy is every n=1");
ce1c2b5d
JR
153 }
154
155 /* Set a custom policy. */
28ab034a 156 status = lttng_action_rotate_session_set_rate_policy(rotate_session_action, policy);
7f4d5b07 157 ok(status == LTTNG_ACTION_STATUS_OK, "Set rate policy");
ce1c2b5d
JR
158
159 /* Validate the custom policy for a rotate_session action. */
160 {
cd9adb8b 161 const struct lttng_rate_policy *cur_policy = nullptr;
28ab034a
JG
162 status = lttng_action_rotate_session_get_rate_policy(rotate_session_action,
163 &cur_policy);
ce1c2b5d 164 ok(status == LTTNG_ACTION_STATUS_OK &&
28ab034a
JG
165 lttng_rate_policy_is_equal(policy, cur_policy),
166 "rotate_session action policy get");
ce1c2b5d
JR
167 }
168
169 /* Ser/des tests. */
170 ret = lttng_action_serialize(rotate_session_action, &payload);
171 ok(ret == 0, "Action rotate_session serialized");
172
173 {
28ab034a
JG
174 struct lttng_payload_view view = lttng_payload_view_from_payload(&payload, 0, -1);
175 (void) lttng_action_create_from_payload(&view, &rotate_session_action_from_buffer);
ce1c2b5d
JR
176 }
177 ok(rotate_session_action_from_buffer,
28ab034a 178 "rotate_session action created from payload is non-null");
ce1c2b5d 179
28ab034a
JG
180 ok(lttng_action_is_equal(rotate_session_action, rotate_session_action_from_buffer),
181 "Serialized and de-serialized rotate_session action are equal");
ce1c2b5d 182
7f4d5b07
JR
183 lttng_rate_policy_destroy(default_policy);
184 lttng_rate_policy_destroy(policy);
ce1c2b5d
JR
185 lttng_action_destroy(rotate_session_action);
186 lttng_action_destroy(rotate_session_action_from_buffer);
187 lttng_payload_reset(&payload);
188}
189
cd9adb8b 190static void test_action_start_session()
ea453cf4
JR
191{
192 int ret;
193 enum lttng_action_status status;
cd9adb8b
JG
194 struct lttng_action *start_session_action = nullptr,
195 *start_session_action_from_buffer = nullptr;
196 struct lttng_rate_policy *policy = nullptr, *default_policy;
ea453cf4
JR
197 struct lttng_payload payload;
198 const char *session_name = "my_session_name";
199 const char *get_session_name;
200
201 lttng_payload_init(&payload);
202
203 /* To set. */
7f4d5b07 204 policy = lttng_rate_policy_every_n_create(100);
ea453cf4 205 /* For comparison. */
7f4d5b07 206 default_policy = lttng_rate_policy_every_n_create(1);
ea453cf4 207
a0377dfe 208 LTTNG_ASSERT(policy && default_policy);
ea453cf4
JR
209
210 start_session_action = lttng_action_start_session_create();
211 ok(start_session_action, "Create start_session action");
28ab034a
JG
212 ok(lttng_action_get_type(start_session_action) == LTTNG_ACTION_TYPE_START_SESSION,
213 "Action has type LTTNG_ACTION_TYPE_START_SESSION");
ea453cf4
JR
214
215 /* Session name setter. */
cd9adb8b 216 status = lttng_action_start_session_set_session_name(nullptr, nullptr);
28ab034a 217 ok(status == LTTNG_ACTION_STATUS_INVALID, "Set session name (NULL,NULL) expect invalid");
cd9adb8b 218 status = lttng_action_start_session_set_session_name(start_session_action, nullptr);
28ab034a 219 ok(status == LTTNG_ACTION_STATUS_INVALID, "Set session name (object,NULL) expect invalid");
cd9adb8b 220 status = lttng_action_start_session_set_session_name(nullptr, session_name);
28ab034a 221 ok(status == LTTNG_ACTION_STATUS_INVALID, "Set session name (NULL,object) expect invalid");
ea453cf4
JR
222
223 /* Set the session name */
28ab034a 224 status = lttng_action_start_session_set_session_name(start_session_action, session_name);
ea453cf4
JR
225 ok(status == LTTNG_ACTION_STATUS_OK, "Set session name");
226
28ab034a
JG
227 status = lttng_action_start_session_get_session_name(start_session_action,
228 &get_session_name);
229 ok(status == LTTNG_ACTION_STATUS_OK && !strcmp(session_name, get_session_name),
230 "Get session name, expected `%s` got `%s`",
231 session_name,
232 get_session_name);
ea453cf4
JR
233
234 /* Validate the default policy for a start_session action. */
235 {
cd9adb8b 236 const struct lttng_rate_policy *cur_policy = nullptr;
28ab034a
JG
237 status = lttng_action_start_session_get_rate_policy(start_session_action,
238 &cur_policy);
ea453cf4 239 ok(status == LTTNG_ACTION_STATUS_OK &&
28ab034a
JG
240 lttng_rate_policy_is_equal(default_policy, cur_policy),
241 "Default policy is every n=1");
ea453cf4
JR
242 }
243
244 /* Set a custom policy. */
28ab034a 245 status = lttng_action_start_session_set_rate_policy(start_session_action, policy);
7f4d5b07 246 ok(status == LTTNG_ACTION_STATUS_OK, "Set rate policy");
ea453cf4
JR
247
248 /* Validate the custom policy for a start_session action. */
249 {
cd9adb8b 250 const struct lttng_rate_policy *cur_policy = nullptr;
28ab034a
JG
251 status = lttng_action_start_session_get_rate_policy(start_session_action,
252 &cur_policy);
ea453cf4 253 ok(status == LTTNG_ACTION_STATUS_OK &&
28ab034a
JG
254 lttng_rate_policy_is_equal(policy, cur_policy),
255 "start_session action policy get");
ea453cf4
JR
256 }
257
258 /* Ser/des tests. */
259 ret = lttng_action_serialize(start_session_action, &payload);
260 ok(ret == 0, "Action start_session serialized");
261
262 {
28ab034a
JG
263 struct lttng_payload_view view = lttng_payload_view_from_payload(&payload, 0, -1);
264 (void) lttng_action_create_from_payload(&view, &start_session_action_from_buffer);
ea453cf4
JR
265 }
266 ok(start_session_action_from_buffer,
28ab034a 267 "start_session action created from payload is non-null");
ea453cf4 268
28ab034a
JG
269 ok(lttng_action_is_equal(start_session_action, start_session_action_from_buffer),
270 "Serialized and de-serialized start_session action are equal");
ea453cf4 271
7f4d5b07
JR
272 lttng_rate_policy_destroy(default_policy);
273 lttng_rate_policy_destroy(policy);
ea453cf4
JR
274 lttng_action_destroy(start_session_action);
275 lttng_action_destroy(start_session_action_from_buffer);
276 lttng_payload_reset(&payload);
277}
278
cd9adb8b 279static void test_action_stop_session()
3474dcb1
JR
280{
281 int ret;
282 enum lttng_action_status status;
cd9adb8b
JG
283 struct lttng_action *stop_session_action = nullptr,
284 *stop_session_action_from_buffer = nullptr;
285 struct lttng_rate_policy *policy = nullptr, *default_policy;
3474dcb1
JR
286 struct lttng_payload payload;
287 const char *session_name = "my_session_name";
288 const char *get_session_name;
289
290 lttng_payload_init(&payload);
291
292 /* To set. */
7f4d5b07 293 policy = lttng_rate_policy_every_n_create(100);
3474dcb1 294 /* For comparison. */
7f4d5b07 295 default_policy = lttng_rate_policy_every_n_create(1);
3474dcb1 296
a0377dfe 297 LTTNG_ASSERT(policy && default_policy);
3474dcb1
JR
298
299 stop_session_action = lttng_action_stop_session_create();
300 ok(stop_session_action, "Create stop_session action");
28ab034a
JG
301 ok(lttng_action_get_type(stop_session_action) == LTTNG_ACTION_TYPE_STOP_SESSION,
302 "Action has type LTTNG_ACTION_TYPE_STOP_SESSION");
3474dcb1
JR
303
304 /* Session name setter. */
cd9adb8b 305 status = lttng_action_stop_session_set_session_name(nullptr, nullptr);
28ab034a 306 ok(status == LTTNG_ACTION_STATUS_INVALID, "Set session name (NULL,NULL) expect invalid");
cd9adb8b 307 status = lttng_action_stop_session_set_session_name(stop_session_action, nullptr);
28ab034a 308 ok(status == LTTNG_ACTION_STATUS_INVALID, "Set session name (object,NULL) expect invalid");
cd9adb8b 309 status = lttng_action_stop_session_set_session_name(nullptr, session_name);
28ab034a 310 ok(status == LTTNG_ACTION_STATUS_INVALID, "Set session name (NULL,object) expect invalid");
3474dcb1
JR
311
312 /* Set the session name */
28ab034a 313 status = lttng_action_stop_session_set_session_name(stop_session_action, session_name);
3474dcb1
JR
314 ok(status == LTTNG_ACTION_STATUS_OK, "Set session name");
315
28ab034a
JG
316 status = lttng_action_stop_session_get_session_name(stop_session_action, &get_session_name);
317 ok(status == LTTNG_ACTION_STATUS_OK && !strcmp(session_name, get_session_name),
318 "Get session name, expected `%s` got `%s`",
319 session_name,
320 get_session_name);
3474dcb1
JR
321
322 /* Validate the default policy for a stop_session action. */
323 {
cd9adb8b 324 const struct lttng_rate_policy *cur_policy = nullptr;
28ab034a
JG
325 status =
326 lttng_action_stop_session_get_rate_policy(stop_session_action, &cur_policy);
3474dcb1 327 ok(status == LTTNG_ACTION_STATUS_OK &&
28ab034a
JG
328 lttng_rate_policy_is_equal(default_policy, cur_policy),
329 "Default policy is every n=1");
3474dcb1
JR
330 }
331
332 /* Set a custom policy. */
28ab034a 333 status = lttng_action_stop_session_set_rate_policy(stop_session_action, policy);
7f4d5b07 334 ok(status == LTTNG_ACTION_STATUS_OK, "Set rate policy");
3474dcb1
JR
335
336 /* Validate the custom policy for a stop_session action. */
337 {
cd9adb8b 338 const struct lttng_rate_policy *cur_policy = nullptr;
28ab034a
JG
339 status =
340 lttng_action_stop_session_get_rate_policy(stop_session_action, &cur_policy);
3474dcb1 341 ok(status == LTTNG_ACTION_STATUS_OK &&
28ab034a
JG
342 lttng_rate_policy_is_equal(policy, cur_policy),
343 "stop_session action policy get");
3474dcb1
JR
344 }
345
346 /* Ser/des tests. */
347 ret = lttng_action_serialize(stop_session_action, &payload);
348 ok(ret == 0, "Action stop_session serialized");
349
350 {
28ab034a
JG
351 struct lttng_payload_view view = lttng_payload_view_from_payload(&payload, 0, -1);
352 (void) lttng_action_create_from_payload(&view, &stop_session_action_from_buffer);
3474dcb1 353 }
28ab034a 354 ok(stop_session_action_from_buffer, "stop_session action created from payload is non-null");
3474dcb1 355
28ab034a
JG
356 ok(lttng_action_is_equal(stop_session_action, stop_session_action_from_buffer),
357 "Serialized and de-serialized stop_session action are equal");
3474dcb1 358
7f4d5b07
JR
359 lttng_rate_policy_destroy(default_policy);
360 lttng_rate_policy_destroy(policy);
3474dcb1
JR
361 lttng_action_destroy(stop_session_action);
362 lttng_action_destroy(stop_session_action_from_buffer);
363 lttng_payload_reset(&payload);
364}
365
cd9adb8b 366static void test_action_snapshot_session()
5b2c0a3e
JR
367{
368 int ret;
369 enum lttng_action_status status;
cd9adb8b
JG
370 struct lttng_action *snapshot_session_action = nullptr,
371 *snapshot_session_action_from_buffer = nullptr;
372 struct lttng_rate_policy *policy = nullptr, *default_policy;
5b2c0a3e
JR
373 struct lttng_payload payload;
374 const char *session_name = "my_session_name";
375 const char *get_session_name;
376
377 lttng_payload_init(&payload);
378
379 /* To set. */
7f4d5b07 380 policy = lttng_rate_policy_every_n_create(100);
5b2c0a3e 381 /* For comparison. */
7f4d5b07 382 default_policy = lttng_rate_policy_every_n_create(1);
5b2c0a3e 383
a0377dfe 384 LTTNG_ASSERT(policy && default_policy);
5b2c0a3e
JR
385
386 snapshot_session_action = lttng_action_snapshot_session_create();
387 ok(snapshot_session_action, "Create snapshot_session action");
28ab034a
JG
388 ok(lttng_action_get_type(snapshot_session_action) == LTTNG_ACTION_TYPE_SNAPSHOT_SESSION,
389 "Action has type LTTNG_ACTION_TYPE_SNAPSHOT_SESSION");
5b2c0a3e
JR
390
391 /* Session name setter. */
cd9adb8b 392 status = lttng_action_snapshot_session_set_session_name(nullptr, nullptr);
28ab034a 393 ok(status == LTTNG_ACTION_STATUS_INVALID, "Set session name (NULL,NULL) expect invalid");
cd9adb8b 394 status = lttng_action_snapshot_session_set_session_name(snapshot_session_action, nullptr);
28ab034a 395 ok(status == LTTNG_ACTION_STATUS_INVALID, "Set session name (object,NULL) expect invalid");
cd9adb8b 396 status = lttng_action_snapshot_session_set_session_name(nullptr, session_name);
28ab034a 397 ok(status == LTTNG_ACTION_STATUS_INVALID, "Set session name (NULL,object) expect invalid");
5b2c0a3e
JR
398
399 /* Set the session name */
28ab034a
JG
400 status = lttng_action_snapshot_session_set_session_name(snapshot_session_action,
401 session_name);
5b2c0a3e
JR
402 ok(status == LTTNG_ACTION_STATUS_OK, "Set session name");
403
28ab034a
JG
404 status = lttng_action_snapshot_session_get_session_name(snapshot_session_action,
405 &get_session_name);
406 ok(status == LTTNG_ACTION_STATUS_OK && !strcmp(session_name, get_session_name),
407 "Get session name, expected `%s` got `%s`",
408 session_name,
409 get_session_name);
5b2c0a3e
JR
410
411 /* Validate the default policy for a snapshot_session action. */
412 {
cd9adb8b 413 const struct lttng_rate_policy *cur_policy = nullptr;
28ab034a
JG
414 status = lttng_action_snapshot_session_get_rate_policy(snapshot_session_action,
415 &cur_policy);
5b2c0a3e 416 ok(status == LTTNG_ACTION_STATUS_OK &&
28ab034a
JG
417 lttng_rate_policy_is_equal(default_policy, cur_policy),
418 "Default policy is every n=1");
5b2c0a3e
JR
419 }
420
421 /* Set a custom policy. */
28ab034a 422 status = lttng_action_snapshot_session_set_rate_policy(snapshot_session_action, policy);
7f4d5b07 423 ok(status == LTTNG_ACTION_STATUS_OK, "Set rate policy");
5b2c0a3e
JR
424
425 /* Validate the custom policy for a snapshot_session action. */
426 {
cd9adb8b 427 const struct lttng_rate_policy *cur_policy = nullptr;
28ab034a
JG
428 status = lttng_action_snapshot_session_get_rate_policy(snapshot_session_action,
429 &cur_policy);
5b2c0a3e 430 ok(status == LTTNG_ACTION_STATUS_OK &&
28ab034a
JG
431 lttng_rate_policy_is_equal(policy, cur_policy),
432 "snapshot_session action policy get");
5b2c0a3e
JR
433 }
434
435 /* Ser/des tests. */
436 ret = lttng_action_serialize(snapshot_session_action, &payload);
437 ok(ret == 0, "Action snapshot_session serialized");
438
439 {
28ab034a
JG
440 struct lttng_payload_view view = lttng_payload_view_from_payload(&payload, 0, -1);
441 (void) lttng_action_create_from_payload(&view,
442 &snapshot_session_action_from_buffer);
5b2c0a3e
JR
443 }
444 ok(snapshot_session_action_from_buffer,
28ab034a 445 "snapshot_session action created from payload is non-null");
5b2c0a3e 446
28ab034a
JG
447 ok(lttng_action_is_equal(snapshot_session_action, snapshot_session_action_from_buffer),
448 "Serialized and de-serialized snapshot_session action are equal");
5b2c0a3e 449
7f4d5b07
JR
450 lttng_rate_policy_destroy(default_policy);
451 lttng_rate_policy_destroy(policy);
5b2c0a3e
JR
452 lttng_action_destroy(snapshot_session_action);
453 lttng_action_destroy(snapshot_session_action_from_buffer);
454 lttng_payload_reset(&payload);
455}
456
cd9adb8b 457int main()
9cff59ec
JR
458{
459 plan_tests(NUM_TESTS);
460 test_action_notify();
ce1c2b5d 461 test_action_rotate_session();
ea453cf4 462 test_action_start_session();
3474dcb1 463 test_action_stop_session();
5b2c0a3e 464 test_action_snapshot_session();
9cff59ec
JR
465 return exit_status();
466}
This page took 0.055331 seconds and 4 git commands to generate.