/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright (C) 2021, Google Inc. * * unique-fd.cpp - UniqueFD test */ #include <fcntl.h> #include <iostream> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> #include <libcamera/base/unique_fd.h> #include <libcamera/base/utils.h> #include "test.h" using namespace libcamera; using namespace std; class UniqueFDTest : public Test { protected: int init() override { return createFd(); } int run() override { /* Test creating empty UniqueFD. */ UniqueFD fd; if (fd.isValid() || fd.get() != -1) { std::cout << "Failed fd check (default constructor)" << std::endl; return TestFail; } /* Test creating UniqueFD from numerical file descriptor. */ UniqueFD fd2(fd_); if (!fd2.isValid() || fd2.get() != fd_) { std::cout << "Failed fd check (fd constructor)" << std::endl; return TestFail; } if (!isValidFd(fd_)) { std::cout << "Failed fd validity (fd constructor)" << std::endl; return TestFail; } /* Test move constructor. */ UniqueFD fd3(std::move(fd2)); if (!fd3.isValid() || fd3.get() != fd_) { std::cout << "Failed fd check (move constructor)" << std::endl; return TestFail; } if (fd2.isValid() || fd2.get() != -1) { std::cout << "Failed moved fd check (move constructor)" << std::endl; return TestFail; } if (!isValidFd(fd_)) { std::cout << "Failed fd validity (move constructor)" << std::endl; return TestFail; } /* Test move assignment operator. */ fd = std::move(fd3); if (!fd.isValid() || fd.get() != fd_) { std::cout << "Failed fd check (move assignment)" << std::endl; return TestFail; } if (fd3.isValid() || fd3.get() != -1) { std::cout << "Failed moved fd check (move assignment)" << std::endl; return TestFail; } if (!isValidFd(fd_)) { std::cout << "Failed fd validity (move assignment)" << std::endl; return TestFail; } /* Test swapping. */ fd2.swap(fd); if (!fd2.isValid() || fd2.get() != fd_) { std::cout << "Failed fd check (swap)" << std::endl; return TestFail; } if (fd.isValid() || fd.get() != -1) { std::cout << "Failed swapped fd check (swap)" << std::endl; return TestFail; } if (!isValidFd(fd_)) { std::cout << "Failed fd validity (swap)" << std::endl; return TestFail; } /* Test release. */ int numFd = fd2.release(); if (fd2.isValid() || fd2.get() != -1) { std::cout << "Failed fd check (release)" << std::endl; return TestFail; } if (numFd != fd_) { std::cout << "Failed released fd check (release)" << std::endl; return TestFail; } if (!isValidFd(fd_)) { std::cout << "Failed fd validity (release)" << std::endl; return TestFail; } /* Test reset assignment. */ fd.reset(numFd); if (!fd.isValid() || fd.get() != fd_) { std::cout << "Failed fd check (reset assignment)" << std::endl; return TestFail; } if (!isValidFd(fd_)) { std::cout << "Failed fd validity (reset assignment)" << std::endl; return TestFail; } /* Test reset destruction. */ fd.reset(); if (fd.isValid() || fd.get() != -1) { std::cout << "Failed fd check (reset destruction)" << std::endl; return TestFail; } if (isValidFd(fd_)) { std::cout << "Failed fd validity (reset destruction)" << std::endl; return TestFail; } /* Test destruction. */ if (createFd() == TestFail) { std::cout << "Failed to recreate test fd" << std::endl; return TestFail; } { UniqueFD fd4(fd_); } if (isValidFd(fd_)) { std::cout << "Failed fd validity (destruction)" << std::endl; return TestFail; } return TestPass; } void cleanup() override { if (fd_ > 0) close(fd_); } private: int createFd() { fd_ = open("/tmp", O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR); if (fd_ < 0) return TestFail; /* Cache inode number of temp file. */ struct stat s; if (fstat(fd_, &s)) return TestFail; inodeNr_ = s.st_ino; return 0; } bool isValidFd(int fd) { struct stat s; if (fstat(fd, &s)) return false; /* Check that inode number matches cached temp file. */ return s.st_ino == inodeNr_; } int fd_; ino_t inodeNr_; }; TEST_REGISTER(UniqueFDTest) earch'/> </form> </td></tr></table> <div class='path'>path: <a href='/libcamera/jmondi/libcamera.git/tree/?h=jmondi/android/pinephonepro&id=268882fa309c62cae8cccf1f2209bc32fc24fb05'>root</a>/<a href='/libcamera/jmondi/libcamera.git/tree/src?h=jmondi/android/pinephonepro&id=268882fa309c62cae8cccf1f2209bc32fc24fb05'>src</a>/<a href='/libcamera/jmondi/libcamera.git/tree/src/libcamera?h=jmondi/android/pinephonepro&id=268882fa309c62cae8cccf1f2209bc32fc24fb05'>libcamera</a>/<a href='/libcamera/jmondi/libcamera.git/tree/src/libcamera/ipa_pub_key.cpp.in?h=jmondi/android/pinephonepro&id=268882fa309c62cae8cccf1f2209bc32fc24fb05'>ipa_pub_key.cpp.in</a></div><div class='content'>blob: 01e5333b4d30fb53625cdae7d8388fb2ae4b7e9a (<a href='/libcamera/jmondi/libcamera.git/plain/src/libcamera/ipa_pub_key.cpp.in?h=jmondi/android/pinephonepro&id=268882fa309c62cae8cccf1f2209bc32fc24fb05'>plain</a>) <table summary='blob content' class='blob'> <tr><td class='linenumbers'><pre><a id='n1' href='#n1'>1</a> <a id='n2' href='#n2'>2</a> <a id='n3' href='#n3'>3</a> <a id='n4' href='#n4'>4</a> <a id='n5' href='#n5'>5</a> <a id='n6' href='#n6'>6</a> <a id='n7' href='#n7'>7</a> <a id='n8' href='#n8'>8</a> <a id='n9' href='#n9'>9</a> <a id='n10' href='#n10'>10</a> <a id='n11' href='#n11'>11</a> <a id='n12' href='#n12'>12</a> <a id='n13' href='#n13'>13</a> <a id='n14' href='#n14'>14</a> <a id='n15' href='#n15'>15</a> <a id='n16' href='#n16'>16</a> <a id='n17' href='#n17'>17</a> <a id='n18' href='#n18'>18</a> <a id='n19' href='#n19'>19</a> <a id='n20' href='#n20'>20</a> <a id='n21' href='#n21'>21</a> <a id='n22' href='#n22'>22</a> </pre></td> <td class='lines'><pre><code>