xref: /OK3568_Linux_fs/external/xserver/test/test_xkb.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /**
2  * Copyright © 2009 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 <xkb-config.h>
29 
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <ctype.h>
33 #include <unistd.h>
34 #include <math.h>
35 #include <X11/X.h>
36 #include <X11/Xproto.h>
37 #include <X11/keysym.h>
38 #include <X11/Xatom.h>
39 #include "misc.h"
40 #include "inputstr.h"
41 #include "opaque.h"
42 #include "property.h"
43 #define	XKBSRV_NEED_FILE_FUNCS
44 #include <xkbsrv.h>
45 #include "../xkb/xkbgeom.h"
46 #include <X11/extensions/XKMformat.h>
47 #include "xkbfile.h"
48 #include "../xkb/xkb.h"
49 #include <assert.h>
50 
51 #include "tests-common.h"
52 
53 /**
54  * Initialize an empty XkbRMLVOSet.
55  * Call XkbGetRulesDflts to obtain the default ruleset.
56  * Compare obtained ruleset with the built-in defaults.
57  *
58  * Result: RMLVO defaults are the same as obtained.
59  */
60 static void
xkb_get_rules_test(void)61 xkb_get_rules_test(void)
62 {
63     XkbRMLVOSet rmlvo = { NULL };
64     XkbGetRulesDflts(&rmlvo);
65 
66     assert(rmlvo.rules);
67     assert(rmlvo.model);
68     assert(rmlvo.layout);
69     assert(rmlvo.variant);
70     assert(rmlvo.options);
71     assert(strcmp(rmlvo.rules, XKB_DFLT_RULES) == 0);
72     assert(strcmp(rmlvo.model, XKB_DFLT_MODEL) == 0);
73     assert(strcmp(rmlvo.layout, XKB_DFLT_LAYOUT) == 0);
74     assert(strcmp(rmlvo.variant, XKB_DFLT_VARIANT) == 0);
75     assert(strcmp(rmlvo.options, XKB_DFLT_OPTIONS) == 0);
76 }
77 
78 /**
79  * Initialize an random XkbRMLVOSet.
80  * Call XkbGetRulesDflts to obtain the default ruleset.
81  * Compare obtained ruleset with the built-in defaults.
82  * Result: RMLVO defaults are the same as obtained.
83  */
84 static void
xkb_set_rules_test(void)85 xkb_set_rules_test(void)
86 {
87     XkbRMLVOSet rmlvo;
88     XkbRMLVOSet rmlvo_new = { NULL };
89 
90     XkbInitRules(&rmlvo, "test-rules", "test-model", "test-layout",
91                          "test-variant", "test-options");
92     assert(rmlvo.rules);
93     assert(rmlvo.model);
94     assert(rmlvo.layout);
95     assert(rmlvo.variant);
96     assert(rmlvo.options);
97 
98     XkbSetRulesDflts(&rmlvo);
99     XkbGetRulesDflts(&rmlvo_new);
100 
101     /* XkbGetRulesDflts strdups the values */
102     assert(rmlvo.rules != rmlvo_new.rules);
103     assert(rmlvo.model != rmlvo_new.model);
104     assert(rmlvo.layout != rmlvo_new.layout);
105     assert(rmlvo.variant != rmlvo_new.variant);
106     assert(rmlvo.options != rmlvo_new.options);
107 
108     assert(strcmp(rmlvo.rules, rmlvo_new.rules) == 0);
109     assert(strcmp(rmlvo.model, rmlvo_new.model) == 0);
110     assert(strcmp(rmlvo.layout, rmlvo_new.layout) == 0);
111     assert(strcmp(rmlvo.variant, rmlvo_new.variant) == 0);
112     assert(strcmp(rmlvo.options, rmlvo_new.options) == 0);
113 
114     XkbFreeRMLVOSet(&rmlvo, FALSE);
115 }
116 
117 /**
118  * Get the default RMLVO set.
119  * Set the default RMLVO set.
120  * Get the default RMLVO set.
121  * Repeat the last two steps.
122  *
123  * Result: RMLVO set obtained is the same as previously set.
124  */
125 static void
xkb_set_get_rules_test(void)126 xkb_set_get_rules_test(void)
127 {
128 /* This test failed before XkbGetRulesDftlts changed to strdup.
129    We test this twice because the first time using XkbGetRulesDflts we obtain
130    the built-in defaults. The unexpected free isn't triggered until the second
131    XkbSetRulesDefaults.
132  */
133     XkbRMLVOSet rmlvo = { NULL };
134     XkbRMLVOSet rmlvo_backup;
135 
136     XkbGetRulesDflts(&rmlvo);
137 
138     /* pass 1 */
139     XkbSetRulesDflts(&rmlvo);
140     XkbGetRulesDflts(&rmlvo);
141 
142     /* Make a backup copy */
143     rmlvo_backup.rules = strdup(rmlvo.rules);
144     rmlvo_backup.layout = strdup(rmlvo.layout);
145     rmlvo_backup.model = strdup(rmlvo.model);
146     rmlvo_backup.variant = strdup(rmlvo.variant);
147     rmlvo_backup.options = strdup(rmlvo.options);
148 
149     /* pass 2 */
150     XkbSetRulesDflts(&rmlvo);
151 
152     /* This test is iffy, because strictly we may be comparing against already
153      * freed memory */
154     assert(strcmp(rmlvo.rules, rmlvo_backup.rules) == 0);
155     assert(strcmp(rmlvo.model, rmlvo_backup.model) == 0);
156     assert(strcmp(rmlvo.layout, rmlvo_backup.layout) == 0);
157     assert(strcmp(rmlvo.variant, rmlvo_backup.variant) == 0);
158     assert(strcmp(rmlvo.options, rmlvo_backup.options) == 0);
159 
160     XkbGetRulesDflts(&rmlvo);
161     assert(strcmp(rmlvo.rules, rmlvo_backup.rules) == 0);
162     assert(strcmp(rmlvo.model, rmlvo_backup.model) == 0);
163     assert(strcmp(rmlvo.layout, rmlvo_backup.layout) == 0);
164     assert(strcmp(rmlvo.variant, rmlvo_backup.variant) == 0);
165     assert(strcmp(rmlvo.options, rmlvo_backup.options) == 0);
166 }
167 
168 int
xkb_test(void)169 xkb_test(void)
170 {
171     xkb_set_get_rules_test();
172     xkb_get_rules_test();
173     xkb_set_rules_test();
174 
175     return 0;
176 }
177