blob: 35e6d94f4b16b3ba3fc78b6479c59cca81da6173 [file] [log] [blame]
edisonn@google.comc2c49812012-10-10 15:08:12 +00001'''
2Compares the rendererings of serialized SkPictures to expected result.
3
4Copyright 2012 Google Inc.
5
6Use of this source code is governed by a BSD-style license that can be
7found in the LICENSE file.
8'''
9# common Python modules
10import os
11import optparse
12import sys
13import shutil
14import tempfile
15
16USAGE_STRING = 'Usage: %s input... expectedDir render_app [reander_app_args]'
17HELP_STRING = '''
18
19Compares the renderings of serialized SkPicture files and directories specified
20by input with the files in expectedDir. Note, files in directoriers are
21expected to end with .skp.
22'''
23
24def RunCommand(command):
25 """Run a command.
26
27 @param command the command as a single string
28 """
29 print 'running command [%s]...' % command
30 os.system(command)
31
32
33def FindPathToProgram(program):
34 """Return path to an existing program binary, or raise an exception if we
35 cannot find one.
36
37 @param program the name of the program that is being looked for
38 """
39 trunk_path = os.path.abspath(os.path.join(os.path.dirname(__file__),
40 os.pardir))
41 possible_paths = [os.path.join(trunk_path, 'out', 'Release', program),
42 os.path.join(trunk_path, 'out', 'Debug', program),
43 os.path.join(trunk_path, 'out', 'Release',
44 program + ".exe"),
45 os.path.join(trunk_path, 'out', 'Debug',
46 program + ".exe")]
47 for try_path in possible_paths:
48 if os.path.isfile(try_path):
49 return try_path
50 raise Exception('cannot find %s in paths %s; maybe you need to '
51 'build %s?' % (program, possible_paths, program))
52
53
54def RenderSkps(inputs, render_dir, render_app, args):
55 """Renders the serialized SkPictures.
56
57 Uses the render_pictures program to do the rendering.
58
59 @param inputs the location(s) to read the serlialized SkPictures
60 @param render_dir the location to write out the rendered images
61 """
62 renderer_path = FindPathToProgram(render_app)
63 inputs_as_string = " ".join(inputs)
64 command = '%s %s %s' % (renderer_path, inputs_as_string, render_dir)
65
66 command += args
67
68 RunCommand(command)
69
70
71def DiffRenderings(expected_dir, comparison_dir, diff_dir):
72 """Diffs the rendered SkPicture files with the baseline files.
73
74 Uses the skdiff program to do the diffing.
75
76 @param expected_dir the location of the baseline images.
77 @param comparison_dir the location of the images to comapre with the
78 baseline
79 @param diff_dir the location to write out the diff results
80 """
81 skdiff_path = FindPathToProgram('skdiff')
82 RunCommand('%s %s %s %s %s' %
83 (skdiff_path, expected_dir, comparison_dir, diff_dir,
84 '--noprintdirs'))
85
86
87def Cleanup(render_dir_option, diff_dir_option, render_dir, diff_dir):
88 """Deletes any temporary folders and files created.
89
90 @param foo_option The OptionParser parsed render_dir or diff_dir vars.
91 If these variables are not passed by user we ended up creating
92 temporary directories (render_dir, diff_dir) which we will remove.
93 @param render_dir the directory where the rendered images were written
94 @param diff_dir the directory where the diff results were written
95 """
96 if (not render_dir_option):
97 if (os.path.isdir(render_dir)):
98 shutil.rmtree(render_dir)
99 if (not diff_dir_option):
100 if (os.path.isdir(diff_dir)):
101 shutil.rmtree(diff_dir)
102
103def TestRenderSkps(inputs, expected_dir, render_dir_option, diff_dir_option,
104 render_app, render_args):
105 if (render_dir_option):
106 render_dir = render_dir_option
107 else:
108 render_dir = tempfile.mkdtemp()
109
110 if (diff_dir_option):
111 diff_dir = diff_dir_option
112 else:
113 diff_dir = tempfile.mkdtemp()
114 try:
115 RenderSkps(inputs, render_dir, render_app, render_args)
116 DiffRenderings(expected_dir, render_dir, diff_dir)
117 finally:
118 Cleanup(render_dir_option, diff_dir_option, render_dir, diff_dir)