xref: /aosp_15_r20/external/skia/site/docs/dev/testing/testing.md (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker---
2*c8dee2aaSAndroid Build Coastguard Workertitle: 'Correctness Testing'
3*c8dee2aaSAndroid Build Coastguard WorkerlinkTitle: 'Correctness Testing'
4*c8dee2aaSAndroid Build Coastguard Worker---
5*c8dee2aaSAndroid Build Coastguard Worker
6*c8dee2aaSAndroid Build Coastguard WorkerSkia correctness testing is primarily served by a tool named DM. This is a
7*c8dee2aaSAndroid Build Coastguard Workerquickstart to building and running DM.
8*c8dee2aaSAndroid Build Coastguard Worker
9*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify lang=sh?-->
10*c8dee2aaSAndroid Build Coastguard Worker
11*c8dee2aaSAndroid Build Coastguard Worker    python3 tools/git-sync-deps
12*c8dee2aaSAndroid Build Coastguard Worker    bin/gn gen out/Debug
13*c8dee2aaSAndroid Build Coastguard Worker    ninja -C out/Debug dm
14*c8dee2aaSAndroid Build Coastguard Worker    out/Debug/dm -v -w dm_output
15*c8dee2aaSAndroid Build Coastguard Worker
16*c8dee2aaSAndroid Build Coastguard WorkerWhen you run this, you may notice your CPU peg to 100% for a while, then taper
17*c8dee2aaSAndroid Build Coastguard Workeroff to 1 or 2 active cores as the run finishes. This is intentional. DM is very
18*c8dee2aaSAndroid Build Coastguard Workermultithreaded, but some of the work, particularly GPU-backed work, is still
19*c8dee2aaSAndroid Build Coastguard Workerforced to run on a single thread. You can use `--threads N` to limit DM to N
20*c8dee2aaSAndroid Build Coastguard Workerthreads if you like. This can sometimes be helpful on machines that have
21*c8dee2aaSAndroid Build Coastguard Workerrelatively more CPU available than RAM.
22*c8dee2aaSAndroid Build Coastguard Worker
23*c8dee2aaSAndroid Build Coastguard WorkerAs DM runs, you ought to see a giant spew of output that looks something like
24*c8dee2aaSAndroid Build Coastguard Workerthis.
25*c8dee2aaSAndroid Build Coastguard Worker
26*c8dee2aaSAndroid Build Coastguard Worker```
27*c8dee2aaSAndroid Build Coastguard WorkerSkipping nonrendering: Don't understand 'nonrendering'.
28*c8dee2aaSAndroid Build Coastguard WorkerSkipping angle: Don't understand 'angle'.
29*c8dee2aaSAndroid Build Coastguard WorkerSkipping nvprmsaa4: Could not create a surface.
30*c8dee2aaSAndroid Build Coastguard Worker492 srcs * 3 sinks + 382 tests == 1858 tasks
31*c8dee2aaSAndroid Build Coastguard Worker
32*c8dee2aaSAndroid Build Coastguard Worker(  25MB  1857) 1.36ms   8888 image mandrill_132x132_12x12.astc-5-subsets
33*c8dee2aaSAndroid Build Coastguard Worker(  25MB  1856) 1.41ms   8888 image mandrill_132x132_6x6.astc-5-subsets
34*c8dee2aaSAndroid Build Coastguard Worker(  25MB  1855) 1.35ms   8888 image mandrill_132x130_6x5.astc-5-subsets
35*c8dee2aaSAndroid Build Coastguard Worker(  25MB  1854) 1.41ms   8888 image mandrill_132x130_12x10.astc-5-subsets
36*c8dee2aaSAndroid Build Coastguard Worker(  25MB  1853) 151µs    8888 image mandrill_130x132_10x6.astc-5-subsets
37*c8dee2aaSAndroid Build Coastguard Worker(  25MB  1852) 154µs    8888 image mandrill_130x130_5x5.astc-5-subsets
38*c8dee2aaSAndroid Build Coastguard Worker                                  ...
39*c8dee2aaSAndroid Build Coastguard Worker( 748MB     5) 9.43ms   unit test GLInterfaceValidation
40*c8dee2aaSAndroid Build Coastguard Worker( 748MB     4) 30.3ms   unit test HalfFloatTextureTest
41*c8dee2aaSAndroid Build Coastguard Worker( 748MB     3) 31.2ms   unit test FloatingPointTextureTest
42*c8dee2aaSAndroid Build Coastguard Worker( 748MB     2) 32.9ms   unit test DeferredCanvas_GPU
43*c8dee2aaSAndroid Build Coastguard Worker( 748MB     1) 49.4ms   unit test ClipCache
44*c8dee2aaSAndroid Build Coastguard Worker( 748MB     0) 37.2ms   unit test Blur
45*c8dee2aaSAndroid Build Coastguard Worker```
46*c8dee2aaSAndroid Build Coastguard Worker
47*c8dee2aaSAndroid Build Coastguard WorkerDo not panic.
48*c8dee2aaSAndroid Build Coastguard Worker
49*c8dee2aaSAndroid Build Coastguard WorkerAs you become more familiar with DM, this spew may be a bit annoying. If you
50*c8dee2aaSAndroid Build Coastguard Workerremove -v from the command line, DM will spin its progress on a single line
51*c8dee2aaSAndroid Build Coastguard Workerrather than print a new line for each status update.
52*c8dee2aaSAndroid Build Coastguard Worker
53*c8dee2aaSAndroid Build Coastguard WorkerDon't worry about the "Skipping something: Here's why." lines at startup. DM
54*c8dee2aaSAndroid Build Coastguard Workersupports many test configurations, which are not all appropriate for all
55*c8dee2aaSAndroid Build Coastguard Workermachines. These lines are a sort of FYI, mostly in case DM can't run some
56*c8dee2aaSAndroid Build Coastguard Workerconfiguration you might be expecting it to run.
57*c8dee2aaSAndroid Build Coastguard Worker
58*c8dee2aaSAndroid Build Coastguard WorkerDon't worry about the "skps: Couldn't read skps." messages either, you won't
59*c8dee2aaSAndroid Build Coastguard Workerhave those by default and can do without them. If you wish to test with them
60*c8dee2aaSAndroid Build Coastguard Workertoo, you can download them separately.
61*c8dee2aaSAndroid Build Coastguard Worker
62*c8dee2aaSAndroid Build Coastguard WorkerThe next line is an overview of the work DM is about to do.
63*c8dee2aaSAndroid Build Coastguard Worker
64*c8dee2aaSAndroid Build Coastguard Worker```
65*c8dee2aaSAndroid Build Coastguard Worker492 srcs * 3 sinks + 382 tests == 1858 tasks
66*c8dee2aaSAndroid Build Coastguard Worker```
67*c8dee2aaSAndroid Build Coastguard Worker
68*c8dee2aaSAndroid Build Coastguard WorkerDM has found 382 unit tests (code linked in from tests/), and 492 other drawing
69*c8dee2aaSAndroid Build Coastguard Workersources. These drawing sources may be GM integration tests (code linked in from
70*c8dee2aaSAndroid Build Coastguard Workergm/), image files (from `--images`, which defaults to "resources") or .skp files
71*c8dee2aaSAndroid Build Coastguard Worker(from `--skps`, which defaults to "skps"). You can control the types of sources
72*c8dee2aaSAndroid Build Coastguard WorkerDM will use with `--src` (default, "tests gm image skp").
73*c8dee2aaSAndroid Build Coastguard Worker
74*c8dee2aaSAndroid Build Coastguard WorkerDM has found 3 usable ways to draw those 492 sources. This is controlled by
75*c8dee2aaSAndroid Build Coastguard Worker`--config`. The defaults are operating system dependent. On Linux they are "8888
76*c8dee2aaSAndroid Build Coastguard Workergl nonrendering". DM has skipped nonrendering leaving two usable configs: 8888
77*c8dee2aaSAndroid Build Coastguard Workerand gl. These two name different ways to draw using Skia:
78*c8dee2aaSAndroid Build Coastguard Worker
79*c8dee2aaSAndroid Build Coastguard Worker- 8888: draw using the software backend into a 32-bit RGBA bitmap
80*c8dee2aaSAndroid Build Coastguard Worker- gl: draw using the OpenGL backend (Ganesh) into a 32-bit RGBA bitmap
81*c8dee2aaSAndroid Build Coastguard Worker
82*c8dee2aaSAndroid Build Coastguard WorkerSometimes DM calls these configs, sometimes sinks. Sorry. There are many
83*c8dee2aaSAndroid Build Coastguard Workerpossible configs but generally we pay most attention to 8888 and gl.
84*c8dee2aaSAndroid Build Coastguard Worker
85*c8dee2aaSAndroid Build Coastguard WorkerDM always tries to draw all sources into all sinks, which is why we multiply 492
86*c8dee2aaSAndroid Build Coastguard Workerby 3. The unit tests don't really fit into this source-sink model, so they stand
87*c8dee2aaSAndroid Build Coastguard Workeralone. A couple thousand tasks is pretty normal. Let's look at the status line
88*c8dee2aaSAndroid Build Coastguard Workerfor one of those tasks.
89*c8dee2aaSAndroid Build Coastguard Worker
90*c8dee2aaSAndroid Build Coastguard Worker```
91*c8dee2aaSAndroid Build Coastguard Worker(  25MB  1857) 1.36ms   8888 image mandrill_132x132_12x12.astc-5-subsets
92*c8dee2aaSAndroid Build Coastguard Worker   [1]   [2]   [3]      [4]
93*c8dee2aaSAndroid Build Coastguard Worker```
94*c8dee2aaSAndroid Build Coastguard Worker
95*c8dee2aaSAndroid Build Coastguard WorkerThis status line tells us several things.
96*c8dee2aaSAndroid Build Coastguard Worker
97*c8dee2aaSAndroid Build Coastguard Worker1. The maximum amount of memory DM had ever used was 25MB. Note this is a high
98*c8dee2aaSAndroid Build Coastguard Worker   water mark, not the current memory usage. This is mostly useful for us to
99*c8dee2aaSAndroid Build Coastguard Worker   track on our buildbots, some of which run perilously close to the system
100*c8dee2aaSAndroid Build Coastguard Worker   memory limit.
101*c8dee2aaSAndroid Build Coastguard Worker
102*c8dee2aaSAndroid Build Coastguard Worker2. The number of unfinished tasks, in this example there are 1857, either
103*c8dee2aaSAndroid Build Coastguard Worker   currently running or waiting to run. We generally run one task per hardware
104*c8dee2aaSAndroid Build Coastguard Worker   thread available, so on a typical laptop there are probably 4 or 8 running at
105*c8dee2aaSAndroid Build Coastguard Worker   once. Sometimes the counts appear to show up out of order, particularly at DM
106*c8dee2aaSAndroid Build Coastguard Worker   startup; it's harmless, and doesn't affect the correctness of the run.
107*c8dee2aaSAndroid Build Coastguard Worker
108*c8dee2aaSAndroid Build Coastguard Worker3. Next, we see this task took 1.36 milliseconds to run. Generally, the
109*c8dee2aaSAndroid Build Coastguard Worker   precision of this timer is around 1 microsecond. The time is purely there for
110*c8dee2aaSAndroid Build Coastguard Worker   informational purposes, to make it easier for us to find slow tests.
111*c8dee2aaSAndroid Build Coastguard Worker
112*c8dee2aaSAndroid Build Coastguard Worker4. The configuration and name of the test we ran. We drew the test
113*c8dee2aaSAndroid Build Coastguard Worker   "mandrill_132x132_12x12.astc-5-subsets", which is an "image" source, into an
114*c8dee2aaSAndroid Build Coastguard Worker   "8888" sink.
115*c8dee2aaSAndroid Build Coastguard Worker
116*c8dee2aaSAndroid Build Coastguard WorkerWhen DM finishes running, you should find a directory with file named `dm.json`,
117*c8dee2aaSAndroid Build Coastguard Workerand some nested directories filled with lots of images.
118*c8dee2aaSAndroid Build Coastguard Worker
119*c8dee2aaSAndroid Build Coastguard Worker```
120*c8dee2aaSAndroid Build Coastguard Worker$ ls dm_output
121*c8dee2aaSAndroid Build Coastguard Worker8888    dm.json gl
122*c8dee2aaSAndroid Build Coastguard Worker
123*c8dee2aaSAndroid Build Coastguard Worker$ find dm_output -name '*.png'
124*c8dee2aaSAndroid Build Coastguard Workerdm_output/8888/gm/3x3bitmaprect.png
125*c8dee2aaSAndroid Build Coastguard Workerdm_output/8888/gm/aaclip.png
126*c8dee2aaSAndroid Build Coastguard Workerdm_output/8888/gm/aarectmodes.png
127*c8dee2aaSAndroid Build Coastguard Workerdm_output/8888/gm/alphagradients.png
128*c8dee2aaSAndroid Build Coastguard Workerdm_output/8888/gm/arcofzorro.png
129*c8dee2aaSAndroid Build Coastguard Workerdm_output/8888/gm/arithmode.png
130*c8dee2aaSAndroid Build Coastguard Workerdm_output/8888/gm/astcbitmap.png
131*c8dee2aaSAndroid Build Coastguard Workerdm_output/8888/gm/bezier_conic_effects.png
132*c8dee2aaSAndroid Build Coastguard Workerdm_output/8888/gm/bezier_cubic_effects.png
133*c8dee2aaSAndroid Build Coastguard Workerdm_output/8888/gm/bezier_quad_effects.png
134*c8dee2aaSAndroid Build Coastguard Worker                ...
135*c8dee2aaSAndroid Build Coastguard Worker```
136*c8dee2aaSAndroid Build Coastguard Worker
137*c8dee2aaSAndroid Build Coastguard WorkerThe directories are nested first by sink type (`--config`), then by source type
138*c8dee2aaSAndroid Build Coastguard Worker(`--src`). The image from the task we just looked at, "8888 image
139*c8dee2aaSAndroid Build Coastguard Workermandrill_132x132_12x12.astc-5-subsets", can be found at
140*c8dee2aaSAndroid Build Coastguard Worker`dm_output/8888/image/mandrill_132x132_12x12.astc-5-subsets.png`.
141*c8dee2aaSAndroid Build Coastguard Worker
142*c8dee2aaSAndroid Build Coastguard Worker`dm.json` is used by our automated testing system, so you can ignore it if you
143*c8dee2aaSAndroid Build Coastguard Workerlike. It contains a listing of each test run and a checksum of the image
144*c8dee2aaSAndroid Build Coastguard Workergenerated for that run.
145*c8dee2aaSAndroid Build Coastguard Worker
146*c8dee2aaSAndroid Build Coastguard Worker### Detail <a name="digests"></a>
147*c8dee2aaSAndroid Build Coastguard Worker
148*c8dee2aaSAndroid Build Coastguard WorkerBoring technical detail: The checksum is not a checksum of the .png file, but
149*c8dee2aaSAndroid Build Coastguard Workerrather a checksum of the raw pixels used to create that .png. That means it is
150*c8dee2aaSAndroid Build Coastguard Workerpossible for two different configurations to produce the same exact .png, but
151*c8dee2aaSAndroid Build Coastguard Workerhave their checksums differ.
152*c8dee2aaSAndroid Build Coastguard Worker
153*c8dee2aaSAndroid Build Coastguard WorkerUnit tests don't generally output anything but a status update when they pass.
154*c8dee2aaSAndroid Build Coastguard WorkerIf a test fails, DM will print out its assertion failures, both at the time they
155*c8dee2aaSAndroid Build Coastguard Workerhappen and then again all together after everything is done running. These
156*c8dee2aaSAndroid Build Coastguard Workerfailures are also included in the `dm.json` file.
157*c8dee2aaSAndroid Build Coastguard Worker
158*c8dee2aaSAndroid Build Coastguard WorkerDM has a simple facility to compare against the results of a previous run:
159*c8dee2aaSAndroid Build Coastguard Worker
160*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify lang=sh?-->
161*c8dee2aaSAndroid Build Coastguard Worker
162*c8dee2aaSAndroid Build Coastguard Worker    ninja -C out/Debug dm
163*c8dee2aaSAndroid Build Coastguard Worker    out/Debug/dm -w good
164*c8dee2aaSAndroid Build Coastguard Worker
165*c8dee2aaSAndroid Build Coastguard Worker    # do some work
166*c8dee2aaSAndroid Build Coastguard Worker
167*c8dee2aaSAndroid Build Coastguard Worker    ninja -C out/Debug dm
168*c8dee2aaSAndroid Build Coastguard Worker    out/Debug/dm -r good -w bad
169*c8dee2aaSAndroid Build Coastguard Worker
170*c8dee2aaSAndroid Build Coastguard WorkerWhen using `-r`, DM will display a failure for any test that didn't produce the
171*c8dee2aaSAndroid Build Coastguard Workersame image as the `good` run.
172*c8dee2aaSAndroid Build Coastguard Worker
173*c8dee2aaSAndroid Build Coastguard WorkerFor anything fancier, I suggest using skdiff:
174*c8dee2aaSAndroid Build Coastguard Worker
175*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify lang=sh?-->
176*c8dee2aaSAndroid Build Coastguard Worker
177*c8dee2aaSAndroid Build Coastguard Worker    ninja -C out/Debug dm
178*c8dee2aaSAndroid Build Coastguard Worker    out/Debug/dm -w good
179*c8dee2aaSAndroid Build Coastguard Worker
180*c8dee2aaSAndroid Build Coastguard Worker    # do some work
181*c8dee2aaSAndroid Build Coastguard Worker
182*c8dee2aaSAndroid Build Coastguard Worker    ninja -C out/Debug dm
183*c8dee2aaSAndroid Build Coastguard Worker    out/Debug/dm -w bad
184*c8dee2aaSAndroid Build Coastguard Worker
185*c8dee2aaSAndroid Build Coastguard Worker    ninja -C out/Debug skdiff
186*c8dee2aaSAndroid Build Coastguard Worker    mkdir diff
187*c8dee2aaSAndroid Build Coastguard Worker    out/Debug/skdiff good bad diff
188*c8dee2aaSAndroid Build Coastguard Worker
189*c8dee2aaSAndroid Build Coastguard Worker    # open diff/index.html in your web browser
190*c8dee2aaSAndroid Build Coastguard Worker
191*c8dee2aaSAndroid Build Coastguard WorkerThat's the basics of DM. DM supports many other modes and flags. Here are a few
192*c8dee2aaSAndroid Build Coastguard Workerexamples you might find handy.
193*c8dee2aaSAndroid Build Coastguard Worker
194*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify lang=sh?-->
195*c8dee2aaSAndroid Build Coastguard Worker
196*c8dee2aaSAndroid Build Coastguard Worker    out/Debug/dm --help        # Print all flags, their defaults, and a brief explanation of each.
197*c8dee2aaSAndroid Build Coastguard Worker    out/Debug/dm --src tests   # Run only unit tests.
198*c8dee2aaSAndroid Build Coastguard Worker    out/Debug/dm --nocpu       # Test only GPU-backed work.
199*c8dee2aaSAndroid Build Coastguard Worker    out/Debug/dm --nogpu       # Test only CPU-backed work.
200*c8dee2aaSAndroid Build Coastguard Worker    out/Debug/dm --match blur  # Run only work with "blur" in its name.
201*c8dee2aaSAndroid Build Coastguard Worker    out/Debug/dm --dryRun      # Don't really do anything, just print out what we'd do.
202