1*4882a593Smuzhiyun /**
2*4882a593Smuzhiyun * Copyright © 2011 Red Hat, Inc.
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Permission is hereby granted, free of charge, to any person obtaining a
5*4882a593Smuzhiyun * copy of this software and associated documentation files (the "Software"),
6*4882a593Smuzhiyun * to deal in the Software without restriction, including without limitation
7*4882a593Smuzhiyun * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*4882a593Smuzhiyun * and/or sell copies of the Software, and to permit persons to whom the
9*4882a593Smuzhiyun * Software is furnished to do so, subject to the following conditions:
10*4882a593Smuzhiyun *
11*4882a593Smuzhiyun * The above copyright notice and this permission notice (including the next
12*4882a593Smuzhiyun * paragraph) shall be included in all copies or substantial portions of the
13*4882a593Smuzhiyun * Software.
14*4882a593Smuzhiyun *
15*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*4882a593Smuzhiyun * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*4882a593Smuzhiyun * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*4882a593Smuzhiyun * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*4882a593Smuzhiyun * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21*4882a593Smuzhiyun * DEALINGS IN THE SOFTWARE.
22*4882a593Smuzhiyun */
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun #ifdef HAVE_DIX_CONFIG_H
25*4882a593Smuzhiyun #include <dix-config.h>
26*4882a593Smuzhiyun #endif
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun #include <stdint.h>
29*4882a593Smuzhiyun #include "misc.h"
30*4882a593Smuzhiyun #include "scrnintstr.h"
31*4882a593Smuzhiyun #include "dix.h"
32*4882a593Smuzhiyun #include "dixstruct.h"
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun #include "tests-common.h"
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun extern ScreenInfo screenInfo;
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun static void
dix_version_compare(void)39*4882a593Smuzhiyun dix_version_compare(void)
40*4882a593Smuzhiyun {
41*4882a593Smuzhiyun int rc;
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun rc = version_compare(0, 0, 1, 0);
44*4882a593Smuzhiyun assert(rc < 0);
45*4882a593Smuzhiyun rc = version_compare(1, 0, 0, 0);
46*4882a593Smuzhiyun assert(rc > 0);
47*4882a593Smuzhiyun rc = version_compare(0, 0, 0, 0);
48*4882a593Smuzhiyun assert(rc == 0);
49*4882a593Smuzhiyun rc = version_compare(1, 0, 1, 0);
50*4882a593Smuzhiyun assert(rc == 0);
51*4882a593Smuzhiyun rc = version_compare(1, 0, 0, 9);
52*4882a593Smuzhiyun assert(rc > 0);
53*4882a593Smuzhiyun rc = version_compare(0, 9, 1, 0);
54*4882a593Smuzhiyun assert(rc < 0);
55*4882a593Smuzhiyun rc = version_compare(1, 0, 1, 9);
56*4882a593Smuzhiyun assert(rc < 0);
57*4882a593Smuzhiyun rc = version_compare(1, 9, 1, 0);
58*4882a593Smuzhiyun assert(rc > 0);
59*4882a593Smuzhiyun rc = version_compare(2, 0, 1, 9);
60*4882a593Smuzhiyun assert(rc > 0);
61*4882a593Smuzhiyun rc = version_compare(1, 9, 2, 0);
62*4882a593Smuzhiyun assert(rc < 0);
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun static void
dix_update_desktop_dimensions(void)66*4882a593Smuzhiyun dix_update_desktop_dimensions(void)
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun int i;
69*4882a593Smuzhiyun int x, y, w, h;
70*4882a593Smuzhiyun int w2, h2;
71*4882a593Smuzhiyun ScreenRec screens[MAXSCREENS];
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun for (i = 0; i < MAXSCREENS; i++)
74*4882a593Smuzhiyun screenInfo.screens[i] = &screens[i];
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun x = 0;
77*4882a593Smuzhiyun y = 0;
78*4882a593Smuzhiyun w = 10;
79*4882a593Smuzhiyun h = 5;
80*4882a593Smuzhiyun w2 = 35;
81*4882a593Smuzhiyun h2 = 25;
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun #define assert_dimensions(_x, _y, _w, _h) \
84*4882a593Smuzhiyun update_desktop_dimensions(); \
85*4882a593Smuzhiyun assert(screenInfo.x == _x); \
86*4882a593Smuzhiyun assert(screenInfo.y == _y); \
87*4882a593Smuzhiyun assert(screenInfo.width == _w); \
88*4882a593Smuzhiyun assert(screenInfo.height == _h);
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun #define set_screen(idx, _x, _y, _w, _h) \
91*4882a593Smuzhiyun screenInfo.screens[idx]->x = _x; \
92*4882a593Smuzhiyun screenInfo.screens[idx]->y = _y; \
93*4882a593Smuzhiyun screenInfo.screens[idx]->width = _w; \
94*4882a593Smuzhiyun screenInfo.screens[idx]->height = _h; \
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun /* single screen */
97*4882a593Smuzhiyun screenInfo.numScreens = 1;
98*4882a593Smuzhiyun set_screen(0, x, y, w, h);
99*4882a593Smuzhiyun assert_dimensions(x, y, w, h);
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun /* dualhead rightof */
102*4882a593Smuzhiyun screenInfo.numScreens = 2;
103*4882a593Smuzhiyun set_screen(1, w, 0, w2, h2);
104*4882a593Smuzhiyun assert_dimensions(x, y, w + w2, h2);
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun /* dualhead belowof */
107*4882a593Smuzhiyun screenInfo.numScreens = 2;
108*4882a593Smuzhiyun set_screen(1, 0, h, w2, h2);
109*4882a593Smuzhiyun assert_dimensions(x, y, w2, h + h2);
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun /* triplehead L shape */
112*4882a593Smuzhiyun screenInfo.numScreens = 3;
113*4882a593Smuzhiyun set_screen(1, 0, h, w2, h2);
114*4882a593Smuzhiyun set_screen(2, w2, h2, w, h);
115*4882a593Smuzhiyun assert_dimensions(x, y, w + w2, h + h2);
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun /* quadhead 2x2 */
118*4882a593Smuzhiyun screenInfo.numScreens = 4;
119*4882a593Smuzhiyun set_screen(1, 0, h, w, h);
120*4882a593Smuzhiyun set_screen(2, w, h, w, h2);
121*4882a593Smuzhiyun set_screen(3, w, 0, w2, h);
122*4882a593Smuzhiyun assert_dimensions(x, y, w + w2, h + h2);
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun /* quadhead horiz line */
125*4882a593Smuzhiyun screenInfo.numScreens = 4;
126*4882a593Smuzhiyun set_screen(1, w, 0, w, h);
127*4882a593Smuzhiyun set_screen(2, 2 * w, 0, w, h);
128*4882a593Smuzhiyun set_screen(3, 3 * w, 0, w, h);
129*4882a593Smuzhiyun assert_dimensions(x, y, 4 * w, h);
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun /* quadhead vert line */
132*4882a593Smuzhiyun screenInfo.numScreens = 4;
133*4882a593Smuzhiyun set_screen(1, 0, h, w, h);
134*4882a593Smuzhiyun set_screen(2, 0, 2 * h, w, h);
135*4882a593Smuzhiyun set_screen(3, 0, 3 * h, w, h);
136*4882a593Smuzhiyun assert_dimensions(x, y, w, 4 * h);
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun /* x overlap */
139*4882a593Smuzhiyun screenInfo.numScreens = 2;
140*4882a593Smuzhiyun set_screen(0, 0, 0, w2, h2);
141*4882a593Smuzhiyun set_screen(1, w, 0, w2, h2);
142*4882a593Smuzhiyun assert_dimensions(x, y, w2 + w, h2);
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun /* y overlap */
145*4882a593Smuzhiyun screenInfo.numScreens = 2;
146*4882a593Smuzhiyun set_screen(0, 0, 0, w2, h2);
147*4882a593Smuzhiyun set_screen(1, 0, h, w2, h2);
148*4882a593Smuzhiyun assert_dimensions(x, y, w2, h2 + h);
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun /* negative origin */
151*4882a593Smuzhiyun screenInfo.numScreens = 1;
152*4882a593Smuzhiyun set_screen(0, -w2, -h2, w, h);
153*4882a593Smuzhiyun assert_dimensions(-w2, -h2, w, h);
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun /* dualhead negative origin, overlap */
156*4882a593Smuzhiyun screenInfo.numScreens = 2;
157*4882a593Smuzhiyun set_screen(0, -w2, -h2, w2, h2);
158*4882a593Smuzhiyun set_screen(1, -w, -h, w, h);
159*4882a593Smuzhiyun assert_dimensions(-w2, -h2, w2, h2);
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun static int
dix_request_fixed_size_overflow(ClientRec * client)163*4882a593Smuzhiyun dix_request_fixed_size_overflow(ClientRec *client)
164*4882a593Smuzhiyun {
165*4882a593Smuzhiyun xReq req = { 0 };
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun client->req_len = req.length = 1;
168*4882a593Smuzhiyun REQUEST_FIXED_SIZE(req, SIZE_MAX);
169*4882a593Smuzhiyun return Success;
170*4882a593Smuzhiyun }
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun static int
dix_request_fixed_size_match(ClientRec * client)173*4882a593Smuzhiyun dix_request_fixed_size_match(ClientRec *client)
174*4882a593Smuzhiyun {
175*4882a593Smuzhiyun xReq req = { 0 };
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun client->req_len = req.length = 9;
178*4882a593Smuzhiyun REQUEST_FIXED_SIZE(req, 30);
179*4882a593Smuzhiyun return Success;
180*4882a593Smuzhiyun }
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun static void
dix_request_size_checks(void)183*4882a593Smuzhiyun dix_request_size_checks(void)
184*4882a593Smuzhiyun {
185*4882a593Smuzhiyun ClientRec client = { 0 };
186*4882a593Smuzhiyun int rc;
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun rc = dix_request_fixed_size_overflow(&client);
189*4882a593Smuzhiyun assert(rc == BadLength);
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun rc = dix_request_fixed_size_match(&client);
192*4882a593Smuzhiyun assert(rc == Success);
193*4882a593Smuzhiyun }
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun static void
bswap_test(void)196*4882a593Smuzhiyun bswap_test(void)
197*4882a593Smuzhiyun {
198*4882a593Smuzhiyun const uint16_t test_16 = 0xaabb;
199*4882a593Smuzhiyun const uint16_t expect_16 = 0xbbaa;
200*4882a593Smuzhiyun const uint32_t test_32 = 0xaabbccdd;
201*4882a593Smuzhiyun const uint32_t expect_32 = 0xddccbbaa;
202*4882a593Smuzhiyun const uint64_t test_64 = 0x11223344aabbccddull;
203*4882a593Smuzhiyun const uint64_t expect_64 = 0xddccbbaa44332211ull;
204*4882a593Smuzhiyun uint16_t result_16;
205*4882a593Smuzhiyun uint32_t result_32;
206*4882a593Smuzhiyun uint64_t result_64;
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun assert(bswap_16(test_16) == expect_16);
209*4882a593Smuzhiyun assert(bswap_32(test_32) == expect_32);
210*4882a593Smuzhiyun assert(bswap_64(test_64) == expect_64);
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun result_16 = test_16;
213*4882a593Smuzhiyun swaps(&result_16);
214*4882a593Smuzhiyun assert(result_16 == expect_16);
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun result_32 = test_32;
217*4882a593Smuzhiyun swapl(&result_32);
218*4882a593Smuzhiyun assert(result_32 == expect_32);
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun result_64 = test_64;
221*4882a593Smuzhiyun swapll(&result_64);
222*4882a593Smuzhiyun assert(result_64 == expect_64);
223*4882a593Smuzhiyun }
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun int
misc_test(void)226*4882a593Smuzhiyun misc_test(void)
227*4882a593Smuzhiyun {
228*4882a593Smuzhiyun dix_version_compare();
229*4882a593Smuzhiyun dix_update_desktop_dimensions();
230*4882a593Smuzhiyun dix_request_size_checks();
231*4882a593Smuzhiyun bswap_test();
232*4882a593Smuzhiyun
233*4882a593Smuzhiyun return 0;
234*4882a593Smuzhiyun }
235