summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorMax Kellermann <max@musicpd.org>2020-09-07 21:15:53 +0200
committerMax Kellermann <max@musicpd.org>2020-09-07 21:15:53 +0200
commite8380cf2aa9ff7517d5ea3ada33a40df09d8542c (patch)
tree05e90c5cbd73e2b5bb0f98b330a7d931eb50cd2f /test
parent291be84704e9369f2cfc895c02bcceeace7b95d3 (diff)
parentb2ae5298a765f83dd142564adfdcaf5b2d34ff52 (diff)
Merge branch 'v0.21.x' into master
Diffstat (limited to 'test')
-rw-r--r--test/run_input.cxx33
-rwxr-xr-xtest/test_archive_iso9660.sh5
2 files changed, 33 insertions, 5 deletions
diff --git a/test/run_input.cxx b/test/run_input.cxx
index 57300183a..f24840f71 100644
--- a/test/run_input.cxx
+++ b/test/run_input.cxx
@@ -49,11 +49,15 @@
#include <unistd.h>
#include <stdlib.h>
+static constexpr std::size_t MAX_CHUNK_SIZE = 16384;
+
struct CommandLine {
const char *uri = nullptr;
FromNarrowPath config_path;
+ std::size_t chunk_size = MAX_CHUNK_SIZE;
+
bool verbose = false;
bool scan = false;
@@ -63,14 +67,27 @@ enum Option {
OPTION_CONFIG,
OPTION_VERBOSE,
OPTION_SCAN,
+ OPTION_CHUNK_SIZE,
};
static constexpr OptionDef option_defs[] = {
{"config", 0, true, "Load a MPD configuration file"},
{"verbose", 'v', false, "Verbose logging"},
{"scan", 0, false, "Scan tags instead of reading raw data"},
+ {"chunk-size", 0, true, "Read this number of bytes at a time"},
};
+static std::size_t
+ParseSize(const char *s)
+{
+ char *endptr;
+ std::size_t value = std::strtoul(s, &endptr, 10);
+ if (endptr == s)
+ throw std::runtime_error("Failed to parse integer");
+
+ return value;
+}
+
static CommandLine
ParseCommandLine(int argc, char **argv)
{
@@ -90,6 +107,12 @@ ParseCommandLine(int argc, char **argv)
case OPTION_SCAN:
c.scan = true;
break;
+
+ case OPTION_CHUNK_SIZE:
+ c.chunk_size = ParseSize(o.value);
+ if (c.chunk_size <= 0 || c.chunk_size > MAX_CHUNK_SIZE)
+ throw std::runtime_error("Invalid chunk size");
+ break;
}
}
@@ -130,7 +153,7 @@ tag_save(FILE *file, const Tag &tag)
}
static int
-dump_input_stream(InputStream &is, FileDescriptor out)
+dump_input_stream(InputStream &is, FileDescriptor out, size_t chunk_size)
{
std::unique_lock<Mutex> lock(is.mutex);
@@ -150,8 +173,9 @@ dump_input_stream(InputStream &is, FileDescriptor out)
}
}
- char buffer[4096];
- size_t num_read = is.Read(lock, buffer, sizeof(buffer));
+ char buffer[MAX_CHUNK_SIZE];
+ assert(chunk_size <= sizeof(buffer));
+ size_t num_read = is.Read(lock, buffer, chunk_size);
if (num_read == 0)
break;
@@ -231,7 +255,8 @@ try {
Mutex mutex;
auto is = InputStream::OpenReady(c.uri, mutex);
- return dump_input_stream(*is, FileDescriptor(STDOUT_FILENO));
+ return dump_input_stream(*is, FileDescriptor(STDOUT_FILENO),
+ c.chunk_size);
} catch (...) {
PrintException(std::current_exception());
return EXIT_FAILURE;
diff --git a/test/test_archive_iso9660.sh b/test/test_archive_iso9660.sh
index 5658f7a98..fc999bd47 100755
--- a/test/test_archive_iso9660.sh
+++ b/test/test_archive_iso9660.sh
@@ -7,4 +7,7 @@ DST="$(pwd)/test/tmp/${SRC_BASE}.iso"
mkdir -p test/tmp
rm -f "$DST"
mkisofs -quiet -l -o "$DST" "$SRC"
-./test/run_input "$DST/${SRC_BASE}" |diff "$SRC" -
+
+# Using an odd chunk size to check whether the plugin can cope with
+# partial sectors
+./test/run_input --chunk-size=1337 "$DST/${SRC_BASE}" |diff "$SRC" -