@@ -40,6 +40,103 @@ class FileDataLoaderTest : public ::testing::TestWithParam<size_t> {
4040 }
4141};
4242
43+ TEST_P (FileDataLoaderTest, InBoundsFileDescriptorLoadsSucceed) {
44+ // Write some heterogeneous data to a file.
45+ uint8_t data[256 ];
46+ for (int i = 0 ; i < sizeof (data); ++i) {
47+ data[i] = i;
48+ }
49+ TempFile tf (data, sizeof (data));
50+
51+ int fd = ::open (tf.path ().c_str (), O_RDONLY);
52+
53+ // Wrap it in a loader.
54+ Result<FileDataLoader> fdl = FileDataLoader::fromFileDescriptorUri (
55+ (" fd:///" + std::to_string (fd)).c_str (), alignment ());
56+ ASSERT_EQ (fdl.error (), Error::Ok);
57+
58+ // size() should succeed and reflect the total size.
59+ Result<size_t > size = fdl->size ();
60+ ASSERT_EQ (size.error (), Error::Ok);
61+ EXPECT_EQ (*size, sizeof (data));
62+
63+ // Load the first bytes of the data.
64+ {
65+ Result<FreeableBuffer> fb = fdl->load (
66+ /* offset=*/ 0 ,
67+ /* size=*/ 8 ,
68+ DataLoader::SegmentInfo (DataLoader::SegmentInfo::Type::Program));
69+ ASSERT_EQ (fb.error (), Error::Ok);
70+ EXPECT_ALIGNED (fb->data (), alignment ());
71+ EXPECT_EQ (fb->size (), 8 );
72+ EXPECT_EQ (
73+ 0 ,
74+ std::memcmp (
75+ fb->data (),
76+ " \x00\x01\x02\x03 "
77+ " \x04\x05\x06\x07 " ,
78+ fb->size ()));
79+
80+ // Freeing should release the buffer and clear out the segment.
81+ fb->Free ();
82+ EXPECT_EQ (fb->size (), 0 );
83+ EXPECT_EQ (fb->data (), nullptr );
84+
85+ // Safe to call multiple times.
86+ fb->Free ();
87+ }
88+
89+ // Load the last few bytes of the data, a different size than the first time.
90+ {
91+ Result<FreeableBuffer> fb = fdl->load (
92+ /* offset=*/ sizeof (data) - 3 ,
93+ /* size=*/ 3 ,
94+ DataLoader::SegmentInfo (DataLoader::SegmentInfo::Type::Program));
95+ ASSERT_EQ (fb.error (), Error::Ok);
96+ EXPECT_ALIGNED (fb->data (), alignment ());
97+ EXPECT_EQ (fb->size (), 3 );
98+ EXPECT_EQ (0 , std::memcmp (fb->data (), " \xfd\xfe\xff " , fb->size ()));
99+ }
100+
101+ // Loading all of the data succeeds.
102+ {
103+ Result<FreeableBuffer> fb = fdl->load (
104+ /* offset=*/ 0 ,
105+ /* size=*/ sizeof (data),
106+ DataLoader::SegmentInfo (DataLoader::SegmentInfo::Type::Program));
107+ ASSERT_EQ (fb.error (), Error::Ok);
108+ EXPECT_ALIGNED (fb->data (), alignment ());
109+ EXPECT_EQ (fb->size (), sizeof (data));
110+ EXPECT_EQ (0 , std::memcmp (fb->data (), data, fb->size ()));
111+ }
112+
113+ // Loading zero-sized data succeeds, even at the end of the data.
114+ {
115+ Result<FreeableBuffer> fb = fdl->load (
116+ /* offset=*/ sizeof (data),
117+ /* size=*/ 0 ,
118+ DataLoader::SegmentInfo (DataLoader::SegmentInfo::Type::Program));
119+ ASSERT_EQ (fb.error (), Error::Ok);
120+ EXPECT_EQ (fb->size (), 0 );
121+ }
122+ }
123+
124+ TEST_P (FileDataLoaderTest, FileDescriptorLoadPrefixFail) {
125+ // Write some heterogeneous data to a file.
126+ uint8_t data[256 ];
127+ for (int i = 0 ; i < sizeof (data); ++i) {
128+ data[i] = i;
129+ }
130+ TempFile tf (data, sizeof (data));
131+
132+ int fd = ::open (tf.path ().c_str (), O_RDONLY);
133+
134+ // Wrap it in a loader.
135+ Result<FileDataLoader> fdl = FileDataLoader::fromFileDescriptorUri (
136+ std::to_string (fd).c_str (), alignment ());
137+ ASSERT_EQ (fdl.error (), Error::InvalidArgument);
138+ }
139+
43140TEST_P (FileDataLoaderTest, InBoundsLoadsSucceed) {
44141 // Write some heterogeneous data to a file.
45142 uint8_t data[256 ];
0 commit comments