+ auto options = Options{
+ {"path", tmpFile.path().string()},
+ {"max_buffer_size", "0"},
+ };
+ EXPECT_THROW_RE(
+ factory.createHandler(options),
+ std::invalid_argument,
+ "^error processing option \"max_buffer_size\": "
+ "must be a positive integer$");
+ }
+
+ {
+ auto options = Options{
+ {"path", tmpFile.path().string()},
+ {"foo", "bar"},
+ };
+ EXPECT_THROW_RE(
+ factory.createHandler(options),
+ std::invalid_argument,
+ "^unknown option \"foo\"$");
+ }
+}
+
+TEST(StreamHandlerFactory, errors) {
+ StreamHandlerFactory factory;
+ using Options = LogHandlerFactory::Options;
+
+ {
+ auto options = Options{};
+ EXPECT_THROW_RE(
+ factory.createHandler(options),
+ std::invalid_argument,
+ "no stream name specified for stream handler");
+ }
+
+ {
+ auto options = Options{
+ {"path", "/tmp/log.txt"},
+ {"stream", "stderr"},
+ };
+ EXPECT_THROW_RE(
+ factory.createHandler(options),
+ std::invalid_argument,
+ "unknown option \"path\"");
+ }
+
+ {
+ auto options = Options{
+ {"stream", "nonstdout"},
+ };
+ EXPECT_THROW_RE(
+ factory.createHandler(options),
+ std::invalid_argument,
+ "unknown stream \"nonstdout\": expected one of stdout or stderr");
+ }
+
+ {
+ auto options = Options{
+ {"stream", "stderr"},
+ {"async", "xyz"},
+ };
+ EXPECT_THROW_RE(
+ factory.createHandler(options),
+ std::invalid_argument,
+ "^error processing option \"async\": Invalid value for bool: \"xyz\"$");
+ }
+
+ {
+ auto options = Options{
+ {"stream", "stderr"},
+ {"async", "false"},
+ {"max_buffer_size", "1234"},
+ };
+ EXPECT_THROW_RE(
+ factory.createHandler(options),
+ std::invalid_argument,
+ "^the \"max_buffer_size\" option is only valid for "
+ "async file handlers$");
+ }
+
+ {
+ auto options = Options{
+ {"stream", "stderr"},
+ {"max_buffer_size", "hello"},
+ };
+ EXPECT_THROW_RE(
+ factory.createHandler(options),
+ std::invalid_argument,
+ "^error processing option \"max_buffer_size\": "
+ "Non-digit character found: \"hello\"$");
+ }
+
+ {
+ auto options = Options{
+ {"stream", "stderr"},
+ {"max_buffer_size", "0"},