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