xref: /freebsd/contrib/processor-trace/libipt/test/src/ptunit-event_queue.c (revision 85f87cf491bec6f90948a85b10f5523ea24db9e3)
174fe6c29SRuslan Bukin /*
2*85f87cf4SRuslan Bukin  * Copyright (c) 2014-2019, Intel Corporation
374fe6c29SRuslan Bukin  *
474fe6c29SRuslan Bukin  * Redistribution and use in source and binary forms, with or without
574fe6c29SRuslan Bukin  * modification, are permitted provided that the following conditions are met:
674fe6c29SRuslan Bukin  *
774fe6c29SRuslan Bukin  *  * Redistributions of source code must retain the above copyright notice,
874fe6c29SRuslan Bukin  *    this list of conditions and the following disclaimer.
974fe6c29SRuslan Bukin  *  * Redistributions in binary form must reproduce the above copyright notice,
1074fe6c29SRuslan Bukin  *    this list of conditions and the following disclaimer in the documentation
1174fe6c29SRuslan Bukin  *    and/or other materials provided with the distribution.
1274fe6c29SRuslan Bukin  *  * Neither the name of Intel Corporation nor the names of its contributors
1374fe6c29SRuslan Bukin  *    may be used to endorse or promote products derived from this software
1474fe6c29SRuslan Bukin  *    without specific prior written permission.
1574fe6c29SRuslan Bukin  *
1674fe6c29SRuslan Bukin  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1774fe6c29SRuslan Bukin  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1874fe6c29SRuslan Bukin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1974fe6c29SRuslan Bukin  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2074fe6c29SRuslan Bukin  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2174fe6c29SRuslan Bukin  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2274fe6c29SRuslan Bukin  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2374fe6c29SRuslan Bukin  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2474fe6c29SRuslan Bukin  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2574fe6c29SRuslan Bukin  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2674fe6c29SRuslan Bukin  * POSSIBILITY OF SUCH DAMAGE.
2774fe6c29SRuslan Bukin  */
2874fe6c29SRuslan Bukin 
2974fe6c29SRuslan Bukin #include "ptunit.h"
3074fe6c29SRuslan Bukin 
3174fe6c29SRuslan Bukin #include "pt_event_queue.h"
3274fe6c29SRuslan Bukin 
3374fe6c29SRuslan Bukin 
3474fe6c29SRuslan Bukin /* A test fixture providing an initialized event queue. */
3574fe6c29SRuslan Bukin struct evq_fixture {
3674fe6c29SRuslan Bukin 	/* The event queue. */
3774fe6c29SRuslan Bukin 	struct pt_event_queue evq;
3874fe6c29SRuslan Bukin 
3974fe6c29SRuslan Bukin 	/* The test fixture initialization and finalization functions. */
4074fe6c29SRuslan Bukin 	struct ptunit_result (*init)(struct evq_fixture *);
4174fe6c29SRuslan Bukin 	struct ptunit_result (*fini)(struct evq_fixture *);
4274fe6c29SRuslan Bukin };
4374fe6c29SRuslan Bukin 
4474fe6c29SRuslan Bukin 
efix_init(struct evq_fixture * efix)4574fe6c29SRuslan Bukin static struct ptunit_result efix_init(struct evq_fixture *efix)
4674fe6c29SRuslan Bukin {
4774fe6c29SRuslan Bukin 	pt_evq_init(&efix->evq);
4874fe6c29SRuslan Bukin 
4974fe6c29SRuslan Bukin 	return ptu_passed();
5074fe6c29SRuslan Bukin }
5174fe6c29SRuslan Bukin 
efix_init_pending(struct evq_fixture * efix)5274fe6c29SRuslan Bukin static struct ptunit_result efix_init_pending(struct evq_fixture *efix)
5374fe6c29SRuslan Bukin {
5474fe6c29SRuslan Bukin 	struct pt_event *ev;
5574fe6c29SRuslan Bukin 	int evb;
5674fe6c29SRuslan Bukin 
5774fe6c29SRuslan Bukin 	pt_evq_init(&efix->evq);
5874fe6c29SRuslan Bukin 
5974fe6c29SRuslan Bukin 	for (evb = 0; evb < evb_max; ++evb) {
6074fe6c29SRuslan Bukin 		ev = pt_evq_enqueue(&efix->evq, (enum pt_event_binding) evb);
6174fe6c29SRuslan Bukin 		ptu_ptr(ev);
6274fe6c29SRuslan Bukin 	}
6374fe6c29SRuslan Bukin 
6474fe6c29SRuslan Bukin 	return ptu_passed();
6574fe6c29SRuslan Bukin }
6674fe6c29SRuslan Bukin 
standalone_null(void)6774fe6c29SRuslan Bukin static struct ptunit_result standalone_null(void)
6874fe6c29SRuslan Bukin {
6974fe6c29SRuslan Bukin 	struct pt_event *ev;
7074fe6c29SRuslan Bukin 
7174fe6c29SRuslan Bukin 	ev = pt_evq_standalone(NULL);
7274fe6c29SRuslan Bukin 	ptu_null(ev);
7374fe6c29SRuslan Bukin 
7474fe6c29SRuslan Bukin 	return ptu_passed();
7574fe6c29SRuslan Bukin }
7674fe6c29SRuslan Bukin 
standalone(struct evq_fixture * efix)7774fe6c29SRuslan Bukin static struct ptunit_result standalone(struct evq_fixture *efix)
7874fe6c29SRuslan Bukin {
7974fe6c29SRuslan Bukin 	struct pt_event *ev;
8074fe6c29SRuslan Bukin 
8174fe6c29SRuslan Bukin 	ev = pt_evq_standalone(&efix->evq);
8274fe6c29SRuslan Bukin 	ptu_ptr(ev);
8374fe6c29SRuslan Bukin 	ptu_uint_eq(ev->ip_suppressed, 0ul);
8474fe6c29SRuslan Bukin 	ptu_uint_eq(ev->status_update, 0ul);
8574fe6c29SRuslan Bukin 
8674fe6c29SRuslan Bukin 	return ptu_passed();
8774fe6c29SRuslan Bukin }
8874fe6c29SRuslan Bukin 
enqueue_null(enum pt_event_binding evb)8974fe6c29SRuslan Bukin static struct ptunit_result enqueue_null(enum pt_event_binding evb)
9074fe6c29SRuslan Bukin {
9174fe6c29SRuslan Bukin 	struct pt_event *ev;
9274fe6c29SRuslan Bukin 
9374fe6c29SRuslan Bukin 	ev = pt_evq_enqueue(NULL, evb);
9474fe6c29SRuslan Bukin 	ptu_null(ev);
9574fe6c29SRuslan Bukin 
9674fe6c29SRuslan Bukin 	return ptu_passed();
9774fe6c29SRuslan Bukin }
9874fe6c29SRuslan Bukin 
dequeue_null(enum pt_event_binding evb)9974fe6c29SRuslan Bukin static struct ptunit_result dequeue_null(enum pt_event_binding evb)
10074fe6c29SRuslan Bukin {
10174fe6c29SRuslan Bukin 	struct pt_event *ev;
10274fe6c29SRuslan Bukin 
10374fe6c29SRuslan Bukin 	ev = pt_evq_dequeue(NULL, evb);
10474fe6c29SRuslan Bukin 	ptu_null(ev);
10574fe6c29SRuslan Bukin 
10674fe6c29SRuslan Bukin 	return ptu_passed();
10774fe6c29SRuslan Bukin }
10874fe6c29SRuslan Bukin 
dequeue_empty(struct evq_fixture * efix,enum pt_event_binding evb)10974fe6c29SRuslan Bukin static struct ptunit_result dequeue_empty(struct evq_fixture *efix,
11074fe6c29SRuslan Bukin 					  enum pt_event_binding evb)
11174fe6c29SRuslan Bukin {
11274fe6c29SRuslan Bukin 	struct pt_event *ev;
11374fe6c29SRuslan Bukin 
11474fe6c29SRuslan Bukin 	ev = pt_evq_dequeue(&efix->evq, evb);
11574fe6c29SRuslan Bukin 	ptu_null(ev);
11674fe6c29SRuslan Bukin 
11774fe6c29SRuslan Bukin 	return ptu_passed();
11874fe6c29SRuslan Bukin }
11974fe6c29SRuslan Bukin 
evq_empty(struct evq_fixture * efix,enum pt_event_binding evb)12074fe6c29SRuslan Bukin static struct ptunit_result evq_empty(struct evq_fixture *efix,
12174fe6c29SRuslan Bukin 				      enum pt_event_binding evb)
12274fe6c29SRuslan Bukin {
12374fe6c29SRuslan Bukin 	int status;
12474fe6c29SRuslan Bukin 
12574fe6c29SRuslan Bukin 	status = pt_evq_empty(&efix->evq, evb);
12674fe6c29SRuslan Bukin 	ptu_int_gt(status, 0);
12774fe6c29SRuslan Bukin 
12874fe6c29SRuslan Bukin 	status = pt_evq_pending(&efix->evq, evb);
12974fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
13074fe6c29SRuslan Bukin 
13174fe6c29SRuslan Bukin 	return ptu_passed();
13274fe6c29SRuslan Bukin }
13374fe6c29SRuslan Bukin 
evq_pending(struct evq_fixture * efix,enum pt_event_binding evb)13474fe6c29SRuslan Bukin static struct ptunit_result evq_pending(struct evq_fixture *efix,
13574fe6c29SRuslan Bukin 					enum pt_event_binding evb)
13674fe6c29SRuslan Bukin {
13774fe6c29SRuslan Bukin 	int status;
13874fe6c29SRuslan Bukin 
13974fe6c29SRuslan Bukin 	status = pt_evq_empty(&efix->evq, evb);
14074fe6c29SRuslan Bukin 	ptu_int_eq(status, 0);
14174fe6c29SRuslan Bukin 
14274fe6c29SRuslan Bukin 	status = pt_evq_pending(&efix->evq, evb);
14374fe6c29SRuslan Bukin 	ptu_int_gt(status, 0);
14474fe6c29SRuslan Bukin 
14574fe6c29SRuslan Bukin 	return ptu_passed();
14674fe6c29SRuslan Bukin }
14774fe6c29SRuslan Bukin 
evq_others_empty(struct evq_fixture * efix,enum pt_event_binding evb)14874fe6c29SRuslan Bukin static struct ptunit_result evq_others_empty(struct evq_fixture *efix,
14974fe6c29SRuslan Bukin 					     enum pt_event_binding evb)
15074fe6c29SRuslan Bukin {
15174fe6c29SRuslan Bukin 	int other;
15274fe6c29SRuslan Bukin 
15374fe6c29SRuslan Bukin 	for (other = 0; other < evb_max; ++other) {
15474fe6c29SRuslan Bukin 		enum pt_event_binding ob;
15574fe6c29SRuslan Bukin 
15674fe6c29SRuslan Bukin 		ob = (enum pt_event_binding) other;
15774fe6c29SRuslan Bukin 		if (ob != evb)
15874fe6c29SRuslan Bukin 			ptu_test(evq_empty, efix, ob);
15974fe6c29SRuslan Bukin 	}
16074fe6c29SRuslan Bukin 
16174fe6c29SRuslan Bukin 	return ptu_passed();
16274fe6c29SRuslan Bukin }
16374fe6c29SRuslan Bukin 
enqueue_all_dequeue(struct evq_fixture * efix,enum pt_event_binding evb,size_t num)16474fe6c29SRuslan Bukin static struct ptunit_result enqueue_all_dequeue(struct evq_fixture *efix,
16574fe6c29SRuslan Bukin 						enum pt_event_binding evb,
16674fe6c29SRuslan Bukin 						size_t num)
16774fe6c29SRuslan Bukin {
16874fe6c29SRuslan Bukin 	struct pt_event *in[evq_max], *out[evq_max];
16974fe6c29SRuslan Bukin 	size_t idx;
17074fe6c29SRuslan Bukin 
17174fe6c29SRuslan Bukin 	ptu_uint_le(num, evq_max - 2);
17274fe6c29SRuslan Bukin 
17374fe6c29SRuslan Bukin 	for (idx = 0; idx < num; ++idx) {
17474fe6c29SRuslan Bukin 		in[idx] = pt_evq_enqueue(&efix->evq, evb);
17574fe6c29SRuslan Bukin 		ptu_ptr(in[idx]);
17674fe6c29SRuslan Bukin 	}
17774fe6c29SRuslan Bukin 
17874fe6c29SRuslan Bukin 	ptu_test(evq_pending, efix, evb);
17974fe6c29SRuslan Bukin 	ptu_test(evq_others_empty, efix, evb);
18074fe6c29SRuslan Bukin 
18174fe6c29SRuslan Bukin 	for (idx = 0; idx < num; ++idx) {
18274fe6c29SRuslan Bukin 		out[idx] = pt_evq_dequeue(&efix->evq, evb);
18374fe6c29SRuslan Bukin 		ptu_ptr_eq(out[idx], in[idx]);
18474fe6c29SRuslan Bukin 	}
18574fe6c29SRuslan Bukin 
18674fe6c29SRuslan Bukin 	ptu_test(evq_empty, efix, evb);
18774fe6c29SRuslan Bukin 
18874fe6c29SRuslan Bukin 	return ptu_passed();
18974fe6c29SRuslan Bukin }
19074fe6c29SRuslan Bukin 
enqueue_one_dequeue(struct evq_fixture * efix,enum pt_event_binding evb,size_t num)19174fe6c29SRuslan Bukin static struct ptunit_result enqueue_one_dequeue(struct evq_fixture *efix,
19274fe6c29SRuslan Bukin 						enum pt_event_binding evb,
19374fe6c29SRuslan Bukin 						size_t num)
19474fe6c29SRuslan Bukin {
19574fe6c29SRuslan Bukin 	size_t idx;
19674fe6c29SRuslan Bukin 
19774fe6c29SRuslan Bukin 	for (idx = 0; idx < num; ++idx) {
19874fe6c29SRuslan Bukin 		struct pt_event *in, *out;
19974fe6c29SRuslan Bukin 
20074fe6c29SRuslan Bukin 		in = pt_evq_enqueue(&efix->evq, evb);
20174fe6c29SRuslan Bukin 		ptu_ptr(in);
20274fe6c29SRuslan Bukin 
20374fe6c29SRuslan Bukin 		out = pt_evq_dequeue(&efix->evq, evb);
20474fe6c29SRuslan Bukin 		ptu_ptr_eq(out, in);
20574fe6c29SRuslan Bukin 	}
20674fe6c29SRuslan Bukin 
20774fe6c29SRuslan Bukin 	return ptu_passed();
20874fe6c29SRuslan Bukin }
20974fe6c29SRuslan Bukin 
overflow(struct evq_fixture * efix,enum pt_event_binding evb,size_t num)21074fe6c29SRuslan Bukin static struct ptunit_result overflow(struct evq_fixture *efix,
21174fe6c29SRuslan Bukin 				     enum pt_event_binding evb,
21274fe6c29SRuslan Bukin 				     size_t num)
21374fe6c29SRuslan Bukin {
21474fe6c29SRuslan Bukin 	struct pt_event *in[evq_max], *out[evq_max], *ev;
21574fe6c29SRuslan Bukin 	size_t idx;
21674fe6c29SRuslan Bukin 
21774fe6c29SRuslan Bukin 	ptu_uint_le(num, evq_max - 2);
21874fe6c29SRuslan Bukin 
21974fe6c29SRuslan Bukin 	for (idx = 0; idx < (evq_max - 2); ++idx) {
22074fe6c29SRuslan Bukin 		in[idx] = pt_evq_enqueue(&efix->evq, evb);
22174fe6c29SRuslan Bukin 		ptu_ptr(in[idx]);
22274fe6c29SRuslan Bukin 	}
22374fe6c29SRuslan Bukin 
22474fe6c29SRuslan Bukin 	for (idx = 0; idx < num; ++idx) {
22574fe6c29SRuslan Bukin 		ev = pt_evq_enqueue(&efix->evq, evb);
22674fe6c29SRuslan Bukin 		ptu_null(ev);
22774fe6c29SRuslan Bukin 	}
22874fe6c29SRuslan Bukin 
22974fe6c29SRuslan Bukin 	for (idx = 0; idx < num; ++idx) {
23074fe6c29SRuslan Bukin 		out[idx] = pt_evq_dequeue(&efix->evq, evb);
23174fe6c29SRuslan Bukin 		ptu_ptr_eq(out[idx], in[idx]);
23274fe6c29SRuslan Bukin 	}
23374fe6c29SRuslan Bukin 
23474fe6c29SRuslan Bukin 	return ptu_passed();
23574fe6c29SRuslan Bukin }
23674fe6c29SRuslan Bukin 
clear_null(enum pt_event_binding evb)23774fe6c29SRuslan Bukin static struct ptunit_result clear_null(enum pt_event_binding evb)
23874fe6c29SRuslan Bukin {
23974fe6c29SRuslan Bukin 	int errcode;
24074fe6c29SRuslan Bukin 
24174fe6c29SRuslan Bukin 	errcode = pt_evq_clear(NULL, evb);
24274fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
24374fe6c29SRuslan Bukin 
24474fe6c29SRuslan Bukin 	return ptu_passed();
24574fe6c29SRuslan Bukin }
24674fe6c29SRuslan Bukin 
clear(struct evq_fixture * efix,enum pt_event_binding evb)24774fe6c29SRuslan Bukin static struct ptunit_result clear(struct evq_fixture *efix,
24874fe6c29SRuslan Bukin 				  enum pt_event_binding evb)
24974fe6c29SRuslan Bukin {
25074fe6c29SRuslan Bukin 	int errcode;
25174fe6c29SRuslan Bukin 
25274fe6c29SRuslan Bukin 	errcode = pt_evq_clear(&efix->evq, evb);
25374fe6c29SRuslan Bukin 	ptu_int_eq(errcode, 0);
25474fe6c29SRuslan Bukin 
25574fe6c29SRuslan Bukin 	ptu_test(evq_empty, efix, evb);
25674fe6c29SRuslan Bukin 
25774fe6c29SRuslan Bukin 	return ptu_passed();
25874fe6c29SRuslan Bukin }
25974fe6c29SRuslan Bukin 
empty_null(enum pt_event_binding evb)26074fe6c29SRuslan Bukin static struct ptunit_result empty_null(enum pt_event_binding evb)
26174fe6c29SRuslan Bukin {
26274fe6c29SRuslan Bukin 	int errcode;
26374fe6c29SRuslan Bukin 
26474fe6c29SRuslan Bukin 	errcode = pt_evq_empty(NULL, evb);
26574fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
26674fe6c29SRuslan Bukin 
26774fe6c29SRuslan Bukin 	return ptu_passed();
26874fe6c29SRuslan Bukin }
26974fe6c29SRuslan Bukin 
pending_null(enum pt_event_binding evb)27074fe6c29SRuslan Bukin static struct ptunit_result pending_null(enum pt_event_binding evb)
27174fe6c29SRuslan Bukin {
27274fe6c29SRuslan Bukin 	int errcode;
27374fe6c29SRuslan Bukin 
27474fe6c29SRuslan Bukin 	errcode = pt_evq_pending(NULL, evb);
27574fe6c29SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
27674fe6c29SRuslan Bukin 
27774fe6c29SRuslan Bukin 	return ptu_passed();
27874fe6c29SRuslan Bukin }
27974fe6c29SRuslan Bukin 
find_null(enum pt_event_binding evb,enum pt_event_type evt)28074fe6c29SRuslan Bukin static struct ptunit_result find_null(enum pt_event_binding evb,
28174fe6c29SRuslan Bukin 				      enum pt_event_type evt)
28274fe6c29SRuslan Bukin {
28374fe6c29SRuslan Bukin 	struct pt_event *ev;
28474fe6c29SRuslan Bukin 
28574fe6c29SRuslan Bukin 	ev = pt_evq_find(NULL, evb, evt);
28674fe6c29SRuslan Bukin 	ptu_null(ev);
28774fe6c29SRuslan Bukin 
28874fe6c29SRuslan Bukin 	return ptu_passed();
28974fe6c29SRuslan Bukin }
29074fe6c29SRuslan Bukin 
find_empty(struct evq_fixture * efix,enum pt_event_binding evb,enum pt_event_type evt)29174fe6c29SRuslan Bukin static struct ptunit_result find_empty(struct evq_fixture *efix,
29274fe6c29SRuslan Bukin 				       enum pt_event_binding evb,
29374fe6c29SRuslan Bukin 				       enum pt_event_type evt)
29474fe6c29SRuslan Bukin {
29574fe6c29SRuslan Bukin 	struct pt_event *ev;
29674fe6c29SRuslan Bukin 
29774fe6c29SRuslan Bukin 	ev = pt_evq_find(&efix->evq, evb, evt);
29874fe6c29SRuslan Bukin 	ptu_null(ev);
29974fe6c29SRuslan Bukin 
30074fe6c29SRuslan Bukin 	return ptu_passed();
30174fe6c29SRuslan Bukin }
30274fe6c29SRuslan Bukin 
find_none_evb(struct evq_fixture * efix,enum pt_event_binding evb,enum pt_event_type evt)30374fe6c29SRuslan Bukin static struct ptunit_result find_none_evb(struct evq_fixture *efix,
30474fe6c29SRuslan Bukin 					  enum pt_event_binding evb,
30574fe6c29SRuslan Bukin 					  enum pt_event_type evt)
30674fe6c29SRuslan Bukin {
30774fe6c29SRuslan Bukin 	struct pt_event *ev;
30874fe6c29SRuslan Bukin 	size_t other;
30974fe6c29SRuslan Bukin 
31074fe6c29SRuslan Bukin 	for (other = 0; other < evb_max; ++other) {
31174fe6c29SRuslan Bukin 		enum pt_event_binding ob;
31274fe6c29SRuslan Bukin 
31374fe6c29SRuslan Bukin 		ob = (enum pt_event_binding) other;
31474fe6c29SRuslan Bukin 		if (ob != evb) {
31574fe6c29SRuslan Bukin 			ev = pt_evq_enqueue(&efix->evq, ob);
31674fe6c29SRuslan Bukin 			ptu_ptr(ev);
31774fe6c29SRuslan Bukin 
31874fe6c29SRuslan Bukin 			ev->type = evt;
31974fe6c29SRuslan Bukin 		}
32074fe6c29SRuslan Bukin 	}
32174fe6c29SRuslan Bukin 
32274fe6c29SRuslan Bukin 	ev = pt_evq_find(&efix->evq, evb, evt);
32374fe6c29SRuslan Bukin 	ptu_null(ev);
32474fe6c29SRuslan Bukin 
32574fe6c29SRuslan Bukin 	return ptu_passed();
32674fe6c29SRuslan Bukin }
32774fe6c29SRuslan Bukin 
evq_enqueue_other(struct evq_fixture * efix,enum pt_event_binding evb,enum pt_event_type evt,size_t num)32874fe6c29SRuslan Bukin static struct ptunit_result evq_enqueue_other(struct evq_fixture *efix,
32974fe6c29SRuslan Bukin 					      enum pt_event_binding evb,
33074fe6c29SRuslan Bukin 					      enum pt_event_type evt,
33174fe6c29SRuslan Bukin 					      size_t num)
33274fe6c29SRuslan Bukin {
33374fe6c29SRuslan Bukin 	enum pt_event_type ot;
33474fe6c29SRuslan Bukin 	struct pt_event *ev;
33574fe6c29SRuslan Bukin 	size_t other;
33674fe6c29SRuslan Bukin 
33774fe6c29SRuslan Bukin 	for (other = 0; other < num; ++other) {
33874fe6c29SRuslan Bukin 		ot = (enum pt_event_type) other;
33974fe6c29SRuslan Bukin 		if (ot != evt) {
34074fe6c29SRuslan Bukin 			ev = pt_evq_enqueue(&efix->evq, evb);
34174fe6c29SRuslan Bukin 			ptu_ptr(ev);
34274fe6c29SRuslan Bukin 
34374fe6c29SRuslan Bukin 			ev->type = ot;
34474fe6c29SRuslan Bukin 		}
34574fe6c29SRuslan Bukin 	}
34674fe6c29SRuslan Bukin 
34774fe6c29SRuslan Bukin 	return ptu_passed();
34874fe6c29SRuslan Bukin }
34974fe6c29SRuslan Bukin 
find_none_evt(struct evq_fixture * efix,enum pt_event_binding evb,enum pt_event_type evt,size_t num)35074fe6c29SRuslan Bukin static struct ptunit_result find_none_evt(struct evq_fixture *efix,
35174fe6c29SRuslan Bukin 					  enum pt_event_binding evb,
35274fe6c29SRuslan Bukin 					  enum pt_event_type evt,
35374fe6c29SRuslan Bukin 					  size_t num)
35474fe6c29SRuslan Bukin {
35574fe6c29SRuslan Bukin 	struct pt_event *ev;
35674fe6c29SRuslan Bukin 
35774fe6c29SRuslan Bukin 	ptu_test(evq_enqueue_other, efix, evb, evt, num);
35874fe6c29SRuslan Bukin 
35974fe6c29SRuslan Bukin 	ev = pt_evq_find(&efix->evq, evb, evt);
36074fe6c29SRuslan Bukin 	ptu_null(ev);
36174fe6c29SRuslan Bukin 
36274fe6c29SRuslan Bukin 	return ptu_passed();
36374fe6c29SRuslan Bukin }
36474fe6c29SRuslan Bukin 
find(struct evq_fixture * efix,enum pt_event_binding evb,enum pt_event_type evt,size_t before,size_t after)36574fe6c29SRuslan Bukin static struct ptunit_result find(struct evq_fixture *efix,
36674fe6c29SRuslan Bukin 				 enum pt_event_binding evb,
36774fe6c29SRuslan Bukin 				 enum pt_event_type evt,
36874fe6c29SRuslan Bukin 				 size_t before, size_t after)
36974fe6c29SRuslan Bukin {
37074fe6c29SRuslan Bukin 	struct pt_event *in, *out;
37174fe6c29SRuslan Bukin 
37274fe6c29SRuslan Bukin 	ptu_test(evq_enqueue_other, efix, evb, evt, before);
37374fe6c29SRuslan Bukin 
37474fe6c29SRuslan Bukin 	in = pt_evq_enqueue(&efix->evq, evb);
37574fe6c29SRuslan Bukin 	ptu_ptr(in);
37674fe6c29SRuslan Bukin 
37774fe6c29SRuslan Bukin 	in->type = evt;
37874fe6c29SRuslan Bukin 
37974fe6c29SRuslan Bukin 	ptu_test(evq_enqueue_other, efix, evb, evt, after);
38074fe6c29SRuslan Bukin 
38174fe6c29SRuslan Bukin 	out = pt_evq_find(&efix->evq, evb, evt);
38274fe6c29SRuslan Bukin 	ptu_ptr_eq(out, in);
38374fe6c29SRuslan Bukin 
38474fe6c29SRuslan Bukin 	return ptu_passed();
38574fe6c29SRuslan Bukin }
38674fe6c29SRuslan Bukin 
main(int argc,char ** argv)38774fe6c29SRuslan Bukin int main(int argc, char **argv)
38874fe6c29SRuslan Bukin {
38974fe6c29SRuslan Bukin 	struct evq_fixture efix, pfix;
39074fe6c29SRuslan Bukin 	struct ptunit_suite suite;
39174fe6c29SRuslan Bukin 
39274fe6c29SRuslan Bukin 	efix.init = efix_init;
39374fe6c29SRuslan Bukin 	efix.fini = NULL;
39474fe6c29SRuslan Bukin 
39574fe6c29SRuslan Bukin 	pfix.init = efix_init_pending;
39674fe6c29SRuslan Bukin 	pfix.fini = NULL;
39774fe6c29SRuslan Bukin 
39874fe6c29SRuslan Bukin 	suite = ptunit_mk_suite(argc, argv);
39974fe6c29SRuslan Bukin 
40074fe6c29SRuslan Bukin 	ptu_run(suite, standalone_null);
40174fe6c29SRuslan Bukin 	ptu_run_f(suite, standalone, efix);
40274fe6c29SRuslan Bukin 
40374fe6c29SRuslan Bukin 	ptu_run_p(suite, enqueue_null, evb_psbend);
40474fe6c29SRuslan Bukin 	ptu_run_p(suite, enqueue_null, evb_tip);
40574fe6c29SRuslan Bukin 	ptu_run_p(suite, enqueue_null, evb_fup);
40674fe6c29SRuslan Bukin 
40774fe6c29SRuslan Bukin 	ptu_run_p(suite, dequeue_null, evb_psbend);
40874fe6c29SRuslan Bukin 	ptu_run_p(suite, dequeue_null, evb_tip);
40974fe6c29SRuslan Bukin 	ptu_run_p(suite, dequeue_null, evb_fup);
41074fe6c29SRuslan Bukin 
41174fe6c29SRuslan Bukin 	ptu_run_fp(suite, dequeue_empty, efix, evb_psbend);
41274fe6c29SRuslan Bukin 	ptu_run_fp(suite, dequeue_empty, efix, evb_tip);
41374fe6c29SRuslan Bukin 	ptu_run_fp(suite, dequeue_empty, efix, evb_fup);
41474fe6c29SRuslan Bukin 
41574fe6c29SRuslan Bukin 	ptu_run_fp(suite, enqueue_all_dequeue, efix, evb_psbend, 1);
41674fe6c29SRuslan Bukin 	ptu_run_fp(suite, enqueue_all_dequeue, efix, evb_psbend, 2);
41774fe6c29SRuslan Bukin 	ptu_run_fp(suite, enqueue_all_dequeue, efix, evb_tip, 1);
41874fe6c29SRuslan Bukin 	ptu_run_fp(suite, enqueue_all_dequeue, efix, evb_tip, 3);
41974fe6c29SRuslan Bukin 	ptu_run_fp(suite, enqueue_all_dequeue, efix, evb_fup, 1);
42074fe6c29SRuslan Bukin 	ptu_run_fp(suite, enqueue_all_dequeue, efix, evb_fup, 4);
42174fe6c29SRuslan Bukin 
42274fe6c29SRuslan Bukin 	ptu_run_fp(suite, enqueue_one_dequeue, efix, evb_psbend, evb_max * 2);
42374fe6c29SRuslan Bukin 	ptu_run_fp(suite, enqueue_one_dequeue, efix, evb_tip, evb_max * 2);
42474fe6c29SRuslan Bukin 	ptu_run_fp(suite, enqueue_one_dequeue, efix, evb_fup, evb_max * 2);
42574fe6c29SRuslan Bukin 
42674fe6c29SRuslan Bukin 	ptu_run_fp(suite, overflow, efix, evb_psbend, 1);
42774fe6c29SRuslan Bukin 	ptu_run_fp(suite, overflow, efix, evb_tip, 2);
42874fe6c29SRuslan Bukin 	ptu_run_fp(suite, overflow, efix, evb_fup, 3);
42974fe6c29SRuslan Bukin 
43074fe6c29SRuslan Bukin 	ptu_run_p(suite, clear_null, evb_psbend);
43174fe6c29SRuslan Bukin 	ptu_run_p(suite, clear_null, evb_tip);
43274fe6c29SRuslan Bukin 	ptu_run_p(suite, clear_null, evb_fup);
43374fe6c29SRuslan Bukin 
43474fe6c29SRuslan Bukin 	ptu_run_fp(suite, clear, efix, evb_psbend);
43574fe6c29SRuslan Bukin 	ptu_run_fp(suite, clear, pfix, evb_psbend);
43674fe6c29SRuslan Bukin 	ptu_run_fp(suite, clear, efix, evb_tip);
43774fe6c29SRuslan Bukin 	ptu_run_fp(suite, clear, pfix, evb_tip);
43874fe6c29SRuslan Bukin 	ptu_run_fp(suite, clear, efix, evb_fup);
43974fe6c29SRuslan Bukin 	ptu_run_fp(suite, clear, pfix, evb_fup);
44074fe6c29SRuslan Bukin 
44174fe6c29SRuslan Bukin 	ptu_run_p(suite, empty_null, evb_psbend);
44274fe6c29SRuslan Bukin 	ptu_run_p(suite, empty_null, evb_tip);
44374fe6c29SRuslan Bukin 	ptu_run_p(suite, empty_null, evb_fup);
44474fe6c29SRuslan Bukin 
44574fe6c29SRuslan Bukin 	ptu_run_p(suite, pending_null, evb_psbend);
44674fe6c29SRuslan Bukin 	ptu_run_p(suite, pending_null, evb_tip);
44774fe6c29SRuslan Bukin 	ptu_run_p(suite, pending_null, evb_fup);
44874fe6c29SRuslan Bukin 
44974fe6c29SRuslan Bukin 	ptu_run_p(suite, find_null, evb_psbend, ptev_enabled);
45074fe6c29SRuslan Bukin 	ptu_run_p(suite, find_null, evb_tip, ptev_disabled);
45174fe6c29SRuslan Bukin 	ptu_run_p(suite, find_null, evb_fup, ptev_paging);
45274fe6c29SRuslan Bukin 
45374fe6c29SRuslan Bukin 	ptu_run_fp(suite, find_empty, efix, evb_psbend, ptev_enabled);
45474fe6c29SRuslan Bukin 	ptu_run_fp(suite, find_empty, efix, evb_tip, ptev_disabled);
45574fe6c29SRuslan Bukin 	ptu_run_fp(suite, find_empty, efix, evb_fup, ptev_paging);
45674fe6c29SRuslan Bukin 
45774fe6c29SRuslan Bukin 	ptu_run_fp(suite, find_none_evb, efix, evb_psbend, ptev_enabled);
45874fe6c29SRuslan Bukin 	ptu_run_fp(suite, find_none_evb, efix, evb_tip, ptev_disabled);
45974fe6c29SRuslan Bukin 	ptu_run_fp(suite, find_none_evb, efix, evb_fup, ptev_paging);
46074fe6c29SRuslan Bukin 
46174fe6c29SRuslan Bukin 	ptu_run_fp(suite, find_none_evt, efix, evb_psbend, ptev_enabled, 3);
46274fe6c29SRuslan Bukin 	ptu_run_fp(suite, find_none_evt, efix, evb_tip, ptev_disabled, 4);
46374fe6c29SRuslan Bukin 	ptu_run_fp(suite, find_none_evt, efix, evb_fup, ptev_paging, 2);
46474fe6c29SRuslan Bukin 
46574fe6c29SRuslan Bukin 	ptu_run_fp(suite, find, efix, evb_psbend, ptev_enabled, 0, 3);
46674fe6c29SRuslan Bukin 	ptu_run_fp(suite, find, efix, evb_tip, ptev_disabled, 2, 0);
46774fe6c29SRuslan Bukin 	ptu_run_fp(suite, find, efix, evb_fup, ptev_paging, 1, 4);
46874fe6c29SRuslan Bukin 
46974fe6c29SRuslan Bukin 	return ptunit_report(&suite);
47074fe6c29SRuslan Bukin }
471