sync code

This commit is contained in:
Ned Wright
2024-09-17 10:53:09 +00:00
parent 3fe0b42fcd
commit 586150fe4f
143 changed files with 1886 additions and 380 deletions

View File

@@ -0,0 +1,2 @@
add_library(report_messaging report_messaging.cc)
add_subdirectory(report_messaging_ut)

View File

@@ -0,0 +1,74 @@
// Copyright (C) 2022 Check Point Software Technologies Ltd. All rights reserved.
// Licensed under the Apache License, Version 2.0 (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 "report_messaging.h"
#include <string>
#include "report/log_rest.h"
using namespace std;
static const string url = "/api/v1/agents/events";
ReportMessaging::~ReportMessaging()
{
if (!Singleton::exists<I_Messaging>()) return;
if (!is_async_message) return;
LogRest log_rest(report);
auto messaging = Singleton::Consume<I_Messaging>::by<ReportMessaging>();
try {
messaging->sendAsyncMessage(
HTTPMethod::POST,
url,
log_rest,
message_type_tag,
MessageMetadata(),
force_buffering
);
} catch (...) {}
}
ReportMessaging &
ReportMessaging::operator<<(const LogField &field)
{
report << field;
return *this;
}
class LogRestWithReply : public LogRest
{
public:
LogRestWithReply(const Report &report) : LogRest(report) {}
bool loadJson(const string &) const { return true; }
};
Maybe<void, HTTPResponse>
ReportMessaging::sendReportSynchronously()
{
is_async_message = false;
LogRestWithReply log_rest(report);
auto messaging = Singleton::Consume<I_Messaging>::by<ReportMessaging>();
return messaging->sendSyncMessage(HTTPMethod::POST, url, log_rest, message_type_tag);
}
void
ReportMessaging::setForceBuffering(bool _force_buffering)
{
force_buffering = _force_buffering;
}

View File

@@ -0,0 +1,7 @@
link_directories(${BOOST_ROOT}/lib)
add_unit_test(
report_messaging_ut
"report_messaging_ut.cc"
"report_messaging;report;singleton;-lboost_regex;messaging;"
)

View File

