From caa3e751f7912dddafbfec85aedb8080e2e2fdfc Mon Sep 17 00:00:00 2001 From: Pavel Emelyanov Date: Tue, 24 Oct 2023 10:31:39 +0300 Subject: [PATCH] test: Add s3_client test for upload PUT fallback The test case creates non-jumbo upload simk and puts some bytes into it, then flushes. In order to make sure the fallback did took place the multipar memory tracker sempahore is broken in advance. Signed-off-by: Pavel Emelyanov --- test/boost/s3_test.cc | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/test/boost/s3_test.cc b/test/boost/s3_test.cc index 3b36d35be9..1443a8aa30 100644 --- a/test/boost/s3_test.cc +++ b/test/boost/s3_test.cc @@ -162,6 +162,34 @@ SEASTAR_THREAD_TEST_CASE(test_client_multipart_copy_upload) { do_test_client_multipart_upload(true); } +SEASTAR_THREAD_TEST_CASE(test_client_multipart_upload_fallback) { + const sstring name(fmt::format("/{}/testfbobject-{}", tests::getenv_safe("S3_BUCKET_FOR_TEST"), ::getpid())); + + testlog.info("Make client"); + semaphore mem(0); + mem.broken(); // so that any attempt to use it throws + auto cln = s3::client::make(tests::getenv_safe("S3_SERVER_ADDRESS_FOR_TEST"), make_minio_config(), mem); + auto close_client = deferred_close(*cln); + + testlog.info("Upload object"); + auto out = output_stream(cln->make_upload_sink(name)); + auto close = seastar::deferred_close(out); + + temporary_buffer data = sstring("1A3B5C7890").release(); + out.write(reinterpret_cast(data.begin()), data.size()).get(); + + testlog.info("Flush upload"); + out.flush().get(); // if it tries to do regular flush, memory claim would throw + auto delete_object = deferred_delete_object(cln, name); + + testlog.info("Closing"); + close.close_now(); + + testlog.info("Get object content"); + temporary_buffer res = cln->get_object_contiguous(name).get0(); + BOOST_REQUIRE_EQUAL(to_sstring(std::move(res)), to_sstring(std::move(data))); +} + SEASTAR_THREAD_TEST_CASE(test_client_readable_file) { const sstring name(fmt::format("/{}/testroobject-{}", tests::getenv_safe("S3_BUCKET_FOR_TEST"), ::getpid()));