• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

wirenboard / wb-mqtt-smartweb / 2

31 Jul 2026 10:01AM UTC coverage: 33.897% (-0.4%) from 34.328%
2

Pull #40

github

476708
ekateluv
Lower coverage threshold to 33
Pull Request #40: Use exported vars instead of MAKEFLAGS for coverage options

307 of 744 branches covered (41.26%)

501 of 1478 relevant lines covered (33.9%)

20.03 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.3
/test/config.test.cpp
1
#include "config_parser.h"
2

3
#include <gtest/gtest.h>
4
#include <vector>
5

6
#include <wblib/json_utils.h>
7
#include <wblib/testing/testlog.h>
8

9
using namespace WBMQTT;
10

11
namespace
12
{
13

14
    struct TestClassParameterSample
15
    {
16
        uint32_t id;
17
        std::string name;
18
        std::string type;
19
        uint32_t order;
20
        std::string programClassName;
21
        std::string codecName;
22
        bool readOnly;
23
    };
24
}
25

26
class TLoadConfigTest: public Testing::TLoggedFixture
27
{
28
protected:
29
    std::string TestRootDir;
30
    std::string SchemaFile;
31
    std::string ClassSchemaFile;
32

33
    void SetUp()
12✔
34
    {
35
        TestRootDir = Testing::TLoggedFixture::GetDataFilePath("config_test_data");
12✔
36
        SchemaFile = TestRootDir + "/../../wb-mqtt-smartweb.schema.json";
12✔
37
        ClassSchemaFile = TestRootDir + "/../../wb-mqtt-smartweb-class.schema.json";
12✔
38
    }
12✔
39

40
    std::shared_ptr<TSmartWebToMqttConfig> GetTestConfig()
6✔
41
    {
42
        auto classJson = WBMQTT::JSON::Parse(TestRootDir + "/classes/ROOM_DEVICE.json");
6✔
43
        auto pConfig = std::make_shared<TSmartWebToMqttConfig>();
6✔
44
        LoadSmartWebClass(*pConfig, classJson, TDeviceClassSource::USER);
6✔
45
        EXPECT_EQ(1, pConfig->Classes.size());
6✔
46
        return pConfig;
6✔
47
    }
6✔
48

49
    void ParameterEqHelper(const TestClassParameterSample& sample, const TSmartWebParameter& parameter)
6✔
50
    {
51
        EXPECT_EQ(sample.id, parameter.Id);
6✔
52
        EXPECT_EQ(sample.name, parameter.Name);
6✔
53
        EXPECT_EQ(sample.type, parameter.Type);
6✔
54
        EXPECT_EQ(sample.order, parameter.Order);
6✔
55
        EXPECT_EQ(sample.programClassName, parameter.ProgramClass->Name);
6✔
56
        EXPECT_EQ(sample.codecName, parameter.Codec->GetName());
6✔
57
        EXPECT_EQ(sample.readOnly, parameter.ReadOnly);
6✔
58
    }
6✔
59
};
60

61
TEST_F(TLoadConfigTest, ClassValidation)
16✔
62
{
63
    auto classSchema = WBMQTT::JSON::Parse(ClassSchemaFile);
4✔
64

65
    auto classJsonGood = WBMQTT::JSON::Parse(TestRootDir + "/classes/ROOM_DEVICE.json");
4✔
66
    WBMQTT::JSON::Validate(classJsonGood, classSchema);
4✔
67

68
    // missing fields
69
    for (size_t i = 1; i <= 8; ++i) {
36✔
70
        auto classJsonBad = WBMQTT::JSON::Parse(TestRootDir + "/classes/bad/bad" + std::to_string(i) + ".json");
32✔
71
        ASSERT_THROW(WBMQTT::JSON::Validate(classJsonBad, classSchema), std::runtime_error) << i;
32✔
72
    }
32✔
73
}
4✔
74

75
TEST_F(TLoadConfigTest, SmartWebToMqttConfigWoDat)
16✔
76
{
77
    auto classJson = WBMQTT::JSON::Parse(TestRootDir + "/classes/ROOM_DEVICE.json");
4✔
78
    TSmartWebToMqttConfig config;
4✔
79
    LoadSmartWebClass(config, classJson, TDeviceClassSource::USER);
4✔
80
    ASSERT_EQ(1, config.Classes.size());
4✔
81
    auto c = config.Classes.begin();
4✔
82
    const auto id = c->first;
4✔
83
    const auto smartWebClass = c->second;
4✔
84
    EXPECT_EQ(5, id);
4✔
85
    EXPECT_EQ("ROOM_DEVICE", smartWebClass->Name);
4✔
86
    EXPECT_EQ(5, smartWebClass->Type);
4✔
87
    ASSERT_EQ(1, smartWebClass->ParentClasses.size());
4✔
88
    auto parentClassIt = smartWebClass->ParentClasses.begin();
4✔
89
    EXPECT_EQ("PROGRAM", *parentClassIt);
4✔
90
}
4✔
91

