#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "tests.h"
#include "util.h"
#include "session.h"
#include "evlist.h"
#include "debug.h"

#define TEMPL "/tmp/perf-test-XXXXXX"
#define DATA_SIZE	10

static int get_temp(char *path)
{
	int fd;

	strcpy(path, TEMPL);

	fd = mkstemp(path);
	if (fd < 0) {
		perror("mkstemp failed");
		return -1;
	}

	close(fd);
	return 0;
}

static int session_write_header(char *path)
{
	struct perf_session *session;
	struct perf_data_file file = {
		.path = path,
		.mode = PERF_DATA_MODE_WRITE,
	};

	session = perf_session__new(&file, false, NULL);
	TEST_ASSERT_VAL("can't get session", session);

	session->evlist = perf_evlist__new_default();
	TEST_ASSERT_VAL("can't get evlist", session->evlist);

	perf_header__set_feat(&session->header, HEADER_CPU_TOPOLOGY);
	perf_header__set_feat(&session->header, HEADER_NRCPUS);

	session->header.data_size += DATA_SIZE;

	TEST_ASSERT_VAL("failed to write header",
			!perf_session__write_header(session, session->evlist, file.fd, true));

	perf_session__delete(session);

	return 0;
}

static int check_cpu_topology(char *path, struct cpu_map *map)
{
	struct perf_session *session;
	struct perf_data_file file = {
		.path = path,
		.mode = PERF_DATA_MODE_READ,
	};
	int i;

	session = perf_session__new(&file, false, NULL);
	TEST_ASSERT_VAL("can't get session", session);

	for (i = 0; i < session->header.env.nr_cpus_online; i++) {
		pr_debug("CPU %d, core %d, socket %d\n", i,
			 session->header.env.cpu[i].core_id,
			 session->header.env.cpu[i].socket_id);
	}

	for (i = 0; i < map->nr; i++) {
		TEST_ASSERT_VAL("Core ID doesn't match",
			(session->header.env.cpu[map->map[i]].core_id == (cpu_map__get_core(map, i, NULL) & 0xffff)));

		TEST_ASSERT_VAL("Socket ID doesn't match",
			(session->header.env.cpu[map->map[i]].socket_id == cpu_map__get_socket(map, i, NULL)));
	}

	perf_session__delete(session);

	return 0;
}

