})
#endif
+#ifdef __COVERITY__
+# define ASSERT_OK_OR(expr, ...) \
+ ({ \
+ typeof(expr) _result = (expr); \
+ __coverity_check__(_result >= 0 || IN_SET(_result, 0, __VA_ARGS__) \
+ })
+#else
+# define ASSERT_OK_OR(expr, ...) \
+ ({ \
+ typeof(expr) _result = (expr); \
+ if (_result < 0 && !IN_SET(_result, 0, __VA_ARGS__)) \
+ log_test_failed("\"%s\" failed with unexpected error: %"PRIiMAX"/%s", \
+ #expr, (intmax_t) _result, STRERROR(_result)); \
+ })
+#endif
+
/* For functions that return a boolean on success and a negative errno on failure. */
#ifdef __COVERITY__
# define ASSERT_OK_POSITIVE(expr) __coverity_check__((expr) > 0)
ASSERT_SIGNAL(ASSERT_NE_ID128(SD_ID128_NULL, SD_ID128_NULL), SIGABRT);
}
+TEST(ASSERT_OK_OR) {
+ ASSERT_OK_OR(0, -EINVAL, -EUCLEAN);
+ ASSERT_OK_OR(99, -EINVAL, -EUCLEAN);
+ ASSERT_OK_OR(-EINVAL, -EINVAL, -EUCLEAN);
+ ASSERT_OK_OR(-EUCLEAN, -EUCLEAN);
+ ASSERT_OK_OR(-1, -EPERM);
+
+ ASSERT_SIGNAL(ASSERT_OK_OR(-1, -2), SIGABRT);
+}
+
DEFINE_TEST_MAIN(LOG_INFO);