OLD | NEW |
1 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 import os, re, shutil, time | 5 import os, re, shutil, sys, time |
6 | 6 |
7 from autotest_lib.client.bin import test, utils | 7 from autotest_lib.client.bin import test, utils |
8 from autotest_lib.client.common_lib import error, site_ui | 8 from autotest_lib.client.common_lib import error, site_ui |
9 | 9 |
10 WARMUP_TIME = 60 | 10 WARMUP_TIME = 60 |
11 SLEEP_DURATION = 260 | 11 SLEEP_DURATION = 260 |
12 | 12 |
13 def get_pids(program_name): | |
14 """ | |
15 Collect a list of pids for all the instances of a program. | |
16 | |
17 @param program_name the name of the program | |
18 @return list of pids | |
19 """ | |
20 # pgrep is not appropriate here due to its truncation. | |
21 return utils.system_output("ps -ef | grep \'%s\' | grep -v grep | \ | |
22 awk '{print $2}'" % program_name).split("\n") | |
23 | |
24 | |
25 def get_number_of_logical_cpu(): | |
26 """ | |
27 From /proc/stat/. | |
28 | |
29 @return number of logic cpu | |
30 """ | |
31 ret = utils.system_output("cat /proc/stat | grep ^cpu[0-9+] | wc -l") | |
32 return int(ret) | |
33 | |
34 | |
35 def get_utime_stime(pids): | |
36 """ | |
37 Snapshot the sum of utime and the sum of stime for a list of processes. | |
38 | |
39 @param pids a list of pid | |
40 @return [sum_of_utime, sum_of_stime] | |
41 """ | |
42 timelist = [0, 0] | |
43 for p in pids: | |
44 statFile = file("/proc/%s/stat" % p, "r") | |
45 T = statFile.readline().split(" ")[13:15] | |
46 statFile.close() | |
47 for i in range(len(timelist)): | |
48 timelist[i] = timelist[i] + int(T[i]) | |
49 return timelist | |
50 | |
51 | |
52 def get_cpu_usage(duration, time): | |
53 """ | |
54 Calculate cpu usage based on duration and time on cpu. | |
55 | |
56 @param duration | |
57 @param time on cpu | |
58 @return cpu usage | |
59 """ | |
60 return float(time) / float(duration * get_number_of_logical_cpu()) | |
61 | |
62 | |
63 class realtimecomm_GTalkPlayground(test.test): | 13 class realtimecomm_GTalkPlayground(test.test): |
64 version = 1 | 14 version = 1 |
65 playground = '/home/chronos/playground' | 15 playground = '/home/chronos/playground' |
| 16 dep = 'realtimecomm_playground' |
66 | 17 |
67 # The tarball is created from GTalk Playground. | 18 def setup(self): |
68 # https://sites.google.com/a/google.com/wavelet/Home/video-playground | 19 self.job.setup_dep(['realtimecomm_playground']) |
69 def setup(self, tarball='GTalkPlayground.tar.gz'): | |
70 if os.path.exists(self.playground): | |
71 utils.system('rm -rf %s' % self.playground) | |
72 tarball = utils.unmap_url(self.bindir, tarball, self.tmpdir) | |
73 utils.extract_tarball_to_dir(tarball, self.srcdir) | |
74 | 20 |
75 | 21 def run_cleanup(self, testdone=False): |
76 def run_cleanup(self): | |
77 utils.run('pkill chrome', ignore_status=True) | 22 utils.run('pkill chrome', ignore_status=True) |
78 time.sleep(10) | 23 time.sleep(10) |
79 utils.run('pkill GoogleTalkPlugin', ignore_status=True) | 24 utils.run('pkill GoogleTalkPlugin', ignore_status=True) |
80 time.sleep(10) | 25 time.sleep(10) |
81 utils.run('rm -f /tmp/tmp.log', ignore_status=True) | 26 utils.run('rm -f /tmp/tmp.log', ignore_status=True) |
82 utils.run('rm -rf %s' % self.playground) | 27 if testdone: |
| 28 utils.run('rm -rf %s' % self.playground) |
83 # Delete previous browser state if any | 29 # Delete previous browser state if any |
84 shutil.rmtree('/home/chronos/.config/chromium', ignore_errors=True) | 30 shutil.rmtree('/home/chronos/.config/chromium', ignore_errors=True) |
| 31 shutil.rmtree('/home/chronos/.config/google-chrome', ignore_errors=True) |
85 | 32 |
86 | 33 |
87 def run_setup(self): | 34 def run_setup(self): |
88 utils.run('cp -r %s %s' % (self.srcdir, self.playground)) | 35 if os.path.exists(self.playground): |
| 36 shutil.rmtree(self.playground) |
| 37 shutil.copytree(os.path.join(self.dep_dir, 'src'), self.playground) |
89 utils.run('chown chronos %s -R' % self.playground) | 38 utils.run('chown chronos %s -R' % self.playground) |
90 src_opt = os.path.join(self.bindir, 'options') | 39 src_opt = os.path.join(self.bindir, 'options') |
91 des_path= '/home/chronos/.Google/' | 40 des_path= '/home/chronos/.Google/' |
92 opt_path= os.path.join(des_path, 'Google Talk Plugin') | 41 opt_path= os.path.join(des_path, 'Google Talk Plugin') |
93 des_opt = os.path.join(opt_path, 'options') | 42 des_opt = os.path.join(opt_path, 'options') |
94 utils.run('mkdir -p \'%s\'' % opt_path) | 43 utils.run('mkdir -p \'%s\'' % opt_path) |
95 utils.run('cp -f %s \'%s\'' % (src_opt, des_opt)) | 44 utils.run('cp -f %s \'%s\'' % (src_opt, des_opt)) |
96 utils.run('chown chronos \'%s\' -R' % des_path) | 45 utils.run('chown chronos \'%s\' -R' % des_path) |
97 utils.run('chmod o+r+w \'%s\'' % des_opt) | 46 utils.run('chmod o+r+w \'%s\'' % des_opt) |
98 | 47 |
(...skipping 23 matching lines...) Expand all Loading... |
122 except IOError: | 71 except IOError: |
123 raise error.TestFail('Error in reading GTalk log file!') | 72 raise error.TestFail('Error in reading GTalk log file!') |
124 | 73 |
125 | 74 |
126 def get_framerate(self, log): | 75 def get_framerate(self, log): |
127 d = {} | 76 d = {} |
128 # We get a framerate report every 10 seconds for both streams. | 77 # We get a framerate report every 10 seconds for both streams. |
129 # We run for 5 mins, and should get around (5 * 60/10) * 2 = 60 | 78 # We run for 5 mins, and should get around (5 * 60/10) * 2 = 60 |
130 # framerate reports for 2 streams. | 79 # framerate reports for 2 streams. |
131 # Ignore the first and last framerate since they are not accurate. | 80 # Ignore the first and last framerate since they are not accurate. |
132 l = re.findall(r"Decoded framerate \((.*)\): (\d+\.?\d*) fps", log) | 81 l = re.findall(r"Rendered framerate \((.*)\): (\d+\.?\d*) fps", log) |
133 if len(l) < 57: | 82 if len(l) < 57: |
134 raise error.TestFail('Error in Video duration!') | 83 raise error.TestFail('Error in Video duration!') |
135 for i in range(1, len(l) - 1): | 84 for i in range(1, len(l) - 1): |
136 if d.has_key(l[i][0]): | 85 if d.has_key(l[i][0]): |
137 d[l[i][0]] = d[l[i][0]] + float(l[i][1]) | 86 d[l[i][0]] = d[l[i][0]] + float(l[i][1]) |
138 else: | 87 else: |
139 d[l[i][0]] = float(l[i][1]) | 88 d[l[i][0]] = float(l[i][1]) |
140 if len(d) != 2: | 89 if len(d) != 2: |
141 raise error.TestFail('Number of video stream is NOT 2!') | 90 raise error.TestFail('Number of video stream is NOT 2!') |
142 # Get framerate for two streams. | 91 # Get framerate for two streams. |
143 fps = [] | 92 fps = [] |
144 for k in d: | 93 for k in d: |
145 fps.insert(0, d[k] * 2 / (len(l) - 2)) | 94 fps.insert(0, d[k] * 2 / (len(l) - 2)) |
146 self.performance_results['fps_gtalk_up'] = max(fps[0], fps[1]) | 95 self.performance_results['fps_gtalk_up'] = max(fps[0], fps[1]) |
147 self.performance_results['fps_gtalk_down'] = min(fps[0], fps[1]) | 96 self.performance_results['fps_gtalk_down'] = min(fps[0], fps[1]) |
| 97 # Very low framerate means something wrong. Video hang or crash. |
| 98 if (min(fps[0], fps[1]) < 5.0): |
| 99 raise error.TestFail('Error in Video framerate.') |
148 | 100 |
149 | 101 |
150 def run_once(self): | 102 def run_once(self): |
| 103 self.dep_dir = os.path.join(self.autodir, 'deps', self.dep) |
| 104 sys.path.append(self.dep_dir) |
| 105 import pgutil |
| 106 |
151 self.performance_results = {} | 107 self.performance_results = {} |
152 self.run_cleanup() | 108 self.run_cleanup() |
153 self.run_setup() | 109 self.run_setup() |
154 | 110 |
155 # Launch Playground | 111 # Launch Playground |
156 path = os.path.join(self.playground, | 112 path = os.path.join(self.playground, |
157 'buzz/javascript/media/examples') | 113 'buzz/javascript/media/examples') |
158 page = 'videoplayground.html' | 114 page = 'videoplayground.html' |
159 para = 'callType=v' | 115 para = 'callType=v' |
160 playground_url = "%s/%s?%s" % (path, page, para) | 116 playground_url = "%s/%s?%s" % (path, page, para) |
161 # Here we somehow have to use utils.run | 117 # Here we somehow have to use utils.run |
162 # Other approaches like utils.system and site_ui.ChromeSession | 118 # Other approaches like utils.system and site_ui.ChromeSession |
163 # cause problem in video. | 119 # cause problem in video. |
164 # http://code.google.com/p/chromium-os/issues/detail?id=1764 | 120 # http://code.google.com/p/chromium-os/issues/detail?id=1764 |
165 utils.run('su chronos -c \'DISPLAY=:0 \ | 121 utils.run('su chronos -c \'DISPLAY=:0 \ |
166 XAUTHORITY=/home/chronos/.Xauthority \ | 122 XAUTHORITY=/home/chronos/.Xauthority \ |
167 /opt/google/chrome/chrome \ | 123 /opt/google/chrome/chrome \ |
168 --no-first-run %s\' &' % playground_url) | 124 --no-first-run %s\' &' % playground_url) |
169 | 125 |
170 # Collect ctime,stime for GoogleTalkPlugin | 126 # Collect ctime,stime for GoogleTalkPlugin |
171 time.sleep(WARMUP_TIME) | 127 time.sleep(WARMUP_TIME) |
172 gtalk_s = get_utime_stime(get_pids('GoogleTalkPlugin')) | 128 gtalk_s = pgutil.get_utime_stime(pgutil.get_pids('GoogleTalkPlugin')) |
173 chrome_s = get_utime_stime(get_pids('chrome/chrome')) | 129 chrome_s = pgutil.get_utime_stime(pgutil.get_pids('chrome/chrome')) |
174 time.sleep(SLEEP_DURATION) | 130 time.sleep(SLEEP_DURATION) |
175 gtalk_e = get_utime_stime(get_pids('GoogleTalkPlugin')) | 131 gtalk_e = pgutil.get_utime_stime(pgutil.get_pids('GoogleTalkPlugin')) |
176 chrome_e = get_utime_stime(get_pids('chrome/chrome')) | 132 chrome_e = pgutil.get_utime_stime(pgutil.get_pids('chrome/chrome')) |
177 | 133 |
178 self.performance_results['ctime_gtalk'] = \ | 134 self.performance_results['ctime_gtalk'] = \ |
179 get_cpu_usage(SLEEP_DURATION, gtalk_e[0] - gtalk_s[0]) | 135 pgutil.get_cpu_usage(SLEEP_DURATION, gtalk_e[0] - gtalk_s[0]) |
180 self.performance_results['stime_gtalk'] = \ | 136 self.performance_results['stime_gtalk'] = \ |
181 get_cpu_usage(SLEEP_DURATION, gtalk_e[1] - gtalk_s[1]) | 137 pgutil.get_cpu_usage(SLEEP_DURATION, gtalk_e[1] - gtalk_s[1]) |
182 self.performance_results['ctime_chrome'] = \ | 138 self.performance_results['ctime_chrome'] = \ |
183 get_cpu_usage(SLEEP_DURATION, chrome_e[0] - chrome_s[0]) | 139 pgutil.get_cpu_usage(SLEEP_DURATION, chrome_e[0] - chrome_s[0]) |
184 self.performance_results['stime_chrome'] = \ | 140 self.performance_results['stime_chrome'] = \ |
185 get_cpu_usage(SLEEP_DURATION, chrome_e[1] - chrome_s[1]) | 141 pgutil.get_cpu_usage(SLEEP_DURATION, chrome_e[1] - chrome_s[1]) |
186 | 142 |
187 # Verify log | 143 # Verify log |
188 try: | 144 try: |
189 self.run_verification() | 145 self.run_verification() |
190 finally: | 146 finally: |
191 self.run_cleanup() | 147 self.run_cleanup(True) |
192 | 148 |
193 # Report perf | 149 # Report perf |
194 self.write_perf_keyval(self.performance_results) | 150 self.write_perf_keyval(self.performance_results) |
195 | 151 |
OLD | NEW |