|
60 | 60 |
|
61 | 61 | class LoggerPeer : public Logger { |
62 | 62 | public: |
63 | | - // Make base class constructors visible |
| 63 | + // Make base class constructors and members visible |
64 | 64 | using Logger::Logger; |
| 65 | + using Logger::serializer_; |
| 66 | + using Logger::tracker_; |
| 67 | + using Logger::writer_; |
65 | 68 |
|
66 | 69 | LoggerPeer(std::unique_ptr<Logger> l) |
67 | 70 | : Logger(nil, nil, TelemetryEvent::kEverything, l->serializer_, l->writer_) {} |
68 | 71 |
|
69 | | - std::shared_ptr<santa::Serializer> Serializer() { return serializer_; } |
70 | | - |
71 | | - std::shared_ptr<santa::Writer> Writer() { return writer_; } |
| 72 | + absl::flat_hash_map<std::string, bool> TrackerState() { return tracker_.file_state_; } |
72 | 73 | }; |
73 | 74 |
|
74 | 75 | } // namespace santa |
@@ -120,32 +121,32 @@ - (void)testCreate { |
120 | 121 | LoggerPeer logger(Logger::Create(mockESApi, nil, nil, TelemetryEvent::kEverything, |
121 | 122 | SNTEventLogTypeFilelog, nil, @"/tmp/temppy", @"/tmp/spool", 1, 1, |
122 | 123 | 1, 1)); |
123 | | - XCTAssertNotEqual(nullptr, std::dynamic_pointer_cast<BasicString>(logger.Serializer())); |
124 | | - XCTAssertNotEqual(nullptr, std::dynamic_pointer_cast<File>(logger.Writer())); |
| 124 | + XCTAssertNotEqual(nullptr, std::dynamic_pointer_cast<BasicString>(logger.serializer_)); |
| 125 | + XCTAssertNotEqual(nullptr, std::dynamic_pointer_cast<File>(logger.writer_)); |
125 | 126 |
|
126 | 127 | logger = LoggerPeer(Logger::Create(mockESApi, nil, nil, TelemetryEvent::kEverything, |
127 | 128 | SNTEventLogTypeSyslog, nil, @"/tmp/temppy", @"/tmp/spool", 1, |
128 | 129 | 1, 1, 1)); |
129 | | - XCTAssertNotEqual(nullptr, std::dynamic_pointer_cast<BasicString>(logger.Serializer())); |
130 | | - XCTAssertNotEqual(nullptr, std::dynamic_pointer_cast<Syslog>(logger.Writer())); |
| 130 | + XCTAssertNotEqual(nullptr, std::dynamic_pointer_cast<BasicString>(logger.serializer_)); |
| 131 | + XCTAssertNotEqual(nullptr, std::dynamic_pointer_cast<Syslog>(logger.writer_)); |
131 | 132 |
|
132 | 133 | logger = LoggerPeer(Logger::Create(mockESApi, nil, nil, TelemetryEvent::kEverything, |
133 | 134 | SNTEventLogTypeNull, nil, @"/tmp/temppy", @"/tmp/spool", 1, 1, |
134 | 135 | 1, 1)); |
135 | | - XCTAssertNotEqual(nullptr, std::dynamic_pointer_cast<Empty>(logger.Serializer())); |
136 | | - XCTAssertNotEqual(nullptr, std::dynamic_pointer_cast<Null>(logger.Writer())); |
| 136 | + XCTAssertNotEqual(nullptr, std::dynamic_pointer_cast<Empty>(logger.serializer_)); |
| 137 | + XCTAssertNotEqual(nullptr, std::dynamic_pointer_cast<Null>(logger.writer_)); |
137 | 138 |
|
138 | 139 | logger = LoggerPeer(Logger::Create(mockESApi, nil, nil, TelemetryEvent::kEverything, |
139 | 140 | SNTEventLogTypeProtobuf, nil, @"/tmp/temppy", @"/tmp/spool", 1, |
140 | 141 | 1, 1, 1)); |
141 | | - XCTAssertNotEqual(nullptr, std::dynamic_pointer_cast<Protobuf>(logger.Serializer())); |
142 | | - XCTAssertNotEqual(nullptr, std::dynamic_pointer_cast<Spool>(logger.Writer())); |
| 142 | + XCTAssertNotEqual(nullptr, std::dynamic_pointer_cast<Protobuf>(logger.serializer_)); |
| 143 | + XCTAssertNotEqual(nullptr, std::dynamic_pointer_cast<Spool>(logger.writer_)); |
143 | 144 |
|
144 | 145 | logger = LoggerPeer(Logger::Create(mockESApi, nil, nil, TelemetryEvent::kEverything, |
145 | 146 | SNTEventLogTypeJSON, nil, @"/tmp/temppy", @"/tmp/spool", 1, 1, |
146 | 147 | 1, 1)); |
147 | | - XCTAssertNotEqual(nullptr, std::dynamic_pointer_cast<Protobuf>(logger.Serializer())); |
148 | | - XCTAssertNotEqual(nullptr, std::dynamic_pointer_cast<File>(logger.Writer())); |
| 148 | + XCTAssertNotEqual(nullptr, std::dynamic_pointer_cast<Protobuf>(logger.serializer_)); |
| 149 | + XCTAssertNotEqual(nullptr, std::dynamic_pointer_cast<File>(logger.writer_)); |
149 | 150 | } |
150 | 151 |
|
151 | 152 | - (void)testLog { |
@@ -263,4 +264,60 @@ - (void)testLogFileAccess { |
263 | 264 | XCTBubbleMockVerifyAndClearExpectations(mockWriter.get()); |
264 | 265 | } |
265 | 266 |
|
| 267 | +- (void)testExportTracker { |
| 268 | + auto mockESApi = std::make_shared<MockEndpointSecurityAPI>(); |
| 269 | + LoggerPeer logger(Logger::Create(mockESApi, nil, nil, TelemetryEvent::kEverything, |
| 270 | + SNTEventLogTypeNull, nil, @"", @"", 1, 1, 1, 1)); |
| 271 | + |
| 272 | + // Nothing in the map initially |
| 273 | + auto map = logger.tracker_.Drain(); |
| 274 | + XCTAssertEqual(logger.TrackerState().size(), 0); |
| 275 | + XCTAssertEqual(map.size(), 0); |
| 276 | + |
| 277 | + // Start tracking a couple of keys |
| 278 | + logger.tracker_.Track("foo"); |
| 279 | + XCTAssertEqual(logger.TrackerState().size(), 1); |
| 280 | + XCTAssertEqual(logger.TrackerState().at("foo"), false); |
| 281 | + |
| 282 | + logger.tracker_.Track("bar"); |
| 283 | + XCTAssertEqual(logger.TrackerState().size(), 2); |
| 284 | + XCTAssertEqual(logger.TrackerState().at("bar"), false); |
| 285 | + |
| 286 | + // Change state of an existing key |
| 287 | + logger.tracker_.AckCompleted("bar"); |
| 288 | + XCTAssertEqual(logger.TrackerState().at("bar"), true); |
| 289 | + |
| 290 | + // Change state of a non-existing key, it should be created |
| 291 | + logger.tracker_.AckCompleted("cake"); |
| 292 | + XCTAssertEqual(logger.TrackerState().at("cake"), true); |
| 293 | + |
| 294 | + // Drain the tracker |
| 295 | + map = logger.tracker_.Drain(); |
| 296 | + XCTAssertEqual(logger.TrackerState().size(), 0); |
| 297 | + XCTAssertEqual(map.size(), 3); |
| 298 | + XCTAssertEqual(map.at("foo"), false); |
| 299 | + XCTAssertEqual(map.at("bar"), true); |
| 300 | + XCTAssertEqual(map.at("cake"), true); |
| 301 | + |
| 302 | + // Add some more keys after draining |
| 303 | + logger.tracker_.Track("baz"); |
| 304 | + logger.tracker_.AckCompleted("qaz"); |
| 305 | + XCTAssertEqual(logger.TrackerState().size(), 2); |
| 306 | + XCTAssertEqual(logger.TrackerState().at("baz"), false); |
| 307 | + XCTAssertEqual(logger.TrackerState().at("qaz"), true); |
| 308 | + |
| 309 | + // Track something already ack'd, ensure value doesn't change |
| 310 | + logger.tracker_.Track("qaz"); |
| 311 | + XCTAssertEqual(logger.TrackerState().size(), 2); |
| 312 | + XCTAssertEqual(logger.TrackerState().at("baz"), false); |
| 313 | + XCTAssertEqual(logger.TrackerState().at("qaz"), true); |
| 314 | + |
| 315 | + // One last drain for fun |
| 316 | + map = logger.tracker_.Drain(); |
| 317 | + XCTAssertEqual(logger.TrackerState().size(), 0); |
| 318 | + XCTAssertEqual(map.size(), 2); |
| 319 | + XCTAssertEqual(map.at("baz"), false); |
| 320 | + XCTAssertEqual(map.at("qaz"), true); |
| 321 | +} |
| 322 | + |
266 | 323 | @end |
0 commit comments