mirror of
https://github.com/X11Libre/xserver.git
synced 2026-03-24 10:14:52 +00:00
> ../test/misc.c:172:5: warning: result of comparison of constant 4611686018427387903 with expression of type 'CARD32' (aka 'unsigned int') is always true [-Wtautological-constant-out-of-range-compare] > 172 | REQUEST_FIXED_SIZE(req, SIZE_MAX); > | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > ../include/dix.h:88:25: note: expanded from macro 'REQUEST_FIXED_SIZE' > 88 | (((n) >> 2) >= client->req_len) || \ > | ~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~ We don't really need SIZE_MAX (platform specific) for this job, just a big enough number. Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
241 lines
6.1 KiB
C
241 lines
6.1 KiB
C
/**
|
|
* Copyright © 2011 Red Hat, Inc.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
* to deal in the Software without restriction, including without limitation
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
* Software is furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice (including the next
|
|
* paragraph) shall be included in all copies or substantial portions of the
|
|
* Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
* DEALINGS IN THE SOFTWARE.
|
|
*/
|
|
|
|
/* Test relies on assert() */
|
|
#undef NDEBUG
|
|
|
|
#include <dix-config.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include "dix/input_priv.h"
|
|
#include "dix/screenint_priv.h"
|
|
#include "os/fmt.h"
|
|
|
|
#include "misc.h"
|
|
#include "scrnintstr.h"
|
|
#include "dix.h"
|
|
#include "dixstruct.h"
|
|
#include "tests-common.h"
|
|
|
|
static void
|
|
dix_version_compare(void)
|
|
{
|
|
int rc;
|
|
|
|
rc = version_compare(0, 0, 1, 0);
|
|
assert(rc < 0);
|
|
rc = version_compare(1, 0, 0, 0);
|
|
assert(rc > 0);
|
|
rc = version_compare(0, 0, 0, 0);
|
|
assert(rc == 0);
|
|
rc = version_compare(1, 0, 1, 0);
|
|
assert(rc == 0);
|
|
rc = version_compare(1, 0, 0, 9);
|
|
assert(rc > 0);
|
|
rc = version_compare(0, 9, 1, 0);
|
|
assert(rc < 0);
|
|
rc = version_compare(1, 0, 1, 9);
|
|
assert(rc < 0);
|
|
rc = version_compare(1, 9, 1, 0);
|
|
assert(rc > 0);
|
|
rc = version_compare(2, 0, 1, 9);
|
|
assert(rc > 0);
|
|
rc = version_compare(1, 9, 2, 0);
|
|
assert(rc < 0);
|
|
}
|
|
|
|
static inline void set_screen(unsigned int idx, short x, short y, short w, short h)
|
|
{
|
|
ScreenPtr pScreen = dixGetScreenPtr(idx);
|
|
pScreen->x = x;
|
|
pScreen->y = y;
|
|
pScreen->width = w;
|
|
pScreen->height = h;
|
|
}
|
|
|
|
static void
|
|
dix_update_desktop_dimensions(void)
|
|
{
|
|
int i;
|
|
ScreenRec screens[MAXSCREENS];
|
|
|
|
for (i = 0; i < MAXSCREENS; i++)
|
|
screenInfo.screens[i] = &screens[i];
|
|
|
|
short x = 0;
|
|
short y = 0;
|
|
short w = 10;
|
|
short h = 5;
|
|
short w2 = 35;
|
|
short h2 = 25;
|
|
|
|
#define assert_dimensions(_x, _y, _w, _h) \
|
|
update_desktop_dimensions(); \
|
|
assert(screenInfo.x == _x); \
|
|
assert(screenInfo.y == _y); \
|
|
assert(screenInfo.width == _w); \
|
|
assert(screenInfo.height == _h);
|
|
|
|
/* single screen */
|
|
screenInfo.numScreens = 1;
|
|
set_screen(0, x, y, w, h);
|
|
assert_dimensions(x, y, w, h);
|
|
|
|
/* dualhead rightof */
|
|
screenInfo.numScreens = 2;
|
|
set_screen(1, w, 0, w2, h2);
|
|
assert_dimensions(x, y, w + w2, h2);
|
|
|
|
/* dualhead belowof */
|
|
screenInfo.numScreens = 2;
|
|
set_screen(1, 0, h, w2, h2);
|
|
assert_dimensions(x, y, w2, h + h2);
|
|
|
|
/* triplehead L shape */
|
|
screenInfo.numScreens = 3;
|
|
set_screen(1, 0, h, w2, h2);
|
|
set_screen(2, w2, h2, w, h);
|
|
assert_dimensions(x, y, w + w2, h + h2);
|
|
|
|
/* quadhead 2x2 */
|
|
screenInfo.numScreens = 4;
|
|
set_screen(1, 0, h, w, h);
|
|
set_screen(2, w, h, w, h2);
|
|
set_screen(3, w, 0, w2, h);
|
|
assert_dimensions(x, y, w + w2, h + h2);
|
|
|
|
/* quadhead horiz line */
|
|
screenInfo.numScreens = 4;
|
|
set_screen(1, w, 0, w, h);
|
|
set_screen(2, 2 * w, 0, w, h);
|
|
set_screen(3, 3 * w, 0, w, h);
|
|
assert_dimensions(x, y, 4 * w, h);
|
|
|
|
/* quadhead vert line */
|
|
screenInfo.numScreens = 4;
|
|
set_screen(1, 0, h, w, h);
|
|
set_screen(2, 0, 2 * h, w, h);
|
|
set_screen(3, 0, 3 * h, w, h);
|
|
assert_dimensions(x, y, w, 4 * h);
|
|
|
|
/* x overlap */
|
|
screenInfo.numScreens = 2;
|
|
set_screen(0, 0, 0, w2, h2);
|
|
set_screen(1, w, 0, w2, h2);
|
|
assert_dimensions(x, y, w2 + w, h2);
|
|
|
|
/* y overlap */
|
|
screenInfo.numScreens = 2;
|
|
set_screen(0, 0, 0, w2, h2);
|
|
set_screen(1, 0, h, w2, h2);
|
|
assert_dimensions(x, y, w2, h2 + h);
|
|
|
|
/* negative origin */
|
|
screenInfo.numScreens = 1;
|
|
set_screen(0, -w2, -h2, w, h);
|
|
assert_dimensions(-w2, -h2, w, h);
|
|
|
|
/* dualhead negative origin, overlap */
|
|
screenInfo.numScreens = 2;
|
|
set_screen(0, -w2, -h2, w2, h2);
|
|
set_screen(1, -w, -h, w, h);
|
|
assert_dimensions(-w2, -h2, w2, h2);
|
|
}
|
|
|
|
static int
|
|
dix_request_fixed_size_overflow(ClientRec *client)
|
|
{
|
|
xReq req = { 0 };
|
|
|
|
client->req_len = req.length = 1;
|
|
REQUEST_FIXED_SIZE(req, 4096);
|
|
return Success;
|
|
}
|
|
|
|
static int
|
|
dix_request_fixed_size_match(ClientRec *client)
|
|
{
|
|
xReq req = { 0 };
|
|
|
|
client->req_len = req.length = 9;
|
|
REQUEST_FIXED_SIZE(req, 30);
|
|
return Success;
|
|
}
|
|
|
|
static void
|
|
dix_request_size_checks(void)
|
|
{
|
|
ClientRec client = { 0 };
|
|
int rc;
|
|
|
|
rc = dix_request_fixed_size_overflow(&client);
|
|
assert(rc == BadLength);
|
|
|
|
rc = dix_request_fixed_size_match(&client);
|
|
assert(rc == Success);
|
|
}
|
|
|
|
static void
|
|
bswap_test(void)
|
|
{
|
|
const uint16_t test_16 = 0xaabb;
|
|
const uint16_t expect_16 = 0xbbaa;
|
|
const uint32_t test_32 = 0xaabbccdd;
|
|
const uint32_t expect_32 = 0xddccbbaa;
|
|
const uint64_t test_64 = 0x11223344aabbccddull;
|
|
const uint64_t expect_64 = 0xddccbbaa44332211ull;
|
|
uint16_t result_16;
|
|
uint32_t result_32;
|
|
uint64_t result_64;
|
|
|
|
assert(bswap_16(test_16) == expect_16);
|
|
assert(bswap_32(test_32) == expect_32);
|
|
assert(bswap_64(test_64) == expect_64);
|
|
|
|
result_16 = test_16;
|
|
swaps(&result_16);
|
|
assert(result_16 == expect_16);
|
|
|
|
result_32 = test_32;
|
|
swapl(&result_32);
|
|
assert(result_32 == expect_32);
|
|
|
|
result_64 = test_64;
|
|
swapll(&result_64);
|
|
assert(result_64 == expect_64);
|
|
}
|
|
|
|
const testfunc_t*
|
|
misc_test(void)
|
|
{
|
|
static const testfunc_t testfuncs[] = {
|
|
dix_version_compare,
|
|
dix_update_desktop_dimensions,
|
|
dix_request_size_checks,
|
|
bswap_test,
|
|
NULL,
|
|
};
|
|
return testfuncs;
|
|
}
|