#include "../include/mio/mmap.hpp" #include #include #include #include #include int main() { const char* path = "test-file"; // Fill buffer, then write it to file. std::string buffer(0x4000 - 250, 'M'); std::ofstream file(path); file << buffer; file.close(); // Map the region of the file to which buffer was written. std::error_code error; mio::mmap_source file_view = mio::make_mmap_source( path, 0, mio::use_full_file_size, error); if(error) { const auto& errmsg = error.message(); std::printf("error mapping file: %s, exiting...\n", errmsg.c_str()); return error.value(); } assert(file_view.is_open()); assert(file_view.size() == buffer.size()); // Then verify that mmap's bytes correspond to that of buffer. for(auto i = 0; i < buffer.size(); ++i) { if(file_view[i] != buffer[i]) { std::printf("%ith byte mismatch: expected(%i) <> actual(%i)", i, buffer[i], file_view[i]); assert(0); } } #define CHECK_INVALID_MMAP(m) do { \ assert(error); \ assert(m.empty()); \ assert(!m.is_open()); \ error.clear(); } while(0) mio::mmap_source m; // See if mapping an invalid file results in an error. m = mio::make_mmap_source("garbage-that-hopefully-doesnt-exist", 0, 0, error); CHECK_INVALID_MMAP(m); // Empty path? m = mio::make_mmap_source(static_cast(0), 0, 0, error); CHECK_INVALID_MMAP(m); m = mio::make_mmap_source(std::string(), 0, 0, error); CHECK_INVALID_MMAP(m); // Invalid handle? m = mio::make_mmap_source( INVALID_HANDLE_VALUE/*Psst... This is an implementation detail!*/, 0, 0, error); CHECK_INVALID_MMAP(m); // Invalid offset? m = mio::make_mmap_source(path, 100 * buffer.size(), buffer.size(), error); CHECK_INVALID_MMAP(m); std::printf("all tests passed!\n"); }