Files
MacMonitor/Tests/MMProcessTests.swift
T
gronod 72ed8256c8
MacMonitor CI/CD Pipeline / Build & Test (Intel x86_64) (push) Canceled after 0s
feat(telemetry): implement live process explorer and resource attribution provider (fixes #11)
2026-09-08 12:39:23 +01:00

70 lines
2.5 KiB
Swift

import XCTest
@testable import MacMonitor
final class MMProcessTests: XCTestCase {
func testProcessCPUPercentCalculation() {
let prevCPUTimes: [NSNumber: NSNumber] = [
100: NSNumber(value: 1_000_000_000), // 1.0s
200: NSNumber(value: 500_000_000) // 0.5s
]
let rawProcesses: [[String: Any]] = [
[
"pid": 100,
"ppid": 1,
"uid": 501,
"username": "tester",
"name": "cpu_hog",
"cpuTimeNs": NSNumber(value: 2_000_000_000), // delta = 1.0s over 2.0s = 50% CPU
"residentBytes": NSNumber(value: 50_000_000),
"virtualBytes": NSNumber(value: 100_000_000),
"threadCount": 4,
"runningThreads": 1
],
[
"pid": 200,
"ppid": 1,
"uid": 501,
"username": "tester",
"name": "idle_app",
"cpuTimeNs": NSNumber(value: 520_000_000), // delta = 0.02s over 2.0s = 1% CPU
"residentBytes": NSNumber(value: 20_000_000),
"virtualBytes": NSNumber(value: 50_000_000),
"threadCount": 2,
"runningThreads": 0
]
]
let timeDelta: TimeInterval = 2.0
let results = MMProcessTelemetryProvider.calculateProcessList(
withRawProcesses: rawProcesses,
previousCPUTimes: prevCPUTimes,
timeDelta: timeDelta
)
XCTAssertEqual(results.count, 2)
// First entry should be highest CPU
XCTAssertEqual(results[0]["name"] as? String, "cpu_hog")
let hogCPU = results[0]["cpuPercent"] as? Double ?? 0
XCTAssertEqual(hogCPU, 50.0, accuracy: 0.1)
let idleCPU = results[1]["cpuPercent"] as? Double ?? 0
XCTAssertEqual(idleCPU, 1.0, accuracy: 0.1)
}
func testLiveProcessProvider() throws {
let provider = MMProcessTelemetryProvider()
XCTAssertEqual(provider.domain, .process)
XCTAssertEqual(provider.providerIdentifier, "com.i3omb.macmonitor.telemetry.process")
let sample = try provider.sampleTelemetry()
XCTAssertNotNil(sample)
let processCount = sample["processCount"] as? Int ?? 0
XCTAssertGreaterThan(processCount, 0)
XCTAssertNotNil(sample["processes"])
XCTAssertNotNil(sample["totalThreads"])
}
}