// Copyright 2021 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "general_systemd.hpp" #include "log_handlers_builder.hpp" #include "skip_action.hpp" #include #include #include namespace ipmi_flash { namespace { using ::testing::IsEmpty; using json = nlohmann::json; TEST(LogJsonTest, ValidConfigurationNoLogHandler) { auto j2 = R"( [{ "blob" : "/flash/sink_seq", "log":{ "handler": { "type" : "file", "path" : "/tmp/log_info" }, "actions":{ "open" :{ "type" : "systemd", "unit" : "absolute" } } } }] )"_json; auto h = LogHandlersBuilder().buildHandlerFromJson(j2); ASSERT_THAT(h, ::testing::SizeIs(1)); EXPECT_THAT(h[0].blobId, "/log/sink_seq"); EXPECT_FALSE(h[0].actions == nullptr); EXPECT_FALSE(h[0].handler == nullptr); } TEST(LogJsonTest, ValidConfigurationLogBlobName) { auto j2 = R"( [{ "blob" : "/log/sink_seq", "log":{ "handler": { "type" : "file", "path" : "/tmp/log_info" }, "actions": { "open" : { "type" : "systemd", "unit" : "phosphor-ipmi-flash-log-sink-sequencer.target" } } } }] )"_json; auto h = LogHandlersBuilder().buildHandlerFromJson(j2); ASSERT_THAT(h, ::testing::SizeIs(1)); EXPECT_THAT(h[0].blobId, "/log/sink_seq"); EXPECT_FALSE(h[0].actions == nullptr); EXPECT_FALSE(h[0].handler == nullptr); } TEST(LogJsonTest, MissingHandlerType) { auto j2 = R"( [{ "blob" : "/flash/image", "log":{ "handler": { "path" : "/tmp/log_info" }, "actions": { "open" : { "type" : "systemd", "unit" : "absolute"} } } }] )"_json; EXPECT_THAT(LogHandlersBuilder().buildHandlerFromJson(j2), IsEmpty()); } TEST(LogJsonTest, BadBlobName) { auto j2 = R"( [{ "blob" : "/bad/image", "log":{ "handler": { "type" : "file", "path" : "/tmp/log_info" }, "actions": { "open" : { "type" : "systemd", "unit" : "absolute"} } } }] )"_json; EXPECT_THAT(LogHandlersBuilder().buildHandlerFromJson(j2), IsEmpty()); } TEST(LogJsonTest, MissingActions) { auto j2 = R"( [{ "blob" : "/flash/image", "log":{ "handler": { "type" : "file", "path" : "/tmp/log_info" } } }] )"_json; EXPECT_THAT(LogHandlersBuilder().buildHandlerFromJson(j2), IsEmpty()); } TEST(LogJsonTest, MissingOpenAction) { auto j2 = R"( [{ "blob" : "/flash/image", "log":{ "handler": { "type" : "file", "path" : "/tmp/log_info" }, "actions": {} } }] )"_json; EXPECT_THAT(LogHandlersBuilder().buildHandlerFromJson(j2), IsEmpty()); } TEST(LogJsonTest, OneInvalidTwoValidSucceeds) { auto j2 = R"( [{ "blob" : "/flash/sink_seq0", "log":{ "handler": { "type" : "file", "path" : "/tmp/log_info" }, "actions":{ "open" :{ "type" : "systemd", "unit" : "absolute" } } } }, { "blob" : "/log/sink_seq1", "log":{ "handler": { "type" : "file", "path" : "/tmp/log_info" }, "actions":{ "open" :{ "type" : "systemd", "unit" : "absolute" } } } }, { "blob" : "/bad/sink_seq", "log":{ "handler": { "type" : "file", "path" : "/tmp/log_info" }, "actions":{ "open" :{ "type" : "systemd", "unit" : "absolute" } } } } ] )"_json; auto h = LogHandlersBuilder().buildHandlerFromJson(j2); ASSERT_THAT(h, ::testing::SizeIs(2)); EXPECT_THAT(h[0].blobId, "/log/sink_seq0"); EXPECT_THAT(h[1].blobId, "/log/sink_seq1"); } TEST(LogJsonTest, BlobNameIsTooShort) { auto j2 = R"( [{ "blob" : "/flash/", "log":{ "handler": { "type" : "file", "path" : "/tmp/log_info" }, "actions":{ "open" :{ "type" : "systemd", "unit" : "absolute" } } } }] )"_json; EXPECT_THAT(LogHandlersBuilder().buildHandlerFromJson(j2), IsEmpty()); } TEST(LogJsonTest, OpenSkipAction) { auto j2 = R"( [{ "blob" : "/flash/sink_seqs", "log":{ "handler": { "type" : "file", "path" : "/tmp/log_info" }, "actions":{ "open" :{ "type" : "skip" } } } }] )"_json; auto h = LogHandlersBuilder().buildHandlerFromJson(j2); EXPECT_THAT(h, ::testing::SizeIs(1)); EXPECT_TRUE(h[0].blobId == "/log/sink_seqs"); ASSERT_FALSE(h[0].actions == nullptr); EXPECT_FALSE(h[0].actions->onOpen == nullptr); } TEST(LogJsonTest, OpenActionsWithDifferentModes) { auto j2 = R"( [{ "blob" : "/flash/blob1", "log":{ "handler": { "type" : "file", "path" : "/tmp/log_info" }, "actions":{ "open" :{ "type" : "systemd", "unit" : "absolute", "mode" : "replace-nope" } } } }, { "blob" : "/flash/blob2", "log":{ "handler": { "type" : "file", "path" : "/tmp/log_info" }, "actions":{ "open" :{ "type" : "systemd", "unit" : "absolute", "mode" : "replace-fake" } } } } ] )"_json; auto h = LogHandlersBuilder().buildHandlerFromJson(j2); ASSERT_THAT(h, ::testing::SizeIs(2)); EXPECT_FALSE(h[0].handler == nullptr); EXPECT_FALSE(h[0].actions == nullptr); EXPECT_THAT(h[0].blobId, "/log/blob1"); auto onOpen0 = reinterpret_cast(h[0].actions->onOpen.get()); EXPECT_THAT(onOpen0->getMode(), "replace-nope"); EXPECT_FALSE(h[1].handler == nullptr); EXPECT_FALSE(h[1].actions == nullptr); EXPECT_THAT(h[1].blobId, "/log/blob2"); auto onOpen1 = reinterpret_cast(h[1].actions->onOpen.get()); EXPECT_THAT(onOpen1->getMode(), "replace-fake"); } } // namespace } // namespace ipmi_flash