1*58e6ee5fSAndroid Build Coastguard Worker // SPDX-License-Identifier: LGPL-2.1
2*58e6ee5fSAndroid Build Coastguard Worker /*
3*58e6ee5fSAndroid Build Coastguard Worker * Copyright (C) 2020, VMware, Tzvetomir Stoyanov <[email protected]>
4*58e6ee5fSAndroid Build Coastguard Worker *
5*58e6ee5fSAndroid Build Coastguard Worker */
6*58e6ee5fSAndroid Build Coastguard Worker #include <stdio.h>
7*58e6ee5fSAndroid Build Coastguard Worker #include <stdlib.h>
8*58e6ee5fSAndroid Build Coastguard Worker #include <sys/stat.h>
9*58e6ee5fSAndroid Build Coastguard Worker #include <fcntl.h>
10*58e6ee5fSAndroid Build Coastguard Worker #include <unistd.h>
11*58e6ee5fSAndroid Build Coastguard Worker #include <time.h>
12*58e6ee5fSAndroid Build Coastguard Worker #include <dirent.h>
13*58e6ee5fSAndroid Build Coastguard Worker
14*58e6ee5fSAndroid Build Coastguard Worker #include <CUnit/CUnit.h>
15*58e6ee5fSAndroid Build Coastguard Worker #include <CUnit/Basic.h>
16*58e6ee5fSAndroid Build Coastguard Worker
17*58e6ee5fSAndroid Build Coastguard Worker #include "tracefs.h"
18*58e6ee5fSAndroid Build Coastguard Worker
19*58e6ee5fSAndroid Build Coastguard Worker #define TRACEFS_SUITE "trasefs library"
20*58e6ee5fSAndroid Build Coastguard Worker #define TEST_INSTANCE_NAME "cunit_test_iter"
21*58e6ee5fSAndroid Build Coastguard Worker #define TEST_ARRAY_SIZE 500
22*58e6ee5fSAndroid Build Coastguard Worker
23*58e6ee5fSAndroid Build Coastguard Worker static struct tracefs_instance *test_instance;
24*58e6ee5fSAndroid Build Coastguard Worker static struct tep_handle *test_tep;
25*58e6ee5fSAndroid Build Coastguard Worker struct test_sample {
26*58e6ee5fSAndroid Build Coastguard Worker int cpu;
27*58e6ee5fSAndroid Build Coastguard Worker int value;
28*58e6ee5fSAndroid Build Coastguard Worker };
29*58e6ee5fSAndroid Build Coastguard Worker static struct test_sample test_array[TEST_ARRAY_SIZE];
30*58e6ee5fSAndroid Build Coastguard Worker static int test_found;
31*58e6ee5fSAndroid Build Coastguard Worker
test_callback(struct tep_event * event,struct tep_record * record,int cpu,void * context)32*58e6ee5fSAndroid Build Coastguard Worker static int test_callback(struct tep_event *event, struct tep_record *record,
33*58e6ee5fSAndroid Build Coastguard Worker int cpu, void *context)
34*58e6ee5fSAndroid Build Coastguard Worker {
35*58e6ee5fSAndroid Build Coastguard Worker struct tep_format_field *field;
36*58e6ee5fSAndroid Build Coastguard Worker struct test_sample *sample;
37*58e6ee5fSAndroid Build Coastguard Worker int *cpu_test = (int *)context;
38*58e6ee5fSAndroid Build Coastguard Worker int i;
39*58e6ee5fSAndroid Build Coastguard Worker
40*58e6ee5fSAndroid Build Coastguard Worker if (cpu_test && *cpu_test >= 0 && *cpu_test != cpu)
41*58e6ee5fSAndroid Build Coastguard Worker return 0;
42*58e6ee5fSAndroid Build Coastguard Worker field = tep_find_field(event, "buf");
43*58e6ee5fSAndroid Build Coastguard Worker if (field) {
44*58e6ee5fSAndroid Build Coastguard Worker sample = ((struct test_sample *)(record->data + field->offset));
45*58e6ee5fSAndroid Build Coastguard Worker for (i = 0; i < TEST_ARRAY_SIZE; i++) {
46*58e6ee5fSAndroid Build Coastguard Worker if (test_array[i].value == sample->value &&
47*58e6ee5fSAndroid Build Coastguard Worker test_array[i].cpu == cpu) {
48*58e6ee5fSAndroid Build Coastguard Worker test_array[i].value = 0;
49*58e6ee5fSAndroid Build Coastguard Worker test_found++;
50*58e6ee5fSAndroid Build Coastguard Worker break;
51*58e6ee5fSAndroid Build Coastguard Worker }
52*58e6ee5fSAndroid Build Coastguard Worker }
53*58e6ee5fSAndroid Build Coastguard Worker }
54*58e6ee5fSAndroid Build Coastguard Worker
55*58e6ee5fSAndroid Build Coastguard Worker return 0;
56*58e6ee5fSAndroid Build Coastguard Worker }
57*58e6ee5fSAndroid Build Coastguard Worker
test_iter_write(void)58*58e6ee5fSAndroid Build Coastguard Worker static void test_iter_write(void)
59*58e6ee5fSAndroid Build Coastguard Worker {
60*58e6ee5fSAndroid Build Coastguard Worker int cpus = sysconf(_SC_NPROCESSORS_CONF);
61*58e6ee5fSAndroid Build Coastguard Worker cpu_set_t *cpuset, *cpusave;
62*58e6ee5fSAndroid Build Coastguard Worker int cpu_size;
63*58e6ee5fSAndroid Build Coastguard Worker char *path;
64*58e6ee5fSAndroid Build Coastguard Worker int i, fd;
65*58e6ee5fSAndroid Build Coastguard Worker int ret;
66*58e6ee5fSAndroid Build Coastguard Worker cpuset = CPU_ALLOC(cpus);
67*58e6ee5fSAndroid Build Coastguard Worker cpusave = CPU_ALLOC(cpus);
68*58e6ee5fSAndroid Build Coastguard Worker cpu_size = CPU_ALLOC_SIZE(cpus);
69*58e6ee5fSAndroid Build Coastguard Worker CPU_ZERO_S(cpu_size, cpuset);
70*58e6ee5fSAndroid Build Coastguard Worker
71*58e6ee5fSAndroid Build Coastguard Worker sched_getaffinity(0, cpu_size, cpusave);
72*58e6ee5fSAndroid Build Coastguard Worker
73*58e6ee5fSAndroid Build Coastguard Worker path = tracefs_instance_get_file(test_instance, "trace_marker");
74*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(path != NULL);
75*58e6ee5fSAndroid Build Coastguard Worker fd = open(path, O_WRONLY);
76*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(path);
77*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(fd >= 0);
78*58e6ee5fSAndroid Build Coastguard Worker
79*58e6ee5fSAndroid Build Coastguard Worker for (i = 0; i < TEST_ARRAY_SIZE; i++) {
80*58e6ee5fSAndroid Build Coastguard Worker test_array[i].cpu = rand() % cpus;
81*58e6ee5fSAndroid Build Coastguard Worker test_array[i].value = random();
82*58e6ee5fSAndroid Build Coastguard Worker if (!test_array[i].value)
83*58e6ee5fSAndroid Build Coastguard Worker test_array[i].value++;
84*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(test_array[i].cpu < cpus);
85*58e6ee5fSAndroid Build Coastguard Worker CPU_ZERO_S(cpu_size, cpuset);
86*58e6ee5fSAndroid Build Coastguard Worker CPU_SET(test_array[i].cpu, cpuset);
87*58e6ee5fSAndroid Build Coastguard Worker sched_setaffinity(0, cpu_size, cpuset);
88*58e6ee5fSAndroid Build Coastguard Worker ret = write(fd, test_array + i, sizeof(struct test_sample));
89*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(ret == sizeof(struct test_sample));
90*58e6ee5fSAndroid Build Coastguard Worker }
91*58e6ee5fSAndroid Build Coastguard Worker
92*58e6ee5fSAndroid Build Coastguard Worker sched_setaffinity(0, cpu_size, cpusave);
93*58e6ee5fSAndroid Build Coastguard Worker close(fd);
94*58e6ee5fSAndroid Build Coastguard Worker }
95*58e6ee5fSAndroid Build Coastguard Worker
96*58e6ee5fSAndroid Build Coastguard Worker
iter_raw_events_on_cpu(int cpu)97*58e6ee5fSAndroid Build Coastguard Worker static void iter_raw_events_on_cpu(int cpu)
98*58e6ee5fSAndroid Build Coastguard Worker {
99*58e6ee5fSAndroid Build Coastguard Worker int check = 0;
100*58e6ee5fSAndroid Build Coastguard Worker int ret;
101*58e6ee5fSAndroid Build Coastguard Worker int i;
102*58e6ee5fSAndroid Build Coastguard Worker
103*58e6ee5fSAndroid Build Coastguard Worker test_found = 0;
104*58e6ee5fSAndroid Build Coastguard Worker test_iter_write();
105*58e6ee5fSAndroid Build Coastguard Worker ret = tracefs_iterate_raw_events(test_tep, test_instance, NULL, 0,
106*58e6ee5fSAndroid Build Coastguard Worker test_callback, &cpu);
107*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(ret == 0);
108*58e6ee5fSAndroid Build Coastguard Worker if (cpu < 0) {
109*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(test_found == TEST_ARRAY_SIZE);
110*58e6ee5fSAndroid Build Coastguard Worker } else {
111*58e6ee5fSAndroid Build Coastguard Worker for (i = 0; i < TEST_ARRAY_SIZE; i++) {
112*58e6ee5fSAndroid Build Coastguard Worker if (test_array[i].cpu == cpu) {
113*58e6ee5fSAndroid Build Coastguard Worker check++;
114*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(test_array[i].value == 0)
115*58e6ee5fSAndroid Build Coastguard Worker } else {
116*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(test_array[i].value != 0)
117*58e6ee5fSAndroid Build Coastguard Worker }
118*58e6ee5fSAndroid Build Coastguard Worker }
119*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(test_found == check);
120*58e6ee5fSAndroid Build Coastguard Worker }
121*58e6ee5fSAndroid Build Coastguard Worker }
122*58e6ee5fSAndroid Build Coastguard Worker
test_iter_raw_events(void)123*58e6ee5fSAndroid Build Coastguard Worker static void test_iter_raw_events(void)
124*58e6ee5fSAndroid Build Coastguard Worker {
125*58e6ee5fSAndroid Build Coastguard Worker int cpus = sysconf(_SC_NPROCESSORS_CONF);
126*58e6ee5fSAndroid Build Coastguard Worker int ret;
127*58e6ee5fSAndroid Build Coastguard Worker int i;
128*58e6ee5fSAndroid Build Coastguard Worker
129*58e6ee5fSAndroid Build Coastguard Worker ret = tracefs_iterate_raw_events(NULL, test_instance, NULL, 0, test_callback, NULL);
130*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(ret < 0);
131*58e6ee5fSAndroid Build Coastguard Worker ret = tracefs_iterate_raw_events(test_tep, NULL, NULL, 0, test_callback, NULL);
132*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(ret == 0);
133*58e6ee5fSAndroid Build Coastguard Worker ret = tracefs_iterate_raw_events(test_tep, test_instance, NULL, 0, NULL, NULL);
134*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(ret < 0);
135*58e6ee5fSAndroid Build Coastguard Worker
136*58e6ee5fSAndroid Build Coastguard Worker iter_raw_events_on_cpu(-1);
137*58e6ee5fSAndroid Build Coastguard Worker for (i = 0; i < cpus; i++)
138*58e6ee5fSAndroid Build Coastguard Worker iter_raw_events_on_cpu(i);
139*58e6ee5fSAndroid Build Coastguard Worker }
140*58e6ee5fSAndroid Build Coastguard Worker
141*58e6ee5fSAndroid Build Coastguard Worker #define RAND_STR_SIZE 20
142*58e6ee5fSAndroid Build Coastguard Worker #define RAND_ASCII "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
get_rand_str()143*58e6ee5fSAndroid Build Coastguard Worker static const char *get_rand_str()
144*58e6ee5fSAndroid Build Coastguard Worker {
145*58e6ee5fSAndroid Build Coastguard Worker static char str[RAND_STR_SIZE];
146*58e6ee5fSAndroid Build Coastguard Worker static char sym[] = RAND_ASCII;
147*58e6ee5fSAndroid Build Coastguard Worker struct timespec clk;
148*58e6ee5fSAndroid Build Coastguard Worker int i;
149*58e6ee5fSAndroid Build Coastguard Worker
150*58e6ee5fSAndroid Build Coastguard Worker clock_gettime(CLOCK_REALTIME, &clk);
151*58e6ee5fSAndroid Build Coastguard Worker srand(clk.tv_nsec);
152*58e6ee5fSAndroid Build Coastguard Worker for (i = 0; i < RAND_STR_SIZE; i++)
153*58e6ee5fSAndroid Build Coastguard Worker str[i] = sym[rand() % (sizeof(sym) - 1)];
154*58e6ee5fSAndroid Build Coastguard Worker
155*58e6ee5fSAndroid Build Coastguard Worker str[RAND_STR_SIZE - 1] = 0;
156*58e6ee5fSAndroid Build Coastguard Worker return str;
157*58e6ee5fSAndroid Build Coastguard Worker }
158*58e6ee5fSAndroid Build Coastguard Worker
test_trace_file(void)159*58e6ee5fSAndroid Build Coastguard Worker static void test_trace_file(void)
160*58e6ee5fSAndroid Build Coastguard Worker {
161*58e6ee5fSAndroid Build Coastguard Worker const char *tmp = get_rand_str();
162*58e6ee5fSAndroid Build Coastguard Worker const char *tdir;
163*58e6ee5fSAndroid Build Coastguard Worker struct stat st;
164*58e6ee5fSAndroid Build Coastguard Worker char *file;
165*58e6ee5fSAndroid Build Coastguard Worker
166*58e6ee5fSAndroid Build Coastguard Worker tdir = tracefs_tracing_dir();
167*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tdir != NULL);
168*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(stat(tdir, &st) == 0);
169*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(S_ISDIR(st.st_mode));
170*58e6ee5fSAndroid Build Coastguard Worker
171*58e6ee5fSAndroid Build Coastguard Worker file = tracefs_get_tracing_file(NULL);
172*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(file == NULL);
173*58e6ee5fSAndroid Build Coastguard Worker file = tracefs_get_tracing_file(tmp);
174*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(file != NULL);
175*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(stat(file, &st) != 0);
176*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(file);
177*58e6ee5fSAndroid Build Coastguard Worker
178*58e6ee5fSAndroid Build Coastguard Worker file = tracefs_get_tracing_file("trace");
179*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(file != NULL);
180*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(stat(file, &st) == 0);
181*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(file);
182*58e6ee5fSAndroid Build Coastguard Worker }
183*58e6ee5fSAndroid Build Coastguard Worker
test_instance_file_read(struct tracefs_instance * inst,char * fname)184*58e6ee5fSAndroid Build Coastguard Worker static void test_instance_file_read(struct tracefs_instance *inst, char *fname)
185*58e6ee5fSAndroid Build Coastguard Worker {
186*58e6ee5fSAndroid Build Coastguard Worker const char *tdir = tracefs_tracing_dir();
187*58e6ee5fSAndroid Build Coastguard Worker char buf[BUFSIZ];
188*58e6ee5fSAndroid Build Coastguard Worker char *fpath;
189*58e6ee5fSAndroid Build Coastguard Worker char *file;
190*58e6ee5fSAndroid Build Coastguard Worker size_t fsize = 0;
191*58e6ee5fSAndroid Build Coastguard Worker int size = 0;
192*58e6ee5fSAndroid Build Coastguard Worker int fd;
193*58e6ee5fSAndroid Build Coastguard Worker
194*58e6ee5fSAndroid Build Coastguard Worker if (inst) {
195*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(asprintf(&fpath, "%s/instances/%s/%s",
196*58e6ee5fSAndroid Build Coastguard Worker tdir, tracefs_instance_get_name(inst), fname) > 0);
197*58e6ee5fSAndroid Build Coastguard Worker } else {
198*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(asprintf(&fpath, "%s/%s", tdir, fname) > 0);
199*58e6ee5fSAndroid Build Coastguard Worker }
200*58e6ee5fSAndroid Build Coastguard Worker
201*58e6ee5fSAndroid Build Coastguard Worker memset(buf, 0, BUFSIZ);
202*58e6ee5fSAndroid Build Coastguard Worker fd = open(fpath, O_RDONLY);
203*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(fd >= 0);
204*58e6ee5fSAndroid Build Coastguard Worker fsize = read(fd, buf, BUFSIZ);
205*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(fsize >= 0);
206*58e6ee5fSAndroid Build Coastguard Worker close(fd);
207*58e6ee5fSAndroid Build Coastguard Worker buf[BUFSIZ - 1] = 0;
208*58e6ee5fSAndroid Build Coastguard Worker
209*58e6ee5fSAndroid Build Coastguard Worker file = tracefs_instance_file_read(inst, fname, &size);
210*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(file != NULL);
211*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(size == fsize);
212*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(strcmp(file, buf) == 0);
213*58e6ee5fSAndroid Build Coastguard Worker
214*58e6ee5fSAndroid Build Coastguard Worker free(fpath);
215*58e6ee5fSAndroid Build Coastguard Worker free(file);
216*58e6ee5fSAndroid Build Coastguard Worker }
217*58e6ee5fSAndroid Build Coastguard Worker
218*58e6ee5fSAndroid Build Coastguard Worker #define ALL_TRACERS "available_tracers"
219*58e6ee5fSAndroid Build Coastguard Worker #define CUR_TRACER "current_tracer"
220*58e6ee5fSAndroid Build Coastguard Worker #define PER_CPU "per_cpu"
test_instance_file(void)221*58e6ee5fSAndroid Build Coastguard Worker static void test_instance_file(void)
222*58e6ee5fSAndroid Build Coastguard Worker {
223*58e6ee5fSAndroid Build Coastguard Worker struct tracefs_instance *instance = NULL;
224*58e6ee5fSAndroid Build Coastguard Worker struct tracefs_instance *second = NULL;
225*58e6ee5fSAndroid Build Coastguard Worker const char *name = get_rand_str();
226*58e6ee5fSAndroid Build Coastguard Worker const char *inst_name = NULL;
227*58e6ee5fSAndroid Build Coastguard Worker const char *tdir;
228*58e6ee5fSAndroid Build Coastguard Worker char *inst_file;
229*58e6ee5fSAndroid Build Coastguard Worker char *inst_dir;
230*58e6ee5fSAndroid Build Coastguard Worker struct stat st;
231*58e6ee5fSAndroid Build Coastguard Worker char *fname;
232*58e6ee5fSAndroid Build Coastguard Worker char *file1;
233*58e6ee5fSAndroid Build Coastguard Worker char *file2;
234*58e6ee5fSAndroid Build Coastguard Worker char *tracer;
235*58e6ee5fSAndroid Build Coastguard Worker int size;
236*58e6ee5fSAndroid Build Coastguard Worker int ret;
237*58e6ee5fSAndroid Build Coastguard Worker
238*58e6ee5fSAndroid Build Coastguard Worker tdir = tracefs_tracing_dir();
239*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tdir != NULL);
240*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(asprintf(&inst_dir, "%s/instances/%s", tdir, name) > 0);
241*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(stat(inst_dir, &st) != 0);
242*58e6ee5fSAndroid Build Coastguard Worker
243*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracefs_instance_exists(name) == false);
244*58e6ee5fSAndroid Build Coastguard Worker instance = tracefs_instance_create(name);
245*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(instance != NULL);
246*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracefs_instance_is_new(instance));
247*58e6ee5fSAndroid Build Coastguard Worker second = tracefs_instance_create(name);
248*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(second != NULL);
249*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(!tracefs_instance_is_new(second));
250*58e6ee5fSAndroid Build Coastguard Worker tracefs_instance_free(second);
251*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracefs_instance_exists(name) == true);
252*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(stat(inst_dir, &st) == 0);
253*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(S_ISDIR(st.st_mode));
254*58e6ee5fSAndroid Build Coastguard Worker inst_name = tracefs_instance_get_name(instance);
255*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(inst_name != NULL);
256*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(strcmp(inst_name, name) == 0);
257*58e6ee5fSAndroid Build Coastguard Worker
258*58e6ee5fSAndroid Build Coastguard Worker fname = tracefs_instance_get_dir(NULL);
259*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(fname != NULL);
260*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(strcmp(fname, tdir) == 0);
261*58e6ee5fSAndroid Build Coastguard Worker free(fname);
262*58e6ee5fSAndroid Build Coastguard Worker
263*58e6ee5fSAndroid Build Coastguard Worker fname = tracefs_instance_get_dir(instance);
264*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(fname != NULL);
265*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(strcmp(fname, inst_dir) == 0);
266*58e6ee5fSAndroid Build Coastguard Worker free(fname);
267*58e6ee5fSAndroid Build Coastguard Worker
268*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(asprintf(&fname, "%s/"ALL_TRACERS, tdir) > 0);
269*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(fname != NULL);
270*58e6ee5fSAndroid Build Coastguard Worker inst_file = tracefs_instance_get_file(NULL, ALL_TRACERS);
271*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(inst_file != NULL);
272*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(strcmp(fname, inst_file) == 0);
273*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(inst_file);
274*58e6ee5fSAndroid Build Coastguard Worker free(fname);
275*58e6ee5fSAndroid Build Coastguard Worker
276*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(asprintf(&fname, "%s/instances/%s/"ALL_TRACERS, tdir, name) > 0);
277*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(fname != NULL);
278*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(stat(fname, &st) == 0);
279*58e6ee5fSAndroid Build Coastguard Worker inst_file = tracefs_instance_get_file(instance, ALL_TRACERS);
280*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(inst_file != NULL);
281*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(strcmp(fname, inst_file) == 0);
282*58e6ee5fSAndroid Build Coastguard Worker
283*58e6ee5fSAndroid Build Coastguard Worker test_instance_file_read(NULL, ALL_TRACERS);
284*58e6ee5fSAndroid Build Coastguard Worker test_instance_file_read(instance, ALL_TRACERS);
285*58e6ee5fSAndroid Build Coastguard Worker
286*58e6ee5fSAndroid Build Coastguard Worker file1 = tracefs_instance_file_read(instance, ALL_TRACERS, NULL);
287*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(file1 != NULL);
288*58e6ee5fSAndroid Build Coastguard Worker tracer = strtok(file1, " ");
289*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracer != NULL);
290*58e6ee5fSAndroid Build Coastguard Worker ret = tracefs_instance_file_write(instance, CUR_TRACER, tracer);
291*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(ret == strlen(tracer));
292*58e6ee5fSAndroid Build Coastguard Worker file2 = tracefs_instance_file_read(instance, CUR_TRACER, &size);
293*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(file2 != NULL);
294*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(size >= strlen(tracer));
295*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(strncmp(file2, tracer, strlen(tracer)) == 0);
296*58e6ee5fSAndroid Build Coastguard Worker free(file1);
297*58e6ee5fSAndroid Build Coastguard Worker free(file2);
298*58e6ee5fSAndroid Build Coastguard Worker
299*58e6ee5fSAndroid Build Coastguard Worker tracefs_put_tracing_file(inst_file);
300*58e6ee5fSAndroid Build Coastguard Worker free(fname);
301*58e6ee5fSAndroid Build Coastguard Worker
302*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracefs_file_exists(NULL, (char *)name) == false);
303*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracefs_dir_exists(NULL, (char *)name) == false);
304*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracefs_file_exists(instance, (char *)name) == false);
305*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracefs_dir_exists(instance, (char *)name) == false);
306*58e6ee5fSAndroid Build Coastguard Worker
307*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracefs_file_exists(NULL, CUR_TRACER) == true);
308*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracefs_dir_exists(NULL, CUR_TRACER) == false);
309*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracefs_file_exists(instance, CUR_TRACER) == true);
310*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracefs_dir_exists(instance, CUR_TRACER) == false);
311*58e6ee5fSAndroid Build Coastguard Worker
312*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracefs_file_exists(NULL, PER_CPU) == false);
313*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracefs_dir_exists(NULL, PER_CPU) == true);
314*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracefs_file_exists(instance, PER_CPU) == false);
315*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracefs_dir_exists(instance, PER_CPU) == true);
316*58e6ee5fSAndroid Build Coastguard Worker
317*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracefs_instance_destroy(NULL) != 0);
318*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracefs_instance_destroy(instance) == 0);
319*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracefs_instance_destroy(instance) != 0);
320*58e6ee5fSAndroid Build Coastguard Worker tracefs_instance_free(instance);
321*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(stat(inst_dir, &st) != 0);
322*58e6ee5fSAndroid Build Coastguard Worker free(inst_dir);
323*58e6ee5fSAndroid Build Coastguard Worker }
324*58e6ee5fSAndroid Build Coastguard Worker
exclude_string(char ** strings,char * name)325*58e6ee5fSAndroid Build Coastguard Worker static void exclude_string(char **strings, char *name)
326*58e6ee5fSAndroid Build Coastguard Worker {
327*58e6ee5fSAndroid Build Coastguard Worker int i;
328*58e6ee5fSAndroid Build Coastguard Worker
329*58e6ee5fSAndroid Build Coastguard Worker for (i = 0; strings[i]; i++) {
330*58e6ee5fSAndroid Build Coastguard Worker if (strcmp(strings[i], name) == 0) {
331*58e6ee5fSAndroid Build Coastguard Worker free(strings[i]);
332*58e6ee5fSAndroid Build Coastguard Worker strings[i] = strdup("/");
333*58e6ee5fSAndroid Build Coastguard Worker return;
334*58e6ee5fSAndroid Build Coastguard Worker }
335*58e6ee5fSAndroid Build Coastguard Worker }
336*58e6ee5fSAndroid Build Coastguard Worker }
337*58e6ee5fSAndroid Build Coastguard Worker
test_check_files(const char * fdir,char ** files)338*58e6ee5fSAndroid Build Coastguard Worker static void test_check_files(const char *fdir, char **files)
339*58e6ee5fSAndroid Build Coastguard Worker {
340*58e6ee5fSAndroid Build Coastguard Worker struct dirent *dent;
341*58e6ee5fSAndroid Build Coastguard Worker DIR *dir;
342*58e6ee5fSAndroid Build Coastguard Worker int i;
343*58e6ee5fSAndroid Build Coastguard Worker
344*58e6ee5fSAndroid Build Coastguard Worker dir = opendir(fdir);
345*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(dir != NULL);
346*58e6ee5fSAndroid Build Coastguard Worker
347*58e6ee5fSAndroid Build Coastguard Worker while ((dent = readdir(dir)))
348*58e6ee5fSAndroid Build Coastguard Worker exclude_string(files, dent->d_name);
349*58e6ee5fSAndroid Build Coastguard Worker
350*58e6ee5fSAndroid Build Coastguard Worker closedir(dir);
351*58e6ee5fSAndroid Build Coastguard Worker
352*58e6ee5fSAndroid Build Coastguard Worker for (i = 0; files[i]; i++)
353*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(files[i][0] == '/');
354*58e6ee5fSAndroid Build Coastguard Worker }
355*58e6ee5fSAndroid Build Coastguard Worker
test_system_event(void)356*58e6ee5fSAndroid Build Coastguard Worker static void test_system_event(void)
357*58e6ee5fSAndroid Build Coastguard Worker {
358*58e6ee5fSAndroid Build Coastguard Worker const char *tdir;
359*58e6ee5fSAndroid Build Coastguard Worker char **systems;
360*58e6ee5fSAndroid Build Coastguard Worker char **events;
361*58e6ee5fSAndroid Build Coastguard Worker char *sdir = NULL;
362*58e6ee5fSAndroid Build Coastguard Worker
363*58e6ee5fSAndroid Build Coastguard Worker tdir = tracefs_tracing_dir();
364*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tdir != NULL);
365*58e6ee5fSAndroid Build Coastguard Worker
366*58e6ee5fSAndroid Build Coastguard Worker systems = tracefs_event_systems(tdir);
367*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(systems != NULL);
368*58e6ee5fSAndroid Build Coastguard Worker
369*58e6ee5fSAndroid Build Coastguard Worker events = tracefs_system_events(tdir, systems[0]);
370*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(events != NULL);
371*58e6ee5fSAndroid Build Coastguard Worker
372*58e6ee5fSAndroid Build Coastguard Worker asprintf(&sdir, "%s/events/%s", tdir, systems[0]);
373*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(sdir != NULL);
374*58e6ee5fSAndroid Build Coastguard Worker test_check_files(sdir, events);
375*58e6ee5fSAndroid Build Coastguard Worker free(sdir);
376*58e6ee5fSAndroid Build Coastguard Worker sdir = NULL;
377*58e6ee5fSAndroid Build Coastguard Worker
378*58e6ee5fSAndroid Build Coastguard Worker asprintf(&sdir, "%s/events", tdir);
379*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(sdir != NULL);
380*58e6ee5fSAndroid Build Coastguard Worker test_check_files(sdir, systems);
381*58e6ee5fSAndroid Build Coastguard Worker
382*58e6ee5fSAndroid Build Coastguard Worker tracefs_list_free(systems);
383*58e6ee5fSAndroid Build Coastguard Worker tracefs_list_free(events);
384*58e6ee5fSAndroid Build Coastguard Worker
385*58e6ee5fSAndroid Build Coastguard Worker free(sdir);
386*58e6ee5fSAndroid Build Coastguard Worker }
387*58e6ee5fSAndroid Build Coastguard Worker
test_tracers(void)388*58e6ee5fSAndroid Build Coastguard Worker static void test_tracers(void)
389*58e6ee5fSAndroid Build Coastguard Worker {
390*58e6ee5fSAndroid Build Coastguard Worker const char *tdir;
391*58e6ee5fSAndroid Build Coastguard Worker char **tracers;
392*58e6ee5fSAndroid Build Coastguard Worker char *tfile;
393*58e6ee5fSAndroid Build Coastguard Worker char *tracer;
394*58e6ee5fSAndroid Build Coastguard Worker int i;
395*58e6ee5fSAndroid Build Coastguard Worker
396*58e6ee5fSAndroid Build Coastguard Worker tdir = tracefs_tracing_dir();
397*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tdir != NULL);
398*58e6ee5fSAndroid Build Coastguard Worker
399*58e6ee5fSAndroid Build Coastguard Worker tracers = tracefs_tracers(tdir);
400*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracers != NULL);
401*58e6ee5fSAndroid Build Coastguard Worker
402*58e6ee5fSAndroid Build Coastguard Worker tfile = tracefs_instance_file_read(NULL, ALL_TRACERS, NULL);
403*58e6ee5fSAndroid Build Coastguard Worker
404*58e6ee5fSAndroid Build Coastguard Worker tracer = strtok(tfile, " ");
405*58e6ee5fSAndroid Build Coastguard Worker while (tracer) {
406*58e6ee5fSAndroid Build Coastguard Worker exclude_string(tracers, tracer);
407*58e6ee5fSAndroid Build Coastguard Worker tracer = strtok(NULL, " ");
408*58e6ee5fSAndroid Build Coastguard Worker }
409*58e6ee5fSAndroid Build Coastguard Worker
410*58e6ee5fSAndroid Build Coastguard Worker for (i = 0; tracers[i]; i++)
411*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracers[i][0] == '/');
412*58e6ee5fSAndroid Build Coastguard Worker
413*58e6ee5fSAndroid Build Coastguard Worker tracefs_list_free(tracers);
414*58e6ee5fSAndroid Build Coastguard Worker free(tfile);
415*58e6ee5fSAndroid Build Coastguard Worker }
416*58e6ee5fSAndroid Build Coastguard Worker
test_check_events(struct tep_handle * tep,char * system,bool exist)417*58e6ee5fSAndroid Build Coastguard Worker static void test_check_events(struct tep_handle *tep, char *system, bool exist)
418*58e6ee5fSAndroid Build Coastguard Worker {
419*58e6ee5fSAndroid Build Coastguard Worker struct dirent *dent;
420*58e6ee5fSAndroid Build Coastguard Worker char file[PATH_MAX];
421*58e6ee5fSAndroid Build Coastguard Worker char buf[1024];
422*58e6ee5fSAndroid Build Coastguard Worker char *edir = NULL;
423*58e6ee5fSAndroid Build Coastguard Worker const char *tdir;
424*58e6ee5fSAndroid Build Coastguard Worker DIR *dir;
425*58e6ee5fSAndroid Build Coastguard Worker int fd;
426*58e6ee5fSAndroid Build Coastguard Worker
427*58e6ee5fSAndroid Build Coastguard Worker tdir = tracefs_tracing_dir();
428*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tdir != NULL);
429*58e6ee5fSAndroid Build Coastguard Worker
430*58e6ee5fSAndroid Build Coastguard Worker asprintf(&edir, "%s/events/%s", tdir, system);
431*58e6ee5fSAndroid Build Coastguard Worker dir = opendir(edir);
432*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(dir != NULL);
433*58e6ee5fSAndroid Build Coastguard Worker
434*58e6ee5fSAndroid Build Coastguard Worker while ((dent = readdir(dir))) {
435*58e6ee5fSAndroid Build Coastguard Worker if (dent->d_name[0] == '.')
436*58e6ee5fSAndroid Build Coastguard Worker continue;
437*58e6ee5fSAndroid Build Coastguard Worker sprintf(file, "%s/%s/id", edir, dent->d_name);
438*58e6ee5fSAndroid Build Coastguard Worker fd = open(file, O_RDONLY);
439*58e6ee5fSAndroid Build Coastguard Worker if (fd < 0)
440*58e6ee5fSAndroid Build Coastguard Worker continue;
441*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(read(fd, buf, 1024) > 0);
442*58e6ee5fSAndroid Build Coastguard Worker if (exist) {
443*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tep_find_event(tep, atoi(buf)) != NULL);
444*58e6ee5fSAndroid Build Coastguard Worker } else {
445*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tep_find_event(tep, atoi(buf)) == NULL);
446*58e6ee5fSAndroid Build Coastguard Worker }
447*58e6ee5fSAndroid Build Coastguard Worker
448*58e6ee5fSAndroid Build Coastguard Worker close(fd);
449*58e6ee5fSAndroid Build Coastguard Worker }
450*58e6ee5fSAndroid Build Coastguard Worker
451*58e6ee5fSAndroid Build Coastguard Worker closedir(dir);
452*58e6ee5fSAndroid Build Coastguard Worker free(edir);
453*58e6ee5fSAndroid Build Coastguard Worker
454*58e6ee5fSAndroid Build Coastguard Worker }
455*58e6ee5fSAndroid Build Coastguard Worker
test_local_events(void)456*58e6ee5fSAndroid Build Coastguard Worker static void test_local_events(void)
457*58e6ee5fSAndroid Build Coastguard Worker {
458*58e6ee5fSAndroid Build Coastguard Worker struct tep_handle *tep;
459*58e6ee5fSAndroid Build Coastguard Worker const char *tdir;
460*58e6ee5fSAndroid Build Coastguard Worker char **systems;
461*58e6ee5fSAndroid Build Coastguard Worker char *lsystems[3];
462*58e6ee5fSAndroid Build Coastguard Worker int i;
463*58e6ee5fSAndroid Build Coastguard Worker
464*58e6ee5fSAndroid Build Coastguard Worker tdir = tracefs_tracing_dir();
465*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tdir != NULL);
466*58e6ee5fSAndroid Build Coastguard Worker
467*58e6ee5fSAndroid Build Coastguard Worker tep = tracefs_local_events(tdir);
468*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tep != NULL);
469*58e6ee5fSAndroid Build Coastguard Worker
470*58e6ee5fSAndroid Build Coastguard Worker systems = tracefs_event_systems(tdir);
471*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(systems != NULL);
472*58e6ee5fSAndroid Build Coastguard Worker
473*58e6ee5fSAndroid Build Coastguard Worker for (i = 0; systems[i]; i++)
474*58e6ee5fSAndroid Build Coastguard Worker test_check_events(tep, systems[i], true);
475*58e6ee5fSAndroid Build Coastguard Worker tep_free(tep);
476*58e6ee5fSAndroid Build Coastguard Worker
477*58e6ee5fSAndroid Build Coastguard Worker memset(lsystems, 0, sizeof(lsystems));
478*58e6ee5fSAndroid Build Coastguard Worker for (i = 0; systems[i]; i++) {
479*58e6ee5fSAndroid Build Coastguard Worker if (!lsystems[0])
480*58e6ee5fSAndroid Build Coastguard Worker lsystems[0] = systems[i];
481*58e6ee5fSAndroid Build Coastguard Worker else if (!lsystems[2])
482*58e6ee5fSAndroid Build Coastguard Worker lsystems[2] = systems[i];
483*58e6ee5fSAndroid Build Coastguard Worker else
484*58e6ee5fSAndroid Build Coastguard Worker break;
485*58e6ee5fSAndroid Build Coastguard Worker }
486*58e6ee5fSAndroid Build Coastguard Worker
487*58e6ee5fSAndroid Build Coastguard Worker if (lsystems[0] && lsystems[2]) {
488*58e6ee5fSAndroid Build Coastguard Worker tep = tracefs_local_events_system(tdir,
489*58e6ee5fSAndroid Build Coastguard Worker (const char * const *)lsystems);
490*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tep != NULL);
491*58e6ee5fSAndroid Build Coastguard Worker test_check_events(tep, lsystems[0], true);
492*58e6ee5fSAndroid Build Coastguard Worker test_check_events(tep, lsystems[2], false);
493*58e6ee5fSAndroid Build Coastguard Worker }
494*58e6ee5fSAndroid Build Coastguard Worker tep_free(tep);
495*58e6ee5fSAndroid Build Coastguard Worker
496*58e6ee5fSAndroid Build Coastguard Worker tep = tep_alloc();
497*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tep != NULL);
498*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracefs_fill_local_events(tdir, tep, NULL) == 0);
499*58e6ee5fSAndroid Build Coastguard Worker for (i = 0; systems[i]; i++)
500*58e6ee5fSAndroid Build Coastguard Worker test_check_events(tep, systems[i], true);
501*58e6ee5fSAndroid Build Coastguard Worker
502*58e6ee5fSAndroid Build Coastguard Worker tep_free(tep);
503*58e6ee5fSAndroid Build Coastguard Worker
504*58e6ee5fSAndroid Build Coastguard Worker tracefs_list_free(systems);
505*58e6ee5fSAndroid Build Coastguard Worker }
506*58e6ee5fSAndroid Build Coastguard Worker
507*58e6ee5fSAndroid Build Coastguard Worker struct test_walk_instance {
508*58e6ee5fSAndroid Build Coastguard Worker struct tracefs_instance *instance;
509*58e6ee5fSAndroid Build Coastguard Worker bool found;
510*58e6ee5fSAndroid Build Coastguard Worker };
511*58e6ee5fSAndroid Build Coastguard Worker #define WALK_COUNT 10
test_instances_walk_cb(const char * name,void * data)512*58e6ee5fSAndroid Build Coastguard Worker int test_instances_walk_cb(const char *name, void *data)
513*58e6ee5fSAndroid Build Coastguard Worker {
514*58e6ee5fSAndroid Build Coastguard Worker struct test_walk_instance *instances = (struct test_walk_instance *)data;
515*58e6ee5fSAndroid Build Coastguard Worker int i;
516*58e6ee5fSAndroid Build Coastguard Worker
517*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(instances != NULL);
518*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(name != NULL);
519*58e6ee5fSAndroid Build Coastguard Worker
520*58e6ee5fSAndroid Build Coastguard Worker for (i = 0; i < WALK_COUNT; i++) {
521*58e6ee5fSAndroid Build Coastguard Worker if (!strcmp(name,
522*58e6ee5fSAndroid Build Coastguard Worker tracefs_instance_get_name(instances[i].instance))) {
523*58e6ee5fSAndroid Build Coastguard Worker instances[i].found = true;
524*58e6ee5fSAndroid Build Coastguard Worker break;
525*58e6ee5fSAndroid Build Coastguard Worker }
526*58e6ee5fSAndroid Build Coastguard Worker }
527*58e6ee5fSAndroid Build Coastguard Worker
528*58e6ee5fSAndroid Build Coastguard Worker return 0;
529*58e6ee5fSAndroid Build Coastguard Worker }
530*58e6ee5fSAndroid Build Coastguard Worker
test_instances_walk(void)531*58e6ee5fSAndroid Build Coastguard Worker static void test_instances_walk(void)
532*58e6ee5fSAndroid Build Coastguard Worker {
533*58e6ee5fSAndroid Build Coastguard Worker struct test_walk_instance instances[WALK_COUNT];
534*58e6ee5fSAndroid Build Coastguard Worker int i;
535*58e6ee5fSAndroid Build Coastguard Worker
536*58e6ee5fSAndroid Build Coastguard Worker memset(instances, 0, WALK_COUNT * sizeof(struct test_walk_instance));
537*58e6ee5fSAndroid Build Coastguard Worker for (i = 0; i < WALK_COUNT; i++) {
538*58e6ee5fSAndroid Build Coastguard Worker instances[i].instance = tracefs_instance_create(get_rand_str());
539*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(instances[i].instance != NULL);
540*58e6ee5fSAndroid Build Coastguard Worker }
541*58e6ee5fSAndroid Build Coastguard Worker
542*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracefs_instances_walk(test_instances_walk_cb, instances) == 0);
543*58e6ee5fSAndroid Build Coastguard Worker for (i = 0; i < WALK_COUNT; i++) {
544*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(instances[i].found);
545*58e6ee5fSAndroid Build Coastguard Worker tracefs_instance_destroy(instances[i].instance);
546*58e6ee5fSAndroid Build Coastguard Worker instances[i].found = false;
547*58e6ee5fSAndroid Build Coastguard Worker }
548*58e6ee5fSAndroid Build Coastguard Worker
549*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(tracefs_instances_walk(test_instances_walk_cb, instances) == 0);
550*58e6ee5fSAndroid Build Coastguard Worker for (i = 0; i < WALK_COUNT; i++) {
551*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(!instances[i].found);
552*58e6ee5fSAndroid Build Coastguard Worker tracefs_instance_free(instances[i].instance);
553*58e6ee5fSAndroid Build Coastguard Worker }
554*58e6ee5fSAndroid Build Coastguard Worker }
555*58e6ee5fSAndroid Build Coastguard Worker
current_clock_check(const char * clock)556*58e6ee5fSAndroid Build Coastguard Worker static void current_clock_check(const char *clock)
557*58e6ee5fSAndroid Build Coastguard Worker {
558*58e6ee5fSAndroid Build Coastguard Worker int size = 0;
559*58e6ee5fSAndroid Build Coastguard Worker char *clocks;
560*58e6ee5fSAndroid Build Coastguard Worker char *str;
561*58e6ee5fSAndroid Build Coastguard Worker
562*58e6ee5fSAndroid Build Coastguard Worker clocks = tracefs_instance_file_read(test_instance, "trace_clock", &size);
563*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(clocks != NULL);
564*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(size > strlen(clock));
565*58e6ee5fSAndroid Build Coastguard Worker str = strstr(clocks, clock);
566*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(str != NULL);
567*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(str != clocks);
568*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(*(str - 1) == '[');
569*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(*(str + strlen(clock)) == ']');
570*58e6ee5fSAndroid Build Coastguard Worker free(clocks);
571*58e6ee5fSAndroid Build Coastguard Worker }
572*58e6ee5fSAndroid Build Coastguard Worker
test_get_clock(void)573*58e6ee5fSAndroid Build Coastguard Worker static void test_get_clock(void)
574*58e6ee5fSAndroid Build Coastguard Worker {
575*58e6ee5fSAndroid Build Coastguard Worker const char *clock;
576*58e6ee5fSAndroid Build Coastguard Worker
577*58e6ee5fSAndroid Build Coastguard Worker clock = tracefs_get_clock(test_instance);
578*58e6ee5fSAndroid Build Coastguard Worker CU_TEST(clock != NULL);
579*58e6ee5fSAndroid Build Coastguard Worker current_clock_check(clock);
580*58e6ee5fSAndroid Build Coastguard Worker free((char *)clock);
581*58e6ee5fSAndroid Build Coastguard Worker }
582*58e6ee5fSAndroid Build Coastguard Worker
test_suite_destroy(void)583*58e6ee5fSAndroid Build Coastguard Worker static int test_suite_destroy(void)
584*58e6ee5fSAndroid Build Coastguard Worker {
585*58e6ee5fSAndroid Build Coastguard Worker tracefs_instance_destroy(test_instance);
586*58e6ee5fSAndroid Build Coastguard Worker tracefs_instance_free(test_instance);
587*58e6ee5fSAndroid Build Coastguard Worker tep_free(test_tep);
588*58e6ee5fSAndroid Build Coastguard Worker return 0;
589*58e6ee5fSAndroid Build Coastguard Worker }
590*58e6ee5fSAndroid Build Coastguard Worker
test_suite_init(void)591*58e6ee5fSAndroid Build Coastguard Worker static int test_suite_init(void)
592*58e6ee5fSAndroid Build Coastguard Worker {
593*58e6ee5fSAndroid Build Coastguard Worker const char *systems[] = {"ftrace", NULL};
594*58e6ee5fSAndroid Build Coastguard Worker
595*58e6ee5fSAndroid Build Coastguard Worker test_tep = tracefs_local_events_system(NULL, systems);
596*58e6ee5fSAndroid Build Coastguard Worker if (test_tep == NULL)
597*58e6ee5fSAndroid Build Coastguard Worker return 1;
598*58e6ee5fSAndroid Build Coastguard Worker test_instance = tracefs_instance_create(TEST_INSTANCE_NAME);
599*58e6ee5fSAndroid Build Coastguard Worker if (!test_instance)
600*58e6ee5fSAndroid Build Coastguard Worker return 1;
601*58e6ee5fSAndroid Build Coastguard Worker
602*58e6ee5fSAndroid Build Coastguard Worker return 0;
603*58e6ee5fSAndroid Build Coastguard Worker }
604*58e6ee5fSAndroid Build Coastguard Worker
test_tracefs_lib(void)605*58e6ee5fSAndroid Build Coastguard Worker void test_tracefs_lib(void)
606*58e6ee5fSAndroid Build Coastguard Worker {
607*58e6ee5fSAndroid Build Coastguard Worker CU_pSuite suite = NULL;
608*58e6ee5fSAndroid Build Coastguard Worker
609*58e6ee5fSAndroid Build Coastguard Worker suite = CU_add_suite(TRACEFS_SUITE, test_suite_init, test_suite_destroy);
610*58e6ee5fSAndroid Build Coastguard Worker if (suite == NULL) {
611*58e6ee5fSAndroid Build Coastguard Worker fprintf(stderr, "Suite \"%s\" cannot be ceated\n", TRACEFS_SUITE);
612*58e6ee5fSAndroid Build Coastguard Worker return;
613*58e6ee5fSAndroid Build Coastguard Worker }
614*58e6ee5fSAndroid Build Coastguard Worker CU_add_test(suite, "tracing file / directory APIs",
615*58e6ee5fSAndroid Build Coastguard Worker test_trace_file);
616*58e6ee5fSAndroid Build Coastguard Worker CU_add_test(suite, "instance file / directory APIs",
617*58e6ee5fSAndroid Build Coastguard Worker test_instance_file);
618*58e6ee5fSAndroid Build Coastguard Worker CU_add_test(suite, "systems and events APIs",
619*58e6ee5fSAndroid Build Coastguard Worker test_system_event);
620*58e6ee5fSAndroid Build Coastguard Worker CU_add_test(suite, "tracefs_iterate_raw_events API",
621*58e6ee5fSAndroid Build Coastguard Worker test_iter_raw_events);
622*58e6ee5fSAndroid Build Coastguard Worker CU_add_test(suite, "tracefs_tracers API",
623*58e6ee5fSAndroid Build Coastguard Worker test_tracers);
624*58e6ee5fSAndroid Build Coastguard Worker CU_add_test(suite, "tracefs_local events API",
625*58e6ee5fSAndroid Build Coastguard Worker test_local_events);
626*58e6ee5fSAndroid Build Coastguard Worker CU_add_test(suite, "tracefs_instances_walk API",
627*58e6ee5fSAndroid Build Coastguard Worker test_instances_walk);
628*58e6ee5fSAndroid Build Coastguard Worker CU_add_test(suite, "tracefs_get_clock API",
629*58e6ee5fSAndroid Build Coastguard Worker test_get_clock);
630*58e6ee5fSAndroid Build Coastguard Worker }
631