1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <algorithm>
6 #include <string>
7 
8 #include "base/test/task_environment.h"
9 #include "build/build_config.h"
10 #include "gpu/config/gpu_feature_type.h"
11 #include "gpu/ipc/common/gpu_feature_info.mojom.h"
12 #include "gpu/ipc/common/gpu_feature_info_mojom_traits.h"
13 #include "gpu/ipc/common/traits_test_service.mojom.h"
14 #include "mojo/public/cpp/bindings/receiver_set.h"
15 #include "mojo/public/cpp/bindings/remote.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17 
18 namespace gpu {
19 
20 namespace {
21 
22 class StructTraitsTest : public testing::Test, public mojom::TraitsTestService {
23  public:
24   StructTraitsTest() = default;
25 
26  protected:
GetTraitsTestRemote()27   mojo::Remote<mojom::TraitsTestService> GetTraitsTestRemote() {
28     mojo::Remote<mojom::TraitsTestService> remote;
29     traits_test_receivers_.Add(this, remote.BindNewPipeAndPassReceiver());
30     return remote;
31   }
32 
33  private:
34   // TraitsTestService:
EchoDxDiagNode(const DxDiagNode & d,EchoDxDiagNodeCallback callback)35   void EchoDxDiagNode(const DxDiagNode& d,
36                       EchoDxDiagNodeCallback callback) override {
37     std::move(callback).Run(d);
38   }
39 
EchoGpuDevice(const GPUInfo::GPUDevice & g,EchoGpuDeviceCallback callback)40   void EchoGpuDevice(const GPUInfo::GPUDevice& g,
41                      EchoGpuDeviceCallback callback) override {
42     std::move(callback).Run(g);
43   }
44 
EchoGpuInfo(const GPUInfo & g,EchoGpuInfoCallback callback)45   void EchoGpuInfo(const GPUInfo& g, EchoGpuInfoCallback callback) override {
46     std::move(callback).Run(g);
47   }
48 
EchoMailbox(const Mailbox & m,EchoMailboxCallback callback)49   void EchoMailbox(const Mailbox& m, EchoMailboxCallback callback) override {
50     std::move(callback).Run(m);
51   }
52 
EchoMailboxHolder(const MailboxHolder & r,EchoMailboxHolderCallback callback)53   void EchoMailboxHolder(const MailboxHolder& r,
54                          EchoMailboxHolderCallback callback) override {
55     std::move(callback).Run(r);
56   }
57 
EchoSyncToken(const SyncToken & s,EchoSyncTokenCallback callback)58   void EchoSyncToken(const SyncToken& s,
59                      EchoSyncTokenCallback callback) override {
60     std::move(callback).Run(s);
61   }
62 
EchoVideoDecodeAcceleratorSupportedProfile(const VideoDecodeAcceleratorSupportedProfile & v,EchoVideoDecodeAcceleratorSupportedProfileCallback callback)63   void EchoVideoDecodeAcceleratorSupportedProfile(
64       const VideoDecodeAcceleratorSupportedProfile& v,
65       EchoVideoDecodeAcceleratorSupportedProfileCallback callback) override {
66     std::move(callback).Run(v);
67   }
68 
EchoVideoDecodeAcceleratorCapabilities(const VideoDecodeAcceleratorCapabilities & v,EchoVideoDecodeAcceleratorCapabilitiesCallback callback)69   void EchoVideoDecodeAcceleratorCapabilities(
70       const VideoDecodeAcceleratorCapabilities& v,
71       EchoVideoDecodeAcceleratorCapabilitiesCallback callback) override {
72     std::move(callback).Run(v);
73   }
74 
EchoVideoEncodeAcceleratorSupportedProfile(const VideoEncodeAcceleratorSupportedProfile & v,EchoVideoEncodeAcceleratorSupportedProfileCallback callback)75   void EchoVideoEncodeAcceleratorSupportedProfile(
76       const VideoEncodeAcceleratorSupportedProfile& v,
77       EchoVideoEncodeAcceleratorSupportedProfileCallback callback) override {
78     std::move(callback).Run(v);
79   }
80 
EchoGpuPreferences(const GpuPreferences & prefs,EchoGpuPreferencesCallback callback)81   void EchoGpuPreferences(const GpuPreferences& prefs,
82                           EchoGpuPreferencesCallback callback) override {
83     std::move(callback).Run(prefs);
84   }
85 
86   base::test::TaskEnvironment task_environment_;
87   mojo::ReceiverSet<TraitsTestService> traits_test_receivers_;
88 
89   DISALLOW_COPY_AND_ASSIGN(StructTraitsTest);
90 };
91 
92 }  // namespace
93 
TEST_F(StructTraitsTest,DxDiagNode)94 TEST_F(StructTraitsTest, DxDiagNode) {
95   gpu::DxDiagNode input;
96   input.values["abc"] = "123";
97   mojo::Remote<mojom::TraitsTestService> remote = GetTraitsTestRemote();
98   gpu::DxDiagNode output;
99   remote->EchoDxDiagNode(input, &output);
100 
101   gpu::DxDiagNode test_dx_diag_node;
102   test_dx_diag_node.values["abc"] = "123";
103   EXPECT_EQ(test_dx_diag_node.values, output.values);
104 }
105 
TEST_F(StructTraitsTest,GPUDevice)106 TEST_F(StructTraitsTest, GPUDevice) {
107   gpu::GPUInfo::GPUDevice input;
108   // Using the values from gpu/config/gpu_info_collector_unittest.cc::nvidia_gpu
109   const uint32_t vendor_id = 0x10de;
110   const uint32_t device_id = 0x0df8;
111 #if defined(OS_WIN)
112   const uint32_t sub_sys_id = 0xc0d8144d;
113   const uint32_t revision = 4u;
114 #endif  // OS_WIN
115   const std::string vendor_string = "vendor_string";
116   const std::string device_string = "device_string";
117 
118   input.vendor_id = vendor_id;
119   input.device_id = device_id;
120 #if defined(OS_WIN)
121   input.sub_sys_id = sub_sys_id;
122   input.revision = revision;
123 #endif  // OS_WIN
124   input.vendor_string = vendor_string;
125   input.device_string = device_string;
126   input.active = false;
127   mojo::Remote<mojom::TraitsTestService> remote = GetTraitsTestRemote();
128   gpu::GPUInfo::GPUDevice output;
129   remote->EchoGpuDevice(input, &output);
130 
131   EXPECT_EQ(vendor_id, output.vendor_id);
132   EXPECT_EQ(device_id, output.device_id);
133 #if defined(OS_WIN)
134   EXPECT_EQ(sub_sys_id, output.sub_sys_id);
135   EXPECT_EQ(revision, output.revision);
136 #endif  // OS_WIN
137   EXPECT_FALSE(output.active);
138   EXPECT_TRUE(vendor_string.compare(output.vendor_string) == 0);
139   EXPECT_TRUE(device_string.compare(output.device_string) == 0);
140 }
141 
TEST_F(StructTraitsTest,GpuInfo)142 TEST_F(StructTraitsTest, GpuInfo) {
143   const base::TimeDelta initialization_time = base::TimeDelta::Max();
144   const bool optimus = true;
145   const bool amd_switchable = true;
146   const gpu::GPUInfo::GPUDevice gpu;
147   const std::vector<gpu::GPUInfo::GPUDevice> secondary_gpus;
148   const std::string driver_vendor = "driver_vendor";
149   const std::string driver_version = "driver_version";
150   const std::string driver_date = "driver_date";
151   const std::string pixel_shader_version = "pixel_shader_version";
152   const std::string vertex_shader_version = "vertex_shader_version";
153   const std::string max_msaa_samples = "max_msaa_samples";
154   const std::string machine_model_name = "machine_model_name";
155   const std::string machine_model_version = "machine_model_version";
156   const std::string gl_version = "gl_version";
157   const std::string gl_vendor = "gl_vendor";
158   const std::string gl_renderer = "gl_renderer";
159   const std::string gl_extensions = "gl_extension";
160   const std::string gl_ws_vendor = "gl_ws_vendor";
161   const std::string gl_ws_version = "gl_ws_version";
162   const std::string gl_ws_extensions = "gl_ws_extensions";
163   const uint32_t gl_reset_notification_strategy = 0xbeef;
164   const bool software_rendering = true;
165   const std::string direct_rendering_version = "DRI1";
166   const bool sandboxed = true;
167   const bool in_process_gpu = true;
168   const bool passthrough_cmd_decoder = true;
169 #if defined(OS_WIN)
170   const bool direct_composition = true;
171   const bool supports_overlays = true;
172   const OverlaySupport yuy2_overlay_support = OverlaySupport::kScaling;
173   const OverlaySupport nv12_overlay_support = OverlaySupport::kNone;
174   const DxDiagNode dx_diagnostics;
175 #endif
176   const gpu::VideoDecodeAcceleratorCapabilities
177       video_decode_accelerator_capabilities;
178   const std::vector<gpu::VideoEncodeAcceleratorSupportedProfile>
179       video_encode_accelerator_supported_profiles;
180   const bool jpeg_decode_accelerator_supported = true;
181 
182   gpu::GPUInfo input;
183   input.initialization_time = initialization_time;
184   input.optimus = optimus;
185   input.amd_switchable = amd_switchable;
186   input.gpu = gpu;
187   input.secondary_gpus = secondary_gpus;
188   input.gpu.driver_vendor = driver_vendor;
189   input.gpu.driver_version = driver_version;
190   input.pixel_shader_version = pixel_shader_version;
191   input.vertex_shader_version = vertex_shader_version;
192   input.max_msaa_samples = max_msaa_samples;
193   input.machine_model_name = machine_model_name;
194   input.machine_model_version = machine_model_version;
195   input.gl_version = gl_version;
196   input.gl_vendor = gl_vendor;
197   input.gl_renderer = gl_renderer;
198   input.gl_extensions = gl_extensions;
199   input.gl_ws_vendor = gl_ws_vendor;
200   input.gl_ws_version = gl_ws_version;
201   input.gl_ws_extensions = gl_ws_extensions;
202   input.gl_reset_notification_strategy = gl_reset_notification_strategy;
203   input.software_rendering = software_rendering;
204   input.direct_rendering_version = direct_rendering_version;
205   input.sandboxed = sandboxed;
206   input.in_process_gpu = in_process_gpu;
207   input.passthrough_cmd_decoder = passthrough_cmd_decoder;
208 #if defined(OS_WIN)
209   input.overlay_info.direct_composition = direct_composition;
210   input.overlay_info.supports_overlays = supports_overlays;
211   input.overlay_info.yuy2_overlay_support = yuy2_overlay_support;
212   input.overlay_info.nv12_overlay_support = nv12_overlay_support;
213   input.dx_diagnostics = dx_diagnostics;
214 #endif
215   input.video_decode_accelerator_capabilities =
216       video_decode_accelerator_capabilities;
217   input.video_encode_accelerator_supported_profiles =
218       video_encode_accelerator_supported_profiles;
219   input.jpeg_decode_accelerator_supported = jpeg_decode_accelerator_supported;
220 
221   mojo::Remote<mojom::TraitsTestService> remote = GetTraitsTestRemote();
222   gpu::GPUInfo output;
223   remote->EchoGpuInfo(input, &output);
224 
225   EXPECT_EQ(optimus, output.optimus);
226   EXPECT_EQ(amd_switchable, output.amd_switchable);
227   EXPECT_EQ(gpu.vendor_id, output.gpu.vendor_id);
228   EXPECT_EQ(gpu.device_id, output.gpu.device_id);
229 #if defined(OS_WIN)
230   EXPECT_EQ(gpu.sub_sys_id, output.gpu.sub_sys_id);
231   EXPECT_EQ(gpu.revision, output.gpu.revision);
232 #endif  // OS_WIN
233   EXPECT_EQ(gpu.active, output.gpu.active);
234   EXPECT_EQ(gpu.vendor_string, output.gpu.vendor_string);
235   EXPECT_EQ(gpu.device_string, output.gpu.device_string);
236   EXPECT_EQ(secondary_gpus.size(), output.secondary_gpus.size());
237   for (size_t i = 0; i < secondary_gpus.size(); ++i) {
238     const gpu::GPUInfo::GPUDevice& expected_gpu = secondary_gpus[i];
239     const gpu::GPUInfo::GPUDevice& actual_gpu = output.secondary_gpus[i];
240     EXPECT_EQ(expected_gpu.vendor_id, actual_gpu.vendor_id);
241     EXPECT_EQ(expected_gpu.device_id, actual_gpu.device_id);
242 #if defined(OS_WIN)
243     EXPECT_EQ(expected_gpu.sub_sys_id, actual_gpu.sub_sys_id);
244     EXPECT_EQ(expected_gpu.revision, actual_gpu.revision);
245 #endif  // OS_WIN
246     EXPECT_EQ(expected_gpu.active, actual_gpu.active);
247     EXPECT_EQ(expected_gpu.vendor_string, actual_gpu.vendor_string);
248     EXPECT_EQ(expected_gpu.device_string, actual_gpu.device_string);
249   }
250   EXPECT_EQ(driver_vendor, output.gpu.driver_vendor);
251   EXPECT_EQ(driver_version, output.gpu.driver_version);
252   EXPECT_EQ(pixel_shader_version, output.pixel_shader_version);
253   EXPECT_EQ(vertex_shader_version, output.vertex_shader_version);
254   EXPECT_EQ(max_msaa_samples, output.max_msaa_samples);
255   EXPECT_EQ(machine_model_name, output.machine_model_name);
256   EXPECT_EQ(machine_model_version, output.machine_model_version);
257   EXPECT_EQ(gl_version, output.gl_version);
258   EXPECT_EQ(gl_vendor, output.gl_vendor);
259   EXPECT_EQ(gl_renderer, output.gl_renderer);
260   EXPECT_EQ(gl_extensions, output.gl_extensions);
261   EXPECT_EQ(gl_ws_vendor, output.gl_ws_vendor);
262   EXPECT_EQ(gl_ws_version, output.gl_ws_version);
263   EXPECT_EQ(gl_ws_extensions, output.gl_ws_extensions);
264   EXPECT_EQ(gl_reset_notification_strategy,
265             output.gl_reset_notification_strategy);
266   EXPECT_EQ(software_rendering, output.software_rendering);
267   EXPECT_EQ(direct_rendering_version, output.direct_rendering_version);
268   EXPECT_EQ(sandboxed, output.sandboxed);
269   EXPECT_EQ(in_process_gpu, output.in_process_gpu);
270   EXPECT_EQ(passthrough_cmd_decoder, output.passthrough_cmd_decoder);
271 #if defined(OS_WIN)
272   EXPECT_EQ(direct_composition, output.overlay_info.direct_composition);
273   EXPECT_EQ(supports_overlays, output.overlay_info.supports_overlays);
274   EXPECT_EQ(yuy2_overlay_support, output.overlay_info.yuy2_overlay_support);
275   EXPECT_EQ(nv12_overlay_support, output.overlay_info.nv12_overlay_support);
276   EXPECT_EQ(dx_diagnostics.values, output.dx_diagnostics.values);
277 #endif
278   EXPECT_EQ(output.video_decode_accelerator_capabilities.flags,
279             video_decode_accelerator_capabilities.flags);
280   EXPECT_EQ(
281       video_decode_accelerator_capabilities.supported_profiles.size(),
282       output.video_decode_accelerator_capabilities.supported_profiles.size());
283   for (size_t i = 0;
284        i < video_decode_accelerator_capabilities.supported_profiles.size();
285        ++i) {
286     const gpu::VideoDecodeAcceleratorSupportedProfile& expected =
287         video_decode_accelerator_capabilities.supported_profiles[i];
288     const gpu::VideoDecodeAcceleratorSupportedProfile& actual =
289         output.video_decode_accelerator_capabilities.supported_profiles[i];
290     EXPECT_EQ(expected.encrypted_only, actual.encrypted_only);
291   }
292   EXPECT_EQ(
293       output.video_decode_accelerator_capabilities.supported_profiles.size(),
294       video_decode_accelerator_capabilities.supported_profiles.size());
295   EXPECT_EQ(output.video_encode_accelerator_supported_profiles.size(),
296             video_encode_accelerator_supported_profiles.size());
297 }
298 
TEST_F(StructTraitsTest,EmptyGpuInfo)299 TEST_F(StructTraitsTest, EmptyGpuInfo) {
300   gpu::GPUInfo input;
301   mojo::Remote<mojom::TraitsTestService> remote = GetTraitsTestRemote();
302   gpu::GPUInfo output;
303   remote->EchoGpuInfo(input, &output);
304 }
305 
TEST_F(StructTraitsTest,Mailbox)306 TEST_F(StructTraitsTest, Mailbox) {
307   const int8_t mailbox_name[GL_MAILBOX_SIZE_CHROMIUM] = {
308       0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 9, 7, 5, 3, 1, 2};
309   gpu::Mailbox input;
310   input.SetName(mailbox_name);
311   mojo::Remote<mojom::TraitsTestService> remote = GetTraitsTestRemote();
312   gpu::Mailbox output;
313   remote->EchoMailbox(input, &output);
314   gpu::Mailbox test_mailbox;
315   test_mailbox.SetName(mailbox_name);
316   EXPECT_EQ(test_mailbox, output);
317 }
318 
TEST_F(StructTraitsTest,MailboxHolder)319 TEST_F(StructTraitsTest, MailboxHolder) {
320   gpu::MailboxHolder input;
321 
322   const int8_t mailbox_name[GL_MAILBOX_SIZE_CHROMIUM] = {
323       0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 9, 7, 5, 3, 1, 2};
324   gpu::Mailbox mailbox;
325   mailbox.SetName(mailbox_name);
326 
327   const gpu::CommandBufferNamespace namespace_id = gpu::IN_PROCESS;
328   const gpu::CommandBufferId command_buffer_id(
329       gpu::CommandBufferId::FromUnsafeValue(0xdeadbeef));
330   const uint64_t release_count = 0xdeadbeefdeadL;
331   gpu::SyncToken sync_token(namespace_id, command_buffer_id, release_count);
332   sync_token.SetVerifyFlush();
333 
334   const uint32_t texture_target = 1337;
335 
336   input.mailbox = mailbox;
337   input.sync_token = sync_token;
338   input.texture_target = texture_target;
339 
340   mojo::Remote<mojom::TraitsTestService> remote = GetTraitsTestRemote();
341   gpu::MailboxHolder output;
342   remote->EchoMailboxHolder(input, &output);
343   EXPECT_EQ(mailbox, output.mailbox);
344   EXPECT_EQ(sync_token, output.sync_token);
345   EXPECT_EQ(texture_target, output.texture_target);
346 }
347 
TEST_F(StructTraitsTest,SyncToken)348 TEST_F(StructTraitsTest, SyncToken) {
349   const gpu::CommandBufferNamespace namespace_id = gpu::IN_PROCESS;
350   const gpu::CommandBufferId command_buffer_id(
351       gpu::CommandBufferId::FromUnsafeValue(0xdeadbeef));
352   const uint64_t release_count = 0xdeadbeefdead;
353   gpu::SyncToken input(namespace_id, command_buffer_id, release_count);
354   input.SetVerifyFlush();
355   mojo::Remote<mojom::TraitsTestService> remote = GetTraitsTestRemote();
356   gpu::SyncToken output;
357   remote->EchoSyncToken(input, &output);
358   EXPECT_EQ(namespace_id, output.namespace_id());
359   EXPECT_EQ(command_buffer_id, output.command_buffer_id());
360   EXPECT_EQ(release_count, output.release_count());
361   EXPECT_TRUE(output.verified_flush());
362 }
363 
TEST_F(StructTraitsTest,VideoDecodeAcceleratorSupportedProfile)364 TEST_F(StructTraitsTest, VideoDecodeAcceleratorSupportedProfile) {
365   const gpu::VideoCodecProfile profile =
366       gpu::VideoCodecProfile::H264PROFILE_MAIN;
367   const int32_t max_width = 1920;
368   const int32_t max_height = 1080;
369   const int32_t min_width = 640;
370   const int32_t min_height = 480;
371   const gfx::Size max_resolution(max_width, max_height);
372   const gfx::Size min_resolution(min_width, min_height);
373 
374   gpu::VideoDecodeAcceleratorSupportedProfile input;
375   input.profile = profile;
376   input.max_resolution = max_resolution;
377   input.min_resolution = min_resolution;
378   input.encrypted_only = false;
379 
380   mojo::Remote<mojom::TraitsTestService> remote = GetTraitsTestRemote();
381   gpu::VideoDecodeAcceleratorSupportedProfile output;
382   remote->EchoVideoDecodeAcceleratorSupportedProfile(input, &output);
383   EXPECT_EQ(profile, output.profile);
384   EXPECT_EQ(max_resolution, output.max_resolution);
385   EXPECT_EQ(min_resolution, output.min_resolution);
386   EXPECT_FALSE(output.encrypted_only);
387 }
388 
TEST_F(StructTraitsTest,VideoDecodeAcceleratorCapabilities)389 TEST_F(StructTraitsTest, VideoDecodeAcceleratorCapabilities) {
390   const uint32_t flags = 1234;
391 
392   gpu::VideoDecodeAcceleratorCapabilities input;
393   input.flags = flags;
394   input.supported_profiles.push_back(
395       gpu::VideoDecodeAcceleratorSupportedProfile());
396   input.supported_profiles.push_back(
397       gpu::VideoDecodeAcceleratorSupportedProfile());
398 
399   mojo::Remote<mojom::TraitsTestService> remote = GetTraitsTestRemote();
400   gpu::VideoDecodeAcceleratorCapabilities output;
401   remote->EchoVideoDecodeAcceleratorCapabilities(input, &output);
402   EXPECT_EQ(flags, output.flags);
403   EXPECT_EQ(input.supported_profiles.size(), output.supported_profiles.size());
404 }
405 
TEST_F(StructTraitsTest,VideoEncodeAcceleratorSupportedProfile)406 TEST_F(StructTraitsTest, VideoEncodeAcceleratorSupportedProfile) {
407   const gpu::VideoCodecProfile profile = VideoCodecProfile::H264PROFILE_MAIN;
408   const gfx::Size min_resolution(320, 180);
409   const gfx::Size max_resolution(1920, 1080);
410   const uint32_t max_framerate_numerator = 144;
411   const uint32_t max_framerate_denominator = 12;
412 
413   gpu::VideoEncodeAcceleratorSupportedProfile input;
414   input.profile = profile;
415   input.min_resolution = min_resolution;
416   input.max_resolution = max_resolution;
417   input.max_framerate_numerator = max_framerate_numerator;
418   input.max_framerate_denominator = max_framerate_denominator;
419 
420   mojo::Remote<mojom::TraitsTestService> remote = GetTraitsTestRemote();
421   gpu::VideoEncodeAcceleratorSupportedProfile output;
422   remote->EchoVideoEncodeAcceleratorSupportedProfile(input, &output);
423   EXPECT_EQ(profile, output.profile);
424   EXPECT_EQ(min_resolution, output.min_resolution);
425   EXPECT_EQ(max_resolution, output.max_resolution);
426   EXPECT_EQ(max_framerate_numerator, output.max_framerate_numerator);
427   EXPECT_EQ(max_framerate_denominator, output.max_framerate_denominator);
428 }
429 
TEST_F(StructTraitsTest,GpuPreferences)430 TEST_F(StructTraitsTest, GpuPreferences) {
431   GpuPreferences prefs;
432   prefs.gpu_startup_dialog = true;
433   prefs.disable_gpu_watchdog = true;
434   prefs.enable_gpu_driver_debug_logging = true;
435 
436   mojo::Remote<mojom::TraitsTestService> remote = GetTraitsTestRemote();
437   GpuPreferences echo;
438   remote->EchoGpuPreferences(prefs, &echo);
439   EXPECT_TRUE(echo.gpu_startup_dialog);
440   EXPECT_TRUE(echo.disable_gpu_watchdog);
441   EXPECT_TRUE(echo.enable_gpu_driver_debug_logging);
442 }
443 
TEST_F(StructTraitsTest,GpuFeatureInfo)444 TEST_F(StructTraitsTest, GpuFeatureInfo) {
445   GpuFeatureInfo input;
446   input.status_values[GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS] =
447       gpu::kGpuFeatureStatusBlocklisted;
448   input.status_values[GPU_FEATURE_TYPE_ACCELERATED_WEBGL] =
449       gpu::kGpuFeatureStatusUndefined;
450   input.status_values[GPU_FEATURE_TYPE_GPU_RASTERIZATION] =
451       gpu::kGpuFeatureStatusDisabled;
452   input.status_values[GPU_FEATURE_TYPE_OOP_RASTERIZATION] =
453       gpu::kGpuFeatureStatusDisabled;
454 
455   GpuFeatureInfo output;
456   ASSERT_TRUE(mojom::GpuFeatureInfo::Deserialize(
457       mojom::GpuFeatureInfo::Serialize(&input), &output));
458   EXPECT_TRUE(std::equal(input.status_values,
459                          input.status_values + NUMBER_OF_GPU_FEATURE_TYPES,
460                          output.status_values));
461 }
462 
463 }  // namespace gpu
464