< Summary

Information
Class: Intentum.Core.IoT.IoTRules
Assembly: Intentum.Core
File(s): /home/runner/work/Intentum/Intentum/src/Intentum.Core/IoT/IoTRules.cs
Line coverage
100%
Covered lines: 115
Uncovered lines: 0
Coverable lines: 115
Total lines: 140
Line coverage: 100%
Branch coverage
76%
Covered branches: 46
Total branches: 60
Branch coverage: 76.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
DeviceFailure(...)100%66100%
SecurityBreach(...)75%88100%
MaintenanceRequired(...)87.5%88100%
AnomalousSensorReading(...)83.33%66100%
FirmwareOutdated(...)62.5%88100%
NetworkCongestion(...)75%88100%
PowerFluctuation(...)62.5%88100%
ConfigurationDrift(...)75%88100%
AllRules()100%11100%

File(s)

/home/runner/work/Intentum/Intentum/src/Intentum.Core/IoT/IoTRules.cs

#LineLine coverage
 1using Intentum.Core.Behavior;
 2using Intentum.Core.Models;
 3
 4namespace Intentum.Core.IoT;
 5
 6public static class IoTRules
 7{
 8    public static Func<BehaviorSpace, RuleMatch?> DeviceFailure(
 49        double confidence = 0.9) => space =>
 310    {
 311        var errors = space.Events.Count(e =>
 812            e.Action.Contains("error", StringComparison.OrdinalIgnoreCase));
 313        var gaps = space.Events.Count(e =>
 814            e.Action.Contains("telemetry.gap", StringComparison.OrdinalIgnoreCase));
 415
 316        if (errors >= 1 && gaps >= 1)
 117            return new RuleMatch("DeviceFailure", confidence,
 118                $"Errors: {errors}, telemetry gaps: {gaps}");
 219        if (errors >= 3)
 120            return new RuleMatch("DeviceFailure", confidence * 0.7,
 121                $"Multiple errors: {errors}, no gaps detected");
 122        return null;
 723    };
 24
 25    public static Func<BehaviorSpace, RuleMatch?> SecurityBreach(
 326        double confidence = 0.95) => space =>
 227    {
 228        var signals = space.Events.Count(e =>
 529            e.Action.Contains("access.unauthorized", StringComparison.OrdinalIgnoreCase) ||
 530            e.Action.Contains("location.anomaly", StringComparison.OrdinalIgnoreCase) ||
 531            e.Action.Contains("firmware.unauthorized", StringComparison.OrdinalIgnoreCase) ||
 532            e.Action.Contains("port.scan.detected", StringComparison.OrdinalIgnoreCase));
 333
 234        if (signals >= 2)
 135            return new RuleMatch("SecurityBreach", confidence,
 136                $"Security signals: {signals}");
 137        return null;
 538    };
 39
 40    public static Func<BehaviorSpace, RuleMatch?> MaintenanceRequired(
 341        double confidence = 0.85) => space =>
 242    {
 243        var signals = space.Events.Count(e =>
 544            e.Action.Contains("performance.degrading", StringComparison.OrdinalIgnoreCase) ||
 545            e.Action.Contains("usage.threshold.exceeded", StringComparison.OrdinalIgnoreCase) ||
 546            e.Action.Contains("temperature.high", StringComparison.OrdinalIgnoreCase) ||
 547            e.Action.Contains("battery.low", StringComparison.OrdinalIgnoreCase));
 348
 249        if (signals >= 2)
 150            return new RuleMatch("MaintenanceRequired", confidence,
 151                $"Maintenance signals: {signals}");
 152        return null;
 553    };
 54
 55    public static Func<BehaviorSpace, RuleMatch?> AnomalousSensorReading(
 356        double confidence = 0.8) => space =>
 257    {
 258        var anomalies = space.Events.Count(e =>
 559            e.Action.Contains("reading.outlier", StringComparison.OrdinalIgnoreCase) ||
 560            e.Action.Contains("reading.rapid.change", StringComparison.OrdinalIgnoreCase) ||
 561            e.Action.Contains("reading.calibration.off", StringComparison.OrdinalIgnoreCase));
 362
 263        if (anomalies >= 2)
 164            return new RuleMatch("AnomalousSensorReading", confidence,
 165                $"Anomalous readings: {anomalies}");
 166        return null;
 567    };
 68
 69    public static Func<BehaviorSpace, RuleMatch?> FirmwareOutdated(
 370        double confidence = 0.8) => space =>
 271    {
 272        var signals = space.Events.Count(e =>
 373            e.Action.Contains("firmware.version.mismatch", StringComparison.OrdinalIgnoreCase) ||
 374            e.Action.Contains("firmware.update.failed", StringComparison.OrdinalIgnoreCase) ||
 375            e.Action.Contains("firmware.deprecated", StringComparison.OrdinalIgnoreCase) ||
 376            e.Action.Contains("security.patch.missing", StringComparison.OrdinalIgnoreCase));
 377
 278        if (signals >= 1)
 179            return new RuleMatch("FirmwareOutdated", confidence,
 180                $"Firmware signals: {signals}");
 181        return null;
 582    };
 83
 84    public static Func<BehaviorSpace, RuleMatch?> NetworkCongestion(
 385        double confidence = 0.85) => space =>
 286    {
 287        var signals = space.Events.Count(e =>
 588            e.Action.Contains("network.latency.spike", StringComparison.OrdinalIgnoreCase) ||
 589            e.Action.Contains("network.packet.loss", StringComparison.OrdinalIgnoreCase) ||
 590            e.Action.Contains("network.throughput.drop", StringComparison.OrdinalIgnoreCase) ||
 591            e.Action.Contains("network.connection.intermittent", StringComparison.OrdinalIgnoreCase));
 392
 293        if (signals >= 2)
 194            return new RuleMatch("NetworkCongestion", confidence,
 195                $"Network signals: {signals}");
 196        return null;
 597    };
 98
 99    public static Func<BehaviorSpace, RuleMatch?> PowerFluctuation(
 3100        double confidence = 0.8) => space =>
 2101    {
 2102        var signals = space.Events.Count(e =>
 3103            e.Action.Contains("power.voltage.anomaly", StringComparison.OrdinalIgnoreCase) ||
 3104            e.Action.Contains("power.battery.drain", StringComparison.OrdinalIgnoreCase) ||
 3105            e.Action.Contains("power.surge.detected", StringComparison.OrdinalIgnoreCase) ||
 3106            e.Action.Contains("power.brownout", StringComparison.OrdinalIgnoreCase));
 3107
 2108        if (signals >= 1)
 1109            return new RuleMatch("PowerFluctuation", confidence,
 1110                $"Power signals: {signals}");
 1111        return null;
 5112    };
 113
 114    public static Func<BehaviorSpace, RuleMatch?> ConfigurationDrift(
 3115        double confidence = 0.85) => space =>
 2116    {
 2117        var signals = space.Events.Count(e =>
 5118            e.Action.Contains("config.setting.changed", StringComparison.OrdinalIgnoreCase) ||
 5119            e.Action.Contains("config.compliance.violation", StringComparison.OrdinalIgnoreCase) ||
 5120            e.Action.Contains("config.unexpected.change", StringComparison.OrdinalIgnoreCase) ||
 5121            e.Action.Contains("config.rollback", StringComparison.OrdinalIgnoreCase));
 3122
 2123        if (signals >= 2)
 1124            return new RuleMatch("ConfigurationDrift", confidence,
 1125                $"Configuration signals: {signals}");
 1126        return null;
 5127    };
 128
 129    public static IReadOnlyList<Func<BehaviorSpace, RuleMatch?>> AllRules() =>
 1130    [
 1131        SecurityBreach(),
 1132        DeviceFailure(),
 1133        MaintenanceRequired(),
 1134        AnomalousSensorReading(),
 1135        FirmwareOutdated(),
 1136        NetworkCongestion(),
 1137        PowerFluctuation(),
 1138        ConfigurationDrift()
 1139    ];
 140}