1 /* See COPYING.txt for the full license governing this code. */
2 /**
3 * \file screenshot.c
4 *
5 * Source file for the screenshot API.
6 */
7
8 #include "SDL_visualtest_mischelper.h"
9 #include <SDL_test.h>
10
11 int
SDLVisualTest_VerifyScreenshots(char * args,char * test_dir,char * verify_dir)12 SDLVisualTest_VerifyScreenshots(char* args, char* test_dir, char* verify_dir)
13 {
14 int i, verify_len, return_code, test_len;
15 char hash[33];
16 char* verify_path; /* path to the bmp file used for verification */
17 char* test_path; /* path to the bmp file to be verified */
18 SDL_RWops* rw;
19 SDL_Surface* verifybmp;
20
21 return_code = 1;
22
23 if(!args)
24 {
25 SDLTest_LogError("args argument cannot be NULL");
26 return_code = -1;
27 goto verifyscreenshots_cleanup_generic;
28 }
29 if(!test_dir)
30 {
31 SDLTest_LogError("test_dir argument cannot be NULL");
32 return_code = -1;
33 goto verifyscreenshots_cleanup_generic;
34 }
35 if(!verify_dir)
36 {
37 SDLTest_LogError("verify_dir argument cannot be NULL");
38 return_code = -1;
39 goto verifyscreenshots_cleanup_generic;
40 }
41
42 /* generate the MD5 hash */
43 SDLVisualTest_HashString(args, hash);
44
45 /* find the verification image */
46 /* path_len + hash_len + some number of extra characters */
47 verify_len = SDL_strlen(verify_dir) + 32 + 10;
48 verify_path = (char*)SDL_malloc(verify_len * sizeof(char));
49 if(!verify_path)
50 {
51 SDLTest_LogError("malloc() failed");
52 return_code = -1;
53 goto verifyscreenshots_cleanup_generic;
54 }
55 SDL_snprintf(verify_path, verify_len - 1,
56 "%s/%s.bmp", verify_dir, hash);
57 rw = SDL_RWFromFile(verify_path, "rb");
58 if(!rw)
59 {
60 SDLTest_Log("Verification image does not exist."
61 " Please manually verify that the SUT is working correctly.");
62 return_code = 2;
63 goto verifyscreenshots_cleanup_verifypath;
64 }
65
66 /* load the verification image */
67 verifybmp = SDL_LoadBMP_RW(rw, 1);
68 if(!verifybmp)
69 {
70 SDLTest_LogError("SDL_LoadBMP_RW() failed");
71 return_code = -1;
72 goto verifyscreenshots_cleanup_verifypath;
73 }
74
75 /* load the test images and compare with the verification image */
76 /* path_len + hash_len + some number of extra characters */
77 test_len = SDL_strlen(test_dir) + 32 + 10;
78 test_path = (char*)SDL_malloc(test_len * sizeof(char));
79 if(!test_path)
80 {
81 SDLTest_LogError("malloc() failed");
82 return_code = -1;
83 goto verifyscreenshots_cleanup_verifybmp;
84 }
85
86 for(i = 1; ; i++)
87 {
88 SDL_RWops* testrw;
89 SDL_Surface* testbmp;
90
91 if(i == 1)
92 SDL_snprintf(test_path, test_len - 1, "%s/%s.bmp", test_dir, hash);
93 else
94 SDL_snprintf(test_path, test_len - 1, "%s/%s_%d.bmp", test_dir, hash, i);
95 testrw = SDL_RWFromFile(test_path, "rb");
96
97 /* we keep going until we've iterated through the screenshots each
98 SUT window */
99 if(!testrw)
100 break;
101
102 /* load the test screenshot */
103 testbmp = SDL_LoadBMP_RW(testrw, 1);
104 if(!testbmp)
105 {
106 SDLTest_LogError("SDL_LoadBMP_RW() failed");
107 return_code = -1;
108 goto verifyscreenshots_cleanup_verifybmp;
109 }
110
111 /* compare with the verification image */
112 if(SDLTest_CompareSurfaces(testbmp, verifybmp, 0) != 0)
113 {
114 return_code = 0;
115 SDL_FreeSurface(testbmp);
116 goto verifyscreenshots_cleanup_verifybmp;
117 }
118
119 SDL_FreeSurface(testbmp);
120 }
121
122 if(i == 1)
123 {
124 SDLTest_LogError("No verification images found");
125 return_code = -1;
126 }
127
128 verifyscreenshots_cleanup_verifybmp:
129 SDL_FreeSurface(verifybmp);
130
131 verifyscreenshots_cleanup_verifypath:
132 SDL_free(verify_path);
133
134 verifyscreenshots_cleanup_generic:
135 return return_code;
136 }
137