PageRenderTime 22ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/mordor/tests/file_stream.cpp

http://github.com/mozy/mordor
C++ | 136 lines | 124 code | 10 blank | 2 comment | 9 complexity | 9f550dbb997054eb929654b2e2fd6f4f MD5 | raw file
Possible License(s): BSD-3-Clause
  1. // Copyright (c) 2010 - Mozy, Inc.
  2. #include "mordor/pch.h"
  3. #include "mordor/streams/file.h"
  4. #include "mordor/test/test.h"
  5. using namespace Mordor;
  6. #if 0 // WINDOWS
  7. MORDOR_UNITTEST(FileStream, openSymlinkToDirectory)
  8. {
  9. if (!CreateDirectoryW(L"symlinkdir", NULL))
  10. MORDOR_THROW_EXCEPTION_FROM_LAST_ERROR_API("CreateDirectoryW");
  11. if (!CreateSymbolicLinkW(L"symlink", L"symlinkdir", SYMBOLIC_LINK_FLAG_DIRECTORY)) {
  12. RemoveDirectoryW(L"symlinkdir");
  13. MORDOR_THROW_EXCEPTION_FROM_LAST_ERROR_API("CreateSymbolicLinkW");
  14. }
  15. try {
  16. FileStream fstream(L"symlinktodir", FileStream::READ);
  17. Stream &stream(fstream);
  18. char buffer[6];
  19. stream.read(buffer, 6);
  20. } catch (...) {
  21. RemoveDirectoryW(L"symlinkdir");
  22. DeleteFileW(L"symlink");
  23. throw;
  24. }
  25. RemoveDirectoryW(L"symlinkdir");
  26. DeleteFileW(L"symlink");
  27. }
  28. MORDOR_UNITTEST(FileStream, openSymlinkToSelf)
  29. {
  30. if (!CreateSymbolicLinkW(L"symlink", L"symlink", 0))
  31. MORDOR_THROW_EXCEPTION_FROM_LAST_ERROR_API("CreateSymbolicLinkW");
  32. try {
  33. MORDOR_TEST_ASSERT_EXCEPTION(FileStream stream(L"symlinktoself",
  34. FileStream::READ), UnresolvablePathException);
  35. } catch (...) {
  36. DeleteFileW(L"symlink");
  37. throw;
  38. }
  39. DeleteFileW(L"symlink");
  40. }
  41. MORDOR_UNITTEST(FileStream, openSymlinkToNothing)
  42. {
  43. if (!CreateSymbolicLinkW(L"symlinkt", L"nothing", 0))
  44. MORDOR_THROW_EXCEPTION_FROM_LAST_ERROR_API("CreateSymbolicLinkW");
  45. try {
  46. MORDOR_TEST_ASSERT_EXCEPTION(FileStream stream(L"symlinktonothing",
  47. FileStream::READ), FileNotFoundException);
  48. } catch (...) {
  49. DeleteFileW(L"symlink");
  50. throw;
  51. }
  52. DeleteFileW(L"symlink");
  53. }
  54. #else
  55. static std::string tempfilename()
  56. {
  57. // Silly glibc, *forcing* me to not use mktemp, tempnam, or tmpnam
  58. std::string result("/tmp/mordorXXXXXX");
  59. int fd = mkstemp(&result[0]);
  60. if (fd < 0)
  61. MORDOR_THROW_EXCEPTION_FROM_LAST_ERROR_API("mkstemp");
  62. unlink(result.c_str());
  63. close(fd);
  64. return result;
  65. }
  66. MORDOR_UNITTEST(FileStream, openSymlinkToDirectory)
  67. {
  68. std::string dir("/tmp/mordorXXXXXX");
  69. if (!mkdtemp(&dir[0]))
  70. MORDOR_THROW_EXCEPTION_FROM_LAST_ERROR_API("mkdtemp");
  71. std::string sym;
  72. try {
  73. sym = tempfilename();
  74. } catch(...) {
  75. rmdir(dir.c_str());
  76. throw;
  77. }
  78. if (symlink(dir.c_str(), sym.c_str())) {
  79. rmdir(dir.c_str());
  80. MORDOR_THROW_EXCEPTION_FROM_LAST_ERROR_API("symlink");
  81. }
  82. try {
  83. FileStream fstream(sym, FileStream::READ);
  84. Stream &stream(fstream);
  85. char buffer[6];
  86. stream.read(buffer, 6);
  87. MORDOR_NOTREACHED();
  88. } catch (IsDirectoryException &) {
  89. } catch (...) {
  90. rmdir(dir.c_str());
  91. unlink(sym.c_str());
  92. throw;
  93. }
  94. rmdir(dir.c_str());
  95. unlink(sym.c_str());
  96. }
  97. MORDOR_UNITTEST(FileStream, openSymlinkToSelf)
  98. {
  99. std::string sym = tempfilename();
  100. if (symlink(sym.c_str(), sym.c_str()))
  101. MORDOR_THROW_EXCEPTION_FROM_LAST_ERROR_API("symlink");
  102. try {
  103. MORDOR_TEST_ASSERT_EXCEPTION(FileStream stream(sym, FileStream::READ),
  104. TooManySymbolicLinksException);
  105. } catch (...) {
  106. unlink(sym.c_str());
  107. throw;
  108. }
  109. unlink(sym.c_str());
  110. }
  111. MORDOR_UNITTEST(FileStream, openSymlinkToNothing)
  112. {
  113. std::string sym = tempfilename();
  114. std::string nothing = tempfilename();
  115. if (symlink(nothing.c_str(), sym.c_str()))
  116. MORDOR_THROW_EXCEPTION_FROM_LAST_ERROR_API("symlink");
  117. try {
  118. MORDOR_TEST_ASSERT_EXCEPTION(FileStream stream(sym, FileStream::READ),
  119. FileNotFoundException);
  120. } catch (...) {
  121. unlink(sym.c_str());
  122. throw;
  123. }
  124. unlink(sym.c_str());
  125. }
  126. #endif