xref: /OK3568_Linux_fs/external/xserver/test/misc.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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