aboutsummaryrefslogtreecommitdiff
path: root/thirdparty/cpr/test/download_tests.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2025-10-24 19:32:01 +0200
committerGitHub Enterprise <[email protected]>2025-10-24 19:32:01 +0200
commit4cba4eb3f122c7a1a49b629b1c0656d7f817f001 (patch)
treee184821073167f6e81a75193efca91013d7b359b /thirdparty/cpr/test/download_tests.cpp
parentfixed progress bar when scanning changed local files (#608) (diff)
downloadzen-4cba4eb3f122c7a1a49b629b1c0656d7f817f001.tar.xz
zen-4cba4eb3f122c7a1a49b629b1c0656d7f817f001.zip
move cpr in-tree (#605)
* added cpr 1.10.5 in-tree to allow updates to vcpkg without breaking the build * added asio 1.29.0 in-tree to remove one more vcpkg dependency * bumped vcpkg to 2024.06.15 to address failure to build due to use of deprecated binaries in vcpkg (404 error: `https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-pkgconf-1~2.1.0-1-any.pkg.tar.zst` during build)
Diffstat (limited to 'thirdparty/cpr/test/download_tests.cpp')
-rw-r--r--thirdparty/cpr/test/download_tests.cpp140
1 files changed, 140 insertions, 0 deletions
diff --git a/thirdparty/cpr/test/download_tests.cpp b/thirdparty/cpr/test/download_tests.cpp
new file mode 100644
index 000000000..a1ee6df30
--- /dev/null
+++ b/thirdparty/cpr/test/download_tests.cpp
@@ -0,0 +1,140 @@
+#include <cstddef>
+#include <gtest/gtest.h>
+
+#include <string>
+
+#include <cpr/cpr.h>
+
+#include "cpr/api.h"
+#include "cpr/callback.h"
+#include "cpr/cprtypes.h"
+#include "cpr/session.h"
+#include "httpServer.hpp"
+
+
+static cpr::HttpServer* server = new cpr::HttpServer();
+
+bool write_data(std::string /*data*/, intptr_t /*userdata*/) {
+ return true;
+}
+
+TEST(DownloadTests, DownloadGzip) {
+ cpr::Url url{server->GetBaseUrl() + "/download_gzip.html"};
+ cpr::Session session;
+ session.SetHeader(cpr::Header{{"Accept-Encoding", "gzip"}});
+ session.SetUrl(url);
+ cpr::Response response = session.Download(cpr::WriteCallback{write_data, 0});
+ EXPECT_EQ(url, response.url);
+ EXPECT_EQ(200, response.status_code);
+ EXPECT_EQ(cpr::ErrorCode::OK, response.error.code);
+}
+
+TEST(DownloadTests, RangeTestWholeFile) {
+ const int64_t download_size = 9;
+ cpr::Url url{server->GetBaseUrl() + "/download_gzip.html"};
+ cpr::Session session;
+ session.SetUrl(url);
+ session.SetHeader(cpr::Header{{"Accept-Encoding", "gzip"}});
+ session.SetRange(cpr::Range{std::nullopt, std::nullopt});
+ cpr::Response response = session.Download(cpr::WriteCallback{write_data, 0});
+ EXPECT_EQ(200, response.status_code);
+ EXPECT_EQ(cpr::ErrorCode::OK, response.error.code);
+ EXPECT_EQ(download_size, response.downloaded_bytes);
+}
+
+TEST(DownloadTests, RangeTestLowerLimit) {
+ const int64_t download_size = 8;
+ cpr::Url url{server->GetBaseUrl() + "/download_gzip.html"};
+ cpr::Session session;
+ session.SetUrl(url);
+ session.SetHeader(cpr::Header{{"Accept-Encoding", "gzip"}});
+ session.SetRange(cpr::Range{1, std::nullopt});
+ cpr::Response response = session.Download(cpr::WriteCallback{write_data, 0});
+ EXPECT_EQ(206, response.status_code);
+ EXPECT_EQ(cpr::ErrorCode::OK, response.error.code);
+ EXPECT_EQ(download_size, response.downloaded_bytes);
+}
+
+TEST(DownloadTests, RangeTestUpperLimit) {
+ const int64_t download_size = 6;
+ cpr::Url url{server->GetBaseUrl() + "/download_gzip.html"};
+ cpr::Session session;
+ session.SetUrl(url);
+ session.SetHeader(cpr::Header{{"Accept-Encoding", "gzip"}});
+ session.SetRange(cpr::Range{std::nullopt, download_size - 1});
+ cpr::Response response = session.Download(cpr::WriteCallback{write_data, 0});
+ EXPECT_EQ(206, response.status_code);
+ EXPECT_EQ(cpr::ErrorCode::OK, response.error.code);
+ EXPECT_EQ(download_size, response.downloaded_bytes);
+}
+
+TEST(DownloadTests, RangeTestLowerAndUpperLimit) {
+ const int64_t download_size = 2;
+ const int64_t start_from = 2;
+ const int64_t finish_at = start_from + download_size - 1;
+ cpr::Url url{server->GetBaseUrl() + "/download_gzip.html"};
+ cpr::Session session;
+ session.SetUrl(url);
+ session.SetHeader(cpr::Header{{"Accept-Encoding", "gzip"}});
+ session.SetRange(cpr::Range{start_from, finish_at});
+ cpr::Response response = session.Download(cpr::WriteCallback{write_data, 0});
+ EXPECT_EQ(206, response.status_code);
+ EXPECT_EQ(cpr::ErrorCode::OK, response.error.code);
+ EXPECT_EQ(download_size, response.downloaded_bytes);
+}
+
+TEST(DownloadTests, RangeTestMultipleRangesSet) {
+ const int64_t num_parts = 2;
+ const int64_t download_size = num_parts * (26 /*content range*/ + 4 /*\n*/) + ((num_parts + 1) * 15 /*boundary*/) + 2 /*--*/ + 6 /*data*/;
+ cpr::Url url{server->GetBaseUrl() + "/download_gzip.html"};
+ cpr::Session session;
+ session.SetUrl(url);
+ session.SetHeader(cpr::Header{{"Accept-Encoding", "gzip"}});
+ session.SetMultiRange(cpr::MultiRange{cpr::Range{std::nullopt, 3}, cpr::Range{5, 6}});
+ cpr::Response response = session.Download(cpr::WriteCallback{write_data, 0});
+ EXPECT_EQ(206, response.status_code);
+ EXPECT_EQ(cpr::ErrorCode::OK, response.error.code);
+ EXPECT_EQ(download_size, response.downloaded_bytes);
+}
+
+TEST(DownloadTests, RangeTestMultipleRangesOption) {
+ const int64_t num_parts = 3;
+ const int64_t download_size = num_parts * (26 /*content range*/ + 4 /*\n*/) + ((num_parts + 1) * 15 /*boundary*/) + 2 /*--*/ + 7 /*data*/;
+ cpr::Url url{server->GetBaseUrl() + "/download_gzip.html"};
+ cpr::Session session;
+ session.SetUrl(url);
+ session.SetHeader(cpr::Header{{"Accept-Encoding", "gzip"}});
+ session.SetOption(cpr::MultiRange{cpr::Range{std::nullopt, 2}, cpr::Range{4, 5}, cpr::Range{7, 8}});
+ cpr::Response response = session.Download(cpr::WriteCallback{write_data, 0});
+ EXPECT_EQ(206, response.status_code);
+ EXPECT_EQ(cpr::ErrorCode::OK, response.error.code);
+ EXPECT_EQ(download_size, response.downloaded_bytes);
+}
+
+bool real_write_data(std::string data, intptr_t userdata) {
+ // NOLINTNEXTLINE (cppcoreguidelines-pro-type-reinterpret-cast)
+ std::string* dst = reinterpret_cast<std::string*>(userdata);
+ *dst += data;
+ return true;
+}
+
+TEST(DownloadTests, GetDownloadFileLength) {
+ cpr::Url url{server->GetBaseUrl() + "/get_download_file_length.html"};
+ cpr::Session session;
+ session.SetUrl(url);
+ auto len = session.GetDownloadFileLength();
+ EXPECT_EQ(len, -1);
+
+ std::string strFileData;
+ cpr::Response response = session.Download(cpr::WriteCallback{real_write_data, (intptr_t) &strFileData});
+ EXPECT_EQ(url, response.url);
+ EXPECT_EQ(200, response.status_code);
+ EXPECT_EQ(cpr::ErrorCode::OK, response.error.code);
+ EXPECT_EQ(strFileData, "this is a file content.");
+}
+
+int main(int argc, char** argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ ::testing::AddGlobalTestEnvironment(server);
+ return RUN_ALL_TESTS();
+}