github.com/SagerNet/gvisor@v0.0.0-20210707092255-7731c139d75c/test/syscalls/linux/pwrite64.cc (about) 1 // Copyright 2018 The gVisor Authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #include <errno.h> 16 #include <fcntl.h> 17 #include <linux/unistd.h> 18 #include <sys/socket.h> 19 #include <sys/types.h> 20 #include <unistd.h> 21 22 #include "gtest/gtest.h" 23 #include "test/util/temp_path.h" 24 #include "test/util/test_util.h" 25 26 namespace gvisor { 27 namespace testing { 28 29 namespace { 30 31 // TODO(gvisor.dev/issue/2370): This test is currently very rudimentary. 32 class Pwrite64 : public ::testing::Test { 33 void SetUp() override { 34 name_ = NewTempAbsPath(); 35 int fd; 36 ASSERT_THAT(fd = open(name_.c_str(), O_CREAT, 0644), SyscallSucceeds()); 37 EXPECT_THAT(close(fd), SyscallSucceeds()); 38 } 39 40 void TearDown() override { unlink(name_.c_str()); } 41 42 public: 43 std::string name_; 44 }; 45 46 TEST_F(Pwrite64, AppendOnly) { 47 int fd; 48 ASSERT_THAT(fd = open(name_.c_str(), O_APPEND | O_RDWR), SyscallSucceeds()); 49 constexpr int64_t kBufSize = 1024; 50 std::vector<char> buf(kBufSize); 51 std::fill(buf.begin(), buf.end(), 'a'); 52 EXPECT_THAT(PwriteFd(fd, buf.data(), buf.size(), 0), 53 SyscallSucceedsWithValue(buf.size())); 54 EXPECT_THAT(lseek(fd, 0, SEEK_CUR), SyscallSucceedsWithValue(0)); 55 EXPECT_THAT(close(fd), SyscallSucceeds()); 56 } 57 58 TEST_F(Pwrite64, InvalidArgs) { 59 int fd; 60 ASSERT_THAT(fd = open(name_.c_str(), O_APPEND | O_RDWR), SyscallSucceeds()); 61 constexpr int64_t kBufSize = 1024; 62 std::vector<char> buf(kBufSize); 63 std::fill(buf.begin(), buf.end(), 'a'); 64 EXPECT_THAT(PwriteFd(fd, buf.data(), buf.size(), -1), 65 SyscallFailsWithErrno(EINVAL)); 66 EXPECT_THAT(close(fd), SyscallSucceeds()); 67 } 68 69 TEST_F(Pwrite64, Overflow) { 70 int fd; 71 ASSERT_THAT(fd = open(name_.c_str(), O_APPEND | O_RDWR), SyscallSucceeds()); 72 constexpr int64_t kBufSize = 1024; 73 std::vector<char> buf(kBufSize); 74 std::fill(buf.begin(), buf.end(), 'a'); 75 EXPECT_THAT(PwriteFd(fd, buf.data(), buf.size(), 0x7fffffffffffffffull), 76 SyscallFailsWithErrno(EINVAL)); 77 EXPECT_THAT(close(fd), SyscallSucceeds()); 78 } 79 80 TEST_F(Pwrite64, Pwrite64WithOpath) { 81 SKIP_IF(IsRunningWithVFS1()); 82 const TempPath file = ASSERT_NO_ERRNO_AND_VALUE(TempPath::CreateFile()); 83 const FileDescriptor fd = 84 ASSERT_NO_ERRNO_AND_VALUE(Open(file.path(), O_PATH)); 85 86 std::vector<char> buf(1); 87 EXPECT_THAT(PwriteFd(fd.get(), buf.data(), 1, 0), 88 SyscallFailsWithErrno(EBADF)); 89 } 90 91 } // namespace 92 93 } // namespace testing 94 } // namespace gvisor