• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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