92
TEST_F(TLoadConfigTest, SmartWebToMqttConfigInputs)
16✔
93
{
94
    auto config = GetTestConfig();
4✔
95
    const auto smartWebClass = config->Classes.begin()->second;
4✔
96

97
    EXPECT_EQ(6, smartWebClass->Inputs.size());
4✔
98
    auto input = smartWebClass->Inputs.at(2);
4✔
99

100
    TestClassParameterSample sample = {.id = 2,
4✔
101
                                       .name = "floorT",
×
102
                                       .type = "temperature",
4✔
103
                                       .order = 2,
104
                                       .programClassName = "ROOM_DEVICE",
4✔
105
                                       .codecName = "TSensorCodec",
4✔
106
                                       .readOnly = true};
20✔
107

108
    ParameterEqHelper(sample, *input);
4✔
109
}
4✔
110

111
TEST_F(TLoadConfigTest, SmartWebToMqttConfigOutputs)
16✔
112
{
113
    auto config = GetTestConfig();
4✔
114
    const auto smartWebClass = config->Classes.begin()->second;
4✔
115

116
    EXPECT_EQ(7, smartWebClass->Outputs.size());
4✔
117
    auto output = smartWebClass->Outputs.at(2);
4✔
118

119
    TestClassParameterSample sample = {.id = 2,
4✔
120
                                       .name = "addValve",
×
121
                                       .type = "relay",
4✔
122
                                       .order = 9,
123
                                       .programClassName = "ROOM_DEVICE",
4✔
124
                                       .codecName = "TOutputCodec",
4✔
125
                                       .readOnly = true};
20✔
126

127
    ParameterEqHelper(sample, *output);
4✔
128
}
4✔
129

130
TEST_F(TLoadConfigTest, SmartWebToMqttConfigParameters)
16✔
131
{
132
    auto config = GetTestConfig();
4✔
133
    const auto smartWebClass = config->Classes.begin()->second;
4✔
134

135
    EXPECT_EQ(34, smartWebClass->Parameters.size());
4✔
136
    auto parameter = smartWebClass->Parameters.at(2);
4✔
137

138
    TestClassParameterSample sample = {.id = 2,
4✔
139
                                       .name = "roomReducedTemperature",
×
140
                                       .type = "temperature",
4✔
141
                                       .order = 16,
142
                                       .programClassName = "ROOM_DEVICE",
4✔
143
                                       .codecName = "TIntCodec<signed 2, 10>",
4✔
144
                                       .readOnly = false};
20✔
145

146
    ParameterEqHelper(sample, *parameter);
4✔
147
}
4✔
148

149
TEST_F(TLoadConfigTest, LoadConfig)
16✔
150
{
151
    TConfig config;
4✔
152
    EXPECT_NO_THROW(LoadConfig(config,
4✔
153
                               TestRootDir + "/test_config.json",
154
                               TestRootDir + "/classes",
155
                               TestRootDir + "/builtin_classes",
156
                               SchemaFile,
157
                               ClassSchemaFile));
4✔
158

159
    EXPECT_TRUE(config.Debug);
4✔
160
    EXPECT_EQ("can1", config.InterfaceName);
4✔
161
    EXPECT_EQ(123, config.SmartWebToMqtt.PollInterval.count());
4✔
162

163
    EXPECT_EQ(3, config.SmartWebToMqtt.Classes.size());
4✔
164
    auto outdoorSensorDeviceClass = config.SmartWebToMqtt.Classes[2];
4✔
165

166
    ASSERT_NE(nullptr, outdoorSensorDeviceClass);
4✔
167
    EXPECT_EQ("OUTDOOR_SENSOR", outdoorSensorDeviceClass->Name);
4✔
168
    EXPECT_EQ(1, outdoorSensorDeviceClass->Inputs.size());
4✔
169
    EXPECT_EQ(0, outdoorSensorDeviceClass->Outputs.size());
4✔
170
    EXPECT_EQ(1, outdoorSensorDeviceClass->Parameters.size());
4✔
171

172
    auto roomDeviceClass = config.SmartWebToMqtt.Classes[5];
4✔
173
    ASSERT_NE(nullptr, roomDeviceClass);
4✔
174
    EXPECT_EQ("ROOM_DEVICE", roomDeviceClass->Name);
4✔
175
    EXPECT_EQ(6, roomDeviceClass->Inputs.size());
4✔
176
    EXPECT_EQ(7, roomDeviceClass->Outputs.size());
4✔
177
    EXPECT_EQ(34, roomDeviceClass->Parameters.size());
4✔
178

179
    auto temperatureSourceClass = config.SmartWebToMqtt.Classes[6];
4✔
180
    ASSERT_NE(nullptr, temperatureSourceClass);
4✔
181
    EXPECT_EQ("TEMPERATURE_SOURCE", temperatureSourceClass->Name);
4✔
182
    EXPECT_EQ(0, temperatureSourceClass->Inputs.size());
4✔
183
    EXPECT_EQ(0, temperatureSourceClass->Outputs.size());
4✔
184
    EXPECT_EQ(6, temperatureSourceClass->Parameters.size());
4✔
185
}
4✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc