13 #define TEST_ASSERT_VAL(text, cond) \
16 pr_debug("FAILED %s:%d %s\n", __FILE__, __LINE__, text); \
21 static char *test_file(int size)
23 static char buf_templ[] = "/tmp/test-XXXXXX";
24 char *templ = buf_templ;
30 perror("mkstemp failed");
40 for (i = 0; i < size; i++)
41 buf[i] = (unsigned char) ((int) i % 10);
43 if (size != write(fd, buf, size))
50 #define TEST_FILE_SIZE (DSO__DATA_CACHE_SIZE * 20)
52 struct test_data_offset {
58 struct test_data_offset offsets[] = {
59 /* Fill first cache page. */
62 .data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
65 /* Read first cache page. */
68 .data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
71 /* Fill cache boundary pages. */
73 .offset = DSO__DATA_CACHE_SIZE - DSO__DATA_CACHE_SIZE % 10,
74 .data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
77 /* Read cache boundary pages. */
79 .offset = DSO__DATA_CACHE_SIZE - DSO__DATA_CACHE_SIZE % 10,
80 .data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
83 /* Fill final cache page. */
85 .offset = TEST_FILE_SIZE - 10,
86 .data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
89 /* Read final cache page. */
91 .offset = TEST_FILE_SIZE - 10,
92 .data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
95 /* Read final cache page. */
97 .offset = TEST_FILE_SIZE - 3,
98 .data = { 7, 8, 9, 0, 0, 0, 0, 0, 0, 0 },
103 int test__dso_data(void)
105 struct machine machine;
107 char *file = test_file(TEST_FILE_SIZE);
110 TEST_ASSERT_VAL("No test file", file);
112 memset(&machine, 0, sizeof(machine));
114 dso = dso__new((const char *)file);
116 /* Basic 10 bytes tests. */
117 for (i = 0; i < ARRAY_SIZE(offsets); i++) {
118 struct test_data_offset *data = &offsets[i];
123 size = dso__data_read_offset(dso, &machine, data->offset,
126 TEST_ASSERT_VAL("Wrong size", size == data->size);
127 TEST_ASSERT_VAL("Wrong data", !memcmp(buf, data->data, 10));
130 /* Read cross multiple cache pages. */
136 buf = malloc(TEST_FILE_SIZE);
137 TEST_ASSERT_VAL("ENOMEM\n", buf);
139 /* First iteration to fill caches, second one to read them. */
140 for (c = 0; c < 2; c++) {
141 memset(buf, 0, TEST_FILE_SIZE);
142 size = dso__data_read_offset(dso, &machine, 10,
143 buf, TEST_FILE_SIZE);
145 TEST_ASSERT_VAL("Wrong size",
146 size == (TEST_FILE_SIZE - 10));
148 for (i = 0; i < (size_t)size; i++)
149 TEST_ASSERT_VAL("Wrong data",