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