direct_io_ut.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include <library/cpp/testing/unittest/registar.h>
  2. #include <util/generic/string.h>
  3. #include <util/generic/array_size.h>
  4. #include <util/system/env.h>
  5. #include "buffered.h"
  6. #include "direct_io.h"
  7. Y_UNIT_TEST_SUITE(TDirectIOTests) {
  8. // Decrease numBufToWrite further if tests continue to time out
  9. static void Y_NO_INLINE Test(EOpenMode mode, size_t numBufToWrite) {
  10. const char TEMPLATE[] = "qwertyuiopQWERTYUIOPasdfghjklASD";
  11. const auto TEMPLATE_SIZE = Y_ARRAY_SIZE(TEMPLATE) - 1;
  12. static_assert(TEMPLATE_SIZE > 0, "must be greater than zero");
  13. const size_t BUFFER_SIZE = 32 * 1024;
  14. static_assert(0 == BUFFER_SIZE % TEMPLATE_SIZE, "must be divisible");
  15. const size_t CHUNK_SIZE_TO_READ = 512;
  16. static_assert(0 == CHUNK_SIZE_TO_READ % TEMPLATE_SIZE, "must be divisible");
  17. // filling buffer
  18. // TEMPLATE|TEMPLATE|TEMPLATE|...
  19. auto&& buffer = TBuffer{BUFFER_SIZE};
  20. for (size_t i = 0; i < BUFFER_SIZE / TEMPLATE_SIZE; ++i) {
  21. buffer.Append(TEMPLATE, TEMPLATE_SIZE);
  22. }
  23. // filling file
  24. // TEMPLATE|TEMPLATE|TEMPLATE|...
  25. const auto fileName = TString("test.file");
  26. auto&& directIOBuffer = TDirectIOBufferedFile{fileName, RdWr | CreateAlways | mode};
  27. {
  28. auto&& output = TRandomAccessFileOutput{directIOBuffer};
  29. for (size_t i = 0; i < numBufToWrite; ++i) {
  30. output.Write(buffer.Data(), BUFFER_SIZE);
  31. }
  32. }
  33. auto&& reader = TRandomAccessFileInput{directIOBuffer, 0};
  34. auto&& input = TBufferedInput{&reader, 1 << 17};
  35. auto bytesRead = size_t{};
  36. while (auto len = input.Read(buffer.Data(), CHUNK_SIZE_TO_READ)) {
  37. bytesRead += len;
  38. while (len) {
  39. if (len < TEMPLATE_SIZE) {
  40. UNIT_ASSERT(!memcmp(buffer.Data(), TEMPLATE, len));
  41. len = 0;
  42. } else {
  43. UNIT_ASSERT(!memcmp(buffer.Data(), TEMPLATE, TEMPLATE_SIZE));
  44. len -= TEMPLATE_SIZE;
  45. }
  46. }
  47. }
  48. UNIT_ASSERT_VALUES_EQUAL(bytesRead, numBufToWrite * BUFFER_SIZE);
  49. }
  50. Y_UNIT_TEST(ReadWriteTest) {
  51. Test(0, 100 * 32);
  52. }
  53. Y_UNIT_TEST(ReadWriteDirectTest) {
  54. Test(Direct, 100 * 4);
  55. }
  56. Y_UNIT_TEST(ReadWriteDirectSeqTest) {
  57. Test(Direct | Seq, 100 * 4);
  58. }
  59. }