Skip to content

Commit b65d589

Browse files
committed
fix: create sdbus::Error correctly when errno is 0
1 parent 7fbfcec commit b65d589

3 files changed

Lines changed: 56 additions & 9 deletions

File tree

include/sdbus-c++/Error.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ namespace sdbus {
6464
}
6565

6666
Error(Name name, std::string message)
67-
: std::runtime_error("[" + name + "] " + message)
67+
: std::runtime_error(!message.empty() ? "[" + name + "] " + message : "[" + name + "]")
6868
, name_(std::move(name))
6969
, message_(std::move(message))
7070
{
@@ -90,7 +90,7 @@ namespace sdbus {
9090
std::string message_;
9191
};
9292

93-
Error createError(int errNo, std::string customMsg);
93+
Error createError(int errNo, std::string customMsg = {});
9494

9595
inline const Error::Name SDBUSCPP_ERROR_NAME{"org.sdbuscpp.Error"};
9696
}

src/Error.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,24 @@
3232

3333
namespace sdbus
3434
{
35-
sdbus::Error createError(int errNo, std::string customMsg)
35+
Error createError(int errNo, std::string customMsg)
3636
{
3737
sd_bus_error sdbusError = SD_BUS_ERROR_NULL;
3838
sd_bus_error_set_errno(&sdbusError, errNo);
3939
SCOPE_EXIT{ sd_bus_error_free(&sdbusError); };
4040

41-
Error::Name name(sdbusError.name);
41+
Error::Name name(sd_bus_error_is_set(&sdbusError) ? sdbusError.name : "");
4242
std::string message(std::move(customMsg));
43-
message.append(" (");
44-
message.append(sdbusError.message);
45-
message.append(")");
43+
if (!message.empty() && sdbusError.message != nullptr)
44+
{
45+
message.append(" (");
46+
message.append(sdbusError.message);
47+
message.append(")");
48+
}
49+
else if (sdbusError.message != nullptr)
50+
{
51+
message = sdbusError.message;
52+
}
4653

4754
return Error(std::move(name), std::move(message));
4855
}

tests/unittests/Types_test.cpp

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,7 @@ TEST(AnError, CanBeConstructedFromANameAndAMessage)
430430
auto error = sdbus::Error(sdbus::Error::Name{"org.sdbuscpp.error"}, "message");
431431
EXPECT_THAT(error.getName(), Eq<std::string>("org.sdbuscpp.error"));
432432
EXPECT_THAT(error.getMessage(), Eq<std::string>("message"));
433+
EXPECT_TRUE(error.isValid());
433434
}
434435

435436
TEST(AnError, CanBeConstructedFromANameOnly)
@@ -439,6 +440,45 @@ TEST(AnError, CanBeConstructedFromANameOnly)
439440
EXPECT_THAT(error1.getName(), Eq<std::string>("org.sdbuscpp.error"));
440441
EXPECT_THAT(error2.getName(), Eq<std::string>("org.sdbuscpp.error"));
441442

442-
EXPECT_THAT(error1.getMessage(), Eq<std::string>(""));
443-
EXPECT_THAT(error2.getMessage(), Eq<std::string>(""));
443+
EXPECT_TRUE(error1.getMessage().empty());
444+
EXPECT_TRUE(error2.getMessage().empty());
445+
446+
EXPECT_TRUE(error1.isValid());
447+
EXPECT_TRUE(error2.isValid());
448+
}
449+
450+
TEST(AnError, IsInvalidWhenConstructedWithAnEmptyName)
451+
{
452+
auto error = sdbus::Error({});
453+
454+
EXPECT_TRUE(error.getName().empty());
455+
EXPECT_TRUE(error.getMessage().empty());
456+
EXPECT_FALSE(error.isValid());
457+
}
458+
459+
TEST(AnErrorFactory, CanCreateAnErrorFromErrno)
460+
{
461+
auto error = sdbus::createError(ENOENT, "custom message");
462+
463+
EXPECT_THAT(error.getName(), Eq<std::string>("org.freedesktop.DBus.Error.FileNotFound"));
464+
EXPECT_THAT(error.getMessage(), Eq<std::string>("custom message (No such file or directory)"));
465+
EXPECT_TRUE(error.isValid());
466+
}
467+
468+
TEST(AnErrorFactory, CreatesGenericErrorWhenErrnoIsUnknown)
469+
{
470+
auto error = sdbus::createError(123456, "custom message");
471+
472+
EXPECT_THAT(error.getName(), Eq<std::string>("org.freedesktop.DBus.Error.Failed"));
473+
EXPECT_THAT(error.getMessage(), Eq<std::string>("custom message (Unknown error 123456)"));
474+
EXPECT_TRUE(error.isValid());
475+
}
476+
477+
TEST(AnErrorFactory, CreatesEmptyInvalidErrorWhenErrnoIsZero)
478+
{
479+
auto error = sdbus::createError(0, "custom message");
480+
481+
EXPECT_TRUE(error.getName().empty());
482+
EXPECT_THAT(error.getMessage(), Eq<std::string>("custom message"));
483+
EXPECT_FALSE(error.isValid());
444484
}

0 commit comments

Comments
 (0)