From b645aaa4f2fa9a35ef3089411c0f91d605782f15 Mon Sep 17 00:00:00 2001 From: Will Sobel Date: Fri, 24 Apr 2026 15:49:51 +0200 Subject: [PATCH 1/5] Added legacy rotation_size in case it is being used --- CMakeLists.txt | 2 +- src/mtconnect/configuration/agent_config.cpp | 6 +++++- src/mtconnect/utilities.hpp | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 89a419cd..332fb95b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ set(AGENT_VERSION_MAJOR 2) set(AGENT_VERSION_MINOR 7) set(AGENT_VERSION_PATCH 0) -set(AGENT_VERSION_BUILD 8) +set(AGENT_VERSION_BUILD 9) set(AGENT_VERSION_RC "") # This minimum version is to support Visual Studio 2019 and C++ feature checking and FetchContent diff --git a/src/mtconnect/configuration/agent_config.cpp b/src/mtconnect/configuration/agent_config.cpp index 0cd97b3a..623ff4ae 100644 --- a/src/mtconnect/configuration/agent_config.cpp +++ b/src/mtconnect/configuration/agent_config.cpp @@ -529,7 +529,8 @@ namespace mtconnect::configuration { ConfigOptions options; AddDefaultedOptions(logger, options, - {{"max_size", "2mb"s}, + {{"max_size", ""s}, + {"rotation_size", ""s}, // for backward compatibility {"max_archive_size", "10mb"s}, {"max_index", 9}, {"file_name", defaultFileName}, @@ -602,8 +603,11 @@ namespace mtconnect::configuration { auto &archiveLogDirectory = logChannel.m_archiveLogDirectory; auto &logFileName = logChannel.m_logFileName; + logRotationSize = 2 * 1024 * 1024; // Default to 2MB for log rotation size maxLogArchiveSize = ConvertFileSize(options, "max_archive_size", maxLogArchiveSize); + logRotationSize = ConvertFileSize(options, "rotation_size", logRotationSize); logRotationSize = ConvertFileSize(options, "max_size", logRotationSize); + int max_index = *GetOption(options, "max_index"); if (auto sched = GetOption(options, "schedule")) diff --git a/src/mtconnect/utilities.hpp b/src/mtconnect/utilities.hpp index 9c3f25eb..1ebf6fb1 100644 --- a/src/mtconnect/utilities.hpp +++ b/src/mtconnect/utilities.hpp @@ -561,7 +561,7 @@ namespace mtconnect { using boost::smatch; auto value = GetOption(options, name); - if (value) + if (value && !value->empty()) { static const regex pat("([0-9]+)([GgMmKkBb]*)"); smatch match; From 29342eaebb40068c09b9cc327f540e307b059409 Mon Sep 17 00:00:00 2001 From: Will Sobel Date: Fri, 24 Apr 2026 18:50:26 +0200 Subject: [PATCH 2/5] Added html rendering of swagger and fixed entity json printer that had an unused argument. --- src/mtconnect/configuration/agent_config.cpp | 6 ++-- src/mtconnect/entity/json_parser.cpp | 3 +- src/mtconnect/entity/json_parser.hpp | 2 +- src/mtconnect/observation/change_observer.hpp | 16 ++++----- src/mtconnect/parser/json_parser.cpp | 2 +- src/mtconnect/sink/rest_sink/server.cpp | 35 +++++++++++++++---- src/mtconnect/utilities.hpp | 2 +- test_package/agent_test.cpp | 8 ++--- test_package/json_parser_test.cpp | 20 +++++------ test_package/json_printer_stream_test.cpp | 10 +++--- test_package/mqtt_sink_test.cpp | 6 ++-- 11 files changed, 66 insertions(+), 44 deletions(-) diff --git a/src/mtconnect/configuration/agent_config.cpp b/src/mtconnect/configuration/agent_config.cpp index 623ff4ae..0b5a38e8 100644 --- a/src/mtconnect/configuration/agent_config.cpp +++ b/src/mtconnect/configuration/agent_config.cpp @@ -530,7 +530,7 @@ namespace mtconnect::configuration { ConfigOptions options; AddDefaultedOptions(logger, options, {{"max_size", ""s}, - {"rotation_size", ""s}, // for backward compatibility + {"rotation_size", ""s}, // for backward compatibility {"max_archive_size", "10mb"s}, {"max_index", 9}, {"file_name", defaultFileName}, @@ -603,11 +603,11 @@ namespace mtconnect::configuration { auto &archiveLogDirectory = logChannel.m_archiveLogDirectory; auto &logFileName = logChannel.m_logFileName; - logRotationSize = 2 * 1024 * 1024; // Default to 2MB for log rotation size + logRotationSize = 2 * 1024 * 1024; // Default to 2MB for log rotation size maxLogArchiveSize = ConvertFileSize(options, "max_archive_size", maxLogArchiveSize); logRotationSize = ConvertFileSize(options, "rotation_size", logRotationSize); logRotationSize = ConvertFileSize(options, "max_size", logRotationSize); - + int max_index = *GetOption(options, "max_index"); if (auto sched = GetOption(options, "schedule")) diff --git a/src/mtconnect/entity/json_parser.cpp b/src/mtconnect/entity/json_parser.cpp index 45877007..60020631 100644 --- a/src/mtconnect/entity/json_parser.cpp +++ b/src/mtconnect/entity/json_parser.cpp @@ -177,8 +177,7 @@ namespace mtconnect { return nullptr; } - EntityPtr JsonParser::parse(FactoryPtr factory, const string& document, const string& version, - ErrorList& errors) + EntityPtr JsonParser::parse(FactoryPtr factory, const string& document, ErrorList& errors) { NAMED_SCOPE("entity.json_parser"); EntityPtr entity; diff --git a/src/mtconnect/entity/json_parser.hpp b/src/mtconnect/entity/json_parser.hpp index db8d224d..6c62b809 100644 --- a/src/mtconnect/entity/json_parser.hpp +++ b/src/mtconnect/entity/json_parser.hpp @@ -46,7 +46,7 @@ namespace mtconnect { /// @param version the version to parse /// @param errors Errors that occurred creating the entities /// @return an entity shared pointer if successful - EntityPtr parse(FactoryPtr factory, const std::string &document, const std::string &version, + EntityPtr parse(FactoryPtr factory, const std::string &document, ErrorList &errors); protected: diff --git a/src/mtconnect/observation/change_observer.hpp b/src/mtconnect/observation/change_observer.hpp index 0196dbfd..4eaec484 100644 --- a/src/mtconnect/observation/change_observer.hpp +++ b/src/mtconnect/observation/change_observer.hpp @@ -306,13 +306,13 @@ namespace mtconnect::observation { AsyncObserver(boost::asio::io_context::strand &strand, mtconnect::buffer::CircularBuffer &buffer, FilterSet &&filter, std::chrono::milliseconds interval, std::chrono::milliseconds heartbeat) - : AsyncResponse(interval), - m_heartbeat(heartbeat), - m_last(std::chrono::system_clock::now()), - m_filter(std::move(filter)), - m_strand(strand), - m_observer(strand), - m_buffer(buffer) + : AsyncResponse(interval), + m_heartbeat(heartbeat), + m_last(std::chrono::system_clock::now()), + m_filter(std::move(filter)), + m_strand(strand), + m_observer(strand), + m_buffer(buffer) {} /// @brief default destructor @@ -335,7 +335,7 @@ namespace mtconnect::observation { void handlerCompleted() { NAMED_SCOPE("AsyncObserver::handlerCompleted"); - + m_last = std::chrono::system_clock::now(); if (m_endOfBuffer) { diff --git a/src/mtconnect/parser/json_parser.cpp b/src/mtconnect/parser/json_parser.cpp index 01297fe5..6c676a6b 100644 --- a/src/mtconnect/parser/json_parser.cpp +++ b/src/mtconnect/parser/json_parser.cpp @@ -179,7 +179,7 @@ namespace mtconnect::parser { { entity::ErrorList errors; entity::JsonParser parser(version); - auto entity = parser.parse(Device::getRoot(), jsonDoc, "2.3", errors); + auto entity = parser.parse(Device::getRoot(), jsonDoc, errors); if (!errors.empty()) { diff --git a/src/mtconnect/sink/rest_sink/server.cpp b/src/mtconnect/sink/rest_sink/server.cpp index 4cb1b8d2..9c75c40b 100644 --- a/src/mtconnect/sink/rest_sink/server.cpp +++ b/src/mtconnect/sink/rest_sink/server.cpp @@ -400,14 +400,37 @@ namespace mtconnect::sink::rest_sink { void Server::addSwaggerRoutings() { auto handler = [&](SessionPtr session, const RequestPtr request) -> bool { - auto pretty = *request->parameter("pretty"); - - StringBuffer output; - RenderJson(output, pretty, [this](auto &writer) { renderSwaggerResponse(writer); }); + auto json = request->m_accepts.find("json"); + auto html = request->m_accepts.find("html"); + if (html == string::npos || (json != string::npos && json < html)) + { + auto pretty = *request->parameter("pretty"); - session->writeResponse( - make_unique(status::ok, string(output.GetString()), "application/json")); + StringBuffer output; + RenderJson(output, pretty, [this](auto &writer) { renderSwaggerResponse(writer); }); + session->writeResponse( + make_unique(status::ok, string(output.GetString()), "application/json")); + } + else + { + string response = R"( + + + MTConnect API + + + +
+ + + + +)"; + session->writeResponse(make_unique(status::ok, response, "text/html")); + } return true; }; diff --git a/src/mtconnect/utilities.hpp b/src/mtconnect/utilities.hpp index 1ebf6fb1..9c994bd8 100644 --- a/src/mtconnect/utilities.hpp +++ b/src/mtconnect/utilities.hpp @@ -561,7 +561,7 @@ namespace mtconnect { using boost::smatch; auto value = GetOption(options, name); - if (value && !value->empty()) + if (value && !value->empty()) { static const regex pat("([0-9]+)([GgMmKkBb]*)"); smatch match; diff --git a/test_package/agent_test.cpp b/test_package/agent_test.cpp index bb3bf560..72315732 100644 --- a/test_package/agent_test.cpp +++ b/test_package/agent_test.cpp @@ -2664,9 +2664,9 @@ TEST_F(AgentTest, should_handle_japanese_characters) TEST_F(AgentTest, should_have_device_model_change_time_in_the_header_for_v1_7) { using namespace nlohmann; - + m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "1.7", 4, true, true, - {{configuration::JsonVersion, 2 }}); + {{configuration::JsonVersion, 2}}); { PARSE_JSON_RESPONSE("/current"); json header = doc.at("/MTConnectStreams/Header"_json_pointer); @@ -2679,9 +2679,9 @@ TEST_F(AgentTest, should_have_device_model_change_time_in_the_header_for_v1_7) TEST_F(AgentTest, should_not_have_device_model_change_time_in_the_header_for_pre_v1_7) { using namespace nlohmann; - + m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "1.6", 4, true, true, - {{configuration::JsonVersion, 2 }}); + {{configuration::JsonVersion, 2}}); { PARSE_JSON_RESPONSE("/current"); json header = doc.at("/MTConnectStreams/Header"_json_pointer); diff --git a/test_package/json_parser_test.cpp b/test_package/json_parser_test.cpp index fb8a3f96..50b45cbc 100644 --- a/test_package/json_parser_test.cpp +++ b/test_package/json_parser_test.cpp @@ -122,7 +122,7 @@ TEST_F(JsonParserTest, should_parse_v1_entity_with_properties_and_entity_list) ErrorList errors; entity::JsonParser parser; - auto entity = parser.parse(root, doc, "1.7", errors); + auto entity = parser.parse(root, doc, errors); ASSERT_EQ(0, errors.size()); ASSERT_EQ("FileArchetype", entity->getName()); @@ -169,7 +169,7 @@ TEST_F(JsonParserTest, should_parse_v1_recursive_entity_lists) ErrorList errors; entity::JsonParser parser; - auto entity = parser.parse(root, doc, "1.7", errors); + auto entity = parser.parse(root, doc, errors); ASSERT_EQ(0, errors.size()); ASSERT_EQ("Device", entity->getName()); @@ -220,7 +220,7 @@ TEST_F(JsonParserTest, should_fail_v1_when_required_property_missing) ErrorList errors; entity::JsonParser parser; - auto entity = parser.parse(root, doc, "1.7", errors); + auto entity = parser.parse(root, doc, errors); ASSERT_EQ(1, errors.size()); ASSERT_FALSE(entity); ASSERT_EQ(string("Device(uuid): Property uuid is required and not provided"), @@ -246,7 +246,7 @@ TEST_F(JsonParserTest, should_error_v1_when_entity_list_is_empty) ErrorList errors; entity::JsonParser parser; - auto entity = parser.parse(root, doc, "1.7", errors); + auto entity = parser.parse(root, doc, errors); ASSERT_EQ(1, errors.size()); ASSERT_TRUE(entity); ASSERT_EQ(string("Components(Component): Property Component is required and not provided"), @@ -311,7 +311,7 @@ TEST_F(JsonParserTest, should_parse_v2_entity_with_properties_and_typed_entity_l ErrorList errors; entity::JsonParser parser(2); - auto entity = parser.parse(root, doc, "1.7", errors); + auto entity = parser.parse(root, doc, errors); ASSERT_EQ(0, errors.size()); ASSERT_EQ("FileArchetype", entity->getName()); @@ -359,7 +359,7 @@ TEST_F(JsonParserTest, should_parse_v2_recursive_entity_lists_grouped_by_type) ErrorList errors; entity::JsonParser parser(2); - auto entity = parser.parse(root, doc, "1.7", errors); + auto entity = parser.parse(root, doc, errors); ASSERT_EQ(0, errors.size()); ASSERT_EQ("Device", entity->getName()); @@ -410,7 +410,7 @@ TEST_F(JsonParserTest, should_fail_v2_when_required_property_missing) ErrorList errors; entity::JsonParser parser(2); - auto entity = parser.parse(root, doc, "1.7", errors); + auto entity = parser.parse(root, doc, errors); ASSERT_EQ(1, errors.size()); ASSERT_FALSE(entity); ASSERT_EQ(string("Device(uuid): Property uuid is required and not provided"), @@ -436,7 +436,7 @@ TEST_F(JsonParserTest, should_error_v2_when_entity_list_is_empty) ErrorList errors; entity::JsonParser parser(2); - auto entity = parser.parse(root, doc, "1.7", errors); + auto entity = parser.parse(root, doc, errors); ASSERT_EQ(1, errors.size()); ASSERT_TRUE(entity); ASSERT_EQ(string("Components(Component): Property Component is required and not provided"), @@ -478,7 +478,7 @@ TEST_F(JsonParserTest, should_parse_v2_multiple_entities_of_same_type_in_one_arr ErrorList errors; entity::JsonParser parser(2); - auto entity = parser.parse(root, doc, "1.7", errors); + auto entity = parser.parse(root, doc, errors); ASSERT_EQ(0, errors.size()); auto l = entity->getList("Components"); @@ -513,7 +513,7 @@ TEST_F(JsonParserTest, should_parse_raw_content_without_xml_encoding) ErrorList errors; entity::JsonParser parser; - auto entity = parser.parse(root, doc, "1.7", errors); + auto entity = parser.parse(root, doc, errors); ASSERT_EQ("JSON", get(entity->getProperty("format"))); diff --git a/test_package/json_printer_stream_test.cpp b/test_package/json_printer_stream_test.cpp index e1cf71d7..310d1db7 100644 --- a/test_package/json_printer_stream_test.cpp +++ b/test_package/json_printer_stream_test.cpp @@ -719,13 +719,13 @@ TEST_F(JsonPrinterStreamTest, should_have_device_model_change_time_in_header) m_xmlPrinter = std::make_unique("2.7"); m_printer = std::make_unique(2, true); m_printer->setModelChangeTime("2026-01-01T00:00:00Z"); - + ObservationList list; auto doc = m_printer->printSample(123, 131072, 10254805, 10123733, 10123800, list); - + auto jdoc = json::parse(doc); - + auto header = jdoc.at("/MTConnectStreams/Header"_json_pointer); - ASSERT_EQ(string("2026-01-01T00:00:00Z"), header.at("/deviceModelChangeTime"_json_pointer).get()); + ASSERT_EQ(string("2026-01-01T00:00:00Z"), + header.at("/deviceModelChangeTime"_json_pointer).get()); } - diff --git a/test_package/mqtt_sink_test.cpp b/test_package/mqtt_sink_test.cpp index 011a67ad..fd32294e 100644 --- a/test_package/mqtt_sink_test.cpp +++ b/test_package/mqtt_sink_test.cpp @@ -215,7 +215,7 @@ TEST_F(MqttSinkTest, mqtt_sink_should_publish_Probe) EXPECT_EQ("MTConnect/Probe/000", topic); ErrorList list; - auto ptr = parser.parse(device_model::Device::getRoot(), payload, "2.0", list); + auto ptr = parser.parse(device_model::Device::getRoot(), payload, list); EXPECT_EQ(0, list.size()); auto dev = dynamic_pointer_cast(ptr); EXPECT_TRUE(dev); @@ -336,7 +336,7 @@ TEST_F(MqttSinkTest, mqtt_sink_should_publish_Probe_with_uuid_first) EXPECT_EQ("MTConnect/000/Probe", topic); ErrorList list; - auto ptr = parser.parse(device_model::Device::getRoot(), payload, "2.0", list); + auto ptr = parser.parse(device_model::Device::getRoot(), payload, list); EXPECT_EQ(0, list.size()); auto dev = dynamic_pointer_cast(ptr); EXPECT_TRUE(dev); @@ -375,7 +375,7 @@ TEST_F(MqttSinkTest, mqtt_sink_should_publish_Probe_no_device_in_format) EXPECT_EQ("MTConnect/Probe/000", topic); ErrorList list; - auto ptr = parser.parse(device_model::Device::getRoot(), payload, "2.0", list); + auto ptr = parser.parse(device_model::Device::getRoot(), payload, list); EXPECT_EQ(0, list.size()); auto dev = dynamic_pointer_cast(ptr); EXPECT_TRUE(dev); From b46ab7400cc71c510419057c56522f0487840254 Mon Sep 17 00:00:00 2001 From: Will Sobel Date: Fri, 24 Apr 2026 19:58:16 +0200 Subject: [PATCH 3/5] Formatting --- src/mtconnect/entity/json_parser.hpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/mtconnect/entity/json_parser.hpp b/src/mtconnect/entity/json_parser.hpp index 6c62b809..d0324aaf 100644 --- a/src/mtconnect/entity/json_parser.hpp +++ b/src/mtconnect/entity/json_parser.hpp @@ -46,8 +46,7 @@ namespace mtconnect { /// @param version the version to parse /// @param errors Errors that occurred creating the entities /// @return an entity shared pointer if successful - EntityPtr parse(FactoryPtr factory, const std::string &document, - ErrorList &errors); + EntityPtr parse(FactoryPtr factory, const std::string &document, ErrorList &errors); protected: uint32_t m_version; From 77ee1181103a8db61cd001ed9b8dbea649e6f0cd Mon Sep 17 00:00:00 2001 From: Will Sobel Date: Tue, 28 Apr 2026 11:08:12 +0200 Subject: [PATCH 4/5] Update the configuration for the agent docker containers to use json v2 and created a cutting tool test for v2. Added Date to the response header per 1.1 --- demo/compose/agent/agent.cfg | 2 - demo/compose/agent/agentmqtt.cfg | 3 +- demo/styles/styles.xsl | 2 +- src/mtconnect/sink/rest_sink/session_impl.cpp | 8 ++ test_package/cutting_tool_test.cpp | 101 ++++++++++++++++++ 5 files changed, 111 insertions(+), 5 deletions(-) diff --git a/demo/compose/agent/agent.cfg b/demo/compose/agent/agent.cfg index 541d4bf8..73ec41e1 100644 --- a/demo/compose/agent/agent.cfg +++ b/demo/compose/agent/agent.cfg @@ -1,9 +1,7 @@ Devices = Devices.xml SchemaVersion = 2.7 WorkerThreads = 3 -MonitorConfigFiles = yes Port = 5000 -JsonVersion = 1 MinCompressFileSize = 10k diff --git a/demo/compose/agent/agentmqtt.cfg b/demo/compose/agent/agentmqtt.cfg index 99de7bad..1d0cffa6 100644 --- a/demo/compose/agent/agentmqtt.cfg +++ b/demo/compose/agent/agentmqtt.cfg @@ -1,9 +1,8 @@ Devices = Devices.xml SchemaVersion = 2.7 WorkerThreads = 3 -MonitorConfigFiles = yes Port = 5000 -JsonVersion = 1 +JsonVersion = 2 MinCompressFileSize = 10k diff --git a/demo/styles/styles.xsl b/demo/styles/styles.xsl index 83737edd..c4fd80b0 100644 --- a/demo/styles/styles.xsl +++ b/demo/styles/styles.xsl @@ -1,7 +1,7 @@ diff --git a/src/mtconnect/sink/rest_sink/session_impl.cpp b/src/mtconnect/sink/rest_sink/session_impl.cpp index f188dd4d..d9721763 100644 --- a/src/mtconnect/sink/rest_sink/session_impl.cpp +++ b/src/mtconnect/sink/rest_sink/session_impl.cpp @@ -302,11 +302,15 @@ namespace mtconnect::sink::rest_sink { m_complete = complete; m_mimeType = mimeType; m_streaming = true; + + auto now = std::chrono::floor(std::chrono::system_clock::now()); + std::string date = std::format("{:%a, %d %b %Y %T} GMT", now); auto res = make_shared>(status::ok, 11); m_response = res; res->chunked(true); res->set(field::server, "MTConnectAgent"); + res->set(field::date, date); res->set(field::connection, "close"); res->set(field::content_type, "multipart/mixed;boundary=" + m_boundary); res->set(field::expires, "-1"); @@ -361,6 +365,10 @@ namespace mtconnect::sink::rest_sink { void SessionImpl::addHeaders(const Response &response, Message &res) { res->set(http::field::server, "MTConnectAgent"); + auto now = std::chrono::floor(std::chrono::system_clock::now()); + std::string date = std::format("{:%a, %d %b %Y %T} GMT", now); + res->set(http::field::date, date); + if (response.m_close || m_close) res->set(http::field::connection, "close"); if (response.m_expires == 0s) diff --git a/test_package/cutting_tool_test.cpp b/test_package/cutting_tool_test.cpp index 17989ba9..b4881678 100644 --- a/test_package/cutting_tool_test.cpp +++ b/test_package/cutting_tool_test.cpp @@ -635,6 +635,107 @@ TEST_F(CuttingToolTest, test_extended_cutting_item) sdoc); } +TEST_F(CuttingToolTest, test_extended_cutting_tool_with_json_v2) +{ + const auto doc = + R"DOC( + + + AVAILABLE + + 10 + 13 + + + 0 + 0 + 0 + + AVAILABLE + + 0 + + + + +)DOC"; + + ErrorList errors; + entity::XmlParser parser; + + auto entity = parser.parse(Asset::getRoot(), doc, errors); + ASSERT_EQ(0, errors.size()); + + auto asset = dynamic_cast(entity.get()); + ASSERT_NE(nullptr, asset); + + entity::JsonEntityPrinter jprinter(2, true); + auto jdoc = jprinter.print(entity); + + EXPECT_EQ(R"({ + "CuttingTool": { + "CuttingToolLifeCycle": { + "CutterStatus": { + "Status": [ + { + "value": "AVAILABLE" + } + ] + }, + "CuttingItems": { + "CuttingItem": [ + { + "ItemLife": [ + { + "value": 0.0, + "countDirection": "UP", + "initial": 0.0, + "limit": 0.0, + "type": "PART_COUNT" + }, + { + "value": 0.0, + "countDirection": "UP", + "initial": 0.0, + "limit": 0.0, + "type": "MINUTES" + }, + { + "value": 0.0, + "countDirection": "UP", + "initial": 0.0, + "limit": 0.0, + "type": "WEAR" + } + ], + "indices": "1", + "x:ItemCutterStatus": { + "Status": "AVAILABLE", + "xmlns:x": "okuma.com:OkumaToolAssets" + }, + "x:ItemProgramToolGroup": { + "value": "0", + "xmlns:x": "okuma.com:OkumaToolAssets" + } + } + ], + "count": 12 + }, + "Location": { + "value": "13", + "negativeOverlap": 0, + "positiveOverlap": 0, + "type": "POT" + }, + "ProgramToolNumber": "10" + }, + "assetId": "123456.10", + "serialNumber": "10", + "toolId": "123456" + } +})", jdoc); +} + TEST_F(CuttingToolTest, test_xmlns_with_top_element_alias) { const auto doc = From a572af24d778098c949bc6760a5caeddfb8030c3 Mon Sep 17 00:00:00 2001 From: William Sobel Date: Wed, 29 Apr 2026 22:09:54 +0200 Subject: [PATCH 5/5] Update gcc profile --- conan/profiles/gcc | 3 --- 1 file changed, 3 deletions(-) diff --git a/conan/profiles/gcc b/conan/profiles/gcc index cac1ad8f..ad4ed21f 100644 --- a/conan/profiles/gcc +++ b/conan/profiles/gcc @@ -3,6 +3,3 @@ include(default) [settings] compiler.libcxx=libstdc++11 compiler.cppstd=20 - -[system_tools] -cmake/>3.23.0 \ No newline at end of file