1 #include "sandboxed_api/embed_file.h"
2
3 #include <memory>
4 #include <string>
5
6 #include "sandboxed_api/file_toc.h"
7 #include "gmock/gmock.h"
8 #include "gtest/gtest.h"
9 #include "absl/memory/memory.h"
10 #include "absl/strings/string_view.h"
11
12 namespace sapi {
13
14 class EmbedFileTestPeer {
15 public:
NewInstance()16 static std::unique_ptr<EmbedFile> NewInstance() {
17 return absl::WrapUnique(new EmbedFile());
18 }
19 };
20
21 namespace {
22
23 using ::testing::Eq;
24 using ::testing::Ne;
25
26 constexpr absl::string_view kRegularContents = "Hello world!";
27 constexpr FileToc kRegularToc = {
28 .name = "regular",
29 .data = kRegularContents.data(),
30 .size = kRegularContents.size(),
31 .md5digest = {}, // MD5 is unused in SAPI implementation
32 };
33
34 constexpr FileToc kFaultyToc = {
35 .name = "regular",
36 .data = nullptr,
37 .size = 100,
38 .md5digest = {}, // MD5 is unused in SAPI implementation
39 };
40
TEST(EmbedFileTest,GetRegularFd)41 TEST(EmbedFileTest, GetRegularFd) {
42 std::unique_ptr<EmbedFile> embed_file = EmbedFileTestPeer::NewInstance();
43 int fd = embed_file->GetFdForFileToc(&kRegularToc);
44 EXPECT_THAT(fd, Ne(-1));
45 }
46
TEST(EmbedFileTest,DuplicateGetFdIsSame)47 TEST(EmbedFileTest, DuplicateGetFdIsSame) {
48 std::unique_ptr<EmbedFile> embed_file = EmbedFileTestPeer::NewInstance();
49 int fd = embed_file->GetFdForFileToc(&kRegularToc);
50 EXPECT_THAT(fd, Ne(-1));
51 int fd2 = embed_file->GetFdForFileToc(&kRegularToc);
52 EXPECT_THAT(fd, Eq(fd2));
53 }
54
TEST(EmbedFileTest,GetDupFdReturnsFreshFd)55 TEST(EmbedFileTest, GetDupFdReturnsFreshFd) {
56 std::unique_ptr<EmbedFile> embed_file = EmbedFileTestPeer::NewInstance();
57 int fd = embed_file->GetFdForFileToc(&kRegularToc);
58 EXPECT_THAT(fd, Ne(-1));
59 int dup_fd = embed_file->GetDupFdForFileToc(&kRegularToc);
60 EXPECT_THAT(fd, Ne(dup_fd));
61 close(dup_fd);
62 }
63
TEST(EmbedFileTest,FaultyTocFails)64 TEST(EmbedFileTest, FaultyTocFails) {
65 std::unique_ptr<EmbedFile> embed_file = EmbedFileTestPeer::NewInstance();
66 int fd = embed_file->GetFdForFileToc(&kFaultyToc);
67 EXPECT_THAT(fd, Eq(-1));
68 int dup_fd = embed_file->GetDupFdForFileToc(&kFaultyToc);
69 EXPECT_THAT(dup_fd, Eq(-1));
70 }
71
TEST(EmbedFileTest,OverlongNameTocFails)72 TEST(EmbedFileTest, OverlongNameTocFails) {
73 std::string overlong_name(1000, 'a');
74 FileToc overlong_name_toc = {
75 .name = overlong_name.c_str(),
76 .data = kRegularContents.data(),
77 .size = kRegularContents.size(),
78 .md5digest = {}, // MD5 is unused in SAPI implementation
79 };
80 std::unique_ptr<EmbedFile> embed_file = EmbedFileTestPeer::NewInstance();
81 int fd = embed_file->GetFdForFileToc(&overlong_name_toc);
82 EXPECT_THAT(fd, Eq(-1));
83 }
84
85 } // namespace
86 } // namespace sapi
87