diff options
Diffstat (limited to 'tests/unit')
-rw-r--r-- | tests/unit/libstore/filetransfer.cc | 32 | ||||
-rw-r--r-- | tests/unit/meson.build | 1 |
2 files changed, 33 insertions, 0 deletions
diff --git a/tests/unit/libstore/filetransfer.cc b/tests/unit/libstore/filetransfer.cc new file mode 100644 index 000000000..192bf81ef --- /dev/null +++ b/tests/unit/libstore/filetransfer.cc @@ -0,0 +1,32 @@ +#include "filetransfer.hh" + +#include <future> +#include <gtest/gtest.h> + +using namespace std::chrono_literals; + +namespace nix { + +TEST(FileTransfer, exceptionAbortsDownload) +{ + struct Done + {}; + + auto ft = makeFileTransfer(); + + LambdaSink broken([](auto block) { throw Done(); }); + + ASSERT_THROW(ft->download(FileTransferRequest("file:///dev/zero"), broken), Done); + + // makeFileTransfer returns a ref<>, which cannot be cleared. since we also + // can't default-construct it we'll have to overwrite it instead, but we'll + // take the raw pointer out first so we can destroy it in a detached thread + // (otherwise a failure will stall the process and have it killed by meson) + auto reset = std::async(std::launch::async, [&]() { ft = makeFileTransfer(); }); + EXPECT_EQ(reset.wait_for(10s), std::future_status::ready); + // if this did time out we have to leak `reset`. + if (reset.wait_for(0s) == std::future_status::timeout) { + (void) new auto(std::move(reset)); + } +} +} diff --git a/tests/unit/meson.build b/tests/unit/meson.build index 339ac9a4a..f5355cce8 100644 --- a/tests/unit/meson.build +++ b/tests/unit/meson.build @@ -113,6 +113,7 @@ libstore_tests_sources = files( 'libstore/derivation.cc', 'libstore/derived-path.cc', 'libstore/downstream-placeholder.cc', + 'libstore/filetransfer.cc', 'libstore/machines.cc', 'libstore/nar-info-disk-cache.cc', 'libstore/outputs-spec.cc', |