Providers emitted identifiers and field keys that decodeSnapshot never
looked up, leaving CPU/kernel/load/disk sections zeroed and memory%,
storage%, network, process RSS, and fan fields decoded as zero.
Store-side decode now reads the emitted schema; providers gain the
previously-missing fields: network isUp (IFF_UP via getifaddrs), process
isStopped/isZombie (pbi_status), fan name (F{i}ID). Memory utilization is
computed as used/total in the decoder. decodeSnapshot is internal for
@testable access; new MMSnapshotContractTests cover the emitted-key
contract with synthetic dictionaries (93 tests total, 0 failures).
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
87 lines
3.7 KiB
Swift
87 lines
3.7 KiB
Swift
import XCTest
|
|
@testable import MacMonitor
|
|
|
|
final class MMNetworkBandwidthTests: XCTestCase {
|
|
|
|
func testNetworkBandwidthCalculation() {
|
|
let prev: [String: [String: NSNumber]] = [
|
|
"en0": [
|
|
"inBytes": NSNumber(value: 50_000_000),
|
|
"outBytes": NSNumber(value: 10_000_000),
|
|
"inPackets": NSNumber(value: 40_000),
|
|
"outPackets": NSNumber(value: 20_000),
|
|
"inErrors": NSNumber(value: 0),
|
|
"outErrors": NSNumber(value: 0)
|
|
],
|
|
"lo0": [
|
|
"inBytes": NSNumber(value: 5_000_000),
|
|
"outBytes": NSNumber(value: 5_000_000),
|
|
"inPackets": NSNumber(value: 5_000),
|
|
"outPackets": NSNumber(value: 5_000),
|
|
"inErrors": NSNumber(value: 0),
|
|
"outErrors": NSNumber(value: 0)
|
|
]
|
|
]
|
|
|
|
let curr: [String: [String: NSNumber]] = [
|
|
"en0": [
|
|
"inBytes": NSNumber(value: 60_000_000), // delta in = 10,000,000 bytes
|
|
"outBytes": NSNumber(value: 12_000_000), // delta out = 2,000,000 bytes
|
|
"inPackets": NSNumber(value: 48_000), // delta in = 8,000 pkts
|
|
"outPackets": NSNumber(value: 24_000), // delta out = 4,000 pkts
|
|
"inErrors": NSNumber(value: 0),
|
|
"outErrors": NSNumber(value: 0)
|
|
],
|
|
"lo0": [
|
|
"inBytes": NSNumber(value: 7_000_000),
|
|
"outBytes": NSNumber(value: 7_000_000),
|
|
"inPackets": NSNumber(value: 7_000),
|
|
"outPackets": NSNumber(value: 7_000),
|
|
"inErrors": NSNumber(value: 0),
|
|
"outErrors": NSNumber(value: 0)
|
|
]
|
|
]
|
|
|
|
let timeDelta: TimeInterval = 2.0 // 2 seconds
|
|
let ipDict: [String: String] = ["en0": "192.168.1.100", "lo0": "127.0.0.1"]
|
|
|
|
let metrics = MMNetworkBandwidthProvider.calculateBandwidthMetrics(
|
|
withCurrentSnapshots: curr,
|
|
previousSnapshots: prev,
|
|
timeDelta: timeDelta,
|
|
ipAddresses: ipDict,
|
|
interfaceUpFlags: ["en0": true, "lo0": true]
|
|
)
|
|
|
|
let totalDownBps = metrics["totalDownloadBytesPerSec"] as? Double ?? 0
|
|
let totalUpBps = metrics["totalUploadBytesPerSec"] as? Double ?? 0
|
|
let totalDownPps = metrics["totalDownloadPacketsPerSec"] as? Double ?? 0
|
|
let totalUpPps = metrics["totalUploadPacketsPerSec"] as? Double ?? 0
|
|
let primary = metrics["primaryInterface"] as? String ?? ""
|
|
let interfaces = metrics["interfaces"] as? [[String: Any]] ?? []
|
|
|
|
// en0 delta in = 10MB / 2s = 5,000,000 B/s (lo0 is excluded from total)
|
|
XCTAssertEqual(totalDownBps, 5_000_000.0, accuracy: 1.0)
|
|
// en0 delta out = 2MB / 2s = 1,000,000 B/s
|
|
XCTAssertEqual(totalUpBps, 1_000_000.0, accuracy: 1.0)
|
|
// en0 delta in pkts = 8,000 / 2s = 4,000 pps
|
|
XCTAssertEqual(totalDownPps, 4000.0, accuracy: 0.1)
|
|
// en0 delta out pkts = 4,000 / 2s = 2,000 pps
|
|
XCTAssertEqual(totalUpPps, 2000.0, accuracy: 0.1)
|
|
XCTAssertEqual(primary, "en0")
|
|
XCTAssertEqual(interfaces.count, 2)
|
|
}
|
|
|
|
func testLiveNetworkBandwidthProvider() throws {
|
|
let provider = MMNetworkBandwidthProvider()
|
|
XCTAssertEqual(provider.domain, .network)
|
|
XCTAssertEqual(provider.providerIdentifier, "com.i3omb.macmonitor.telemetry.network.bandwidth")
|
|
|
|
let sample = try provider.sampleTelemetry()
|
|
XCTAssertNotNil(sample)
|
|
XCTAssertNotNil(sample["totalDownloadBytesPerSec"])
|
|
XCTAssertNotNil(sample["totalUploadBytesPerSec"])
|
|
XCTAssertNotNil(sample["interfaces"])
|
|
}
|
|
}
|