int test_session_topology(int subtest __maybe_unused)
{
	char path[PATH_MAX];
	struct cpu_map *map;
	int ret = -1;

	TEST_ASSERT_VAL("can't get templ file", !get_temp(path));

	pr_debug("templ file: %s\n", path);

	if (session_write_header(path))
		goto free_path;

	map = cpu_map__new(NULL);
	if (map == NULL) {
		pr_debug("failed to get system cpumap\n");
		goto free_path;
	}

	if (check_cpu_topology(path, map))
		goto free_map;
	ret = 0;

free_map:
	cpu_map__put(map);
free_path:
	unlink(path);
	return ret;
}
nds-private-remove'/><input type='hidden' name='id' value='f26e8817b235d8764363bffcc9cbfc61867371f2'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/cgit.cgi/linux/net-next.git/commit/?h=nds-private-remove&amp;id=f26e8817b235d8764363bffcc9cbfc61867371f2'>root</a>/<a href='/cgit.cgi/linux/net-next.git/commit/include?h=nds-private-remove&amp;id=f26e8817b235d8764363bffcc9cbfc61867371f2'>include</a>/<a href='/cgit.cgi/linux/net-next.git/commit/include/trace?h=nds-private-remove&amp;id=f26e8817b235d8764363bffcc9cbfc61867371f2'>trace</a>/<a href='/cgit.cgi/linux/net-next.git/commit/include/trace/events?h=nds-private-remove&amp;id=f26e8817b235d8764363bffcc9cbfc61867371f2'>events</a></div><div class='content'><div class='cgit-panel'><b>diff options</b><form method='get'><input type='hidden' name='h' value='nds-private-remove'/><input type='hidden' name='id' value='f26e8817b235d8764363bffcc9cbfc61867371f2'/><table><tr><td colspan='2'/></tr><tr><td class='label'>context:</td><td class='ctrl'><select name='context' onchange='this.form.submit();'><option value='1'>1</option><option value='2'>2</option><option value='3' selected='selected'>3</option><option value='4'>4</option><option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option><option value='10'>10</option><option value='15'>15</option><option value='20'>20</option><option value='25'>25</option><option value='30'>30</option><option value='35'>35</option><option value='40'>40</option></select></td></tr><tr><td class='label'>space:</td><td class='ctrl'><select name='ignorews' onchange='this.form.submit();'><option value='0' selected='selected'>include</option><option value='1'>ignore</option></select></td></tr><tr><td class='label'>mode:</td><td class='ctrl'><select name='dt' onchange='this.form.submit();'><option value='0' selected='selected'>unified</option><option value='1'>ssdiff</option><option value='2'>stat only</option></select></td></tr><tr><td/><td class='ctrl'><noscript><input type='submit' value='reload'/></noscript></td></tr></table></form></div><table summary='commit info' class='commit-info'>
<tr><th>author</th><td>Dmitry Torokhov &lt;dmitry.torokhov@gmail.com&gt;</td><td class='right'>2016-12-16 09:31:17 -0800</td></tr>
<tr><th>committer</th><td>Dmitry Torokhov &lt;dmitry.torokhov@gmail.com&gt;</td><td class='right'>2016-12-16 09:31:17 -0800</td></tr>
<tr><th>commit</th><td colspan='2' class='oid'><a href='/cgit.cgi/linux/net-next.git/commit/include/trace/events?h=nds-private-remove&amp;id=f26e8817b235d8764363bffcc9cbfc61867371f2'>f26e8817b235d8764363bffcc9cbfc61867371f2</a> (<a href='/cgit.cgi/linux/net-next.git/patch/include/trace/events?id=f26e8817b235d8764363bffcc9cbfc61867371f2'>patch</a>)</td></tr>
<tr><th>tree</th><td colspan='2' class='oid'><a href='/cgit.cgi/linux/net-next.git/tree/?h=nds-private-remove&amp;id=f26e8817b235d8764363bffcc9cbfc61867371f2'>6546ea2cf91b78f1ada2161db61e21085c880740</a> /<a href='/cgit.cgi/linux/net-next.git/tree/include/trace/events?h=nds-private-remove&amp;id=f26e8817b235d8764363bffcc9cbfc61867371f2'>include/trace/events</a></td></tr>
<tr><th>parent</th><td colspan='2' class='oid'><a href='/cgit.cgi/linux/net-next.git/commit/include/trace/events?h=nds-private-remove&amp;id=2425f1808123bf69a8f66d4ec90e0d0e302c2613'>2425f1808123bf69a8f66d4ec90e0d0e302c2613</a> (<a href='/cgit.cgi/linux/net-next.git/diff/include/trace/events?h=nds-private-remove&amp;id=f26e8817b235d8764363bffcc9cbfc61867371f2&amp;id2=2425f1808123bf69a8f66d4ec90e0d0e302c2613'>diff</a>)</td></tr><tr><th>parent</th><td colspan='2' class='oid'><a href='/cgit.cgi/linux/net-next.git/commit/include/trace/events?h=nds-private-remove&amp;id=ebfb0184ef560897fad35005989e82433419202c'>ebfb0184ef560897fad35005989e82433419202c</a> (<a href='/cgit.cgi/linux/net-next.git/diff/include/trace/events?h=nds-private-remove&amp;id=f26e8817b235d8764363bffcc9cbfc61867371f2&amp;id2=ebfb0184ef560897fad35005989e82433419202c'>diff</a>)</td></tr></table>
<div class='commit-subject'>Merge branch 'next' into for-linus</div><div class='commit-msg'>Prepare input updates for 4.10 merge window.
</div><div class='diffstat-header'><a href='/cgit.cgi/linux/net-next.git/diff/?h=nds-private-remove&amp;id=f26e8817b235d8764363bffcc9cbfc61867371f2'>Diffstat</a> (limited to 'include/trace/events')</div><table summary='diffstat' class='diffstat'>