diff options
author | Max Kellermann <max@musicpd.org> | 2019-12-24 16:17:10 +0100 |
---|---|---|
committer | Max Kellermann <max@musicpd.org> | 2019-12-24 16:31:06 +0100 |
commit | 803a48e96d5c84f5bff382492da2c943f536d7bd (patch) | |
tree | 8dbf3ab08fad835c9c788085e88f051c757d77c4 /test | |
parent | 57b8e7f651494122e9a2fc30a1281f9d927e5b87 (diff) | |
parent | bf41d1ad2bed5cb0b7b64b0cf4f87688da43d62c (diff) |
Merge tag 'v0.21.18'
release v0.21.18
Diffstat (limited to 'test')
-rw-r--r-- | test/RunCurl.cxx | 93 | ||||
-rw-r--r-- | test/meson.build | 12 | ||||
-rw-r--r-- | test/run_storage.cxx | 35 |
3 files changed, 140 insertions, 0 deletions
diff --git a/test/RunCurl.cxx b/test/RunCurl.cxx new file mode 100644 index 000000000..c8ca25909 --- /dev/null +++ b/test/RunCurl.cxx @@ -0,0 +1,93 @@ +/* + * Copyright 2003-2019 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "ShutdownHandler.hxx" +#include "lib/curl/Global.hxx" +#include "lib/curl/Request.hxx" +#include "lib/curl/Handler.hxx" +#include "event/Loop.hxx" +#include "util/PrintException.hxx" + +#include <stdio.h> + +class MyHandler final : public CurlResponseHandler { + EventLoop &event_loop; + + std::exception_ptr error; + +public: + explicit MyHandler(EventLoop &_event_loop) noexcept + :event_loop(_event_loop) {} + + void Finish() { + if (error) + std::rethrow_exception(error); + } + + /* virtual methods from CurlResponseHandler */ + void OnHeaders(unsigned status, + std::multimap<std::string, std::string> &&headers) override { + fprintf(stderr, "status: %u\n", status); + for (const auto &i : headers) + fprintf(stderr, "%s: %s\n", + i.first.c_str(), i.second.c_str()); + } + + void OnData(ConstBuffer<void> data) override { + if (fwrite(data.data, data.size, 1, stdout) != 1) + throw std::runtime_error("Failed to write"); + } + + void OnEnd() override { + event_loop.Break(); + } + + void OnError(std::exception_ptr e) noexcept override { + error = std::move(e); + event_loop.Break(); + } +}; + +int +main(int argc, char **argv) noexcept +try { + if (argc != 2) { + fprintf(stderr, "Usage: RunCurl URI\n"); + return EXIT_FAILURE; + } + + const char *const uri = argv[1]; + + EventLoop event_loop; + const ShutdownHandler shutdown_handler(event_loop); + CurlGlobal curl_global(event_loop); + + MyHandler handler(event_loop); + CurlRequest request(curl_global, uri, handler); + request.Start(); + + event_loop.Run(); + + handler.Finish(); + + return EXIT_SUCCESS; +} catch (...) { + PrintException(std::current_exception()); + return EXIT_FAILURE; +} diff --git a/test/meson.build b/test/meson.build index bdd6d82c7..db78ada48 100644 --- a/test/meson.build +++ b/test/meson.build @@ -342,6 +342,18 @@ executable( ) if curl_dep.found() + executable( + 'RunCurl', + 'RunCurl.cxx', + 'ShutdownHandler.cxx', + '../src/Log.cxx', + '../src/LogBackend.cxx', + include_directories: inc, + dependencies: [ + curl_dep, + ], + ) + test('test_icy_parser', executable( 'test_icy_parser', 'test_icy_parser.cxx', diff --git a/test/run_storage.cxx b/test/run_storage.cxx index 67816d8f8..b27b1bbe6 100644 --- a/test/run_storage.cxx +++ b/test/run_storage.cxx @@ -90,6 +90,29 @@ Ls(Storage &storage, const char *path) return EXIT_SUCCESS; } +static int +Stat(Storage &storage, const char *path) +{ + const auto info = storage.GetInfo(path, false); + switch (info.type) { + case StorageFileInfo::Type::OTHER: + printf("other\n"); + break; + + case StorageFileInfo::Type::REGULAR: + printf("regular\n"); + break; + + case StorageFileInfo::Type::DIRECTORY: + printf("directory\n"); + break; + } + + printf("size: %llu\n", (unsigned long long)info.size); + + return EXIT_SUCCESS; +} + int main(int argc, char **argv) try { @@ -117,6 +140,18 @@ try { storage_uri); return Ls(*storage, path); + } else if (strcmp(command, "stat") == 0) { + if (argc != 4) { + fprintf(stderr, "Usage: run_storage stat URI PATH\n"); + return EXIT_FAILURE; + } + + const char *const path = argv[3]; + + auto storage = MakeStorage(io_thread.GetEventLoop(), + storage_uri); + + return Stat(*storage, path); } else { fprintf(stderr, "Unknown command\n"); return EXIT_FAILURE; |