-
Notifications
You must be signed in to change notification settings - Fork 6.6k
/
fragment_test.cc
102 lines (81 loc) · 2.95 KB
/
fragment_test.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ipcz/fragment.h"
#include <algorithm>
#include <cstring>
#include <limits>
#include <string>
#include <utility>
#include "ipcz/buffer_id.h"
#include "ipcz/driver_memory.h"
#include "ipcz/driver_memory_mapping.h"
#include "reference_drivers/sync_reference_driver.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace ipcz {
namespace {
const IpczDriver& kTestDriver = reference_drivers::kSyncReferenceDriver;
using FragmentTest = testing::Test;
TEST_F(FragmentTest, FromDescriptorUnsafe) {
char kBuffer[] = "Hello, world!";
Fragment f = Fragment::FromDescriptorUnsafe({BufferId{0}, 1, 4}, kBuffer + 1);
EXPECT_FALSE(f.is_null());
EXPECT_FALSE(f.is_pending());
EXPECT_EQ(1u, f.offset());
EXPECT_EQ(4u, f.size());
EXPECT_EQ("ello", std::string(f.bytes().begin(), f.bytes().end()));
f = Fragment::FromDescriptorUnsafe({BufferId{0}, 7, 6}, kBuffer + 7);
EXPECT_FALSE(f.is_null());
EXPECT_FALSE(f.is_pending());
EXPECT_EQ(7u, f.offset());
EXPECT_EQ(6u, f.size());
EXPECT_EQ("world!", std::string(f.bytes().begin(), f.bytes().end()));
}
TEST_F(FragmentTest, PendingFromDescriptor) {
Fragment f = Fragment::PendingFromDescriptor({BufferId{0}, 5, 42});
EXPECT_TRUE(f.is_pending());
EXPECT_FALSE(f.is_null());
EXPECT_EQ(5u, f.offset());
EXPECT_EQ(42u, f.size());
f = Fragment::PendingFromDescriptor({kInvalidBufferId, 0, 0});
EXPECT_TRUE(f.is_null());
EXPECT_FALSE(f.is_pending());
}
TEST_F(FragmentTest, NullMappedFromDescriptor) {
constexpr size_t kDataSize = 32;
DriverMemory memory(kTestDriver, kDataSize);
auto mapping = memory.Map();
Fragment f =
Fragment::MappedFromDescriptor({kInvalidBufferId, 0, 0}, mapping);
EXPECT_TRUE(f.is_null());
}
TEST_F(FragmentTest, InvalidMappedFromDescriptor) {
constexpr size_t kDataSize = 32;
DriverMemory memory(kTestDriver, kDataSize);
auto mapping = memory.Map();
Fragment f;
// Offset out of bounds
f = Fragment::MappedFromDescriptor({BufferId{0}, kDataSize, 1}, mapping);
EXPECT_TRUE(f.is_null());
// Tail out of bounds
f = Fragment::MappedFromDescriptor({BufferId{0}, 0, kDataSize + 5}, mapping);
EXPECT_TRUE(f.is_null());
// Tail overflow
f = Fragment::MappedFromDescriptor(
{BufferId{0}, std::numeric_limits<uint32_t>::max(), 2}, mapping);
EXPECT_TRUE(f.is_null());
}
TEST_F(FragmentTest, ValidMappedFromDescriptor) {
const char kData[] = "0123456789abcdef";
DriverMemory memory(kTestDriver, std::size(kData));
auto mapping = memory.Map();
memcpy(mapping.bytes().data(), kData, std::size(kData));
Fragment f = Fragment::MappedFromDescriptor({BufferId{0}, 2, 11}, mapping);
EXPECT_FALSE(f.is_null());
EXPECT_FALSE(f.is_pending());
EXPECT_EQ(2u, f.offset());
EXPECT_EQ(11u, f.size());
EXPECT_EQ("23456789abc", std::string(f.bytes().begin(), f.bytes().end()));
}
} // namespace
} // namespace ipcz