Skip to content

Commit 9738357

Browse files
committed
[json validator] Use validator on responses of call requests
1 parent ee29648 commit 9738357

File tree

6 files changed

+53
-21
lines changed

6 files changed

+53
-21
lines changed

src/centralsystem/chargepoint/ChargePointProxy.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ ChargePointProxy::ChargePointProxy(ICentralSystem&
6565
m_identifier(identifier),
6666
m_rpc(rpc),
6767
m_msg_dispatcher(messages_validator),
68-
m_msg_sender(*m_rpc, messages_converter, stack_config.callRequestTimeout()),
68+
m_msg_sender(*m_rpc, messages_converter, messages_validator, stack_config.callRequestTimeout()),
6969
m_handler(m_identifier, messages_converter, m_msg_dispatcher, stack_config)
7070
{
7171
m_rpc->registerSpy(*this);

src/chargepoint/ChargePoint.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ bool ChargePoint::start()
237237
m_rpc_client->registerSpy(*this);
238238
m_msg_dispatcher = std::make_unique<ocpp::messages::MessageDispatcher>(m_messages_validator);
239239
m_msg_sender = std::make_unique<ocpp::messages::GenericMessageSender>(
240-
*m_rpc_client, m_messages_converter, m_stack_config.callRequestTimeout());
240+
*m_rpc_client, m_messages_converter, m_messages_validator, m_stack_config.callRequestTimeout());
241241

242242
m_config_manager = std::make_unique<ConfigManager>(m_ocpp_config, m_messages_converter, *m_msg_dispatcher);
243243
m_trigger_manager = std::make_unique<TriggerMessageManager>(m_connectors, m_messages_converter, *m_msg_dispatcher);

src/messages/GenericMessageSender.h

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ along with OpenOCPP. If not, see <http://www.gnu.org/licenses/>.
2222
#include "IRequestFifo.h"
2323
#include "IRpc.h"
2424
#include "MessagesConverter.h"
25+
#include "MessagesValidator.h"
2526

2627
namespace ocpp
2728
{
@@ -46,8 +47,11 @@ class GenericMessageSender
4647
{
4748
public:
4849
/** @brief Constructor */
49-
GenericMessageSender(ocpp::rpc::IRpc& rpc, MessagesConverter& messages_converter, std::chrono::milliseconds timeout)
50-
: m_rpc(rpc), m_messages_converter(messages_converter), m_timeout(timeout)
50+
GenericMessageSender(ocpp::rpc::IRpc& rpc,
51+
MessagesConverter& messages_converter,
52+
const MessagesValidator& messages_validator,
53+
std::chrono::milliseconds timeout)
54+
: m_rpc(rpc), m_messages_converter(messages_converter), m_messages_validator(messages_validator), m_timeout(timeout)
5155
{
5256
}
5357

@@ -146,13 +150,18 @@ class GenericMessageSender
146150
// Check error
147151
if (error.empty())
148152
{
149-
// Convert response
150-
const char* error_code = nullptr;
151-
std::string error_message;
152-
resp_converter->setAllocator(&rpc_frame.GetAllocator());
153-
if (resp_converter->fromJson(resp, response, error_code, error_message))
153+
// Validate response
154+
ocpp::json::JsonValidator* validator = m_messages_validator.getValidator(action, false);
155+
if (validator && validator->isValid(resp))
154156
{
155-
ret = CallResult::Ok;
157+
// Convert response
158+
const char* error_code = nullptr;
159+
std::string error_message;
160+
resp_converter->setAllocator(&rpc_frame.GetAllocator());
161+
if (resp_converter->fromJson(resp, response, error_code, error_message))
162+
{
163+
ret = CallResult::Ok;
164+
}
156165
}
157166
}
158167
else
@@ -208,13 +217,18 @@ class GenericMessageSender
208217
// Check error
209218
if (error.empty())
210219
{
211-
// Convert response
212-
const char* error_code = nullptr;
213-
std::string error_message;
214-
resp_converter->setAllocator(&rpc_frame.GetAllocator());
215-
if (resp_converter->fromJson(resp, response, error_code, error_message))
220+
// Validate response
221+
ocpp::json::JsonValidator* validator = m_messages_validator.getValidator(action, false);
222+
if (validator && validator->isValid(resp))
216223
{
217-
ret = CallResult::Ok;
224+
// Convert response
225+
const char* error_code = nullptr;
226+
std::string error_message;
227+
resp_converter->setAllocator(&rpc_frame.GetAllocator());
228+
if (resp_converter->fromJson(resp, response, error_code, error_message))
229+
{
230+
ret = CallResult::Ok;
231+
}
218232
}
219233
}
220234
else
@@ -232,6 +246,8 @@ class GenericMessageSender
232246
ocpp::rpc::IRpc& m_rpc;
233247
/** @brief Messages converter */
234248
MessagesConverter& m_messages_converter;
249+
/** @brief Messages validator */
250+
const MessagesValidator& m_messages_validator;
235251
/** @brief Request timeout */
236252
std::chrono::milliseconds m_timeout;
237253
};

tests/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11

2+
# Path to the JSON schemas
3+
add_definitions(-DSCHEMAS_DIR="${CMAKE_SOURCE_DIR}/schemas")
4+
25
# Subdirectories
36
add_subdirectory(chargepoint)
47
add_subdirectory(rpc)

tests/chargepoint/authent/test_authent.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ along with OpenOCPP. If not, see <http://www.gnu.org/licenses/>.
2727
#include "InternalConfigManager.h"
2828
#include "MessageDispatcherStub.h"
2929
#include "MessagesConverter.h"
30+
#include "MessagesValidator.h"
3031
#include "OcppConfigStub.h"
3132
#include "RpcStub.h"
3233
#include "doctest.h"
@@ -46,6 +47,7 @@ Database database;
4647
ChargePointConfigStub cp_config;
4748
OcppConfigStub ocpp_config;
4849
InternalConfigManager internal_config(database);
50+
MessagesValidator msgs_validator;
4951

5052
/** @brief Prepare a response to an Authorize request */
5153
static void setAuthorizeResponse(RpcStub& rpc, const IdTagInfo& tag_info)
@@ -68,6 +70,8 @@ TEST_SUITE("Authentication component")
6870
{
6971
std::filesystem::remove(DATABASE_PATH);
7072
CHECK(database.open(DATABASE_PATH));
73+
74+
CHECK(msgs_validator.load(SCHEMAS_DIR));
7175
}
7276

7377
TEST_CASE("Setup config")
@@ -121,7 +125,7 @@ TEST_SUITE("Authentication component")
121125
MessagesConverter msgs_converter;
122126
MessageDispatcherStub msg_dispatcher;
123127
RpcStub rpc;
124-
GenericMessageSender msg_sender(rpc, msgs_converter, std::chrono::milliseconds(1000));
128+
GenericMessageSender msg_sender(rpc, msgs_converter, msgs_validator, std::chrono::milliseconds(1000));
125129

126130
ocpp_config.setConfigValue("LocalPreAuthorize", "false");
127131
rpc.setConnected(true);
@@ -167,7 +171,7 @@ TEST_SUITE("Authentication component")
167171
MessagesConverter msgs_converter;
168172
MessageDispatcherStub msg_dispatcher;
169173
RpcStub rpc;
170-
GenericMessageSender msg_sender(rpc, msgs_converter, std::chrono::milliseconds(1000));
174+
GenericMessageSender msg_sender(rpc, msgs_converter, msgs_validator, std::chrono::milliseconds(1000));
171175

172176
ocpp_config.setConfigValue("LocalPreAuthorize", "true");
173177
rpc.setConnected(true);
@@ -263,7 +267,7 @@ TEST_SUITE("Authentication component")
263267
MessagesConverter msgs_converter;
264268
MessageDispatcherStub msg_dispatcher;
265269
RpcStub rpc;
266-
GenericMessageSender msg_sender(rpc, msgs_converter, std::chrono::milliseconds(1000));
270+
GenericMessageSender msg_sender(rpc, msgs_converter, msgs_validator, std::chrono::milliseconds(1000));
267271

268272
ocpp_config.setConfigValue("LocalAuthorizeOffline", "false");
269273
rpc.setConnected(false);
@@ -305,7 +309,7 @@ TEST_SUITE("Authentication component")
305309
MessagesConverter msgs_converter;
306310
MessageDispatcherStub msg_dispatcher;
307311
RpcStub rpc;
308-
GenericMessageSender msg_sender(rpc, msgs_converter, std::chrono::milliseconds(1000));
312+
GenericMessageSender msg_sender(rpc, msgs_converter, msgs_validator, std::chrono::milliseconds(1000));
309313

310314
ocpp_config.setConfigValue("LocalAuthorizeOffline", "true");
311315
rpc.setConnected(false);

tests/chargepoint/metervalues/test_metervalues.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ along with OpenOCPP. If not, see <http://www.gnu.org/licenses/>.
2424
#include "Database.h"
2525
#include "GenericMessageSender.h"
2626
#include "MessagesConverter.h"
27+
#include "MessagesValidator.h"
2728
#include "MeterValues.h"
2829
#include "OcppConfigStub.h"
2930
#include "RequestFifoStub.h"
@@ -52,8 +53,9 @@ ChargePointEventsHandlerStub event_handler;
5253
RpcStub rpc;
5354
TestableWorkerThreadPool worker_pool;
5455
RequestFifoStub requests_fifo;
56+
MessagesValidator msgs_validator;
5557
MessagesConverter msgs_converter;
56-
GenericMessageSender msg_sender(rpc, msgs_converter, std::chrono::milliseconds(1000));
58+
GenericMessageSender msg_sender(rpc, msgs_converter, msgs_validator, std::chrono::milliseconds(1000));
5759
TriggerMessageManagerStub trigger_mgr;
5860
StatusManagerStub status_mgr;
5961
ConfigManagerStub config_mgr;
@@ -259,6 +261,8 @@ TEST_SUITE("Metervalues component")
259261
{
260262
std::filesystem::remove(DATABASE_PATH);
261263
CHECK(database.open(DATABASE_PATH));
264+
265+
CHECK(msgs_validator.load(SCHEMAS_DIR));
262266
}
263267

264268
TEST_CASE("Setup config")
@@ -858,6 +862,11 @@ TEST_SUITE("Metervalues component")
858862
// Accepted by Central System
859863
status_mgr.forceRegistrationStatus(RegistrationStatus::Accepted);
860864

865+
// Response
866+
rapidjson::Document json_resp;
867+
json_resp.Parse("{}");
868+
rpc.setResponse(json_resp);
869+
861870
// Send meter values on connector 2
862871
std::vector<MeterValue> meter_values;
863872
meter_values.emplace_back();

0 commit comments

Comments
 (0)