< Summary - Backend C Tests - Coverage Report

Information
Class: sensor_service_c
Assembly: src.backend.database
File(s): C:\Users\yagiz\Desktop\Project\smart-maintenance-suite\src\backend\database\sensor_service.c
Line coverage
100%
Covered lines: 39
Uncovered lines: 0
Coverable lines: 39
Total lines: 77
Line coverage: 100%
Branch coverage
100%
Covered branches: 10
Total branches: 10
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_machine_sensor_stats100%00100%
add_sensor_reading100%00100%

File(s)

C:\Users\yagiz\Desktop\Project\smart-maintenance-suite\src\backend\database\sensor_service.c

#LineLine coverage
 1#include "sensor_service.h"
 2#include "db_connection.h"
 3#include "logger.h"
 4#include <stdio.h>
 5#include <stdlib.h>
 6#include <string.h>
 7#include "alert_service.h"
 8
 89int get_machine_sensor_stats(int machine_id, SensorStatus *out_stats, int max_sensors) {
 810  DBConnection *conn_wrapper = db_pool_acquire();
 11
 812  if (!conn_wrapper) {
 213    LOG_ERROR("Could not acquire connection for machine health check (ID: %d).", machine_id);
 214    return 0;
 15  }
 16
 17  char query[512];
 618  snprintf(query, sizeof(query),
 19           "SELECT DISTINCT ON (s.id) "
 20           "s.id, s.sensor_type, sd.value, s.unit, "
 21           "to_char(sd.timestamp, 'YYYY-MM-DD HH24:MI:SS') "
 22           "FROM sensors s "
 23           "JOIN sensor_data sd ON s.id = sd.sensor_id "
 24           "WHERE s.machine_id = %d "
 25           "ORDER BY s.id, sd.timestamp DESC;",
 26           machine_id);
 627  PGresult *res = PQexec(conn_wrapper->pg_conn, query);
 28
 629  if (PQresultStatus(res) != PGRES_TUPLES_OK) {
 230    PQclear(res);
 231    db_pool_release(conn_wrapper);
 232    return 0;
 33  }
 34
 435  int rows = PQntuples(res);
 436  int count = (rows < max_sensors) ? rows : max_sensors;
 37
 838  for (int i = 0; i < count; i++) {
 439    out_stats[i].sensor_id = atoi(PQgetvalue(res, i, 0));
 440    strncpy(out_stats[i].sensor_type, PQgetvalue(res, i, 1), 31);
 441    out_stats[i].sensor_type[31] = '\0';
 442    out_stats[i].last_value = atof(PQgetvalue(res, i, 2));
 443    strncpy(out_stats[i].unit, PQgetvalue(res, i, 3), 9);
 444    out_stats[i].unit[9] = '\0';
 445    strncpy(out_stats[i].recorded_at, PQgetvalue(res, i, 4), 31);
 446    out_stats[i].recorded_at[31] = '\0';
 47  }
 48
 449  PQclear(res);
 450  db_pool_release(conn_wrapper);
 451  return count;
 52}
 53
 654bool add_sensor_reading(int sensor_id, const char *sensor_type, double value) {
 655  DBConnection *conn_wrapper = db_pool_acquire();
 56
 657  if (!conn_wrapper) {
 258    return false;
 59  }
 60
 61  char query[256];
 462  snprintf(query, sizeof(query),
 63           "INSERT INTO sensor_data (sensor_id, value) VALUES (%d, %.2f);",
 64           sensor_id, value);
 465  PGresult *res = PQexec(conn_wrapper->pg_conn, query);
 66
 467  if (PQresultStatus(res) != PGRES_COMMAND_OK) {
 268    PQclear(res);
 269    db_pool_release(conn_wrapper);
 270    return false;
 71  }
 72
 273  PQclear(res);
 274  db_pool_release(conn_wrapper);
 275  check_and_trigger_alerts(sensor_id, sensor_type, value);
 276  return true;
 77}