test-log.c 5.57 KB
Newer Older
1 2 3
/*
 * Copyright © 2014 Red Hat, Inc.
 *
4 5 6 7 8 9
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
10
 *
11 12 13 14 15 16 17 18 19 20 21
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
22 23 24 25 26 27 28 29 30 31 32 33 34
 */

#include <config.h>

#include <check.h>
#include <errno.h>
#include <fcntl.h>
#include <libinput.h>
#include <unistd.h>

#include "litest.h"

static int log_handler_called;
35
static struct libinput *log_handler_context;
36 37 38 39 40 41 42 43 44 45 46 47

static int open_restricted(const char *path, int flags, void *data)
{
	int fd;
	fd = open(path, flags);
	return fd < 0 ? -errno : fd;
}
static void close_restricted(int fd, void *data)
{
	close(fd);
}

48
static const struct libinput_interface simple_interface = {
49 50 51 52 53
	.open_restricted = open_restricted,
	.close_restricted = close_restricted,
};

static void
54 55
simple_log_handler(struct libinput *libinput,
		   enum libinput_log_priority priority,
56 57 58 59
		   const char *format,
		   va_list args)
{
	log_handler_called++;
60
	if (log_handler_context)
61 62
		litest_assert_ptr_eq(libinput, log_handler_context);
	litest_assert_notnull(format);
63 64 65 66 67 68 69 70
}

START_TEST(log_default_priority)
{
	enum libinput_log_priority pri;
	struct libinput *li;

	li = libinput_path_create_context(&simple_interface, NULL);
71
	pri = libinput_log_get_priority(li);
72

73
	ck_assert_int_eq(pri, LIBINPUT_LOG_PRIORITY_ERROR);
74

75
	libinput_unref(li);
76 77 78
}
END_TEST

79
START_TEST(log_handler_invoked)
80 81 82
{
	struct libinput *li;

83 84 85
	log_handler_context = NULL;
	log_handler_called = 0;

86 87
	li = libinput_path_create_context(&simple_interface, NULL);

88 89 90
	libinput_log_set_priority(li, LIBINPUT_LOG_PRIORITY_DEBUG);
	libinput_log_set_handler(li, simple_log_handler);
	log_handler_context = li;
91 92 93 94

	libinput_path_add_device(li, "/tmp");

	ck_assert_int_gt(log_handler_called, 0);
95

96
	libinput_unref(li);
97 98

	log_handler_context = NULL;
99
	log_handler_called = 0;
100 101 102 103 104 105 106
}
END_TEST

START_TEST(log_handler_NULL)
{
	struct libinput *li;

107 108
	log_handler_called = 0;

109
	li = libinput_path_create_context(&simple_interface, NULL);
110 111 112
	libinput_log_set_priority(li, LIBINPUT_LOG_PRIORITY_DEBUG);
	libinput_log_set_handler(li, NULL);

113 114 115
	libinput_path_add_device(li, "/tmp");

	ck_assert_int_eq(log_handler_called, 0);
116

117
	libinput_unref(li);
118 119

	log_handler_called = 0;
120 121 122 123 124 125 126
}
END_TEST

START_TEST(log_priority)
{
	struct libinput *li;

127 128 129
	log_handler_context = NULL;
	log_handler_called = 0;

130
	li = libinput_path_create_context(&simple_interface, NULL);
131 132 133 134
	libinput_log_set_priority(li, LIBINPUT_LOG_PRIORITY_ERROR);
	libinput_log_set_handler(li, simple_log_handler);
	log_handler_context = li;

135 136
	libinput_path_add_device(li, "/tmp");

137
	ck_assert_int_eq(log_handler_called, 1);
138

139
	libinput_log_set_priority(li, LIBINPUT_LOG_PRIORITY_INFO);
140 141
	/* event0 exists on any box we care to run the test suite on and we
	 * currently prints *something* for each device */
142 143
	libinput_path_add_device(li, "/dev/input/event0");
	ck_assert_int_gt(log_handler_called, 1);
144

145
	libinput_unref(li);
146

147
	log_handler_context = NULL;
148
	log_handler_called = 0;
149 150 151
}
END_TEST

152 153 154 155 156 157 158 159
static int axisrange_log_handler_called = 0;

static void
axisrange_warning_log_handler(struct libinput *libinput,
			      enum libinput_log_priority priority,
			      const char *format,
			      va_list args)
{
160 161
	const char *substr;

162 163
	axisrange_log_handler_called++;
	litest_assert_notnull(format);
164 165 166

	substr = strstr(format, "is outside expected range");
	litest_assert_notnull(substr);
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
}

START_TEST(log_axisrange_warning)
{
	struct litest_device *dev = litest_current_device();
	struct libinput *li = dev->libinput;
	const struct input_absinfo *abs;
	int axis = _i; /* looped test */

	litest_touch_down(dev, 0, 90, 100);
	litest_drain_events(li);

	libinput_log_set_priority(li, LIBINPUT_LOG_PRIORITY_INFO);
	libinput_log_set_handler(li, axisrange_warning_log_handler);

	abs = libevdev_get_abs_info(dev->evdev, axis);

	for (int i = 0; i < 100; i++) {
		litest_event(dev, EV_ABS,
			     ABS_MT_POSITION_X + axis,
			     abs->maximum * 2 + i);
		litest_event(dev, EV_ABS, axis, abs->maximum * 2);
		litest_event(dev, EV_SYN, SYN_REPORT, 0);
		libinput_dispatch(li);
	}

	/* Expect only one message per 5 min */
	ck_assert_int_eq(axisrange_log_handler_called, 1);

196
	libinput_log_set_priority(li, LIBINPUT_LOG_PRIORITY_ERROR);
197 198 199 200 201
	litest_restore_log_handler(li);
	axisrange_log_handler_called = 0;
}
END_TEST

202
void
203
litest_setup_tests_log(void)
204
{
205 206
	struct range axes = { ABS_X, ABS_Y + 1};

207 208 209 210
	litest_add_no_device("log:defaults", log_default_priority);
	litest_add_no_device("log:logging", log_handler_invoked);
	litest_add_no_device("log:logging", log_handler_NULL);
	litest_add_no_device("log:logging", log_priority);
211 212 213

	litest_add_ranged("log:warnings", log_axisrange_warning, LITEST_TOUCH, LITEST_ANY, &axes);
	litest_add_ranged("log:warnings", log_axisrange_warning, LITEST_TOUCHPAD, LITEST_ANY, &axes);
214
}