@@ -0,0 +1,412 @@
#include "report_messaging.h"
#include <chrono>
#include <string>
#include <sstream>
#include <vector>
#include "config.h"
#include "config_component.h"
#include "cptest.h"
#include "mock/mock_messaging.h"
#include "mock/mock_time_get.h"
#include "mock/mock_environment.h"
#include "cereal/archives/json.hpp"
#include "cereal/types/string.hpp"
#include "cereal/types/common.hpp"
using namespace std;
using namespace testing;
class ReportObject
{
public:
ReportObject(int _integer_val, string _string_val, vector<int> _vec_val)
:
integer_val(_integer_val),
string_val(_string_val),
vec_val(_vec_val)
{
}
void
serialize(cereal::JSONOutputArchive &ar) const
{
ar(cereal::make_nvp("integerVal", integer_val));
ar(cereal::make_nvp("stringVal", string_val));
ar(cereal::make_nvp("vecVal", vec_val));
}
friend ostream &
operator<<(ostream &os, const ReportObject &)
{
return os;
}
private:
int integer_val;
string string_val;
vector<int> vec_val;
};
class ReportMessagingTest : public Test
{
public:
ReportMessagingTest()
{
EXPECT_CALL(mock_time_get, getWalltime()).WillRepeatedly(Return(chrono::microseconds(0)));
EXPECT_CALL(mock_time_get, getWalltimeStr(_)).WillRepeatedly(Return("Best Time ever"));
}
StrictMock<MockMessaging> mock_messaging;
StrictMock<MockTimeGet> mock_time_get;
private:
ConfigComponent config;
};
TEST_F(ReportMessagingTest, title_only)
{
EXPECT_CALL(
mock_messaging,
sendAsyncMessage(
_,
_,
"{\n"
" \"log\": {\n"
" \"eventTime\": \"Best Time ever\",\n"
" \"eventName\": \"test\",\n"
" \"eventSeverity\": \"Info\",\n"
" \"eventPriority\": \"Low\",\n"
" \"eventType\": \"Event Driven\",\n"
" \"eventLevel\": \"Log\",\n"
" \"eventLogLevel\": \"info\",\n"
" \"eventAudience\": \"Internal\",\n"
" \"eventAudienceTeam\": \"Agent Core\",\n"
" \"eventFrequency\": 0,\n"
" \"eventTags\": [\n"
" \"Access Control\"\n"
" ],\n"
" \"eventSource\": {\n"
" \"eventTraceId\": \"\",\n"
" \"eventSpanId\": \"\",\n"
" \"issuingEngineVersion\": \"\",\n"
" \"serviceName\": \"Unnamed Nano Service\"\n"
" },\n"
" \"eventData\": {\n"
" \"eventObject\": 1\n"
" }\n"
" }\n"
"}",
_,
_,
_
)
).Times(1);
ReportMessaging("test", ReportIS::AudienceTeam::AGENT_CORE, 1, ReportIS::Tags::ACCESS_CONTROL);
}
TEST_F(ReportMessagingTest, sync_sending)
{
EXPECT_CALL(
mock_messaging,
sendSyncMessage(
_,
_,
"{\n"
" \"log\": {\n"
" \"eventTime\": \"Best Time ever\",\n"
" \"eventName\": \"test\",\n"
" \"eventSeverity\": \"Info\",\n"
" \"eventPriority\": \"Low\",\n"
" \"eventType\": \"Event Driven\",\n"
" \"eventLevel\": \"Log\",\n"
" \"eventLogLevel\": \"info\",\n"
" \"eventAudience\": \"Internal\",\n"
" \"eventAudienceTeam\": \"Agent Core\",\n"
" \"eventFrequency\": 0,\n"
" \"eventTags\": [\n"
" \"Access Control\"\n"
" ],\n"
" \"eventSource\": {\n"
" \"eventTraceId\": \"\",\n"
" \"eventSpanId\": \"\",\n"
" \"issuingEngineVersion\": \"\",\n"
" \"serviceName\": \"Unnamed Nano Service\"\n"
" },\n"
" \"eventData\": {\n"
" \"eventObject\": 1\n"
" }\n"
" }\n"
"}",
_,
_
)
).WillOnce(Return(HTTPResponse(HTTPStatusCode::HTTP_OK, "response!!")));
ReportMessaging report("test", ReportIS::AudienceTeam::AGENT_CORE, 1, ReportIS::Tags::ACCESS_CONTROL);
EXPECT_TRUE(report.sendReportSynchronously().ok());
}
TEST_F(ReportMessagingTest, with_buffering)
{
EXPECT_CALL(
mock_messaging,
sendAsyncMessage(
_,
_,
"{\n"
" \"log\": {\n"
" \"eventTime\": \"Best Time ever\",\n"
" \"eventName\": \"test\",\n"
" \"eventSeverity\": \"Info\",\n"
" \"eventPriority\": \"Low\",\n"
" \"eventType\": \"Event Driven\",\n"
" \"eventLevel\": \"Log\",\n"
" \"eventLogLevel\": \"info\",\n"
" \"eventAudience\": \"Internal\",\n"
" \"eventAudienceTeam\": \"Agent Core\",\n"
" \"eventFrequency\": 0,\n"
" \"eventTags\": [\n"
" \"Access Control\"\n"
" ],\n"
" \"eventSource\": {\n"
" \"eventTraceId\": \"\",\n"
" \"eventSpanId\": \"\",\n"
" \"issuingEngineVersion\": \"\",\n"
" \"serviceName\": \"Unnamed Nano Service\"\n"
" },\n"
" \"eventData\": {\n"
" \"eventObject\": 1\n"
" }\n"
" }\n"
"}",
_,
_,
true
)
).Times(1);
ReportMessaging report("test", ReportIS::AudienceTeam::AGENT_CORE, 1, ReportIS::Tags::ACCESS_CONTROL);
report.setForceBuffering(true);
}
TEST_F(ReportMessagingTest, with_dynamic_fields)
{
EXPECT_CALL(
mock_messaging,
sendAsyncMessage(
_,
_,
"{\n"
" \"log\": {\n"
" \"eventTime\": \"Best Time ever\",\n"
" \"eventName\": \"test\",\n"
" \"eventSeverity\": \"Info\",\n"
" \"eventPriority\": \"Low\",\n"
" \"eventType\": \"Event Driven\",\n"
" \"eventLevel\": \"Log\",\n"
" \"eventLogLevel\": \"info\",\n"
" \"eventAudience\": \"Internal\",\n"
" \"eventAudienceTeam\": \"Agent Core\",\n"
" \"eventFrequency\": 0,\n"
" \"eventTags\": [\n"
" \"Access Control\"\n"
" ],\n"
" \"eventSource\": {\n"
" \"eventTraceId\": \"\",\n"
" \"eventSpanId\": \"\",\n"
" \"issuingEngineVersion\": \"\",\n"
" \"serviceName\": \"Unnamed Nano Service\"\n"
" },\n"
" \"eventData\": {\n"
" \"eventObject\": 1,\n"
" \"ASD\": \"QWE\"\n"
" }\n"
" }\n"
"}",
_,
_,
_
)
).Times(1);
ReportMessaging("test", ReportIS::AudienceTeam::AGENT_CORE, 1, ReportIS::Tags::ACCESS_CONTROL)
<< LogField("ASD", "QWE");
}
TEST_F(ReportMessagingTest, custom_event_object)
{
EXPECT_CALL(
mock_messaging,
sendAsyncMessage(
_,
_,
"{\n"
" \"log\": {\n"
" \"eventTime\": \"Best Time ever\",\n"
" \"eventName\": \"test\",\n"
" \"eventSeverity\": \"Info\",\n"
" \"eventPriority\": \"Low\",\n"
" \"eventType\": \"Event Driven\",\n"
" \"eventLevel\": \"Log\",\n"
" \"eventLogLevel\": \"info\",\n"
" \"eventAudience\": \"Internal\",\n"
" \"eventAudienceTeam\": \"Agent Core\",\n"
" \"eventFrequency\": 0,\n"
" \"eventTags\": [\n"
" \"Access Control\"\n"
" ],\n"
" \"eventSource\": {\n"
" \"eventTraceId\": \"\",\n"
" \"eventSpanId\": \"\",\n"
" \"issuingEngineVersion\": \"\",\n"
" \"serviceName\": \"Unnamed Nano Service\"\n"
" },\n"
" \"eventData\": {\n"
" \"eventObject\": {\n"
" \"integerVal\": 1,\n"
" \"stringVal\": \"2\",\n"
" \"vecVal\": [\n"
" 1,\n"
" 2,\n"
" 3\n"
" ]\n"
" }\n"
" }\n"
" }\n"
"}",
_,
_,
_
)
).Times(1);
ReportMessaging(
"test",
ReportIS::AudienceTeam::AGENT_CORE,
ReportObject(1, "2", { 1, 2, 3}),
ReportIS::Tags::ACCESS_CONTROL
);
}
TEST_F(ReportMessagingTest, custom_priority)
{
EXPECT_CALL(
mock_messaging,
sendAsyncMessage(
_,
_,
"{\n"
" \"log\": {\n"
" \"eventTime\": \"Best Time ever\",\n"
" \"eventName\": \"test\",\n"
" \"eventSeverity\": \"High\",\n"
" \"eventPriority\": \"Medium\",\n"
" \"eventType\": \"Event Driven\",\n"
" \"eventLevel\": \"Log\",\n"
" \"eventLogLevel\": \"info\",\n"
" \"eventAudience\": \"Internal\",\n"
" \"eventAudienceTeam\": \"Agent Core\",\n"
" \"eventFrequency\": 0,\n"
" \"eventTags\": [\n"
" \"Access Control\"\n"
" ],\n"
" \"eventSource\": {\n"
" \"eventTraceId\": \"\",\n"
" \"eventSpanId\": \"\",\n"
" \"issuingEngineVersion\": \"\",\n"
" \"serviceName\": \"Unnamed Nano Service\"\n"
" },\n"
" \"eventData\": {\n"
" \"eventObject\": {\n"
" \"integerVal\": 1,\n"
" \"stringVal\": \"2\",\n"
" \"vecVal\": [\n"
" 1,\n"
" 2,\n"
" 3\n"
" ]\n"
" }\n"
" }\n"
" }\n"
"}",
_,
_,
_
)
).Times(1);
ReportMessaging(
"test",
ReportIS::AudienceTeam::AGENT_CORE,
ReportIS::Severity::HIGH,
ReportIS::Priority::MEDIUM,
ReportObject(1, "2", {1, 2, 3}),
ReportIS::Tags::ACCESS_CONTROL
);
}
TEST_F(ReportMessagingTest, with_env_details)
{
StrictMock<MockEnvironment> mock_env;
Context context;
context.registerValue<string>("Service Name", "Access Control App");
context.registerValue<string>("Service Version", "1.2.3.0.0");
I_Environment::ActiveContexts active_context({&context}, true);
EXPECT_CALL(mock_env, getActiveContexts()).WillRepeatedly(ReturnRef(active_context));
EXPECT_CALL(mock_env, getCurrentTrace()).WillOnce(Return(string("best trace")));
EXPECT_CALL(mock_env, getCurrentSpan()).WillOnce(Return(string("best span")));
EXPECT_CALL(
mock_messaging,
sendAsyncMessage(
_,
_,
"{\n"
" \"log\": {\n"
" \"eventTime\": \"Best Time ever\",\n"
" \"eventName\": \"test\",\n"
" \"eventSeverity\": \"High\",\n"
" \"eventPriority\": \"Medium\",\n"
" \"eventType\": \"Event Driven\",\n"
" \"eventLevel\": \"Log\",\n"
" \"eventLogLevel\": \"info\",\n"
" \"eventAudience\": \"Internal\",\n"
" \"eventAudienceTeam\": \"Agent Core\",\n"
" \"eventFrequency\": 0,\n"
" \"eventTags\": [\n"
" \"Access Control\"\n"
" ],\n"
" \"eventSource\": {\n"
" \"eventTraceId\": \"best trace\",\n"
" \"eventSpanId\": \"best span\",\n"
" \"issuingEngineVersion\": \"1.2.3.0.0\",\n"
" \"serviceName\": \"Access Control App\"\n"
" },\n"
" \"eventData\": {\n"
" \"eventObject\": {\n"
" \"integerVal\": 1,\n"
" \"stringVal\": \"2\",\n"
" \"vecVal\": [\n"
" 1,\n"
" 2,\n"
" 3\n"
" ]\n"
" }\n"
" }\n"
" }\n"
"}",
_,
_,
_
)
).Times(1);
ReportMessaging(
"test",
ReportIS::AudienceTeam::AGENT_CORE,
ReportIS::Severity::HIGH,
ReportIS::Priority::MEDIUM,
ReportObject(1, "2", {1, 2, 3}),
ReportIS::Tags::ACCESS_CONTROL
);
}