diff --git a/meson.build b/meson.build
index d177d3146401ceb334e5557ef21c49853a7047e9..255d5b44269b42cb490259867884fd133e33a664 100644
--- a/meson.build
+++ b/meson.build
@@ -19,3 +19,4 @@ should_install = not meson.is_subproject()
 loadleveller_deps = [ fmt_dep, yamlcpp_dep, mpi_dep, hdf5_lib ]
 
 subdir('src')
+subdir('test')
diff --git a/src/runner.cpp b/src/runner.cpp
index 1e53a993c45cac9c43cf7a5139c5e620c3b9ebf4..2b9ecc0fc2e43cdbb3cd3e51718eafae4e48073b 100644
--- a/src/runner.cpp
+++ b/src/runner.cpp
@@ -26,7 +26,7 @@ enum {
 
 // parses the duration '[[hours:]minutes:]seconds' into seconds
 // replace as soon as there is an alternative
-static double parse_duration(std::string str) {
+static int parse_duration(const std::string &str) {
 	size_t idx;
 
 	try {
@@ -46,7 +46,7 @@ static double parse_duration(std::string str) {
 					throw std::runtime_error{"minutes"};
 				}
 
-				return 24 * 60 * i1 + 60 * i2 + i3;
+				return 60 * 60 * i1 + 60 * i2 + i3;
 			} else {
 				throw std::runtime_error{"hours"};
 			}
diff --git a/test/duration_parser.cpp b/test/duration_parser.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..243ff8307436cfb411173fab960cb06c4e85bae8
--- /dev/null
+++ b/test/duration_parser.cpp
@@ -0,0 +1,17 @@
+#include "runner.cpp"
+
+int main() {
+	using namespace loadl;
+
+	if(parse_duration("20") != 20) {
+		return 1;
+	}
+	if(parse_duration("10:03") != 10*60+3) {
+		return 2;
+	}
+	if(parse_duration("24:06:10") != 60*60*24+60*6+10) {
+		return 3;
+	}
+
+	return 0;
+}
diff --git a/test/meson.build b/test/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..0b4807bc9f0e8c5e4c51d3fc10b4c57bf71c96d8
--- /dev/null
+++ b/test/meson.build
@@ -0,0 +1,8 @@
+
+t1 = executable('test_duration_parser', 'duration_parser.cpp',
+  dependencies : loadleveller_dep,
+  include_directories : include_directories('../src')
+)
+
+test('test duration parser', t1)
+