blob: 90780f130cad6ba3157a223a65fb3ad28468e015 [file] [log] [blame]
Yuri Wiitala486c7ae2019-04-15 15:04:57 -07001// Copyright 2019 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
Jordan Baylesa26582d2019-07-10 14:44:58 -07005#include "util/big_endian.h"
Yuri Wiitala486c7ae2019-04-15 15:04:57 -07006
Jordan Bayles2d01f172019-06-07 11:11:50 -07007#include "gmock/gmock.h"
8#include "gtest/gtest.h"
Yuri Wiitala486c7ae2019-04-15 15:04:57 -07009
10namespace openscreen {
Yuri Wiitala486c7ae2019-04-15 15:04:57 -070011namespace {
12
13// Tests that ReadBigEndian() correctly imports values from various offsets in
14// memory.
15TEST(BigEndianTest, ReadValues) {
16 const uint8_t kInput[] = {
17 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa,
18 0xb, 0xc, 0xd, 0xe, 0xf, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff,
19 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
20 };
21
Max Yakimakha852f70c2019-05-07 14:14:35 -070022 EXPECT_EQ(UINT8_C(0x05), ReadBigEndian<uint8_t>(kInput + 5));
23 EXPECT_EQ(UINT8_C(0xff), ReadBigEndian<uint8_t>(kInput + 16));
24 EXPECT_EQ(7, ReadBigEndian<int8_t>(kInput + 7));
25 EXPECT_EQ(-1, ReadBigEndian<int8_t>(kInput + 17));
26
Yuri Wiitala486c7ae2019-04-15 15:04:57 -070027 EXPECT_EQ(UINT16_C(0x0001), ReadBigEndian<uint16_t>(kInput));
28 EXPECT_EQ(UINT16_C(0x0102), ReadBigEndian<uint16_t>(kInput + 1));
29 EXPECT_EQ(UINT16_C(0x0203), ReadBigEndian<uint16_t>(kInput + 2));
30 EXPECT_EQ(-1, ReadBigEndian<int16_t>(kInput + 16));
31 EXPECT_EQ(-2, ReadBigEndian<int16_t>(kInput + 17));
32
33 EXPECT_EQ(UINT32_C(0x03040506), ReadBigEndian<uint32_t>(kInput + 3));
34 EXPECT_EQ(UINT32_C(0x04050607), ReadBigEndian<uint32_t>(kInput + 4));
35 EXPECT_EQ(UINT32_C(0x05060708), ReadBigEndian<uint32_t>(kInput + 5));
36 EXPECT_EQ(-1, ReadBigEndian<int32_t>(kInput + 19));
37 EXPECT_EQ(-2, ReadBigEndian<int32_t>(kInput + 20));
38
39 EXPECT_EQ(UINT64_C(0x0001020304050607), ReadBigEndian<uint64_t>(kInput));
40 EXPECT_EQ(UINT64_C(0x0102030405060708), ReadBigEndian<uint64_t>(kInput + 1));
41 EXPECT_EQ(UINT64_C(0x0203040506070809), ReadBigEndian<uint64_t>(kInput + 2));
42 EXPECT_EQ(-1, ReadBigEndian<int64_t>(kInput + 24));
43 EXPECT_EQ(-2, ReadBigEndian<int64_t>(kInput + 25));
44}
45
46// Tests that WriteBigEndian() correctly writes-out values to various offsets in
47// memory. This test assumes ReadBigEndian() is working, using it to verify that
48// WriteBigEndian() is working.
49TEST(BigEndianTest, WriteValues) {
50 uint8_t scratch[16];
51
Max Yakimakha852f70c2019-05-07 14:14:35 -070052 WriteBigEndian<uint8_t>(0x07, scratch);
53 EXPECT_EQ(UINT8_C(0x07), ReadBigEndian<uint8_t>(scratch));
54 WriteBigEndian<uint8_t>(0xf0, scratch + 1);
55 EXPECT_EQ(UINT8_C(0xf0), ReadBigEndian<uint8_t>(scratch + 1));
56 WriteBigEndian<int8_t>(23, scratch + 2);
57 EXPECT_EQ(23, ReadBigEndian<int8_t>(scratch + 2));
58 WriteBigEndian<int8_t>(-25, scratch + 3);
59 EXPECT_EQ(-25, ReadBigEndian<int8_t>(scratch + 3));
60
Yuri Wiitala486c7ae2019-04-15 15:04:57 -070061 WriteBigEndian<uint16_t>(0x0102, scratch);
62 EXPECT_EQ(UINT16_C(0x0102), ReadBigEndian<uint16_t>(scratch));
63 WriteBigEndian<uint16_t>(0x0304, scratch + 1);
64 EXPECT_EQ(UINT16_C(0x0304), ReadBigEndian<uint16_t>(scratch + 1));
65 WriteBigEndian<uint16_t>(0x0506, scratch + 2);
66 EXPECT_EQ(UINT16_C(0x0506), ReadBigEndian<uint16_t>(scratch + 2));
67 WriteBigEndian<int16_t>(42, scratch + 3);
68 EXPECT_EQ(42, ReadBigEndian<int16_t>(scratch + 3));
69 WriteBigEndian<int16_t>(-1, scratch + 4);
70 EXPECT_EQ(-1, ReadBigEndian<int16_t>(scratch + 4));
71 WriteBigEndian<int16_t>(-2, scratch + 5);
72 EXPECT_EQ(-2, ReadBigEndian<int16_t>(scratch + 5));
73
74 WriteBigEndian<uint32_t>(UINT32_C(0x03040506), scratch);
75 EXPECT_EQ(UINT32_C(0x03040506), ReadBigEndian<uint32_t>(scratch));
76 WriteBigEndian<uint32_t>(UINT32_C(0x0708090a), scratch + 1);
77 EXPECT_EQ(UINT32_C(0x0708090a), ReadBigEndian<uint32_t>(scratch + 1));
78 WriteBigEndian<uint32_t>(UINT32_C(0x0b0c0d0e), scratch + 2);
79 EXPECT_EQ(UINT32_C(0x0b0c0d0e), ReadBigEndian<uint32_t>(scratch + 2));
80 WriteBigEndian<int32_t>(42, scratch + 3);
81 EXPECT_EQ(42, ReadBigEndian<int32_t>(scratch + 3));
82 WriteBigEndian<int32_t>(-1, scratch + 4);
83 EXPECT_EQ(-1, ReadBigEndian<int32_t>(scratch + 4));
84 WriteBigEndian<int32_t>(-2, scratch + 5);
85 EXPECT_EQ(-2, ReadBigEndian<int32_t>(scratch + 5));
86
87 WriteBigEndian<uint64_t>(UINT64_C(0x0f0e0d0c0b0a0908), scratch);
88 EXPECT_EQ(UINT64_C(0x0f0e0d0c0b0a0908), ReadBigEndian<uint64_t>(scratch));
89 WriteBigEndian<uint64_t>(UINT64_C(0x0708090a0b0c0d0e), scratch + 1);
90 EXPECT_EQ(UINT64_C(0x0708090a0b0c0d0e), ReadBigEndian<uint64_t>(scratch + 1));
91 WriteBigEndian<uint64_t>(UINT64_C(0x99aa88bb77cc66dd), scratch + 2);
92 EXPECT_EQ(UINT64_C(0x99aa88bb77cc66dd), ReadBigEndian<uint64_t>(scratch + 2));
93 WriteBigEndian<int64_t>(42, scratch + 3);
94 EXPECT_EQ(42, ReadBigEndian<int64_t>(scratch + 3));
95 WriteBigEndian<int64_t>(-1, scratch + 4);
96 EXPECT_EQ(-1, ReadBigEndian<int64_t>(scratch + 4));
97 WriteBigEndian<int64_t>(-2, scratch + 5);
98 EXPECT_EQ(-2, ReadBigEndian<int64_t>(scratch + 5));
99}
100
Max Yakimakhadad3c642019-05-24 17:25:30 -0700101TEST(BigEndianReaderTest, ConstructWithValidBuffer) {
102 uint8_t data[64];
103 BigEndianReader reader(data, sizeof(data));
104
105 EXPECT_EQ(reader.begin(), data);
106 EXPECT_EQ(reader.current(), data);
107 EXPECT_EQ(reader.end(), data + 64);
Jordan Baylesd0b8fa32019-07-10 16:59:00 -0700108 EXPECT_EQ(reader.offset(), 0u);
109 EXPECT_EQ(reader.remaining(), 64u);
110 EXPECT_EQ(reader.length(), 64u);
Max Yakimakhadad3c642019-05-24 17:25:30 -0700111}
112
113TEST(BigEndianReaderTest, SkipLessThanRemaining) {
114 uint8_t data[64];
115 BigEndianReader reader(data, sizeof(data));
116
117 EXPECT_TRUE(reader.Skip(16));
118
119 EXPECT_EQ(reader.begin(), data);
120 EXPECT_EQ(reader.current(), data + 16);
121 EXPECT_EQ(reader.end(), data + 64);
Jordan Baylesd0b8fa32019-07-10 16:59:00 -0700122 EXPECT_EQ(reader.offset(), 16u);
123 EXPECT_EQ(reader.remaining(), 48u);
124 EXPECT_EQ(reader.length(), 64u);
Max Yakimakhadad3c642019-05-24 17:25:30 -0700125}
126
127TEST(BigEndianReaderTest, SkipMoreThanRemaining) {
128 uint8_t data[64];
129 BigEndianReader reader(data, sizeof(data));
130
131 EXPECT_TRUE(reader.Skip(16));
132 EXPECT_FALSE(reader.Skip(64));
133
134 // Check that failed Skip does not modify any pointers or offsets.
135 EXPECT_EQ(reader.begin(), data);
136 EXPECT_EQ(reader.current(), data + 16);
137 EXPECT_EQ(reader.end(), data + 64);
Jordan Baylesd0b8fa32019-07-10 16:59:00 -0700138 EXPECT_EQ(reader.offset(), 16u);
139 EXPECT_EQ(reader.remaining(), 48u);
140 EXPECT_EQ(reader.length(), 64u);
Max Yakimakhadad3c642019-05-24 17:25:30 -0700141}
142
143TEST(BigEndianReaderTest, ConstructWithZeroLengthBuffer) {
144 uint8_t data[8];
145 BigEndianReader reader(data, 0);
146
147 EXPECT_EQ(reader.begin(), data);
148 EXPECT_EQ(reader.current(), data);
149 EXPECT_EQ(reader.end(), data);
Jordan Baylesd0b8fa32019-07-10 16:59:00 -0700150 EXPECT_EQ(reader.offset(), 0u);
151 EXPECT_EQ(reader.remaining(), 0u);
152 EXPECT_EQ(reader.length(), 0u);
Max Yakimakhadad3c642019-05-24 17:25:30 -0700153
154 EXPECT_FALSE(reader.Skip(1));
155}
156
157TEST(BigEndianReaderTest, ReadValues) {
158 uint8_t data[17] = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
159 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10};
160 BigEndianReader reader(data, sizeof(data));
161
162 uint8_t buffer[2];
Max Yakimakha55bbe802019-06-19 15:04:28 -0700163 EXPECT_TRUE(reader.Read(sizeof(buffer), buffer));
Max Yakimakhadad3c642019-05-24 17:25:30 -0700164 EXPECT_EQ(buffer[0], UINT8_C(0x0));
165 EXPECT_EQ(buffer[1], UINT8_C(0x1));
166
167 uint8_t u8;
168 EXPECT_TRUE(reader.Read<uint8_t>(&u8));
169 EXPECT_EQ(u8, UINT8_C(0x2));
170
171 uint16_t u16;
172 EXPECT_TRUE(reader.Read<uint16_t>(&u16));
173 EXPECT_EQ(u16, UINT16_C(0x0304));
174
175 uint32_t u32;
176 EXPECT_TRUE(reader.Read<uint32_t>(&u32));
177 EXPECT_EQ(u32, UINT32_C(0x05060708));
178
179 uint64_t u64;
180 EXPECT_TRUE(reader.Read<uint64_t>(&u64));
181 EXPECT_EQ(u64, UINT64_C(0x090A0B0C0D0E0F10));
182
183 EXPECT_EQ(reader.begin(), data);
184 EXPECT_EQ(reader.current(), data + 17);
185 EXPECT_EQ(reader.end(), data + 17);
Jordan Baylesd0b8fa32019-07-10 16:59:00 -0700186 EXPECT_EQ(reader.offset(), 17u);
187 EXPECT_EQ(reader.remaining(), 0u);
188 EXPECT_EQ(reader.length(), 17u);
Max Yakimakhadad3c642019-05-24 17:25:30 -0700189}
190
191TEST(BigEndianReaderTest, RespectLength) {
192 uint8_t data[8];
193 BigEndianReader reader(data, sizeof(data));
194
195 // 8 left
196 EXPECT_FALSE(reader.Skip(9));
197 EXPECT_TRUE(reader.Skip(1));
198
199 // 7 left
200 uint64_t u64;
201 EXPECT_FALSE(reader.Read<uint64_t>(&u64));
202 EXPECT_TRUE(reader.Skip(4));
203
204 // 3 left
205 uint32_t u32;
206 EXPECT_FALSE(reader.Read<uint32_t>(&u32));
207 EXPECT_TRUE(reader.Skip(2));
208
209 // 1 left
210 uint16_t u16;
211 EXPECT_FALSE(reader.Read<uint16_t>(&u16));
212
213 uint8_t buffer[2];
Max Yakimakha55bbe802019-06-19 15:04:28 -0700214 EXPECT_FALSE(reader.Read(2, buffer));
Max Yakimakhadad3c642019-05-24 17:25:30 -0700215 EXPECT_TRUE(reader.Skip(1));
216
217 // 0 left
218 uint8_t u8;
219 EXPECT_FALSE(reader.Read<uint8_t>(&u8));
220
221 EXPECT_EQ(reader.begin(), data);
222 EXPECT_EQ(reader.current(), data + 8);
223 EXPECT_EQ(reader.end(), data + 8);
Jordan Baylesd0b8fa32019-07-10 16:59:00 -0700224 EXPECT_EQ(reader.offset(), 8u);
225 EXPECT_EQ(reader.remaining(), 0u);
226 EXPECT_EQ(reader.length(), 8u);
Max Yakimakhadad3c642019-05-24 17:25:30 -0700227}
228
Max Yakimakhab7da13f2019-06-11 16:59:06 -0700229TEST(BigEndianBufferCursorTest, CursorCommit) {
230 uint8_t data[16] = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
231 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF};
232 BigEndianReader reader(data, sizeof(data));
233
234 {
235 BigEndianReader::Cursor cursor(&reader);
236
237 uint8_t u8;
238 EXPECT_TRUE(reader.Read<uint8_t>(&u8));
Jordan Baylesd0b8fa32019-07-10 16:59:00 -0700239 EXPECT_EQ(cursor.delta(), 1u);
Max Yakimakhab7da13f2019-06-11 16:59:06 -0700240
241 uint16_t u16;
242 EXPECT_TRUE(reader.Read<uint16_t>(&u16));
Jordan Baylesd0b8fa32019-07-10 16:59:00 -0700243 EXPECT_EQ(cursor.delta(), 3u);
Max Yakimakhab7da13f2019-06-11 16:59:06 -0700244
245 uint32_t u32;
246 EXPECT_TRUE(reader.Read<uint32_t>(&u32));
Jordan Baylesd0b8fa32019-07-10 16:59:00 -0700247 EXPECT_EQ(cursor.delta(), 7u);
Max Yakimakhab7da13f2019-06-11 16:59:06 -0700248
249 uint64_t u64;
250 EXPECT_TRUE(reader.Read<uint64_t>(&u64));
Jordan Baylesd0b8fa32019-07-10 16:59:00 -0700251 EXPECT_EQ(cursor.delta(), 15u);
Max Yakimakhab7da13f2019-06-11 16:59:06 -0700252
253 EXPECT_FALSE(reader.Skip(2));
Jordan Baylesd0b8fa32019-07-10 16:59:00 -0700254 EXPECT_EQ(cursor.delta(), 15u);
255 EXPECT_EQ(static_cast<size_t>(reader.current() - cursor.origin()),
256 cursor.delta());
Max Yakimakhab7da13f2019-06-11 16:59:06 -0700257
258 cursor.Commit();
259 }
260
261 EXPECT_EQ(reader.begin(), data);
262 EXPECT_EQ(reader.current(), data + 15);
263 EXPECT_EQ(reader.end(), data + 16);
Jordan Baylesd0b8fa32019-07-10 16:59:00 -0700264 EXPECT_EQ(reader.offset(), 15u);
265 EXPECT_EQ(reader.remaining(), 1u);
266 EXPECT_EQ(reader.length(), 16u);
Max Yakimakhab7da13f2019-06-11 16:59:06 -0700267}
268
269TEST(BigEndianBufferCursorTest, CursorRollback) {
270 uint8_t data[16];
271 BigEndianReader reader(data, sizeof(data));
272
273 {
274 BigEndianReader::Cursor cursor(&reader);
275
276 EXPECT_TRUE(reader.Skip(4));
Jordan Baylesd0b8fa32019-07-10 16:59:00 -0700277 EXPECT_EQ(cursor.delta(), 4u);
Max Yakimakhab7da13f2019-06-11 16:59:06 -0700278 }
279
280 EXPECT_EQ(reader.begin(), data);
281 EXPECT_EQ(reader.current(), data);
Jordan Baylesd0b8fa32019-07-10 16:59:00 -0700282 EXPECT_EQ(reader.end(), data + 16u);
283 EXPECT_EQ(reader.offset(), 0u);
284 EXPECT_EQ(reader.remaining(), 16u);
285 EXPECT_EQ(reader.length(), 16u);
Max Yakimakhab7da13f2019-06-11 16:59:06 -0700286}
287
Max Yakimakhadad3c642019-05-24 17:25:30 -0700288TEST(BigEndianWriterTest, ConstructWithValidBuffer) {
289 uint8_t data[64];
290 BigEndianWriter writer(data, sizeof(data));
291
292 EXPECT_EQ(writer.begin(), data);
293 EXPECT_EQ(writer.current(), data);
Jordan Baylesd0b8fa32019-07-10 16:59:00 -0700294 EXPECT_EQ(writer.end(), data + 64u);
295 EXPECT_EQ(writer.offset(), 0u);
296 EXPECT_EQ(writer.remaining(), 64u);
297 EXPECT_EQ(writer.length(), 64u);
Max Yakimakhadad3c642019-05-24 17:25:30 -0700298}
299
300TEST(BigEndianWriterTest, SkipLessThanRemaining) {
301 uint8_t data[64];
302 BigEndianWriter writer(data, sizeof(data));
303
304 EXPECT_TRUE(writer.Skip(16));
305
306 EXPECT_EQ(writer.begin(), data);
Jordan Baylesd0b8fa32019-07-10 16:59:00 -0700307 EXPECT_EQ(writer.current(), data + 16u);
Max Yakimakhadad3c642019-05-24 17:25:30 -0700308 EXPECT_EQ(writer.end(), data + 64);
Jordan Baylesd0b8fa32019-07-10 16:59:00 -0700309 EXPECT_EQ(writer.offset(), 16u);
310 EXPECT_EQ(writer.remaining(), 48u);
311 EXPECT_EQ(writer.length(), 64u);
Max Yakimakhadad3c642019-05-24 17:25:30 -0700312}
313
314TEST(BigEndianWriterTest, SkipMoreThanRemaining) {
315 uint8_t data[64];
316 BigEndianWriter writer(data, sizeof(data));
317
318 EXPECT_TRUE(writer.Skip(16));
319 EXPECT_FALSE(writer.Skip(64));
320
321 // Check that failed Skip does not modify any pointers or offsets.
322 EXPECT_EQ(writer.begin(), data);
Jordan Baylesd0b8fa32019-07-10 16:59:00 -0700323 EXPECT_EQ(writer.current(), data + 16u);
324 EXPECT_EQ(writer.end(), data + 64u);
325 EXPECT_EQ(writer.offset(), 16u);
326 EXPECT_EQ(writer.remaining(), 48u);
327 EXPECT_EQ(writer.length(), 64u);
Max Yakimakhadad3c642019-05-24 17:25:30 -0700328}
329
330TEST(BigEndianWriterTest, ConstructWithZeroLengthBuffer) {
331 uint8_t data[8];
332 BigEndianWriter writer(data, 0);
333
334 EXPECT_EQ(writer.begin(), data);
335 EXPECT_EQ(writer.current(), data);
336 EXPECT_EQ(writer.end(), data);
Jordan Baylesd0b8fa32019-07-10 16:59:00 -0700337 EXPECT_EQ(writer.offset(), 0u);
338 EXPECT_EQ(writer.remaining(), 0u);
339 EXPECT_EQ(writer.length(), 0u);
Max Yakimakhadad3c642019-05-24 17:25:30 -0700340
341 EXPECT_FALSE(writer.Skip(1));
342}
343
344TEST(BigEndianWriterTest, WriteValues) {
345 uint8_t expected[17] = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
346 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10};
347
348 uint8_t data[17];
349 memset(data, 0xFF, sizeof(data));
350 BigEndianWriter writer(data, sizeof(data));
351
352 uint8_t buffer[] = {0x0, 0x1};
Max Yakimakha2b8a98c2019-06-19 14:39:22 -0700353 EXPECT_TRUE(writer.Write(buffer, sizeof(buffer)));
Max Yakimakhadad3c642019-05-24 17:25:30 -0700354 EXPECT_TRUE(writer.Write<uint8_t>(UINT8_C(0x2)));
355 EXPECT_TRUE(writer.Write<uint16_t>(UINT16_C(0x0304)));
356 EXPECT_TRUE(writer.Write<uint32_t>(UINT32_C(0x05060708)));
357 EXPECT_TRUE(writer.Write<uint64_t>(UINT64_C(0x090A0B0C0D0E0F10)));
358 EXPECT_THAT(data, testing::ElementsAreArray(expected));
359
360 EXPECT_EQ(writer.begin(), data);
361 EXPECT_EQ(writer.current(), data + 17);
362 EXPECT_EQ(writer.end(), data + 17);
Jordan Baylesd0b8fa32019-07-10 16:59:00 -0700363 EXPECT_EQ(writer.offset(), 17u);
364 EXPECT_EQ(writer.remaining(), 0u);
365 EXPECT_EQ(writer.length(), 17u);
Max Yakimakhadad3c642019-05-24 17:25:30 -0700366}
367
368TEST(BigEndianWriterTest, RespectLength) {
369 uint8_t data[8];
370 BigEndianWriter writer(data, sizeof(data));
371
372 // 8 left
373 EXPECT_FALSE(writer.Skip(9));
374 EXPECT_TRUE(writer.Skip(1));
375
376 // 7 left
377 EXPECT_FALSE(writer.Write<uint64_t>(0));
378 EXPECT_TRUE(writer.Skip(4));
379
380 // 3 left
381 EXPECT_FALSE(writer.Write<uint32_t>(0));
382 EXPECT_TRUE(writer.Skip(2));
383
384 // 1 left
385 EXPECT_FALSE(writer.Write<uint16_t>(0));
386
387 uint8_t buffer[2];
Max Yakimakha2b8a98c2019-06-19 14:39:22 -0700388 EXPECT_FALSE(writer.Write(buffer, 2));
Max Yakimakhadad3c642019-05-24 17:25:30 -0700389 EXPECT_TRUE(writer.Skip(1));
390
391 // 0 left
392 EXPECT_FALSE(writer.Write<uint8_t>(0));
393 EXPECT_EQ(0u, writer.remaining());
394
395 EXPECT_EQ(writer.begin(), data);
396 EXPECT_EQ(writer.current(), data + 8);
397 EXPECT_EQ(writer.end(), data + 8);
Jordan Baylesd0b8fa32019-07-10 16:59:00 -0700398 EXPECT_EQ(writer.offset(), 8u);
399 EXPECT_EQ(writer.remaining(), 0u);
400 EXPECT_EQ(writer.length(), 8u);
Max Yakimakhadad3c642019-05-24 17:25:30 -0700401}
402
Yuri Wiitala486c7ae2019-04-15 15:04:57 -0700403} // namespace
Yuri Wiitala486c7ae2019-04-15 15:04:57 -0700404} // namespace openscreen