5a34eaf488a2f25405bcd97f8c16731352d292fd
[platform/core/security/suspicious-activity-monitor.git] / utest / test_audit_utils.cpp
1 #include <gmock/gmock.h>
2 #include <libaudit.h>
3 #include "audit/audit_utils.h"
4
5 using ::testing::_;
6 using ::testing::Eq;
7 using ::testing::Return;
8 class LibAuditI;
9
10 namespace
11 {
12 static LibAuditI* impl = nullptr;
13 }
14
15 class LibAuditI
16 {
17 public:
18     static LibAuditI* instance()
19     {
20         if (impl == nullptr) {
21             throw std::runtime_error("Instance of LibAuditI stub not created.");
22         }
23         return impl;
24     }
25
26     LibAuditI(const LibAuditI&) = delete;
27     LibAuditI(const LibAuditI&&) = delete;
28     LibAuditI& operator=(const LibAuditI&) = delete;
29     LibAuditI& operator=(LibAuditI&&) = delete;
30
31     virtual const char* audit_machine_to_name(int machine) = 0;
32     virtual int audit_detect_machine(void) = 0;
33     virtual const char* audit_syscall_to_name(int sc, int machine) = 0;
34 protected:
35     LibAuditI()
36     {
37         if (impl != nullptr) {
38             throw std::runtime_error("Only one instance of LibAuditI stub implementation is allowed at a time.");
39         }
40         impl = this;
41     }
42
43     virtual ~LibAuditI()
44     {
45         impl = nullptr;
46     }
47 };
48
49 const char *audit_machine_to_name(int machine)
50 {
51     return LibAuditI::instance()->audit_machine_to_name(machine);
52 }
53
54 int audit_detect_machine(void)
55 {
56     return LibAuditI::instance()->audit_detect_machine();
57 }
58
59 const char* audit_syscall_to_name(int sc, int machine)
60 {
61     return LibAuditI::instance()->audit_syscall_to_name(sc, machine);
62 }
63
64 class LibAuditMock : public LibAuditI
65 {
66 public:
67     LibAuditMock() : LibAuditI()
68     {
69     }
70
71     MOCK_METHOD1(audit_machine_to_name, const char*(int machine));
72     MOCK_METHOD0(audit_detect_machine, int(void));
73     MOCK_METHOD2(audit_syscall_to_name, const char*(int sc, int machine));
74 };
75
76 namespace
77 {
78 const int TEST_PLATFORM = 123;
79 const char* TEST_MACHINE_NAME = "test-machine";
80 const char* TEST_SYS_CALL_OPEN = "open";
81 const char* TEST_SYS_CALL_READ = "read";
82 const char* TEST_SYS_CALL_WRITE = "write";
83 }
84
85 TEST(TestAuditUtils, test_platformType)
86 {
87     LibAuditMock audit;
88
89     EXPECT_CALL(audit, audit_detect_machine())
90             .WillOnce(Return(-1))
91             .WillOnce(Return(TEST_PLATFORM));
92     EXPECT_CALL(audit, audit_machine_to_name(Eq(TEST_PLATFORM)))
93             .WillOnce(Return(TEST_MACHINE_NAME));
94
95     EXPECT_EQ(nullptr, audit::AuditUtils::platformType());
96     EXPECT_EQ(TEST_MACHINE_NAME, audit::AuditUtils::platformType());
97 }
98
99 TEST(TestAuditUtils, test_syscallTable)
100 {
101     LibAuditMock audit;
102
103     EXPECT_CALL(audit, audit_detect_machine())
104             .WillOnce(Return(-1))
105             .WillOnce(Return(TEST_PLATFORM));
106     EXPECT_CALL(audit, audit_syscall_to_name(_, Eq(TEST_PLATFORM)))
107             .WillOnce(Return(TEST_SYS_CALL_OPEN))
108             .WillOnce(Return(TEST_SYS_CALL_READ))
109             .WillOnce(Return(TEST_SYS_CALL_WRITE))
110             .WillRepeatedly(Return(nullptr));
111
112     EXPECT_TRUE(audit::AuditUtils::syscallTable().empty());
113     EXPECT_EQ(3, audit::AuditUtils::syscallTable().size());
114 }