1#
2# Copyright 2015 Google Inc.
3#
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6#
7
8#!/usr/bin/env python
9
10usage = '''
11Write extra flags to outfile for DM based on the bot name:
12  $ python dm_flags.py outfile Test-Ubuntu-GCC-GCE-CPU-AVX2-x86-Debug
13Or run self-tests:
14  $ python dm_flags.py test
15'''
16
17import inspect
18import json
19import os
20import sys
21
22
23def lineno():
24  caller = inspect.stack()[1]  # Up one level to our caller.
25  return inspect.getframeinfo(caller[0]).lineno
26
27
28cov_start = lineno()+1   # We care about coverage starting just past this def.
29def get_args(bot):
30  args = []
31
32  configs = ['565', '8888', 'gpu']
33
34  if 'Android' not in bot:
35    configs.extend(('upright-matrix-8888', 'upright-matrix-gpu'))
36    args.extend('--matrix 0 1 1 0'.split(' '))
37
38  if '-GCE-' in bot:
39    configs.append('sp-8888')
40
41  if 'TegraK1' in bot or 'GTX550Ti' in bot or 'GTX660' in bot or 'GT610' in bot:
42    if 'Android' in bot:
43      configs.append('nvprmsaa4')
44    else:
45      configs.append('nvprmsaa16')
46
47  # The S4 crashes and the NP produces a long error stream when we run with
48  # MSAA.  The Tegra2 and Tegra3 just don't support it.
49  if ('GalaxyS4'    not in bot and
50      'NexusPlayer' not in bot and
51      'Tegra3'      not in bot and
52      'iOS'         not in bot):
53    if 'Android' in bot:
54      configs.append('msaa4')
55    else:
56      configs.append('msaa16')
57  # Runs out of memory on Android bots and Daisy.  Everyone else seems fine.
58  if 'Android' not in bot and 'Daisy' not in bot:
59    configs.append('pdf')
60
61  # NP is running out of RAM when we run all these modes.  skia:3255
62  if 'NexusPlayer' not in bot:
63    configs.extend(mode + '-8888' for mode in
64                   ['serialize', 'tiles_rt', 'pipe'])
65    configs.append('tiles_rt-gpu')
66  if 'ANGLE' in bot:
67    configs.append('angle')
68  args.append('--config')
69  args.extend(configs)
70
71  if 'GalaxyS' in bot:
72    args.extend(('--threads', '0'))
73
74  blacklist = []
75  # This image is too large to be a texture for many GPUs.
76  blacklist.extend('gpu _ _ PANO_20121023_214540.jpg'.split(' '))
77  blacklist.extend('msaa _ _ PANO_20121023_214540.jpg'.split(' '))
78
79  # Several of the newest version bmps fail on SkImageDecoder
80  blacklist.extend('_ image decode pal8os2v2.bmp'.split(' '))
81  blacklist.extend('_ image decode pal8v4.bmp'.split(' '))
82  blacklist.extend('_ image decode pal8v5.bmp'.split(' '))
83  blacklist.extend('_ image decode rgb16-565.bmp'.split(' '))
84  blacklist.extend('_ image decode rgb16-565pal.bmp'.split(' '))
85  blacklist.extend('_ image decode rgb32-111110.bmp'.split(' '))
86  blacklist.extend('_ image decode rgb32bf.bmp'.split(' '))
87  blacklist.extend('_ image decode rgba32.bmp'.split(' '))
88  blacklist.extend('_ image decode rgba32abf.bmp'.split(' '))
89  blacklist.extend('_ image decode rgb24largepal.bmp'.split(' '))
90  blacklist.extend('_ image decode pal8os2v2-16.bmp'.split(' '))
91  blacklist.extend('_ image decode pal8oversizepal.bmp'.split(' '))
92  blacklist.extend('_ image decode pal4rletrns.bmp'.split(' '))
93  blacklist.extend('_ image decode pal8rletrns.bmp'.split(' '))
94  blacklist.extend('_ image decode 4bpp-pixeldata-cropped.bmp'.split(' '))
95  blacklist.extend('_ image decode 8bpp-pixeldata-cropped.bmp'.split(' '))
96  blacklist.extend('_ image decode 24bpp-pixeldata-cropped.bmp'.split(' '))
97  blacklist.extend('_ image decode 32bpp-pixeldata-cropped.bmp'.split(' '))
98  blacklist.extend('_ image subset rgb24largepal.bmp'.split(' '))
99  blacklist.extend('_ image subset pal8os2v2-16.bmp'.split(' '))
100  blacklist.extend('_ image subset pal8oversizepal.bmp'.split(' '))
101  blacklist.extend('_ image subset 4bpp-pixeldata-cropped.bmp'.split(' '))
102  blacklist.extend('_ image subset 8bpp-pixeldata-cropped.bmp'.split(' '))
103  blacklist.extend('_ image subset 24bpp-pixeldata-cropped.bmp'.split(' '))
104  blacklist.extend('_ image subset 32bpp-pixeldata-cropped.bmp'.split(' '))
105
106  # New ico files that fail on SkImageDecoder
107  blacklist.extend('_ image decode Hopstarter-Mac-Folders-Apple.ico'.split(' '))
108
109  # Leon doesn't care about this, so why run it?
110  if 'Win' in bot:
111    blacklist.extend('_ image decode _'.split(' '))
112    blacklist.extend('_ image subset _'.split(' '))
113
114  # Certain gm's on win7 gpu and pdf are never finishing and keeping the test
115  # running forever
116  if 'Win7' in bot:
117    blacklist.extend('msaa16 gm _ colorwheelnative'.split(' '))
118    blacklist.extend('pdf gm _ fontmgr_iter_factory'.split(' '))
119
120  # Drawing SKPs or images into GPU canvases is a New Thing.
121  # It seems like we're running out of RAM on some Android bots, so start off
122  # with a very wide blacklist disabling all these tests on all Android bots.
123  if 'Android' in bot:  # skia:3255
124    blacklist.extend('gpu skp _ _ msaa skp _ _'.split(' '))
125    blacklist.extend('gpu image decode _ msaa image decode _'.split(' '))
126    blacklist.extend('gpu image subset _ msaa image subset _'.split(' '))
127
128  if 'Valgrind' in bot:
129    # PDF + .webp -> jumps depending on uninitialized memory.  skia:3505
130    blacklist.extend('pdf _ _ .webp'.split(' '))
131    # These take 18+ hours to run.
132    blacklist.extend('pdf gm _ fontmgr_iter'.split(' '))
133    blacklist.extend('pdf _ _ PANO_20121023_214540.jpg'.split(' '))
134    blacklist.extend('pdf skp _ worldjournal'.split(' '))
135    blacklist.extend('pdf skp _ desk_baidu.skp'.split(' '))
136    blacklist.extend('pdf skp _ desk_wikipedia.skp'.split(' '))
137
138  if 'iOS' in bot:
139    blacklist.extend('gpu skp _ _ msaa skp _ _'.split(' '))
140    blacklist.extend('gpu image decode _ msaa image decode _'.split(' '))
141    blacklist.extend('gpu image subset _ msaa image subset _'.split(' '))
142    blacklist.extend('msaa16 gm _ tilemodesProcess'.split(' '))
143
144  if 'GalaxyS4' in bot:
145    # This occasionally runs forever. skia:3802
146    blacklist.extend('tiles_rt-gpu gm _ imagefilterscropped'.split(' '))
147
148  if blacklist:
149    args.append('--blacklist')
150    args.extend(blacklist)
151
152  match = []
153  if 'Valgrind' in bot: # skia:3021
154    match.append('~Threaded')
155  if 'TSAN' in bot: # skia:3562
156    match.append('~Math')
157
158  if 'GalaxyS3' in bot:  # skia:1699
159    match.append('~WritePixels')
160
161  # skia:3249: these images flakily don't decode on Android.
162  if 'Android' in bot:
163    match.append('~tabl_mozilla_0')
164    match.append('~desk_yahoonews_0')
165
166  if 'NexusPlayer' in bot:
167    match.append('~ResourceCache')
168
169  if 'iOS' in bot:
170    match.append('~WritePixels')
171
172  if match:
173    args.append('--match')
174    args.extend(match)
175
176  return args
177cov_end = lineno()   # Don't care about code coverage past here.
178
179
180def self_test():
181  import coverage  # This way the bots don't need coverage.py to be installed.
182  args = {}
183  cases = [
184    'Pretend-iOS-Bot',
185    'Test-Android-GCC-Nexus9-GPU-TegraK1-Arm64-Debug',
186    'Test-Android-GCC-GalaxyS3-GPU-Mali400-Arm7-Debug',
187    'Test-Android-GCC-GalaxyS4-GPU-SGX544-Arm7-Release',
188    'Test-Android-GCC-Nexus7-GPU-Tegra3-Arm7-Release',
189    'Test-Android-GCC-NexusPlayer-CPU-SSSE3-x86-Release',
190    'Test-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-Valgrind',
191    'Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-TSAN',
192    'Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-Valgrind',
193    'Test-Win7-MSVC-ShuttleA-GPU-HD2000-x86-Debug-ANGLE',
194  ]
195
196  cov = coverage.coverage()
197  cov.start()
198  for case in cases:
199    args[case] = get_args(case)
200  cov.stop()
201
202  this_file = os.path.basename(__file__)
203  _, _, not_run, _ = cov.analysis(this_file)
204  filtered = [line for line in not_run if line > cov_start and line < cov_end]
205  if filtered:
206    print 'Lines not covered by test cases: ', filtered
207    sys.exit(1)
208
209  golden = this_file.replace('.py', '.json')
210  with open(os.path.join(os.path.dirname(__file__), golden), 'w') as f:
211    json.dump(args, f, indent=2, sort_keys=True)
212
213
214if __name__ == '__main__':
215  if len(sys.argv) == 2 and sys.argv[1] == 'test':
216    self_test()
217    sys.exit(0)
218
219  if len(sys.argv) != 3:
220    print usage
221    sys.exit(1)
222
223  with open(sys.argv[1], 'w') as out:
224    json.dump(get_args(sys.argv[2]), out)
225