blob: 5eaffa2de9c5816399a2b455f25857fec46a9613 [file] [log] [blame]
Jiri Olsaf7add552012-07-22 14:14:40 +02001#include "util.h"
2
3#include <stdlib.h>
4#include <sys/types.h>
5#include <sys/stat.h>
6#include <fcntl.h>
7#include <string.h>
8
Arnaldo Carvalho de Melo69d25912012-11-09 11:32:52 -03009#include "machine.h"
Jiri Olsaf7add552012-07-22 14:14:40 +020010#include "symbol.h"
Jiri Olsac81251e2012-11-10 01:46:51 +010011#include "tests.h"
Jiri Olsaf7add552012-07-22 14:14:40 +020012
13#define TEST_ASSERT_VAL(text, cond) \
14do { \
15 if (!(cond)) { \
16 pr_debug("FAILED %s:%d %s\n", __FILE__, __LINE__, text); \
17 return -1; \
18 } \
19} while (0)
20
21static char *test_file(int size)
22{
23 static char buf_templ[] = "/tmp/test-XXXXXX";
24 char *templ = buf_templ;
25 int fd, i;
26 unsigned char *buf;
27
Irina Tirdea7b45f212012-09-08 03:43:21 +030028 fd = mkstemp(templ);
Jiri Olsaf95e0812012-11-10 01:46:52 +010029 if (fd < 0) {
30 perror("mkstemp failed");
31 return NULL;
32 }
Jiri Olsaf7add552012-07-22 14:14:40 +020033
34 buf = malloc(size);
35 if (!buf) {
36 close(fd);
37 return NULL;
38 }
39
40 for (i = 0; i < size; i++)
41 buf[i] = (unsigned char) ((int) i % 10);
42
43 if (size != write(fd, buf, size))
44 templ = NULL;
45
46 close(fd);
47 return templ;
48}
49
50#define TEST_FILE_SIZE (DSO__DATA_CACHE_SIZE * 20)
51
52struct test_data_offset {
53 off_t offset;
54 u8 data[10];
55 int size;
56};
57
58struct test_data_offset offsets[] = {
59 /* Fill first cache page. */
60 {
61 .offset = 10,
62 .data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
63 .size = 10,
64 },
65 /* Read first cache page. */
66 {
67 .offset = 10,
68 .data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
69 .size = 10,
70 },
71 /* Fill cache boundary pages. */
72 {
73 .offset = DSO__DATA_CACHE_SIZE - DSO__DATA_CACHE_SIZE % 10,
74 .data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
75 .size = 10,
76 },
77 /* Read cache boundary pages. */
78 {
79 .offset = DSO__DATA_CACHE_SIZE - DSO__DATA_CACHE_SIZE % 10,
80 .data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
81 .size = 10,
82 },
83 /* Fill final cache page. */
84 {
85 .offset = TEST_FILE_SIZE - 10,
86 .data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
87 .size = 10,
88 },
89 /* Read final cache page. */
90 {
91 .offset = TEST_FILE_SIZE - 10,
92 .data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
93 .size = 10,
94 },
95 /* Read final cache page. */
96 {
97 .offset = TEST_FILE_SIZE - 3,
98 .data = { 7, 8, 9, 0, 0, 0, 0, 0, 0, 0 },
99 .size = 3,
100 },
101};
102
Jiri Olsac81251e2012-11-10 01:46:51 +0100103int test__dso_data(void)
Jiri Olsaf7add552012-07-22 14:14:40 +0200104{
105 struct machine machine;
106 struct dso *dso;
107 char *file = test_file(TEST_FILE_SIZE);
108 size_t i;
109
110 TEST_ASSERT_VAL("No test file", file);
111
112 memset(&machine, 0, sizeof(machine));
113
114 dso = dso__new((const char *)file);
115
116 /* Basic 10 bytes tests. */
117 for (i = 0; i < ARRAY_SIZE(offsets); i++) {
118 struct test_data_offset *data = &offsets[i];
119 ssize_t size;
120 u8 buf[10];
121
122 memset(buf, 0, 10);
123 size = dso__data_read_offset(dso, &machine, data->offset,
124 buf, 10);
125
126 TEST_ASSERT_VAL("Wrong size", size == data->size);
127 TEST_ASSERT_VAL("Wrong data", !memcmp(buf, data->data, 10));
128 }
129
130 /* Read cross multiple cache pages. */
131 {
132 ssize_t size;
133 int c;
134 u8 *buf;
135
136 buf = malloc(TEST_FILE_SIZE);
137 TEST_ASSERT_VAL("ENOMEM\n", buf);
138
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);
144
145 TEST_ASSERT_VAL("Wrong size",
146 size == (TEST_FILE_SIZE - 10));
147
148 for (i = 0; i < (size_t)size; i++)
149 TEST_ASSERT_VAL("Wrong data",
150 buf[i] == (i % 10));
151 }
152
153 free(buf);
154 }
155
156 dso__delete(dso);
157 unlink(file);
158 return 0;
159}