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