11// Copyright (c) Microsoft Corporation. All rights reserved.
22// Licensed under the MIT License.
33
4+ #include < cstdlib>
5+
46#include < chrono>
57#include < fstream>
68#include < gtest/gtest.h>
@@ -13,6 +15,7 @@ class TelemetryTest : public ::testing::Test
1315protected:
1416 std::string m_testDir;
1517 std::string m_testJsonFile;
18+ std::string m_telemetryCache;
1619
1720 void SetUp () override
1821 {
@@ -21,7 +24,15 @@ class TelemetryTest : public ::testing::Test
2124 ASSERT_NE (nullptr , mkdtemp (tmpDir));
2225 m_testDir = std::string (tmpDir);
2326 m_testJsonFile = m_testDir + " /test_telemetry.json" ;
24- }
27+
28+ std::string telemetryCache = m_testDir + " /XXXXXX_telemetry_cache_db" ;
29+ std::vector<char > buffer (telemetryCache.begin (), telemetryCache.end ());
30+ buffer.push_back (' \0 ' );
31+
32+ int fd = ::mkstemp (buffer.data ());
33+ EXPECT_TRUE (0 < fd);
34+ m_telemetryCache.assign (buffer.data (), buffer.size ());
35+ }
2536
2637 void TearDown () override
2738 {
@@ -50,15 +61,15 @@ class TelemetryTest : public ::testing::Test
5061// Test processing a non-existent file
5162TEST_F (TelemetryTest, ProcessNonExistentFile)
5263{
53- Telemetry::TelemetryManager telemetryManager (false , std::chrono::seconds (1 ));
64+ Telemetry::TelemetryManager telemetryManager (m_telemetryCache, false , std::chrono::seconds (1 ));
5465 EXPECT_FALSE (telemetryManager.ProcessJsonFile (" /non/existent/file.json" ));
5566}
5667
5768// Test processing an empty file
5869TEST_F (TelemetryTest, ProcessEmptyFile)
5970{
6071 ASSERT_TRUE (CreateTestJsonFile (" " ));
61- Telemetry::TelemetryManager telemetryManager (false , std::chrono::seconds (1 ));
72+ Telemetry::TelemetryManager telemetryManager (m_telemetryCache, false , std::chrono::seconds (1 ));
6273 EXPECT_TRUE (telemetryManager.ProcessJsonFile (m_testJsonFile)); // Empty file should be processed successfully
6374}
6475
@@ -68,15 +79,15 @@ TEST_F(TelemetryTest, ProcessValidJsonFile)
6879 // Create a test file with a valid event
6980 std::string validJson = R"( {"EventName": "TestEvent", "TestParam": "value"})" ;
7081 ASSERT_TRUE (CreateTestJsonFile (validJson));
71- Telemetry::TelemetryManager telemetryManager (false , std::chrono::seconds (1 ));
82+ Telemetry::TelemetryManager telemetryManager (m_telemetryCache, false , std::chrono::seconds (1 ));
7283 EXPECT_FALSE (telemetryManager.ProcessJsonFile (m_testJsonFile));
7384}
7485
7586// Test processing a file with invalid JSON
7687TEST_F (TelemetryTest, ProcessInvalidJsonFile)
7788{
7889 ASSERT_TRUE (CreateTestJsonFile (" invalid json content" ));
79- Telemetry::TelemetryManager telemetryManager (false , std::chrono::seconds (1 ));
90+ Telemetry::TelemetryManager telemetryManager (m_telemetryCache, false , std::chrono::seconds (1 ));
8091 EXPECT_FALSE (telemetryManager.ProcessJsonFile (m_testJsonFile));
8192}
8293
@@ -87,7 +98,7 @@ TEST_F(TelemetryTest, ProcessMixedJsonFile)
8798invalid json line
8899{"EventName": "AnotherEvent", "Param": "value2"})" ;
89100 ASSERT_TRUE (CreateTestJsonFile (mixedContent));
90- Telemetry::TelemetryManager telemetryManager (false , std::chrono::seconds (1 ));
101+ Telemetry::TelemetryManager telemetryManager (m_telemetryCache, false , std::chrono::seconds (1 ));
91102 EXPECT_FALSE (telemetryManager.ProcessJsonFile (m_testJsonFile));
92103}
93104
@@ -98,7 +109,7 @@ TEST_F(TelemetryTest, ProcessMultipleValidJsonLines)
98109{"EventName": "Event2", "Param2": "value2"}
99110{"EventName": "Event3", "Param3": "value3"})" ;
100111 ASSERT_TRUE (CreateTestJsonFile (multipleLines));
101- Telemetry::TelemetryManager telemetryManager (false , std::chrono::seconds (1 ));
112+ Telemetry::TelemetryManager telemetryManager (m_telemetryCache, false , std::chrono::seconds (1 ));
102113 EXPECT_FALSE (telemetryManager.ProcessJsonFile (m_testJsonFile));
103114}
104115
@@ -107,62 +118,62 @@ TEST_F(TelemetryTest, ProcessRuleCompleteEvent)
107118{
108119 std::string realEvent = R"( {"EventName":"RuleComplete","Timestamp":"2025-10-17 22:52:56+0000","ComponentName":"SecurityBaseline","ObjectName":"auditEnsureAuditdInstalled","ObjectResult":"0","Microseconds":"29","DistroName":"CentOS","CorrelationId":"","Version":"1.0.5.20251017-g03b36b7d"})" ;
109120 ASSERT_TRUE (CreateTestJsonFile (realEvent));
110- Telemetry::TelemetryManager telemetryManager (false , std::chrono::seconds (1 ));
121+ Telemetry::TelemetryManager telemetryManager (m_telemetryCache, false , std::chrono::seconds (1 ));
111122 EXPECT_TRUE (telemetryManager.ProcessJsonFile (m_testJsonFile));
112123}
113124
114125TEST_F (TelemetryTest, ProcessRuleCompleteMissingComponentNameEvent)
115126{
116127 std::string realEvent = R"( {"EventName":"RuleComplete","Timestamp":"2025-10-17 22:52:56+0000","ComponentName":"SecurityBaseline","ObjectResult":"0","Microseconds":"29","DistroName":"CentOS","CorrelationId":"","Version":"1.0.5.20251017-g03b36b7d"})" ;
117128 ASSERT_TRUE (CreateTestJsonFile (realEvent));
118- Telemetry::TelemetryManager telemetryManager (false , std::chrono::seconds (1 ));
129+ Telemetry::TelemetryManager telemetryManager (m_telemetryCache, false , std::chrono::seconds (1 ));
119130 EXPECT_FALSE (telemetryManager.ProcessJsonFile (m_testJsonFile));
120131}
121132
122133TEST_F (TelemetryTest, ProcessBaselineRunEvent)
123134{
124135 std::string realEvent = R"( {"EventName":"BaselineRun","Timestamp":"2025-10-17 22:52:56+0000","BaselineName":"Azure Security Baseline for Linux","Mode":"audit-only","DurationSeconds":"8.87","DistroName":"CentOS","CorrelationId":"","Version":"1.0.5.20251017-g03b36b7d"})" ;
125136 ASSERT_TRUE (CreateTestJsonFile (realEvent));
126- Telemetry::TelemetryManager telemetryManager (false , std::chrono::seconds (1 ));
137+ Telemetry::TelemetryManager telemetryManager (m_telemetryCache, false , std::chrono::seconds (1 ));
127138 EXPECT_TRUE (telemetryManager.ProcessJsonFile (m_testJsonFile));
128139}
129140
130141TEST_F (TelemetryTest, ProcessBaselineRunMissingTimestampEvent)
131142{
132143 std::string realEvent = R"( {"EventName":"BaselineRun","BaselineName":"Azure Security Baseline for Linux","Mode":"audit-only","DurationSeconds":"8.87","DistroName":"CentOS","CorrelationId":"","Version":"1.0.5.20251017-g03b36b7d"})" ;
133144 ASSERT_TRUE (CreateTestJsonFile (realEvent));
134- Telemetry::TelemetryManager telemetryManager (false , std::chrono::seconds (1 ));
145+ Telemetry::TelemetryManager telemetryManager (m_telemetryCache, false , std::chrono::seconds (1 ));
135146 EXPECT_FALSE (telemetryManager.ProcessJsonFile (m_testJsonFile));
136147}
137148
138149TEST_F (TelemetryTest, ProcessStatusTraceEvent)
139150{
140151 std::string realEvent = R"( {"EventName":"StatusTrace","Timestamp":"2025-10-17 22:52:56+0000","FileName":"/workspaces/azure-osconfig/src/common/asb/Asb.c","LineNumber":"1109","FunctionName":"AsbShutdown","RuleCodename":"auditEnsureSmbWithSambaIsDisabled","CallingFunctionName":"TestingStatusTrace","ResultCode":"0","ResultString":"OK","ScenarioName":"TestingScenario","Microseconds":"101807","DistroName":"CentOS","CorrelationId":"","Version":"1.0.5.20251017-g03b36b7d"})" ;
141152 ASSERT_TRUE (CreateTestJsonFile (realEvent));
142- Telemetry::TelemetryManager telemetryManager (false , std::chrono::seconds (1 ));
153+ Telemetry::TelemetryManager telemetryManager (m_telemetryCache, false , std::chrono::seconds (1 ));
143154 EXPECT_TRUE (telemetryManager.ProcessJsonFile (m_testJsonFile));
144155}
145156
146157TEST_F (TelemetryTest, ProcessStatusTraceMissingScenarioNameEvent)
147158{
148159 std::string realEvent = R"( {"EventName":"StatusTrace","Timestamp":"2025-10-17 22:52:56+0000","FileName":"/workspaces/azure-osconfig/src/common/asb/Asb.c","LineNumber":"1109","FunctionName":"AsbShutdown","RuleCodename":"auditEnsureSmbWithSambaIsDisabled","CallingFunctionName":"TestingStatusTrace","ResultCode":"0","Microseconds":"101807","DistroName":"CentOS","CorrelationId":"","Version":"1.0.5.20251017-g03b36b7d"})" ;
149160 ASSERT_TRUE (CreateTestJsonFile (realEvent));
150- Telemetry::TelemetryManager telemetryManager (false , std::chrono::seconds (1 ));
161+ Telemetry::TelemetryManager telemetryManager (m_telemetryCache, false , std::chrono::seconds (1 ));
151162 EXPECT_FALSE (telemetryManager.ProcessJsonFile (m_testJsonFile));
152163}
153164
154165TEST_F (TelemetryTest, ProcessCommandExecutedEvent)
155166{
156167 std::string realEvent = R"( {"EventName":"CommandExecuted","DistroName":"CentOS","Version":"1.3.0-preview123","CorrelationId":"{00000000-0000-0000-0000-000000000000}","CorrelationGroup":"TestGroup","Timestamp":"2025-10-17 22:52:56+0000","IsTestMode":true,"Subcommand":"get resource","Duration":1234.5678,"Success":true,"ErrorKind":"Resource","ErrorResourceName":"Test Resource","ErrorResourceType":"Microsoft.OSConfig/Test","ErrorLocation":"utils/test.rs:123","ErrorCode":1})" ;
157168 ASSERT_TRUE (CreateTestJsonFile (realEvent));
158- Telemetry::TelemetryManager telemetryManager (false , std::chrono::seconds (1 ));
169+ Telemetry::TelemetryManager telemetryManager (m_telemetryCache, false , std::chrono::seconds (1 ));
159170 EXPECT_TRUE (telemetryManager.ProcessJsonFile (m_testJsonFile));
160171}
161172
162173TEST_F (TelemetryTest, ProcessCommandExecutedMissingSubcommandEvent)
163174{
164175 std::string realEvent = R"( {"EventName":"CommandExecuted","DistroName":"CentOS","Version":"1.3.0-preview123","CorrelationId":"{00000000-0000-0000-0000-000000000000}","CorrelationGroup":"TestGroup","Timestamp":"2025-10-17 22:52:56+0000","IsTestMode":true,"Duration":1234.5678,"Success":true,"ErrorKind":"Resource","ErrorResourceName":"Test Resource","ErrorResourceType":"Microsoft.OSConfig/Test","ErrorLocation":"utils/test.rs:123","ErrorCode":1})" ;
165176 ASSERT_TRUE (CreateTestJsonFile (realEvent));
166- Telemetry::TelemetryManager telemetryManager (false , std::chrono::seconds (1 ));
177+ Telemetry::TelemetryManager telemetryManager (m_telemetryCache, false , std::chrono::seconds (1 ));
167178 EXPECT_FALSE (telemetryManager.ProcessJsonFile (m_testJsonFile));
168179}
0 commit comments