1af69d88dSmrg/*
2af69d88dSmrg * Copyright © 2013 Intel Corporation
3af69d88dSmrg *
4af69d88dSmrg * Permission is hereby granted, free of charge, to any person obtaining a
5af69d88dSmrg * copy of this software and associated documentation files (the "Software"),
6af69d88dSmrg * to deal in the Software without restriction, including without limitation
7af69d88dSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8af69d88dSmrg * and/or sell copies of the Software, and to permit persons to whom the
9af69d88dSmrg * Software is furnished to do so, subject to the following conditions:
10af69d88dSmrg *
11af69d88dSmrg * The above copyright notice and this permission notice (including the next
12af69d88dSmrg * paragraph) shall be included in all copies or substantial portions of the
13af69d88dSmrg * Software.
14af69d88dSmrg *
15af69d88dSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16af69d88dSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17af69d88dSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18af69d88dSmrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19af69d88dSmrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20af69d88dSmrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21af69d88dSmrg * DEALINGS IN THE SOFTWARE.
22af69d88dSmrg */
23af69d88dSmrg#include <gtest/gtest.h>
24af69d88dSmrg#include <signal.h>
25af69d88dSmrg#include <setjmp.h>
26af69d88dSmrg
27af69d88dSmrg#include "glxclient.h"
28af69d88dSmrg#include "glx_error.h"
29af69d88dSmrg
30af69d88dSmrgextern bool GetGLXScreenConfigs_called;
31af69d88dSmrgextern struct glx_screen *psc;
32af69d88dSmrg
33af69d88dSmrgstruct attribute_test_vector {
34af69d88dSmrg   const char *string;
35af69d88dSmrg   int value;
36af69d88dSmrg};
37af69d88dSmrg
38af69d88dSmrg#define E(x) { # x, x }
39af69d88dSmrg
40af69d88dSmrg
41af69d88dSmrg
42af69d88dSmrgstatic bool got_sigsegv;
43af69d88dSmrgstatic jmp_buf jmp;
44af69d88dSmrg
45af69d88dSmrgstatic void
46af69d88dSmrgsigsegv_handler(int sig)
47af69d88dSmrg{
48af69d88dSmrg   (void) sig;
49af69d88dSmrg   got_sigsegv = true;
50af69d88dSmrg   longjmp(jmp, 1);
51af69d88dSmrg}
52af69d88dSmrg
53af69d88dSmrgstatic bool query_renderer_string_called = false;
54af69d88dSmrgstatic bool query_renderer_integer_called = false;
55af69d88dSmrg
56af69d88dSmrgstatic int
57af69d88dSmrgfake_query_renderer_integer(struct glx_screen *psc, int attribute,
58af69d88dSmrg                            unsigned int *value)
59af69d88dSmrg{
60af69d88dSmrg   (void) psc;
61af69d88dSmrg   (void) attribute;
62af69d88dSmrg   (void) value;
63af69d88dSmrg
64af69d88dSmrg   query_renderer_integer_called = true;
65af69d88dSmrg
66af69d88dSmrg   return -1;
67af69d88dSmrg}
68af69d88dSmrg
69af69d88dSmrgstatic int
70af69d88dSmrgfake_query_renderer_string(struct glx_screen *psc, int attribute,
71af69d88dSmrg                           const char **value)
72af69d88dSmrg{
73af69d88dSmrg   (void) psc;
74af69d88dSmrg   (void) attribute;
75af69d88dSmrg   (void) value;
76af69d88dSmrg
77af69d88dSmrg   query_renderer_string_called = true;
78af69d88dSmrg
79af69d88dSmrg   return -1;
80af69d88dSmrg}
81af69d88dSmrg
82af69d88dSmrgstruct glx_screen_vtable fake_vtable = {
83af69d88dSmrg   NULL,
84af69d88dSmrg   NULL,
85af69d88dSmrg   fake_query_renderer_integer,
86af69d88dSmrg   fake_query_renderer_string
87af69d88dSmrg};
88af69d88dSmrg
89af69d88dSmrgclass query_renderer_string_test : public ::testing::Test {
90af69d88dSmrgpublic:
91af69d88dSmrg   virtual void SetUp();
92af69d88dSmrg   virtual void TearDown();
93af69d88dSmrg
94af69d88dSmrg   struct glx_screen scr;
95af69d88dSmrg   struct sigaction sa;
96af69d88dSmrg   struct sigaction old_sa;
97af69d88dSmrg   Display dpy;
98af69d88dSmrg};
99af69d88dSmrg
100af69d88dSmrgclass query_renderer_integer_test : public query_renderer_string_test {
101af69d88dSmrg};
102af69d88dSmrg
103af69d88dSmrgvoid query_renderer_string_test::SetUp()
104af69d88dSmrg{
105af69d88dSmrg   memset(&scr, 0, sizeof(scr));
106af69d88dSmrg   scr.vtable = &fake_vtable;
107af69d88dSmrg   psc = &scr;
108af69d88dSmrg
109af69d88dSmrg   got_sigsegv = false;
110af69d88dSmrg
111af69d88dSmrg   sa.sa_handler = sigsegv_handler;
112af69d88dSmrg   sigemptyset(&sa.sa_mask);
113af69d88dSmrg   sa.sa_flags = 0;
114af69d88dSmrg   sigaction(SIGSEGV, &sa, &old_sa);
115af69d88dSmrg}
116af69d88dSmrg
117af69d88dSmrgvoid query_renderer_string_test::TearDown()
118af69d88dSmrg{
119af69d88dSmrg   sigaction(SIGSEGV, &old_sa, NULL);
120af69d88dSmrg}
121af69d88dSmrg
122af69d88dSmrg/**
123af69d88dSmrg * glXQueryRendererStringMESA will return \c NULL if the query_render_string
124af69d88dSmrg * vtable entry is \c NULL.  It will also not segfault.
125af69d88dSmrg */
126af69d88dSmrgTEST_F(query_renderer_string_test, null_query_render_string)
127af69d88dSmrg{
128af69d88dSmrg   struct glx_screen_vtable vtable = {
129af69d88dSmrg      NULL,
130af69d88dSmrg      NULL,
131af69d88dSmrg      NULL,
132af69d88dSmrg      NULL
133af69d88dSmrg   };
134af69d88dSmrg
135af69d88dSmrg   scr.vtable = &vtable;
136af69d88dSmrg
137af69d88dSmrg   if (setjmp(jmp) == 0) {
138af69d88dSmrg      const char *str =
139af69d88dSmrg         glXQueryRendererStringMESA(&dpy, 0, 0, GLX_RENDERER_VENDOR_ID_MESA);
140af69d88dSmrg      EXPECT_EQ((char *)0, str);
141af69d88dSmrg   } else {
142af69d88dSmrg      EXPECT_FALSE(got_sigsegv);
143af69d88dSmrg   }
144af69d88dSmrg}
145af69d88dSmrg
146af69d88dSmrg/**
147af69d88dSmrg * glXQueryRendererStringMESA will not call the screen query_render_string
148af69d88dSmrg * function with an invalid GLX enum value, and it will return NULL.
149af69d88dSmrg */
150af69d88dSmrgTEST_F(query_renderer_string_test, invalid_attribute)
151af69d88dSmrg{
152af69d88dSmrg   static const attribute_test_vector invalid_attributes[] = {
153af69d88dSmrg      /* These values are just plain invalid for use with this extension.
154af69d88dSmrg       */
155af69d88dSmrg      E(0),
156af69d88dSmrg      E(GLX_VENDOR),
157af69d88dSmrg      E(GLX_VERSION),
158af69d88dSmrg      E(GLX_EXTENSIONS),
159af69d88dSmrg      E(GLX_RENDERER_VENDOR_ID_MESA + 0x10000),
160af69d88dSmrg      E(GLX_RENDERER_DEVICE_ID_MESA + 0x10000),
161af69d88dSmrg
162af69d88dSmrg      /* These enums are part of the extension, but they are not allowed for
163af69d88dSmrg       * the string query.
164af69d88dSmrg       */
165af69d88dSmrg      E(GLX_RENDERER_VERSION_MESA),
166af69d88dSmrg      E(GLX_RENDERER_ACCELERATED_MESA),
167af69d88dSmrg      E(GLX_RENDERER_VIDEO_MEMORY_MESA),
168af69d88dSmrg      E(GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA),
169af69d88dSmrg      E(GLX_RENDERER_PREFERRED_PROFILE_MESA),
170af69d88dSmrg      E(GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA),
171af69d88dSmrg      E(GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA),
172af69d88dSmrg      E(GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA),
173af69d88dSmrg      E(GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA),
174af69d88dSmrg   };
175af69d88dSmrg
176af69d88dSmrg   for (unsigned i = 0; i < ARRAY_SIZE(invalid_attributes); i++) {
177af69d88dSmrg      query_renderer_integer_called = false;
178af69d88dSmrg      query_renderer_string_called = false;
179af69d88dSmrg
180af69d88dSmrg      const char *str =
181af69d88dSmrg         glXQueryRendererStringMESA(&dpy, 0, 0, invalid_attributes[i].value);
182af69d88dSmrg      EXPECT_EQ((char *)0, str) << invalid_attributes[i].string;
183af69d88dSmrg      EXPECT_FALSE(query_renderer_integer_called)
184af69d88dSmrg         << invalid_attributes[i].string;
185af69d88dSmrg      EXPECT_FALSE(query_renderer_string_called)
186af69d88dSmrg         << invalid_attributes[i].string;
187af69d88dSmrg   }
188af69d88dSmrg}
189af69d88dSmrg
190af69d88dSmrg/**
191af69d88dSmrg * glXQueryRendererStringMESA will not call GetGLXScreenConfigs if the display
192af69d88dSmrg * pointer is \c NULL.  It will also not segfault.
193af69d88dSmrg */
194af69d88dSmrgTEST_F(query_renderer_string_test, null_display_pointer)
195af69d88dSmrg{
196af69d88dSmrg   if (setjmp(jmp) == 0) {
197af69d88dSmrg      GetGLXScreenConfigs_called = false;
198af69d88dSmrg
199af69d88dSmrg      const char *str =
200af69d88dSmrg         glXQueryRendererStringMESA(NULL, 0, 0, GLX_RENDERER_VENDOR_ID_MESA);
201af69d88dSmrg      EXPECT_EQ((char *)0, str);
202af69d88dSmrg      EXPECT_FALSE(GetGLXScreenConfigs_called);
203af69d88dSmrg   } else {
204af69d88dSmrg      EXPECT_FALSE(got_sigsegv);
205af69d88dSmrg   }
206af69d88dSmrg}
207af69d88dSmrg
208af69d88dSmrg/**
209af69d88dSmrg * glXQueryRendererStringMESA will return error if GetGLXScreenConfigs returns
210af69d88dSmrg * NULL.  It will also not segfault.
211af69d88dSmrg */
212af69d88dSmrgTEST_F(query_renderer_string_test, null_screen_pointer)
213af69d88dSmrg{
214af69d88dSmrg   psc = NULL;
215af69d88dSmrg
216af69d88dSmrg   if (setjmp(jmp) == 0) {
217af69d88dSmrg      GetGLXScreenConfigs_called = false;
218af69d88dSmrg
219af69d88dSmrg      const char *str =
220af69d88dSmrg         glXQueryRendererStringMESA(&dpy, 0, 0, GLX_RENDERER_VENDOR_ID_MESA);
221af69d88dSmrg      EXPECT_EQ((char *)0, str);
222af69d88dSmrg      EXPECT_TRUE(GetGLXScreenConfigs_called);
223af69d88dSmrg   } else {
224af69d88dSmrg      EXPECT_FALSE(got_sigsegv);
225af69d88dSmrg   }
226af69d88dSmrg}
227af69d88dSmrg
228af69d88dSmrg/**
229af69d88dSmrg * glXQueryRendererStringMESA will not call the screen query_render_string
230af69d88dSmrg * function if the renderer is invalid, and it will return NULL.
231af69d88dSmrg */
232af69d88dSmrgTEST_F(query_renderer_string_test, invalid_renderer_index)
233af69d88dSmrg{
234af69d88dSmrg   static const int invalid_renderer_indices[] = {
235af69d88dSmrg      -1,
236af69d88dSmrg      1,
237af69d88dSmrg      999,
238af69d88dSmrg   };
239af69d88dSmrg
240af69d88dSmrg   if (setjmp(jmp) == 0) {
241af69d88dSmrg      for (unsigned i = 0; i < ARRAY_SIZE(invalid_renderer_indices); i++) {
242af69d88dSmrg         const char *str =
243af69d88dSmrg            glXQueryRendererStringMESA(&dpy, 0,
244af69d88dSmrg                                       invalid_renderer_indices[i],
245af69d88dSmrg                                       GLX_RENDERER_VENDOR_ID_MESA);
246af69d88dSmrg         EXPECT_EQ((char *)0, str) << invalid_renderer_indices[i];
247af69d88dSmrg         EXPECT_FALSE(query_renderer_integer_called)
248af69d88dSmrg            << invalid_renderer_indices[i];
249af69d88dSmrg         EXPECT_FALSE(query_renderer_string_called)
250af69d88dSmrg            << invalid_renderer_indices[i];
251af69d88dSmrg      }
252af69d88dSmrg   } else {
253af69d88dSmrg      EXPECT_FALSE(got_sigsegv);
254af69d88dSmrg   }
255af69d88dSmrg}
256af69d88dSmrg
257af69d88dSmrg/**
258af69d88dSmrg * glXQueryCurrentRendererStringMESA will return error if there is no context
259af69d88dSmrg * current.  It will also not segfault.
260af69d88dSmrg */
261af69d88dSmrgTEST_F(query_renderer_string_test, no_current_context)
262af69d88dSmrg{
263af69d88dSmrg   if (setjmp(jmp) == 0) {
264af69d88dSmrg      const char *str =
265af69d88dSmrg         glXQueryCurrentRendererStringMESA(GLX_RENDERER_VENDOR_ID_MESA);
266af69d88dSmrg      EXPECT_EQ((char *)0, str);
267af69d88dSmrg   } else {
268af69d88dSmrg      EXPECT_FALSE(got_sigsegv);
269af69d88dSmrg   }
270af69d88dSmrg}
271af69d88dSmrg
272af69d88dSmrg/**
273af69d88dSmrg * glXQueryCurrentRendererIntegerMESA will return \c NULL if the
274af69d88dSmrg * query_render_string vtable entry is \c NULL.  It will also not segfault.
275af69d88dSmrg */
276af69d88dSmrgTEST_F(query_renderer_integer_test, null_query_render_string)
277af69d88dSmrg{
278af69d88dSmrg   struct glx_screen_vtable vtable = {
279af69d88dSmrg      NULL,
280af69d88dSmrg      NULL,
281af69d88dSmrg      NULL,
282af69d88dSmrg      NULL
283af69d88dSmrg   };
284af69d88dSmrg
285af69d88dSmrg   scr.vtable = &vtable;
286af69d88dSmrg
287af69d88dSmrg   if (setjmp(jmp) == 0) {
288af69d88dSmrg      unsigned value = 0xDEADBEEF;
289af69d88dSmrg      Bool success = glXQueryRendererIntegerMESA(&dpy, 0, 0,
290af69d88dSmrg                                                 GLX_RENDERER_VENDOR_ID_MESA,
291af69d88dSmrg                                                 &value);
292af69d88dSmrg      EXPECT_FALSE(success);
293af69d88dSmrg      EXPECT_EQ(0xDEADBEEF, value);
294af69d88dSmrg   } else {
295af69d88dSmrg      EXPECT_FALSE(got_sigsegv);
296af69d88dSmrg   }
297af69d88dSmrg}
298af69d88dSmrg
299af69d88dSmrg/**
300af69d88dSmrg * glXQueryCurrentRendererIntegerMESA will not call the screen
301af69d88dSmrg * query_render_string function with an invalid GLX enum value, and it will
302af69d88dSmrg * return NULL.
303af69d88dSmrg */
304af69d88dSmrgTEST_F(query_renderer_integer_test, invalid_attribute)
305af69d88dSmrg{
306af69d88dSmrg   static const attribute_test_vector invalid_attributes[] = {
307af69d88dSmrg      /* These values are just plain invalid for use with this extension.
308af69d88dSmrg       */
309af69d88dSmrg      E(0),
310af69d88dSmrg      E(GLX_VENDOR),
311af69d88dSmrg      E(GLX_VERSION),
312af69d88dSmrg      E(GLX_EXTENSIONS),
313af69d88dSmrg      E(GLX_RENDERER_VENDOR_ID_MESA + 0x10000),
314af69d88dSmrg      E(GLX_RENDERER_DEVICE_ID_MESA + 0x10000),
315af69d88dSmrg      E(GLX_RENDERER_VERSION_MESA + 0x10000),
316af69d88dSmrg      E(GLX_RENDERER_ACCELERATED_MESA + 0x10000),
317af69d88dSmrg      E(GLX_RENDERER_VIDEO_MEMORY_MESA + 0x10000),
318af69d88dSmrg      E(GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA + 0x10000),
319af69d88dSmrg      E(GLX_RENDERER_PREFERRED_PROFILE_MESA + 0x10000),
320af69d88dSmrg      E(GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA + 0x10000),
321af69d88dSmrg      E(GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA + 0x10000),
322af69d88dSmrg      E(GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA + 0x10000),
323af69d88dSmrg      E(GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA + 0x10000),
324af69d88dSmrg   };
325af69d88dSmrg
326af69d88dSmrg   for (unsigned i = 0; i < ARRAY_SIZE(invalid_attributes); i++) {
327af69d88dSmrg      query_renderer_integer_called = false;
328af69d88dSmrg      query_renderer_string_called = false;
329af69d88dSmrg
330af69d88dSmrg      unsigned value = 0xDEADBEEF;
331af69d88dSmrg      Bool success =
332af69d88dSmrg         glXQueryRendererIntegerMESA(&dpy, 0, 0,
333af69d88dSmrg                                     invalid_attributes[i].value,
334af69d88dSmrg                                     &value);
335af69d88dSmrg      EXPECT_FALSE(success) << invalid_attributes[i].string;
336af69d88dSmrg      EXPECT_EQ(0xDEADBEEF, value) << invalid_attributes[i].string;
337af69d88dSmrg      EXPECT_FALSE(query_renderer_integer_called)
338af69d88dSmrg         << invalid_attributes[i].string;
339af69d88dSmrg      EXPECT_FALSE(query_renderer_string_called)
340af69d88dSmrg         << invalid_attributes[i].string;
341af69d88dSmrg   }
342af69d88dSmrg}
343af69d88dSmrg
344af69d88dSmrg/**
345af69d88dSmrg * glXQueryCurrentRendererIntegerMESA will not call GetGLXScreenConfigs if the
346af69d88dSmrg * display pointer is \c NULL.  It will also not segfault.
347af69d88dSmrg */
348af69d88dSmrgTEST_F(query_renderer_integer_test, null_display_pointer)
349af69d88dSmrg{
350af69d88dSmrg   if (setjmp(jmp) == 0) {
351af69d88dSmrg      GetGLXScreenConfigs_called = false;
352af69d88dSmrg
353af69d88dSmrg      unsigned value = 0xDEADBEEF;
354af69d88dSmrg      Bool success =
355af69d88dSmrg         glXQueryRendererIntegerMESA(NULL, 0, 0, GLX_RENDERER_VENDOR_ID_MESA,
356af69d88dSmrg                                     &value);
357af69d88dSmrg      EXPECT_FALSE(success);
358af69d88dSmrg      EXPECT_EQ(0xDEADBEEF, value);
359af69d88dSmrg      EXPECT_FALSE(GetGLXScreenConfigs_called);
360af69d88dSmrg   } else {
361af69d88dSmrg      EXPECT_FALSE(got_sigsegv);
362af69d88dSmrg   }
363af69d88dSmrg}
364af69d88dSmrg
365af69d88dSmrg/**
366af69d88dSmrg * glXQueryCurrentRendererIntegerMESA will return error if GetGLXScreenConfigs
367af69d88dSmrg * returns NULL.  It will also not segfault.
368af69d88dSmrg */
369af69d88dSmrgTEST_F(query_renderer_integer_test, null_screen_pointer)
370af69d88dSmrg{
371af69d88dSmrg   psc = NULL;
372af69d88dSmrg
373af69d88dSmrg   if (setjmp(jmp) == 0) {
374af69d88dSmrg      GetGLXScreenConfigs_called = false;
375af69d88dSmrg
376af69d88dSmrg      unsigned value = 0xDEADBEEF;
377af69d88dSmrg      Bool success =
378af69d88dSmrg         glXQueryRendererIntegerMESA(&dpy, 0, 0, GLX_RENDERER_VENDOR_ID_MESA,
379af69d88dSmrg            &value);
380af69d88dSmrg      EXPECT_FALSE(success);
381af69d88dSmrg      EXPECT_EQ(0xDEADBEEF, value);
382af69d88dSmrg      EXPECT_TRUE(GetGLXScreenConfigs_called);
383af69d88dSmrg   } else {
384af69d88dSmrg      EXPECT_FALSE(got_sigsegv);
385af69d88dSmrg   }
386af69d88dSmrg}
387af69d88dSmrg
388af69d88dSmrg/**
389af69d88dSmrg * glXQueryRendererIntegerMESA will not call the screen query_render_integer
390af69d88dSmrg * function if the renderer is invalid, and it will return NULL.
391af69d88dSmrg */
392af69d88dSmrgTEST_F(query_renderer_integer_test, invalid_renderer_index)
393af69d88dSmrg{
394af69d88dSmrg   static const int invalid_renderer_indices[] = {
395af69d88dSmrg      -1,
396af69d88dSmrg      1,
397af69d88dSmrg      999,
398af69d88dSmrg   };
399af69d88dSmrg
400af69d88dSmrg   if (setjmp(jmp) == 0) {
401af69d88dSmrg      for (unsigned i = 0; i < ARRAY_SIZE(invalid_renderer_indices); i++) {
402af69d88dSmrg         unsigned value = 0xDEADBEEF;
403af69d88dSmrg         Bool success =
404af69d88dSmrg            glXQueryRendererIntegerMESA(&dpy, 0,
405af69d88dSmrg                                        invalid_renderer_indices[i],
406af69d88dSmrg                                        GLX_RENDERER_VENDOR_ID_MESA,
407af69d88dSmrg                                        &value);
408af69d88dSmrg         EXPECT_FALSE(success) << invalid_renderer_indices[i];
409af69d88dSmrg         EXPECT_EQ(0xDEADBEEF, value) << invalid_renderer_indices[i];
410af69d88dSmrg         EXPECT_FALSE(query_renderer_integer_called)
411af69d88dSmrg            << invalid_renderer_indices[i];
412af69d88dSmrg         EXPECT_FALSE(query_renderer_string_called)
413af69d88dSmrg            << invalid_renderer_indices[i];
414af69d88dSmrg      }
415af69d88dSmrg   } else {
416af69d88dSmrg      EXPECT_FALSE(got_sigsegv);
417af69d88dSmrg   }
418af69d88dSmrg}
419af69d88dSmrg
420af69d88dSmrg/**
421af69d88dSmrg * glXQueryCurrentRendererIntegerMESA will return error if there is no context
422af69d88dSmrg * current.  It will also not segfault.
423af69d88dSmrg */
424af69d88dSmrgTEST_F(query_renderer_integer_test, no_current_context)
425af69d88dSmrg{
426af69d88dSmrg   if (setjmp(jmp) == 0) {
427af69d88dSmrg      unsigned value = 0xDEADBEEF;
428af69d88dSmrg      Bool success =
429af69d88dSmrg         glXQueryCurrentRendererIntegerMESA(GLX_RENDERER_VENDOR_ID_MESA,
430af69d88dSmrg                                            &value);
431af69d88dSmrg      EXPECT_FALSE(success);
432af69d88dSmrg      EXPECT_EQ(0xDEADBEEF, value);
433af69d88dSmrg   } else {
434af69d88dSmrg      EXPECT_FALSE(got_sigsegv);
435af69d88dSmrg   }
436af69d88dSmrg}
437