--- /dev/null
+# SPDX-License-Identifier: GPL-2.0-only
+
+AM_CPPFLAGS += -I$(top_srcdir)/tests/utils/ -I$(srcdir)
+
+LIBTAP=$(top_builddir)/tests/utils/tap/libtap.la
+LIBLTTNG_CTL=$(top_builddir)/src/lib/lttng-ctl/liblttng-ctl.la
+
+noinst_PROGRAMS = hidden_trigger
+hidden_trigger_CFLAGS = $(AM_CFLAGS)
+hidden_trigger_SOURCES = hidden_trigger.c
+hidden_trigger_LDADD = $(LIBTAP) $(LIBLTTNG_CTL)
+
+noinst_SCRIPTS = test_hidden_trigger
+EXTRA_DIST = test_hidden_trigger
+
+all-local:
+ @if [ x"$(srcdir)" != x"$(builddir)" ]; then \
+ for script in $(EXTRA_DIST); do \
+ cp -f $(srcdir)/$$script $(builddir); \
+ done; \
+ fi
+
+clean-local:
+ @if [ x"$(srcdir)" != x"$(builddir)" ]; then \
+ for script in $(EXTRA_DIST); do \
+ rm -f $(builddir)/$$script; \
+ done; \
+ fi
--- /dev/null
+/*
+ * trigger_name.c
+ *
+ * Test that hidden triggers are not visible to liblttng-ctl.
+ *
+ * Copyright (C) 2021 Jérémie Galarneau <jeremie.galarneau@efficios.com>
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ */
+
+#include <assert.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <tap/tap.h>
+
+#include <common/macros.h>
+#include <lttng/lttng.h>
+
+#define TEST_COUNT 1
+
+#define TEST_SESSION_NAME "test_session"
+#define TEST_CHANNEL_NAME "test_channel"
+
+static
+int get_registered_triggers_count(void)
+{
+ int ret;
+ enum lttng_error_code ret_code;
+ enum lttng_trigger_status trigger_status;
+ struct lttng_triggers *triggers = NULL;
+ unsigned int trigger_count;
+
+ ret_code = lttng_list_triggers(&triggers);
+ if (ret_code != LTTNG_OK) {
+ fail("Failed to list triggers");
+ ret = -1;
+ goto end;
+ }
+
+ trigger_status = lttng_triggers_get_count(triggers, &trigger_count);
+ if (trigger_status != LTTNG_TRIGGER_STATUS_OK) {
+ fail("Failed to get count of triggers returned by listing");
+ ret = -1;
+ goto end;
+ }
+
+ ret = (int) trigger_count;
+
+end:
+ lttng_triggers_destroy(triggers);
+ return ret;
+}
+
+static
+int setup_session_with_size_rotation_schedule(const char *session_output_path)
+{
+ int ret;
+ struct lttng_session_descriptor *session_desriptor = NULL;
+ enum lttng_error_code ret_code;
+ struct lttng_handle ust_channel_handle = {
+ .session_name = TEST_SESSION_NAME,
+ .domain.type = LTTNG_DOMAIN_UST,
+ .domain.buf_type = LTTNG_BUFFER_PER_UID,
+ };
+ struct lttng_channel channel_cfg = {
+ .name = TEST_CHANNEL_NAME,
+ .enabled = 1,
+ .attr.overwrite = -1,
+ .attr.subbuf_size = sysconf(_SC_PAGESIZE) * 8,
+ .attr.num_subbuf = 8,
+ .attr.output = LTTNG_EVENT_MMAP,
+ };
+ enum lttng_rotation_status rotation_status;
+ struct lttng_rotation_schedule *rotation_schedule = NULL;
+
+ session_desriptor = lttng_session_descriptor_local_create(
+ TEST_SESSION_NAME, session_output_path);
+ if (!session_desriptor) {
+ fail("Failed to create session descriptor for session `%s`",
+ TEST_SESSION_NAME);
+ ret = -1;
+ goto end;
+ }
+
+ ret_code = lttng_create_session_ext(session_desriptor);
+ if (ret_code != LTTNG_OK) {
+ fail("Failed to create session `%s`: %s", TEST_SESSION_NAME,
+ lttng_strerror(-ret_code));
+ ret = -1;
+ goto end;
+ }
+
+ ret = lttng_enable_channel(&ust_channel_handle, &channel_cfg);
+ if (ret) {
+ fail("Failed to enable channel `%s`: %s", TEST_CHANNEL_NAME,
+ lttng_strerror(ret));
+ ret = -1;
+ goto end;
+ }
+
+ ret = lttng_start_tracing(TEST_SESSION_NAME);
+ if (ret) {
+ fail("Failed to start session `%s`: %s", TEST_SESSION_NAME,
+ lttng_strerror(ret));
+ ret = -1;
+ goto end;
+ }
+
+ rotation_schedule = lttng_rotation_schedule_size_threshold_create();
+ if (!rotation_schedule) {
+ fail("Failed to create rotation schedule descriptor");
+ ret = -1;
+ goto end;
+ }
+
+ /*
+ * The rotation schedule size threshold doesn't matter; no event rules
+ * were specified so the session consumed size should not grow over
+ * time.
+ */
+ rotation_status = lttng_rotation_schedule_size_threshold_set_threshold(
+ rotation_schedule, sysconf(_SC_PAGESIZE) * 4096);
+ if (rotation_status != LTTNG_ROTATION_STATUS_OK) {
+ fail("Failed to set size threshold of session rotation schedule");
+ ret = -1;
+ goto end;
+ }
+
+ rotation_status = lttng_session_add_rotation_schedule(
+ TEST_SESSION_NAME, rotation_schedule);
+ if (rotation_status != LTTNG_ROTATION_STATUS_OK) {
+ fail("Failed to set size-based rotation schedule on session `%s`",
+ TEST_SESSION_NAME);
+ ret = -1;
+ goto end;
+ }
+
+ ret = 0;
+end:
+ lttng_session_descriptor_destroy(session_desriptor);
+ lttng_rotation_schedule_destroy(rotation_schedule);
+ return ret;
+}
+
+int main(int argc, const char **argv)
+{
+ int ret;
+
+ if (argc != 2) {
+ fail("Missing trace path");
+ goto end;
+ }
+
+ plan_tests(TEST_COUNT);
+
+ if (get_registered_triggers_count() != 0) {
+ fail("Session daemon already has registered triggers, bailing out");
+ goto end;
+ }
+
+ ret = setup_session_with_size_rotation_schedule(argv[1]);
+ if (ret) {
+ goto end;
+ }
+
+ ok(get_registered_triggers_count() == 0,
+ "No triggers visible while session has an enabled size-based rotation schedule");
+
+ ret = lttng_destroy_session(TEST_SESSION_NAME);
+ if (ret) {
+ fail("Failed to destroy session `%s`", TEST_SESSION_NAME);
+ goto end;
+ }
+end:
+ return exit_status();
+}