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