< Summary - Backend C Tests - Coverage Report

Information
Class: test_sensor_service_real_c
Assembly: src.backend.tests.unit.database
File(s): C:\Users\yagiz\Desktop\Project\smart-maintenance-suite\src\backend\tests\unit\database\test_sensor_service_real.c
Line coverage
91%
Covered lines: 53
Uncovered lines: 5
Coverable lines: 58
Total lines: 130
Line coverage: 91.3%
Branch coverage
91%
Covered branches: 11
Total branches: 12
Branch coverage: 91.6%
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
LOG_INFO100%000%
LOG_ERROR100%000%
db_pool_acquire100%00100%
db_pool_release100%00100%
PQexec100%00100%
PQresultStatus100%00100%
PQclear100%00100%
PQntuples100%00100%
PQgetvalue90%0085.71%
PQerrorMessage100%000%
check_and_trigger_alerts100%00100%
test_get_sensor_stats_success100%00100%
test_get_sensor_stats_fail_paths100%00100%
test_add_sensor_reading_success100%00100%
test_add_sensor_reading_fail100%00100%
main100%00100%

File(s)

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

#LineLine coverage
 1#include <stdarg.h>
 2#include <stddef.h>
 3#include <setjmp.h>
 4#include <cmocka.h>
 5#include <string.h>
 6#include <stdio.h>
 7#include <stdlib.h>
 8
 9// PostgreSQL Definitions
 10#define LIBPQ_FE_H
 11#define PGconn void
 12#define PGresult void
 13#define PGRES_COMMAND_OK 1
 14#define PGRES_TUPLES_OK 2
 15#define PGRES_FATAL_ERROR 3
 16
 17#include "sensor_service.h"
 18#include "db_connection.h"
 19
 20// Logger mock
 021void LOG_INFO(const char *format, ...) {}
 22
 023void LOG_ERROR(const char *format, ...) {}
 24
 25// Mock State
 26static DBConnection mock_conn;
 27static int mock_acquire_success = 1;
 28static int mock_result_status = PGRES_TUPLES_OK;
 29static int mock_ntuples = 1;
 30
 31// Mock DB functions
 632DBConnection *db_pool_acquire(void) {
 633  if (mock_acquire_success) {
 434    mock_conn.pg_conn = (void *)0x1234;
 435    return &mock_conn;
 36  }
 37
 238  return NULL;
 39}
 40
 441void db_pool_release(DBConnection *conn) {}
 42
 443void *PQexec(void *conn, const char *query) {
 444  return (void *)0x5678;
 45}
 46
 447int PQresultStatus(const void *res) {
 448  return mock_result_status;
 49}
 50
 451void PQclear(void *res) {}
 52
 153int PQntuples(const void *res) {
 154  return mock_ntuples;
 55}
 56
 557char *PQgetvalue(const void *res, int row, int field) {
 558  if (field == 0) return "101"; // ID
 59
 460  if (field == 1) return "Temperature"; // Type
 61
 362  if (field == 2) return "45.5"; // Value
 63
 264  if (field == 3) return "C"; // Unit
 65
 166  if (field == 4) return "2026-02-18 12:00:00"; // Timestamp
 67
 068  return "";
 69}
 70
 071char *PQerrorMessage(const void *conn) {
 072  return "Sensor Mock Error";
 73}
 74
 75// Mock alert engine to avoid linking
 176void check_and_trigger_alerts(int sensor_id, const char *sensor_type, double value) {}
 77
 78/* ====================================================================
 79 * TEST CASES
 80 * ==================================================================== */
 81
 182static void test_get_sensor_stats_success(void **state) {
 183  mock_acquire_success = 1;
 184  mock_result_status = PGRES_TUPLES_OK;
 185  mock_ntuples = 1;
 86  SensorStatus stats[5];
 187  int count = get_machine_sensor_stats(1, stats, 5);
 188  assert_int_equal(count, 1);
 189  assert_int_equal(stats[0].sensor_id, 101);
 190  assert_string_equal(stats[0].sensor_type, "Temperature");
 191  assert_float_equal(stats[0].last_value, 45.5, 0.01);
 192}
 93
 194static void test_get_sensor_stats_fail_paths(void **state) {
 95  SensorStatus stats[5];
 96  // Acquire fail
 197  mock_acquire_success = 0;
 198  assert_int_equal(get_machine_sensor_stats(1, stats, 5), 0);
 99  // Query fail
 1100  mock_acquire_success = 1;
 1101  mock_result_status = PGRES_FATAL_ERROR;
 1102  assert_int_equal(get_machine_sensor_stats(1, stats, 5), 0);
 1103}
 104
 1105static void test_add_sensor_reading_success(void **state) {
 1106  mock_acquire_success = 1;
 1107  mock_result_status = PGRES_COMMAND_OK;
 1108  bool res = add_sensor_reading(1, "Temperature", 42.0);
 1109  assert_true(res);
 1110}
 111
 1112static void test_add_sensor_reading_fail(void **state) {
 113  // Acquire fail
 1114  mock_acquire_success = 0;
 1115  assert_false(add_sensor_reading(1, "Temperature", 42.0));
 116  // Command fail
 1117  mock_acquire_success = 1;
 1118  mock_result_status = PGRES_FATAL_ERROR;
 1119  assert_false(add_sensor_reading(1, "Temperature", 42.0));
 1120}
 121
 1122int main(void) {
 1123  const struct CMUnitTest tests[] = {
 124    cmocka_unit_test(test_get_sensor_stats_success),
 125    cmocka_unit_test(test_get_sensor_stats_fail_paths),
 126    cmocka_unit_test(test_add_sensor_reading_success),
 127    cmocka_unit_test(test_add_sensor_reading_fail),
 128  };
 1129  return cmocka_run_group_tests(tests, NULL, NULL);
 130}