PageRenderTime 23ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/mordor/tests/efs_stream.cpp

http://github.com/mozy/mordor
C++ | 106 lines | 88 code | 12 blank | 6 comment | 5 complexity | 1906f2c4803664db449501f2f97a4c5b MD5 | raw file
Possible License(s): BSD-3-Clause
  1. // Copyright (c) 2009 - Mozy, Inc.
  2. #ifdef WINDOWS
  3. #include "mordor/fiber.h"
  4. #include "mordor/streams/file.h"
  5. #include "mordor/streams/efs.h"
  6. #include "mordor/streams/transfer.h"
  7. #include "mordor/streams/random.h"
  8. #include "mordor/streams/memory.h"
  9. #include "mordor/test/test.h"
  10. using namespace Mordor;
  11. using namespace Mordor::Test;
  12. MORDOR_UNITTEST(EFSStream, basic)
  13. {
  14. {
  15. FileStream file("dummy.efs", FileStream::WRITE, FileStream::OVERWRITE_OR_CREATE);
  16. file.write("cody", 4);
  17. }
  18. if (!EncryptFileW(L"dummy.efs")) {
  19. DWORD error = GetLastError();
  20. MORDOR_LOG_INFO(Mordor::Log::root()) << "EncryptFileW failed with code " << error;
  21. DeleteFileW(L"dummy.efs");
  22. throw TestSkippedException();
  23. }
  24. Buffer b, b2;
  25. {
  26. EFSStream efs("dummy.efs", true);
  27. efs.read(b, 65536);
  28. MORDOR_TEST_ASSERT_EQUAL(efs.read(b, 65536), 0u);
  29. }
  30. MORDOR_TEST_ASSERT_GREATER_THAN_OR_EQUAL(b.readAvailable(), 4u);
  31. {
  32. EFSStream efs("dummy2.efs", false);
  33. efs.write(b, b.readAvailable());
  34. efs.close();
  35. }
  36. {
  37. FileStream file("dummy2.efs");
  38. Stream &fileStream = file;
  39. MORDOR_TEST_ASSERT_EQUAL(fileStream.read(b2, 65536), 4u);
  40. MORDOR_TEST_ASSERT(b2 == "cody");
  41. }
  42. DeleteFileW(L"dummy.efs");
  43. DeleteFileW(L"dummy2.efs");
  44. }
  45. MORDOR_UNITTEST(EFSStream, seek)
  46. {
  47. {
  48. // create an EFS'd file with random content
  49. {
  50. RandomStream r;
  51. FileStream out("dummy3.efs", FileStream::WRITE, FileStream::OVERWRITE_OR_CREATE);
  52. transferStream(r, out, 100000);
  53. }
  54. if (!EncryptFileW(L"dummy3.efs")) {
  55. DWORD error = GetLastError();
  56. MORDOR_LOG_INFO(Mordor::Log::root()) << "EncryptFileW failed with code " << error;
  57. DeleteFileW(L"dummy3.efs");
  58. throw TestSkippedException();
  59. }
  60. // now open for reading
  61. EFSStream efsr("dummy3.efs", true);
  62. // read the file serially to a MemoryStream
  63. MemoryStream control;
  64. transferStream(efsr, control);
  65. // now seek back to various offsets and ensure the data read is correct
  66. long long seek_offsets[] = {
  67. 0, // eof to bof
  68. 50000, // mid-file forward
  69. 12345, // mid-file backward
  70. 0, // mid-file to bof
  71. 99999, // forward, truncated read
  72. 100000, // eof
  73. };
  74. size_t num_tests = sizeof(seek_offsets) / sizeof(seek_offsets[0]);
  75. for(size_t i = 0; i < num_tests; ++i)
  76. {
  77. Buffer control_buf;
  78. control.seek(seek_offsets[i]);
  79. control.read(control_buf, 1000);
  80. Buffer test_buf;
  81. efsr.seek(seek_offsets[i]);
  82. // EFSStream is known to return partial reads; that is by design
  83. size_t to_read = 1000;
  84. do {
  85. to_read -= efsr.read(test_buf, to_read);
  86. } while(to_read > 0);
  87. MORDOR_TEST_ASSERT_EQUAL(control.tell(), efsr.tell());
  88. MORDOR_TEST_ASSERT_EQUAL(control_buf.readAvailable(), test_buf.readAvailable());
  89. MORDOR_TEST_ASSERT(control_buf == test_buf);
  90. }
  91. }
  92. DeleteFileW(L"dummy3.efs");
  93. }
  94. #endif