185f87cf4SRuslan Bukin /*
285f87cf4SRuslan Bukin  * Copyright (c) 2019, Intel Corporation
385f87cf4SRuslan Bukin  *
485f87cf4SRuslan Bukin  * Redistribution and use in source and binary forms, with or without
585f87cf4SRuslan Bukin  * modification, are permitted provided that the following conditions are met:
685f87cf4SRuslan Bukin  *
785f87cf4SRuslan Bukin  *  * Redistributions of source code must retain the above copyright notice,
885f87cf4SRuslan Bukin  *    this list of conditions and the following disclaimer.
985f87cf4SRuslan Bukin  *  * Redistributions in binary form must reproduce the above copyright notice,
1085f87cf4SRuslan Bukin  *    this list of conditions and the following disclaimer in the documentation
1185f87cf4SRuslan Bukin  *    and/or other materials provided with the distribution.
1285f87cf4SRuslan Bukin  *  * Neither the name of Intel Corporation nor the names of its contributors
1385f87cf4SRuslan Bukin  *    may be used to endorse or promote products derived from this software
1485f87cf4SRuslan Bukin  *    without specific prior written permission.
1585f87cf4SRuslan Bukin  *
1685f87cf4SRuslan Bukin  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1785f87cf4SRuslan Bukin  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1885f87cf4SRuslan Bukin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1985f87cf4SRuslan Bukin  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2085f87cf4SRuslan Bukin  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2185f87cf4SRuslan Bukin  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2285f87cf4SRuslan Bukin  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2385f87cf4SRuslan Bukin  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2485f87cf4SRuslan Bukin  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2585f87cf4SRuslan Bukin  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2685f87cf4SRuslan Bukin  * POSSIBILITY OF SUCH DAMAGE.
2785f87cf4SRuslan Bukin  */
2885f87cf4SRuslan Bukin 
2985f87cf4SRuslan Bukin #include "ptunit.h"
3085f87cf4SRuslan Bukin 
3185f87cf4SRuslan Bukin #include "pt_block_decoder.h"
3285f87cf4SRuslan Bukin 
3385f87cf4SRuslan Bukin #include "intel-pt.h"
3485f87cf4SRuslan Bukin 
3585f87cf4SRuslan Bukin 
3685f87cf4SRuslan Bukin /* A test fixture providing a decoder operating on a small buffer. */
3785f87cf4SRuslan Bukin struct test_fixture {
3885f87cf4SRuslan Bukin 	/* The packet_decoder. */
3985f87cf4SRuslan Bukin 	struct pt_block_decoder decoder;
4085f87cf4SRuslan Bukin 
4185f87cf4SRuslan Bukin 	/* The configuration. */
4285f87cf4SRuslan Bukin 	struct pt_config config;
4385f87cf4SRuslan Bukin 
4485f87cf4SRuslan Bukin 	/* The buffer it operates on. */
4585f87cf4SRuslan Bukin 	uint8_t buffer[24];
4685f87cf4SRuslan Bukin 
4785f87cf4SRuslan Bukin 	/* The test fixture initialization and finalization functions. */
4885f87cf4SRuslan Bukin 	struct ptunit_result (*init)(struct test_fixture *tfix);
4985f87cf4SRuslan Bukin 	struct ptunit_result (*fini)(struct test_fixture *tfix);
5085f87cf4SRuslan Bukin };
5185f87cf4SRuslan Bukin 
tfix_init(struct test_fixture * tfix)5285f87cf4SRuslan Bukin static struct ptunit_result tfix_init(struct test_fixture *tfix)
5385f87cf4SRuslan Bukin {
5485f87cf4SRuslan Bukin 	struct pt_config *config;
5585f87cf4SRuslan Bukin 	uint8_t *buffer;
5685f87cf4SRuslan Bukin 	int errcode;
5785f87cf4SRuslan Bukin 
5885f87cf4SRuslan Bukin 	config = &tfix->config;
5985f87cf4SRuslan Bukin 	buffer = tfix->buffer;
6085f87cf4SRuslan Bukin 
6185f87cf4SRuslan Bukin 	memset(buffer, 0, sizeof(tfix->buffer));
6285f87cf4SRuslan Bukin 
6385f87cf4SRuslan Bukin 	pt_config_init(config);
6485f87cf4SRuslan Bukin 	config->begin = buffer;
6585f87cf4SRuslan Bukin 	config->end = buffer + sizeof(tfix->buffer);
6685f87cf4SRuslan Bukin 
6785f87cf4SRuslan Bukin 	errcode = pt_blk_decoder_init(&tfix->decoder, config);
6885f87cf4SRuslan Bukin 	ptu_int_eq(errcode, 0);
6985f87cf4SRuslan Bukin 
7085f87cf4SRuslan Bukin 	return ptu_passed();
7185f87cf4SRuslan Bukin }
7285f87cf4SRuslan Bukin 
decoder_init_null(void)7385f87cf4SRuslan Bukin static struct ptunit_result decoder_init_null(void)
7485f87cf4SRuslan Bukin {
7585f87cf4SRuslan Bukin 	struct pt_block_decoder decoder;
7685f87cf4SRuslan Bukin 	struct pt_config config;
7785f87cf4SRuslan Bukin 	int errcode;
7885f87cf4SRuslan Bukin 
7985f87cf4SRuslan Bukin 	errcode = pt_blk_decoder_init(NULL, &config);
8085f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_internal);
8185f87cf4SRuslan Bukin 
8285f87cf4SRuslan Bukin 	errcode = pt_blk_decoder_init(&decoder, NULL);
8385f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
8485f87cf4SRuslan Bukin 
8585f87cf4SRuslan Bukin 	return ptu_passed();
8685f87cf4SRuslan Bukin }
8785f87cf4SRuslan Bukin 
decoder_fini_null(void)8885f87cf4SRuslan Bukin static struct ptunit_result decoder_fini_null(void)
8985f87cf4SRuslan Bukin {
9085f87cf4SRuslan Bukin 	pt_blk_decoder_fini(NULL);
9185f87cf4SRuslan Bukin 
9285f87cf4SRuslan Bukin 	return ptu_passed();
9385f87cf4SRuslan Bukin }
9485f87cf4SRuslan Bukin 
alloc_decoder_null(void)9585f87cf4SRuslan Bukin static struct ptunit_result alloc_decoder_null(void)
9685f87cf4SRuslan Bukin {
9785f87cf4SRuslan Bukin 	struct pt_block_decoder *decoder;
9885f87cf4SRuslan Bukin 
9985f87cf4SRuslan Bukin 	decoder = pt_blk_alloc_decoder(NULL);
10085f87cf4SRuslan Bukin 	ptu_null(decoder);
10185f87cf4SRuslan Bukin 
10285f87cf4SRuslan Bukin 	return ptu_passed();
10385f87cf4SRuslan Bukin }
10485f87cf4SRuslan Bukin 
free_decoder_null(void)10585f87cf4SRuslan Bukin static struct ptunit_result free_decoder_null(void)
10685f87cf4SRuslan Bukin {
10785f87cf4SRuslan Bukin 	pt_blk_free_decoder(NULL);
10885f87cf4SRuslan Bukin 
10985f87cf4SRuslan Bukin 	return ptu_passed();
11085f87cf4SRuslan Bukin }
11185f87cf4SRuslan Bukin 
sync_forward_null(void)11285f87cf4SRuslan Bukin static struct ptunit_result sync_forward_null(void)
11385f87cf4SRuslan Bukin {
11485f87cf4SRuslan Bukin 	int errcode;
11585f87cf4SRuslan Bukin 
11685f87cf4SRuslan Bukin 	errcode = pt_blk_sync_forward(NULL);
11785f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
11885f87cf4SRuslan Bukin 
11985f87cf4SRuslan Bukin 	return ptu_passed();
12085f87cf4SRuslan Bukin }
12185f87cf4SRuslan Bukin 
sync_backward_null(void)12285f87cf4SRuslan Bukin static struct ptunit_result sync_backward_null(void)
12385f87cf4SRuslan Bukin {
12485f87cf4SRuslan Bukin 	int errcode;
12585f87cf4SRuslan Bukin 
12685f87cf4SRuslan Bukin 	errcode = pt_blk_sync_backward(NULL);
12785f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
12885f87cf4SRuslan Bukin 
12985f87cf4SRuslan Bukin 	return ptu_passed();
13085f87cf4SRuslan Bukin }
13185f87cf4SRuslan Bukin 
sync_set_null(void)13285f87cf4SRuslan Bukin static struct ptunit_result sync_set_null(void)
13385f87cf4SRuslan Bukin {
13485f87cf4SRuslan Bukin 	int errcode;
13585f87cf4SRuslan Bukin 
13685f87cf4SRuslan Bukin 	errcode = pt_blk_sync_set(NULL, 0ull);
13785f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
13885f87cf4SRuslan Bukin 
13985f87cf4SRuslan Bukin 	return ptu_passed();
14085f87cf4SRuslan Bukin }
14185f87cf4SRuslan Bukin 
sync_set_eos(struct test_fixture * tfix)14285f87cf4SRuslan Bukin static struct ptunit_result sync_set_eos(struct test_fixture *tfix)
14385f87cf4SRuslan Bukin {
14485f87cf4SRuslan Bukin 	int errcode;
14585f87cf4SRuslan Bukin 
14685f87cf4SRuslan Bukin 	errcode = pt_blk_sync_set(&tfix->decoder, sizeof(tfix->buffer) + 1);
14785f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_eos);
14885f87cf4SRuslan Bukin 
14985f87cf4SRuslan Bukin 	return ptu_passed();
15085f87cf4SRuslan Bukin }
15185f87cf4SRuslan Bukin 
get_offset_null(void)15285f87cf4SRuslan Bukin static struct ptunit_result get_offset_null(void)
15385f87cf4SRuslan Bukin {
15485f87cf4SRuslan Bukin 	struct pt_block_decoder decoder;
15585f87cf4SRuslan Bukin 	uint64_t offset;
15685f87cf4SRuslan Bukin 	int errcode;
15785f87cf4SRuslan Bukin 
15885f87cf4SRuslan Bukin 	errcode = pt_blk_get_offset(NULL, &offset);
15985f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
16085f87cf4SRuslan Bukin 
16185f87cf4SRuslan Bukin 	errcode = pt_blk_get_offset(&decoder, NULL);
16285f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
16385f87cf4SRuslan Bukin 
16485f87cf4SRuslan Bukin 	return ptu_passed();
16585f87cf4SRuslan Bukin }
16685f87cf4SRuslan Bukin 
get_offset_init(struct test_fixture * tfix)16785f87cf4SRuslan Bukin static struct ptunit_result get_offset_init(struct test_fixture *tfix)
16885f87cf4SRuslan Bukin {
16985f87cf4SRuslan Bukin 	uint64_t offset;
17085f87cf4SRuslan Bukin 	int errcode;
17185f87cf4SRuslan Bukin 
17285f87cf4SRuslan Bukin 	errcode = pt_blk_get_offset(&tfix->decoder, &offset);
17385f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_nosync);
17485f87cf4SRuslan Bukin 
17585f87cf4SRuslan Bukin 	return ptu_passed();
17685f87cf4SRuslan Bukin }
17785f87cf4SRuslan Bukin 
get_sync_offset_null(void)17885f87cf4SRuslan Bukin static struct ptunit_result get_sync_offset_null(void)
17985f87cf4SRuslan Bukin {
18085f87cf4SRuslan Bukin 	struct pt_block_decoder decoder;
18185f87cf4SRuslan Bukin 	uint64_t offset;
18285f87cf4SRuslan Bukin 	int errcode;
18385f87cf4SRuslan Bukin 
18485f87cf4SRuslan Bukin 	errcode = pt_blk_get_sync_offset(NULL, &offset);
18585f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
18685f87cf4SRuslan Bukin 
18785f87cf4SRuslan Bukin 	errcode = pt_blk_get_sync_offset(&decoder, NULL);
18885f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
18985f87cf4SRuslan Bukin 
19085f87cf4SRuslan Bukin 	return ptu_passed();
19185f87cf4SRuslan Bukin }
19285f87cf4SRuslan Bukin 
get_image_null(void)19385f87cf4SRuslan Bukin static struct ptunit_result get_image_null(void)
19485f87cf4SRuslan Bukin {
19585f87cf4SRuslan Bukin 	const struct pt_image *image;
19685f87cf4SRuslan Bukin 
19785f87cf4SRuslan Bukin 	image = pt_blk_get_image(NULL);
19885f87cf4SRuslan Bukin 	ptu_null(image);
19985f87cf4SRuslan Bukin 
20085f87cf4SRuslan Bukin 	return ptu_passed();
20185f87cf4SRuslan Bukin }
20285f87cf4SRuslan Bukin 
set_image_null(void)20385f87cf4SRuslan Bukin static struct ptunit_result set_image_null(void)
20485f87cf4SRuslan Bukin {
20585f87cf4SRuslan Bukin 	struct pt_image image;
20685f87cf4SRuslan Bukin 	int errcode;
20785f87cf4SRuslan Bukin 
20885f87cf4SRuslan Bukin 	errcode = pt_blk_set_image(NULL, &image);
20985f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
21085f87cf4SRuslan Bukin 
21185f87cf4SRuslan Bukin 	errcode = pt_blk_set_image(NULL, NULL);
21285f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
21385f87cf4SRuslan Bukin 
21485f87cf4SRuslan Bukin 	return ptu_passed();
21585f87cf4SRuslan Bukin }
21685f87cf4SRuslan Bukin 
get_config_null(void)21785f87cf4SRuslan Bukin static struct ptunit_result get_config_null(void)
21885f87cf4SRuslan Bukin {
21985f87cf4SRuslan Bukin 	const struct pt_config *config;
22085f87cf4SRuslan Bukin 
22185f87cf4SRuslan Bukin 	config = pt_blk_get_config(NULL);
22285f87cf4SRuslan Bukin 	ptu_null(config);
22385f87cf4SRuslan Bukin 
22485f87cf4SRuslan Bukin 	return ptu_passed();
22585f87cf4SRuslan Bukin }
22685f87cf4SRuslan Bukin 
get_config(struct test_fixture * tfix)22785f87cf4SRuslan Bukin static struct ptunit_result get_config(struct test_fixture *tfix)
22885f87cf4SRuslan Bukin {
22985f87cf4SRuslan Bukin 	const struct pt_config *config;
23085f87cf4SRuslan Bukin 
23185f87cf4SRuslan Bukin 	config = pt_blk_get_config(&tfix->decoder);
23285f87cf4SRuslan Bukin 	ptu_ptr(config);
23385f87cf4SRuslan Bukin 
23485f87cf4SRuslan Bukin 	return ptu_passed();
23585f87cf4SRuslan Bukin }
23685f87cf4SRuslan Bukin 
time_null(void)23785f87cf4SRuslan Bukin static struct ptunit_result time_null(void)
23885f87cf4SRuslan Bukin {
23985f87cf4SRuslan Bukin 	struct pt_block_decoder decoder;
24085f87cf4SRuslan Bukin 	uint64_t time;
24185f87cf4SRuslan Bukin 	uint32_t lost_mtc, lost_cyc;
24285f87cf4SRuslan Bukin 	int errcode;
24385f87cf4SRuslan Bukin 
24485f87cf4SRuslan Bukin 	errcode = pt_blk_time(NULL, &time, &lost_mtc, &lost_cyc);
24585f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
24685f87cf4SRuslan Bukin 
24785f87cf4SRuslan Bukin 	errcode = pt_blk_time(&decoder, NULL, &lost_mtc, &lost_cyc);
24885f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
24985f87cf4SRuslan Bukin 
25085f87cf4SRuslan Bukin 	return ptu_passed();
25185f87cf4SRuslan Bukin }
25285f87cf4SRuslan Bukin 
cbr_null(void)25385f87cf4SRuslan Bukin static struct ptunit_result cbr_null(void)
25485f87cf4SRuslan Bukin {
25585f87cf4SRuslan Bukin 	struct pt_block_decoder decoder;
25685f87cf4SRuslan Bukin 	uint32_t cbr;
25785f87cf4SRuslan Bukin 	int errcode;
25885f87cf4SRuslan Bukin 
25985f87cf4SRuslan Bukin 	errcode = pt_blk_core_bus_ratio(NULL, &cbr);
26085f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
26185f87cf4SRuslan Bukin 
26285f87cf4SRuslan Bukin 	errcode = pt_blk_core_bus_ratio(&decoder, NULL);
26385f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
26485f87cf4SRuslan Bukin 
26585f87cf4SRuslan Bukin 	return ptu_passed();
26685f87cf4SRuslan Bukin }
26785f87cf4SRuslan Bukin 
asid_null(void)26885f87cf4SRuslan Bukin static struct ptunit_result asid_null(void)
26985f87cf4SRuslan Bukin {
27085f87cf4SRuslan Bukin 	struct pt_block_decoder decoder;
27185f87cf4SRuslan Bukin 	struct pt_asid asid;
27285f87cf4SRuslan Bukin 	int errcode;
27385f87cf4SRuslan Bukin 
27485f87cf4SRuslan Bukin 	errcode = pt_blk_asid(NULL, &asid, sizeof(asid));
27585f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
27685f87cf4SRuslan Bukin 
27785f87cf4SRuslan Bukin 	errcode = pt_blk_asid(&decoder, NULL, sizeof(asid));
27885f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
27985f87cf4SRuslan Bukin 
28085f87cf4SRuslan Bukin 	return ptu_passed();
28185f87cf4SRuslan Bukin }
28285f87cf4SRuslan Bukin 
next_null(void)28385f87cf4SRuslan Bukin static struct ptunit_result next_null(void)
28485f87cf4SRuslan Bukin {
28585f87cf4SRuslan Bukin 	struct pt_block_decoder decoder;
28685f87cf4SRuslan Bukin 	struct pt_block block;
28785f87cf4SRuslan Bukin 	int errcode;
28885f87cf4SRuslan Bukin 
28985f87cf4SRuslan Bukin 	errcode = pt_blk_next(NULL, &block, sizeof(block));
29085f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
29185f87cf4SRuslan Bukin 
29285f87cf4SRuslan Bukin 	errcode = pt_blk_next(&decoder, NULL, sizeof(block));
29385f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
29485f87cf4SRuslan Bukin 
29585f87cf4SRuslan Bukin 	return ptu_passed();
29685f87cf4SRuslan Bukin }
29785f87cf4SRuslan Bukin 
event_null(void)29885f87cf4SRuslan Bukin static struct ptunit_result event_null(void)
29985f87cf4SRuslan Bukin {
30085f87cf4SRuslan Bukin 	struct pt_block_decoder decoder;
30185f87cf4SRuslan Bukin 	struct pt_event event;
30285f87cf4SRuslan Bukin 	int errcode;
30385f87cf4SRuslan Bukin 
30485f87cf4SRuslan Bukin 	errcode = pt_blk_event(NULL, &event, sizeof(event));
30585f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
30685f87cf4SRuslan Bukin 
30785f87cf4SRuslan Bukin 	errcode = pt_blk_event(&decoder, NULL, sizeof(event));
30885f87cf4SRuslan Bukin 	ptu_int_eq(errcode, -pte_invalid);
30985f87cf4SRuslan Bukin 
31085f87cf4SRuslan Bukin 	return ptu_passed();
31185f87cf4SRuslan Bukin }
31285f87cf4SRuslan Bukin 
main(int argc,char ** argv)31385f87cf4SRuslan Bukin int main(int argc, char **argv)
31485f87cf4SRuslan Bukin {
31585f87cf4SRuslan Bukin 	struct test_fixture tfix;
31685f87cf4SRuslan Bukin 	struct ptunit_suite suite;
31785f87cf4SRuslan Bukin 
31885f87cf4SRuslan Bukin 	tfix.init = tfix_init;
31985f87cf4SRuslan Bukin 	tfix.fini = NULL;
32085f87cf4SRuslan Bukin 
32185f87cf4SRuslan Bukin 	suite = ptunit_mk_suite(argc, argv);
32285f87cf4SRuslan Bukin 
32385f87cf4SRuslan Bukin 	ptu_run(suite, decoder_init_null);
32485f87cf4SRuslan Bukin 	ptu_run(suite, decoder_fini_null);
32585f87cf4SRuslan Bukin 	ptu_run(suite, alloc_decoder_null);
32685f87cf4SRuslan Bukin 	ptu_run(suite, free_decoder_null);
32785f87cf4SRuslan Bukin 
32885f87cf4SRuslan Bukin 	ptu_run(suite, sync_forward_null);
32985f87cf4SRuslan Bukin 	ptu_run(suite, sync_backward_null);
33085f87cf4SRuslan Bukin 	ptu_run(suite, sync_set_null);
33185f87cf4SRuslan Bukin 	ptu_run_f(suite, sync_set_eos, tfix);
33285f87cf4SRuslan Bukin 
33385f87cf4SRuslan Bukin 	ptu_run(suite, get_offset_null);
33485f87cf4SRuslan Bukin 	ptu_run_f(suite, get_offset_init, tfix);
33585f87cf4SRuslan Bukin 	ptu_run(suite, get_sync_offset_null);
33685f87cf4SRuslan Bukin 
33785f87cf4SRuslan Bukin 	ptu_run(suite, get_image_null);
33885f87cf4SRuslan Bukin 	ptu_run(suite, set_image_null);
33985f87cf4SRuslan Bukin 
34085f87cf4SRuslan Bukin 	ptu_run(suite, get_config_null);
34185f87cf4SRuslan Bukin 	ptu_run_f(suite, get_config, tfix);
34285f87cf4SRuslan Bukin 
34385f87cf4SRuslan Bukin 	ptu_run(suite, time_null);
34485f87cf4SRuslan Bukin 	ptu_run(suite, cbr_null);
34585f87cf4SRuslan Bukin 	ptu_run(suite, asid_null);
34685f87cf4SRuslan Bukin 
34785f87cf4SRuslan Bukin 	ptu_run(suite, next_null);
34885f87cf4SRuslan Bukin 	ptu_run(suite, event_null);
34985f87cf4SRuslan Bukin 
35085f87cf4SRuslan Bukin 	return ptunit_report(&suite);
35185f87cf4SRuslan Bukin }
352