Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(235)

Side by Side Diff: base/android/third_party/cygprofile_startup/cygprofile_startup_unittest.cc

Issue 10697079: Upstreaming Cygprofile for Android. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: address digit comment Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
Steve Block 2012/07/11 16:17:56 2012
felipeg 2012/07/11 17:10:25 Done.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Test is intended to be executed on an Android device. The device should
6 // have an sd card, and should have a /sdcard/profile directory already created
7 // before running the test, because the test will dump the log file into that
8 // directory. The test will enable order profiling, call some functions and
9 // then disable profiling. The test will then check that the calls were
10 // properly logged in the log file. Since the first entry of a function is
11 // logged, the profiling should log the following:
12 // 00008000-00023000 r-xp 00000000 b3:02 12322 /data/local/tmp/cygprofile_test
13 // secs msecs pid:threadid func
14 // START
15 // 1315416566 712405 1818:1074467944 function2_addr
16 // 1315416566 712457 1818:1074467944 function1_addr
17 // 1315416566 712483 1818:1074467944 function3_addr
18 // END
19 // This is medium-sized unittest because it will first write the log file
20 // during profiling and then reads the file to make sure it contains the correct
21 // output. The test passes on normal exit (i.e. a 0 return value from main).
22
23 #include <stdio.h>
24 #include <stdint.h>
25 #include <string.h>
26
27 #include "./cygprofile_startup.h"
28
29 // Used to mod (i.e. %) seconds with to truncate the length. It seems
30 // reasonable to expect logged calls to be at most 999 seconds apart.
31 const int kTruncateSecs = 1000;
32
33 int function1(void) {
34 return 0;
35 }
36
37 int function2(void) {
38 return function1 () + 1;
39 }
40
41 int function3(void) {
42 return function2 () + 1;
43 }
44
45 int check_logfile(void) {
46 // Check results to see if test passed.
47 FILE* fp;
48 char line[256];
49 int linenum = 0;
50 char* str;
51 char* res;
52 unsigned long seconds, mtime, tid;
53 unsigned long lastsecs, lastmtime, lasttid;
54 int pid, addr, lastpid;
55
56 // The test is to be run on an Android device with a sd card. Before running
57 // the test there should be a /sdcard/profile directory created on the device.
58 if ((fp=fopen("/sdcard/profile/logfile.out", "r")) == NULL) {
59 printf("FAIL: could not open log file: Does directory /sdcard/profile exist? \n");
60 return -1;
61 }
62
63 // Expect exactly 7 lines in log file
64 for (linenum = 0; linenum < 7; linenum++) {
65 if (fgets(line, sizeof(line), fp) == NULL) {
66 printf("FAIL: log file does not contain correct number of lines\n");
67 return -1;
68 }
69
70 // Make sure line 2 is START, last line is END, and the correct calls
71 // are profiled on lines 3, 4 and 5.
72 switch (linenum) {
73 case 2:
74 str = strtok_r(line, " \n", &res);
75 if (strcmp("START", str) != 0) {
76 printf("FAIL: START not found where expected\n");
77 return -1;
78 }
79 break;
80 case 3:
81 sscanf(line, "%ld %ld\t%d:%ld\t%x\n", &lastsecs, &lastmtime, &lastpid,
82 &lasttid, &addr);
83 lastsecs = lastsecs % kTruncateSecs;
84 if (reinterpret_cast<void*>(addr) != &function2) {
85 // Test failed
86 printf("FAIL: function2 call not found where expected\n");
87 printf(" line = %s, function2 = %p\n", line, &function2);
88 return -1;
89 }
90 // fprintf (stdout, "addr: %x, %p equal=%d\n", addr, &function2, ;
91 break;
92 case 4:
93 sscanf(line, "%ld %ld\t%d:%ld\t%x\n", &seconds, &mtime, &pid, &tid,
94 &addr);
95 seconds = seconds % kTruncateSecs;
96 if (reinterpret_cast<void*>(addr) != &function1 || pid != lastpid ||
97 tid != lasttid ||
98 ((seconds * 1000000) + mtime) < ((lastsecs * 100000) + lastmtime)) {
99 // Test failed
100 // printf("addr = %p, function1 = %p, pid = %d, lastpid = %d\n",
101 // reinterpret_cast<void*>(addr), &function1, pid, lastpid);
102 // printf("seconds = %ld, mtime = %ld, lastsecs = %ld, lastmtime = %d\ n",
103 // seconds, mtime, lastsecs, lastmtime);
104 // printf("condition4: %ld < %ld\n",
105 // ((seconds * 1000000) + mtime), ((lastsecs * 100000) + lastmt ime));
106 printf("FAIL: function1 call not found where expected\n");
107 return -1;
108 }
109 lastsecs = seconds;
110 lastmtime = mtime;
111 lastpid = pid;
112 lasttid = tid;
113 break;
114 case 5:
115 sscanf(line, "%ld %ld\t%d:%ld\t%x\n", &seconds, &mtime, &pid, &tid,
116 &addr);
117 if (reinterpret_cast<void*>(addr) != &function3 || pid != lastpid ||
118 tid != lasttid ||
119 ((seconds * 1000000) + mtime) < ((lastsecs * 100000) + lastmtime)) {
120 // Test failed
121 printf("FAIL: function3 call not found where expected\n");
122 return -1;
123 }
124 break;
125 case 6:
126 str = strtok_r(line, " \n", &res);
127 // sscanf(line, "%s%*s", str);
128 if (strcmp("END", str) != 0) {
129 printf("FAIL: END not found where expected\n");
130 return -1;
131 }
132 break;
133 default:
134 break;
135 }
136 }
137
138 return 0;
139 }
140
141 int main(void) {
142 int result, passed;
143 cygprofile_startup::cygprofile_start("/sdcard/profile/logfile.out");
144 function2();
145 result = function3();
146 cygprofile_startup::cygprofile_end();
147
148 function2();
149 passed = check_logfile();
150 if (passed < 0)
151 printf("test failed.\n");
152 else
153 printf("test passed.\n");
154 return passed;
155 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698