Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

new(tests): add tests for event result #1913

Merged
merged 2 commits into from
Jun 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 23 additions & 15 deletions userspace/libsinsp/sinsp_filtercheck.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,14 @@ void sinsp_filter_check::set_inspector(sinsp* inspector)
m_inspector = inspector;
}

template <class T>
static inline T rawval_cast(uint8_t *rawval)
{
T val;
memcpy(&val, rawval, sizeof(T));
return val;
}

Json::Value sinsp_filter_check::rawval_to_json(uint8_t* rawval,
ppm_param_type ptype,
ppm_print_format print_format,
Expand Down Expand Up @@ -102,7 +110,7 @@ Json::Value sinsp_filter_check::rawval_to_json(uint8_t* rawval,
if(print_format == PF_DEC ||
print_format == PF_ID)
{
return *(int16_t *)rawval;
return rawval_cast<int16_t>(rawval);
}
else if(print_format == PF_OCT ||
print_format == PF_HEX)
Expand All @@ -119,7 +127,7 @@ Json::Value sinsp_filter_check::rawval_to_json(uint8_t* rawval,
if(print_format == PF_DEC ||
print_format == PF_ID)
{
return *(int32_t *)rawval;
return rawval_cast<int32_t>(rawval);
}
else if(print_format == PF_OCT ||
print_format == PF_HEX)
Expand All @@ -134,19 +142,19 @@ Json::Value sinsp_filter_check::rawval_to_json(uint8_t* rawval,
case PT_DOUBLE:
if(print_format == PF_DEC)
{
return (Json::Value::Int64)(int64_t)*(double*)rawval;
return (Json::Value::Int64)(int64_t)rawval_cast<double>(rawval);
}
else
{
return (Json::Value)*(double*)rawval;
return (Json::Value)rawval_cast<double>(rawval);
}
case PT_INT64:
case PT_PID:
case PT_FD:
if(print_format == PF_DEC ||
print_format == PF_ID)
{
return (Json::Value::Int64)*(int64_t *)rawval;
return (Json::Value::Int64)rawval_cast<int64_t>(rawval);
}
else
{
Expand Down Expand Up @@ -212,7 +220,7 @@ Json::Value sinsp_filter_check::rawval_to_json(uint8_t* rawval,
if(print_format == PF_DEC ||
print_format == PF_ID)
{
return (Json::Value::UInt64)*(uint64_t *)rawval;
return (Json::Value::UInt64)rawval_cast<uint64_t>(rawval);
}
else if(
print_format == PF_10_PADDED_DEC ||
Expand All @@ -233,7 +241,7 @@ Json::Value sinsp_filter_check::rawval_to_json(uint8_t* rawval,
return Json::nullValue;

case PT_BOOL:
return Json::Value((bool)(*(uint32_t*)rawval != 0));
return Json::Value((bool)(rawval_cast<uint32_t>(rawval) != 0));

case PT_CHARBUF:
case PT_FSPATH:
Expand Down Expand Up @@ -309,7 +317,7 @@ char* sinsp_filter_check::rawval_to_string(uint8_t* rawval,
m_getpropertystr_storage.resize(STRPROPERTY_STORAGE_SIZE);
snprintf(m_getpropertystr_storage.data(),
STRPROPERTY_STORAGE_SIZE,
prfmt, *(int16_t *)rawval);
prfmt, rawval_cast<int16_t>(rawval));
return m_getpropertystr_storage.data();
case PT_INT32:
if(print_format == PF_OCT)
Expand All @@ -334,7 +342,7 @@ char* sinsp_filter_check::rawval_to_string(uint8_t* rawval,
m_getpropertystr_storage.resize(STRPROPERTY_STORAGE_SIZE);
snprintf(m_getpropertystr_storage.data(),
STRPROPERTY_STORAGE_SIZE,
prfmt, *(int32_t *)rawval);
prfmt, rawval_cast<int32_t>(rawval));
return m_getpropertystr_storage.data();
case PT_INT64:
case PT_PID:
Expand Down Expand Up @@ -365,7 +373,7 @@ char* sinsp_filter_check::rawval_to_string(uint8_t* rawval,
m_getpropertystr_storage.resize(STRPROPERTY_STORAGE_SIZE);
snprintf(m_getpropertystr_storage.data(),
STRPROPERTY_STORAGE_SIZE,
prfmt, *(int64_t *)rawval);
prfmt, rawval_cast<int64_t>(rawval));
return m_getpropertystr_storage.data();
case PT_L4PROTO: // This can be resolved in the future
case PT_UINT8:
Expand Down Expand Up @@ -417,7 +425,7 @@ char* sinsp_filter_check::rawval_to_string(uint8_t* rawval,
m_getpropertystr_storage.resize(STRPROPERTY_STORAGE_SIZE);
snprintf(m_getpropertystr_storage.data(),
STRPROPERTY_STORAGE_SIZE,
prfmt, *(uint16_t *)rawval);
prfmt, rawval_cast<uint16_t>(rawval));
return m_getpropertystr_storage.data();
case PT_UINT32:
if(print_format == PF_OCT)
Expand All @@ -442,7 +450,7 @@ char* sinsp_filter_check::rawval_to_string(uint8_t* rawval,
m_getpropertystr_storage.resize(STRPROPERTY_STORAGE_SIZE);
snprintf(m_getpropertystr_storage.data(),
STRPROPERTY_STORAGE_SIZE,
prfmt, *(uint32_t *)rawval);
prfmt, rawval_cast<uint32_t>(rawval));
return m_getpropertystr_storage.data();
case PT_UINT64:
case PT_RELTIME:
Expand Down Expand Up @@ -473,7 +481,7 @@ char* sinsp_filter_check::rawval_to_string(uint8_t* rawval,
m_getpropertystr_storage.resize(STRPROPERTY_STORAGE_SIZE);
snprintf(m_getpropertystr_storage.data(),
STRPROPERTY_STORAGE_SIZE,
prfmt, *(uint64_t *)rawval);
prfmt, rawval_cast<uint64_t>(rawval));
return m_getpropertystr_storage.data();
case PT_CHARBUF:
case PT_FSPATH:
Expand All @@ -494,7 +502,7 @@ char* sinsp_filter_check::rawval_to_string(uint8_t* rawval,
ASSERT(false);
return NULL;
case PT_BOOL:
if(*(uint32_t*)rawval != 0)
if(rawval_cast<uint32_t>(rawval) != 0)
{
return (char*)"true";
}
Expand Down Expand Up @@ -544,7 +552,7 @@ char* sinsp_filter_check::rawval_to_string(uint8_t* rawval,
m_getpropertystr_storage.resize(STRPROPERTY_STORAGE_SIZE);
snprintf(m_getpropertystr_storage.data(),
STRPROPERTY_STORAGE_SIZE,
"%.1lf", *(double*)rawval);
"%.1lf", rawval_cast<double>(rawval));
return m_getpropertystr_storage.data();
case PT_IPNET:
m_getpropertystr_storage.resize(STRPROPERTY_STORAGE_SIZE);
Expand Down
6 changes: 2 additions & 4 deletions userspace/libsinsp/sinsp_filtercheck_event.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1247,8 +1247,7 @@ uint8_t* sinsp_filter_check_event::extract_single(sinsp_evt *evt, uint32_t* len,

if(pi != NULL)
{
ASSERT(pi->m_len == sizeof(int64_t));
if(*(int64_t*)pi->m_val < 0)
if(pi->as<int64_t>() < 0)
{
m_val.u32 = 1;
}
Expand All @@ -1259,8 +1258,7 @@ uint8_t* sinsp_filter_check_event::extract_single(sinsp_evt *evt, uint32_t* len,

if(pi != NULL)
{
ASSERT(pi->m_len == sizeof(int64_t));
if(*(int64_t*)pi->m_val < 0)
if(pi->as<int64_t>() < 0)
{
m_val.u32 = 1;
}
Expand Down
42 changes: 42 additions & 0 deletions userspace/libsinsp/test/events_evt.ut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ limitations under the License.
#include <gtest/gtest.h>

#include <sinsp_with_test_input.h>
#include <sinsp_errno.h>
#include "test_utils.h"

TEST_F(sinsp_with_test_input, event_category)
Expand Down Expand Up @@ -57,6 +58,47 @@ TEST_F(sinsp_with_test_input, event_category)
ASSERT_EQ(get_field_as_string(evt, "evt.num"), "4");
}

TEST_F(sinsp_with_test_input, event_res)
{
add_default_init_thread();

open_inspector();

sinsp_evt * evt = add_event_advance_ts(increasing_ts(), 1, PPME_SYSCALL_EPOLL_CREATE_E, 1, (uint32_t)-1);
EXPECT_FALSE(field_has_value(evt, "evt.res"));

evt = add_event_advance_ts(increasing_ts(), 1, PPME_SYSCALL_EPOLL_CREATE_X, 1, (int64_t)-SE_EINVAL);

EXPECT_EQ(get_field_as_string(evt, "evt.res"), "EINVAL");
EXPECT_EQ(get_field_as_string(evt, "evt.rawres"), "-22");
EXPECT_TRUE(eval_filter(evt, "evt.rawres < 0"));
EXPECT_EQ(get_field_as_string(evt, "evt.failed"), "true");
EXPECT_EQ(get_field_as_string(evt, "evt.count.error"), "1");

evt = add_event_advance_ts(increasing_ts(), 1, PPME_SYSCALL_EPOLL_CREATE_E, 1, (uint32_t) 100);
evt = add_event_advance_ts(increasing_ts(), 1, PPME_SYSCALL_EPOLL_CREATE_X, 1, (uint64_t) 0);

EXPECT_EQ(get_field_as_string(evt, "evt.res"), "SUCCESS");
EXPECT_EQ(get_field_as_string(evt, "evt.rawres"), "0");
EXPECT_EQ(get_field_as_string(evt, "evt.failed"), "false");

evt = add_event_advance_ts(increasing_ts(), 1, PPME_SYSCALL_OPEN_E, 3, "/tmp/the_file.txt", 0, 0);
evt = add_event_advance_ts(increasing_ts(), 1, PPME_SYSCALL_OPEN_X, 6, (int64_t)123, "/tmp/the_file.txt", 0, 0, 0, (uint64_t) 0);

EXPECT_EQ(get_field_as_string(evt, "evt.res"), "SUCCESS");
EXPECT_EQ(get_field_as_string(evt, "evt.rawres"), "123");
EXPECT_EQ(get_field_as_string(evt, "evt.failed"), "false");

evt = add_event_advance_ts(increasing_ts(), 1, PPME_SYSCALL_OPEN_E, 3, "/tmp/the_file.txt", 0, 0);
evt = add_event_advance_ts(increasing_ts(), 1, PPME_SYSCALL_OPEN_X, 6, (int64_t)-SE_EACCES, "/tmp/the_file.txt", 0, 0, 0, (uint64_t) 0);

EXPECT_EQ(get_field_as_string(evt, "evt.res"), "EACCES");
EXPECT_EQ(get_field_as_string(evt, "evt.rawres"), std::to_string(-SE_EACCES).c_str());
EXPECT_EQ(get_field_as_string(evt, "evt.failed"), "true");
EXPECT_EQ(get_field_as_string(evt, "evt.count.error"), "1");
EXPECT_EQ(get_field_as_string(evt, "evt.count.error.file"), "1");
}

TEST_F(sinsp_with_test_input, event_hostname)
{
#ifdef __linux__
Expand Down
Loading