fileutl_test.cc 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. #include <config.h>
  2. #include <apt-pkg/error.h>
  3. #include <apt-pkg/fileutl.h>
  4. #include <apt-pkg/aptconfiguration.h>
  5. #include <string>
  6. #include <vector>
  7. #include <stdlib.h>
  8. #include <sys/stat.h>
  9. #include <string.h>
  10. #include "assert.h"
  11. static void assertStringEquals(char const * const expect, char const * const got, unsigned long const line) {
  12. if (strncmp(expect, got, strlen(expect)) == 0)
  13. return;
  14. OutputAssertEqual(expect, "==", got, line);
  15. }
  16. #define strequals(x,y) assertStringEquals(x, y, __LINE__)
  17. static bool
  18. TestFileFd(mode_t const a_umask, mode_t const ExpectedFilePermission, unsigned int const filemode, APT::Configuration::Compressor const &compressor)
  19. {
  20. FileFd f;
  21. struct stat buf;
  22. static const char* fname = "test.txt";
  23. umask(a_umask);
  24. equals(f.Open(fname, filemode, compressor), true);
  25. equals(f.IsOpen(), true);
  26. equals(f.Failed(), false);
  27. equals(umask(a_umask), a_umask);
  28. std::string test = "This is a test!";
  29. equals(f.Write(test.c_str(), test.size()), true);
  30. equals(f.IsOpen(), true);
  31. equals(f.Failed(), false);
  32. f.Close();
  33. equals(f.IsOpen(), false);
  34. equals(f.Failed(), false);
  35. equals(f.Open(fname, FileFd::ReadOnly, compressor), true);
  36. equalsNot(f.FileSize(), 0);
  37. equals(f.IsOpen(), true);
  38. equals(f.Failed(), false);
  39. char readback[20];
  40. {
  41. char const * const expect = "This";
  42. equals(f.Read(readback, strlen(expect)), true);
  43. equals(f.Failed(), false);
  44. equals(f.Eof(), false);
  45. strequals(expect, readback);
  46. equals(strlen(expect), f.Tell());
  47. }
  48. {
  49. char const * const expect = "test!";
  50. equals(f.Skip((test.size() - f.Tell()) - strlen(expect)), true);
  51. equals(f.Read(readback, strlen(expect)), true);
  52. equals(f.Failed(), false);
  53. equals(f.Eof(), false);
  54. strequals(expect, readback);
  55. equals(test.size(), f.Tell());
  56. }
  57. equals(f.Seek(0), true);
  58. equals(f.Read(readback, 20, true), true);
  59. equals(f.Failed(), false);
  60. equals(f.Eof(), true);
  61. equals(test, readback);
  62. equals(test.size(), strlen(readback));
  63. equals(f.Size(), f.Tell());
  64. equals(f.Seek(0), true);
  65. f.ReadLine(readback, 20);
  66. equals(f.Failed(), false);
  67. equals(f.Eof(), true);
  68. equals(test, readback);
  69. equals(test.size(), strlen(readback));
  70. equals(f.Size(), f.Tell());
  71. f.Close();
  72. equals(f.IsOpen(), false);
  73. equals(f.Failed(), false);
  74. // regression test for permission bug LP: #1304657
  75. if (stat(fname, &buf) < 0)
  76. {
  77. _error->Errno("stat", "failed to stat");
  78. return false;
  79. }
  80. unlink(fname);
  81. equals(buf.st_mode & 0777, ExpectedFilePermission);
  82. return true;
  83. }
  84. static bool TestFileFd(unsigned int const filemode)
  85. {
  86. std::vector<APT::Configuration::Compressor> const compressors = APT::Configuration::getCompressors();
  87. for (std::vector<APT::Configuration::Compressor>::const_iterator c = compressors.begin(); c != compressors.end(); ++c)
  88. {
  89. if ((filemode & FileFd::ReadWrite) == FileFd::ReadWrite &&
  90. (c->Name.empty() != true && c->Binary.empty() != true))
  91. continue;
  92. if (TestFileFd(0002, 0664, filemode, *c) == false ||
  93. TestFileFd(0022, 0644, filemode, *c) == false ||
  94. TestFileFd(0077, 0600, filemode, *c) == false ||
  95. TestFileFd(0026, 0640, filemode, *c) == false)
  96. {
  97. _error->DumpErrors();
  98. return false;
  99. }
  100. }
  101. return true;
  102. }
  103. int main()
  104. {
  105. if (TestFileFd(FileFd::WriteOnly | FileFd::Create) == false ||
  106. TestFileFd(FileFd::WriteOnly | FileFd::Create | FileFd::Empty) == false ||
  107. TestFileFd(FileFd::WriteOnly | FileFd::Create | FileFd::Exclusive) == false ||
  108. TestFileFd(FileFd::WriteOnly | FileFd::Atomic) == false ||
  109. TestFileFd(FileFd::WriteOnly | FileFd::Create | FileFd::Atomic) == false ||
  110. // short-hands for ReadWrite with these modes
  111. TestFileFd(FileFd::WriteEmpty) == false ||
  112. TestFileFd(FileFd::WriteAny) == false ||
  113. TestFileFd(FileFd::WriteTemp) == false ||
  114. TestFileFd(FileFd::WriteAtomic) == false)
  115. {
  116. return 1;
  117. }
  118. std::vector<std::string> files;
  119. // normal match
  120. files = Glob("*.lst");
  121. if (files.size() != 1)
  122. {
  123. _error->DumpErrors();
  124. return 1;
  125. }
  126. // not there
  127. files = Glob("xxxyyyzzz");
  128. if (files.size() != 0 || _error->PendingError())
  129. {
  130. _error->DumpErrors();
  131. return 1;
  132. }
  133. // many matches (number is a bit random)
  134. files = Glob("*.cc");
  135. if (files.size() < 10)
  136. {
  137. _error->DumpErrors();
  138. return 1;
  139. }
  140. // GetTempDir()
  141. unsetenv("TMPDIR");
  142. equals(GetTempDir(), "/tmp");
  143. setenv("TMPDIR", "", 1);
  144. equals(GetTempDir(), "/tmp");
  145. setenv("TMPDIR", "/not-there-no-really-not", 1);
  146. equals(GetTempDir(), "/tmp");
  147. setenv("TMPDIR", "/usr", 1);
  148. equals(GetTempDir(), "/usr");
  149. return 0;
  150. }