UtilFsTest.cc 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include "util.h"
  2. #include <fstream>
  3. #include <cppunit/extensions/HelperMacros.h>
  4. #ifdef _WIN32
  5. static char* mkdtemp(char* tpl)
  6. {
  7. char* dn = mktemp(tpl);
  8. if (!dn) {
  9. return dn;
  10. }
  11. if (mkdir(dn)) {
  12. return nullptr;
  13. }
  14. return dn;
  15. }
  16. #endif // _WIN32
  17. namespace aria2 {
  18. class UtilFsTest : public CppUnit::TestFixture {
  19. CPPUNIT_TEST_SUITE(UtilFsTest);
  20. CPPUNIT_TEST(testSpace);
  21. CPPUNIT_TEST(testSpacePwd);
  22. CPPUNIT_TEST(testSpaceDownwardsFile);
  23. CPPUNIT_TEST(testSpaceDownwardsDir);
  24. CPPUNIT_TEST_SUITE_END();
  25. private:
  26. public:
  27. void setUp() {}
  28. void testSpace();
  29. void testSpacePwd();
  30. void testSpaceDownwardsFile();
  31. void testSpaceDownwardsDir();
  32. };
  33. CPPUNIT_TEST_SUITE_REGISTRATION(UtilFsTest);
  34. void UtilFsTest::testSpace()
  35. {
  36. const char* tmpl = "aria2.test.tmp.XXXXXX";
  37. char* tpl = strdup(tmpl); // lets just leak this
  38. CPPUNIT_ASSERT(tpl);
  39. char* tmp = mkdtemp(tpl);
  40. CPPUNIT_ASSERT(tmp);
  41. std::error_code ec;
  42. util::filesystem::space(tmp, ec);
  43. CPPUNIT_ASSERT(!ec);
  44. rmdir(tmp);
  45. auto rv = util::filesystem::space(tmp, ec);
  46. CPPUNIT_ASSERT(ec);
  47. CPPUNIT_ASSERT_EQUAL(rv.available, static_cast<uintmax_t>(-1));
  48. CPPUNIT_ASSERT_EQUAL(rv.capacity, static_cast<uintmax_t>(-1));
  49. CPPUNIT_ASSERT_EQUAL(rv.free, static_cast<uintmax_t>(-1));
  50. }
  51. void UtilFsTest::testSpacePwd()
  52. {
  53. std::error_code ec;
  54. util::filesystem::space(nullptr, ec);
  55. CPPUNIT_ASSERT(!ec);
  56. util::filesystem::space("", ec);
  57. CPPUNIT_ASSERT(!ec);
  58. util::filesystem::space(".", ec);
  59. CPPUNIT_ASSERT(!ec);
  60. util::filesystem::space("doesnotexit", ec);
  61. CPPUNIT_ASSERT(ec);
  62. util::filesystem::space_downwards("doesnotexit", ec);
  63. CPPUNIT_ASSERT(!ec);
  64. }
  65. void UtilFsTest::testSpaceDownwardsFile()
  66. {
  67. const char* tmpl = "aria2.test.tmp.XXXXXX";
  68. char* tpl = strdup(tmpl); // lets just leak this
  69. CPPUNIT_ASSERT(tpl);
  70. char* tmp = mkdtemp(tpl);
  71. CPPUNIT_ASSERT(tmp);
  72. std::string tn(tmp);
  73. tn += "/aria2.tmp";
  74. {
  75. std::ofstream s(tn);
  76. std::error_code ec;
  77. std::string tn2(tn);
  78. tn2 += "/something.else.entirely";
  79. util::filesystem::space(tn2.c_str(), ec);
  80. CPPUNIT_ASSERT_MESSAGE(tn2, ec);
  81. util::filesystem::space_downwards(tn2.c_str(), ec);
  82. CPPUNIT_ASSERT_MESSAGE(tn2, !ec);
  83. }
  84. unlink(tn.c_str());
  85. rmdir(tmp);
  86. }
  87. void UtilFsTest::testSpaceDownwardsDir()
  88. {
  89. const char* tmpl = "aria2.test.tmp.XXXXXX";
  90. char* tpl = strdup(tmpl); // lets just leak this
  91. CPPUNIT_ASSERT(tpl);
  92. char* tmp = mkdtemp(tpl);
  93. CPPUNIT_ASSERT(tmp);
  94. std::string tn(tmp);
  95. tn += "/something.else.entirely";
  96. std::error_code ec;
  97. auto rv = util::filesystem::space(tn.c_str(), ec);
  98. CPPUNIT_ASSERT_MESSAGE(tn, ec);
  99. rv = util::filesystem::space_downwards(tn.c_str(), ec);
  100. rmdir(tmp);
  101. CPPUNIT_ASSERT_MESSAGE(tn, !ec);
  102. }
  103. } // namespace aria2