{"id":3740,"date":"2021-11-15T10:25:47","date_gmt":"2021-11-15T08:25:47","guid":{"rendered":"https:\/\/zen-cori.138-201-132-86.plesk.page\/?p=3740"},"modified":"2022-08-26T18:08:26","modified_gmt":"2022-08-26T16:08:26","slug":"going-further-how-ford-is-testing-hand-coded-libraries-for-model-based-development-with-btc-and-jenkins","status":"publish","type":"post","link":"https:\/\/www.btc-embedded.com\/de\/going-further-how-ford-is-testing-hand-coded-libraries-for-model-based-development-with-btc-and-jenkins\/","title":{"rendered":"Automatic Test of AUTOSAR Code Replacement Library Routines at Ford Motor Company"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"3740\" class=\"elementor elementor-3740\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-3b5f0493 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"3b5f0493\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-559a247a\" data-id=\"559a247a\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b55a73b elementor-widget elementor-widget-text-editor\" data-id=\"b55a73b\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h2>The Journey \u2013 from idea to solution<\/h2><p>It seems like every day more and more software teams are developing software in a model-based way, using Simulink models and auto-generated c-code\u2026 and Ford is no different. Many low-level math and interpolation routines have been developed by the central software team as libraries that can be used by different production teams. In order to fulfill specific requirements on the code side, the c-code for these routines is hand-coded and the Code Replacement Library (CRL) can be used in model-based development to integrate the handwritten code files during the code generation process.<\/p><p>The problem with this process: even for simple algorithms, it\u2019s likely that the behavior on the model and code level aren\u2019t 100% match. This leads to errors down the line that can be a nightmare to analyze.<\/p><p>This journey takes us from the initial objective to a solid and automated test workflow. A journey is rarely straightforward from start to finish. But at the end of the day, the detours, hurdles, and discarded approaches find us appreciating the maturity and simplicity of the final result even more.<\/p><h5>Challenge #1: Catch Discrepancies<\/h5><div><p>Due to the hand-coded core algorithm, the MIL behavior (Simulink blocks) and the SIL behavior (hand coded function) can differ quite a lot.<br \/><em>-&gt;We need to test if model and code behavior are aligned!<\/em><\/p><h5 style=\"font-family: Inter, sans-serif; color: #63718e;\">Challenge #2: Create Tests<\/h5><p>For each function, we need a set of appropriate test cases which give us the needed confidence in the correct functionality. Interface coverage and structural MC\/DC coverage were defined as completeness criteria.<\/p><p><em>-&gt;We need a solution to systematically generate the needed tests using a fully automated process.<\/em><\/p><h5 style=\"font-family: Inter, sans-serif; color: #63718e;\">Challenge #3: Make it Scale<\/h5><p>There\u2019s high number of libraries which need to be tested in multiple Matlab versions. Any manual work is error prone and this would create a massive effort.<\/p><p><em>-&gt;The degree of automation must be as high as possible, otherwise the effort will be immense.<\/em><\/p><h5 style=\"font-family: Inter, sans-serif; color: #63718e;\">Challenge #4: Collaboration Effort<\/h5><p>The developed test models and verification and coverage results need to be reviewed by broad team of code developers, MBD testers and quality engineers to verify and reconcile differences.<\/p><p><em>-&gt;Solution must utilize state of the art of continuous integration development process.<\/em><\/p><h2 style=\"font-family: Inter, sans-serif; color: #63718e;\"><span style=\"font-family: inherit; font-size: 1.75rem; letter-spacing: 0px; background-color: var( --e-global-color-8c64e01 );\">Take 1: Anything can be scripted!<\/span><\/h2><p>Mohammad Kurdi and his team already had a lot of scripting in place to create the Simulink models for each library routine and hook it up with the correct handwritten c-file. Therefore, it was a natural next step to also write the logic that creates test cases for the desired input combinations and use those for a back-to-back test MIL vs. SIL.<\/p><p>However, after some initial success this approach proved very demanding. A lot of special corner cases and advanced scenarios needed to be handled. The effort for an algorithm that calculates the desired input combinations was acceptable but in addition, implementing simulation on MIL and SIL, handling tolerances and integrating tools for coverage measurement, etc. would add a huge overhead.<\/p><p>The scripting effort would indeed get out of hand. It is not a trivial task to write a test tool with a bunch of scripts, even when focusing on a single use case. What is more: in addition to the m-scripts, a Jenkins Pipeline script will eventually be required.<\/p><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7546f12 elementor-widget elementor-widget-image\" data-id=\"7546f12\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"459\" height=\"430\" src=\"https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2021\/11\/AUTOSAR-Library-Routins-at-Ford-Scripting-Approach.png\" class=\"attachment-large size-large wp-image-10000\" alt=\"AUTOSAR Library Routins at Ford - Scripting Approach\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-46fc417 elementor-widget elementor-widget-text-editor\" data-id=\"46fc417\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 style=\"font-family: Inter, sans-serif; color: #63718e;\">Take 2: Semi-Automatic<\/h3><p>It\u2019s common to find teams at Ford using BTC EmbeddedTester for MIL\/SIL tests of their software. Also, the team that writes the hand-coded implementations for these standardized libraries performs their requirements-based testing with BTC.<br \/><br \/><\/p><p>So, the next approach was to bring the script-generated vectors for the input combinations into BTC and perform the respective test steps there:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fd48432 elementor-widget elementor-widget-text-editor\" data-id=\"fd48432\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul style=\"font-size: 16px;\"><li style=\"font-size: 16px;\">Matlab<br><ul style=\"font-size: 16px;\"><li style=\"font-size: 16px;\">Run script to generate input combination vectors (produces CSV files)<\/li><\/ul><\/li><li style=\"font-size: 16px;\">BTC:<br><ul style=\"font-size: 16px;\"><li style=\"font-size: 16px;\">Create test project that knows about the model, the hand-written code and how they relate to each other<\/li><li style=\"font-size: 16px;\">Import CSV files (input combinations and manual vectors)<\/li><li style=\"font-size: 16px;\">Run Back-to-Back test MIL vs. SIL (MIL runs via Matlab)<\/li><li style=\"font-size: 16px;\">Create reports (B2B report, Coverage Report)<\/li><\/ul><\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0aee30a elementor-widget elementor-widget-text-editor\" data-id=\"0aee30a\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>After some initial work, Thabo Krick from BTC became involved and proposed to automate the process via Jenkins. After all, the process was still far from perfect because:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c046194 elementor-widget elementor-widget-text-editor\" data-id=\"c046194\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul style=\"font-size: 16px;\">\n<li style=\"font-size: 16px;\">Each test run generated a number of reports for each model. Having hundreds of these models, it was not possible to get a decent overview.<\/li><li style=\"font-size: 16px;\">Also, the coverage reports showed that \u2013 even on these rather simple libraries \u2013 the script-based input combinations often didn\u2019t cover all parts of the code.<\/li><li style=\"font-size: 16px;\">Automating the process was challenging because we needed to talk to Matlab (m-script to generate the input combinations) and BTC (testing on MIL and SIL), while exchanging data between both tools.<\/li>\n<\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fbb948c elementor-widget elementor-widget-text-editor\" data-id=\"fbb948c\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 style=\"font-family: Inter, sans-serif; color: #63718e;\">Take 3: Full Throttle<\/h3><p>The discussions that followed produced a workflow, which was fully automated in a Jenkins Pipeline purely relying on the BTC Pipeline steps.<\/p><p><br \/>Instead of a script-based approach to generate input combinations, BTC\u2019s User-defined Coverage Goals feature (UDCG) can be used. Based on the available interface, UDCGs allow us to define a Boolean expression describing a state. The stimuli vector generation capabilities in BTC EmbeddedPlatform mathematically will ensure these goals are met. The BTC Jenkins plug-in provides a function that dramatically simplifies the expression of all desired input combinations.<\/p><p>Manually created test cases could optionally be included but are not essential for the workflow. Any gaps would be filled by the automatic test generation, configured to handle the desired input combinations (cover the User-defined Coverage Goals) and achieve 100% MCDC coverage.<br \/><br \/><\/p><p>Since each model was tested multiple times (for each Matlab version), the Pipeline contained two nested for-loops designed to reuse generated vectors to reduce the overall runtime.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-18fd452 elementor-widget elementor-widget-text-editor\" data-id=\"18fd452\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul style=\"font-size: 16px;\"><li style=\"font-size: 16px;\">For each Matlab version<br \/><ul style=\"font-size: 16px;\"><li style=\"font-size: 16px;\">For each model in the repo<br \/><ul style=\"font-size: 16px;\"><li style=\"font-size: 16px;\">Create Test Project<br \/><ul style=\"font-size: 16px;\"><li style=\"font-size: 16px;\">includes auto-code generation with integrated hand-code via CRL<\/li><li style=\"font-size: 16px;\">analyzes the model and code structure and the mapping between model and code interfaces (ports &lt;-&gt; variables, etc.)<\/li><li style=\"font-size: 16px;\">creates an annotated copy of the code for coverage measurement<\/li><\/ul><\/li><li style=\"font-size: 16px;\">Create Input Combinations (e.g., min\/max\/center) via UDCG<\/li><li style=\"font-size: 16px;\">[optional] Re-use existing test cases<\/li><li style=\"font-size: 16px;\">Generate vectors for input combinations &amp; MCDC<\/li><li style=\"font-size: 16px;\">Run Back-to-Back MIL vs. SIL with the selected Matlab version<\/li><li style=\"font-size: 16px;\">Create Report<\/li><\/ul><\/li><li style=\"font-size: 16px;\">Create Overview Report<\/li><\/ul><\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-869ba2f elementor-widget elementor-widget-text-editor\" data-id=\"869ba2f\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 style=\"font-family: Inter, sans-serif; color: #63718e;\">\u00a0Fully automated Jenkins Pipeline<\/h3><p>The resulting Pipeline was surprisingly simple: it checks out the repository, detects the models based on their file extension and invokes the test workflow for each model and Matlab version.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-adcddd6 elementor-widget elementor-widget-image\" data-id=\"adcddd6\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"723\" height=\"700\" src=\"https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2021\/11\/AUTOSAR-Library-Routins-at-Ford-Jenkins-Pipeline-Main-Script.png\" class=\"attachment-large size-large wp-image-10006\" alt=\"AUTOSAR Library Routins at Ford - Jenkins Pipeline Main Script\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7e6a3e7 elementor-widget elementor-widget-text-editor\" data-id=\"7e6a3e7\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>To keep the Pipeline easy to read, the test workflow can be defined in a separate method. With the PLL \u201cUDCG\u201d (line 78), the input combinations added above (line 69-71, as previously mentioned) are considered for the automatic test generation, alongside MCDC.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7a9e92b elementor-widget elementor-widget-image\" data-id=\"7a9e92b\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"800\" height=\"617\" src=\"https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2021\/11\/AUTOSAR-Library-Routins-at-Ford-Jenkins-Pipeline-BTC-Workflow.png\" class=\"attachment-large size-large wp-image-10009\" alt=\"AUTOSAR Library Routins at Ford - Jenkins Pipeline BTC Workflow\" srcset=\"https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2021\/11\/AUTOSAR-Library-Routins-at-Ford-Jenkins-Pipeline-BTC-Workflow.png 1191w, https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2021\/11\/AUTOSAR-Library-Routins-at-Ford-Jenkins-Pipeline-BTC-Workflow-768x593.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-86b73b5 elementor-widget elementor-widget-text-editor\" data-id=\"86b73b5\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>The following image shows us how the Pipeline was applied to different categories of library routines which made it easy to identify the areas that required further attention.<br><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0c349a9 elementor-widget elementor-widget-image\" data-id=\"0c349a9\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"435\" src=\"https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2021\/11\/AUTOSAR-Library-Routins-at-Ford-Jenkins-Pipeline-Results.png\" class=\"attachment-large size-large wp-image-10003\" alt=\"AUTOSAR Library Routins at Ford - Jenkins Pipeline Results\" srcset=\"https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2021\/11\/AUTOSAR-Library-Routins-at-Ford-Jenkins-Pipeline-Results.png 869w, https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2021\/11\/AUTOSAR-Library-Routins-at-Ford-Jenkins-Pipeline-Results-768x417.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-370e2bc elementor-widget elementor-widget-text-editor\" data-id=\"370e2bc\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h5 style=\"font-family: Inter, sans-serif; color: rgb(99, 113, 142);\">Reporting<\/h5><p>An overview report can be generated to serve as the entry point to quickly see the overall status. It\u2019s a high-level view with an aggregated PASSED \/ FAILED result and lists each project including its result, links to project-level report and to the project file for direct on-demand access to more details.For each combination of model &lt;-&gt; Matlab version, the project-level report lists the performed steps and results and links to further details.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-973b1c0 elementor-widget elementor-widget-image\" data-id=\"973b1c0\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"461\" src=\"https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2021\/11\/AUTOSAR-Library-Routins-at-Ford-Reporting.gif\" class=\"attachment-large size-large wp-image-9997\" alt=\"AUTOSAR Library Routins at Ford - Reporting\" srcset=\"https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2021\/11\/AUTOSAR-Library-Routins-at-Ford-Reporting.gif 1152w, https:\/\/www.btc-embedded.com\/wp-content\/uploads\/2021\/11\/AUTOSAR-Library-Routins-at-Ford-Reporting-768x443.gif 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a1ff07f elementor-widget elementor-widget-text-editor\" data-id=\"a1ff07f\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h2><span style=\"font-family: inherit; font-size: 1.75rem; letter-spacing: 0px; background-color: var( --e-global-color-8c64e01 );\">Summary<\/span><\/h2><p>The quality improvement on the library routines pays off, since it reduces the analysis and debugging effort for the production teams. Since the tested library routines can be used in most production models, there is tremendous benefit enjoyed from the effort of optimizing this process, both from the standpoint of reduced effort and improved software quality.<\/p><p>The project really took off after introducing the User-defined Coverage Goals in combination with the automatic test generation and back-to-back test. No manual steps are involved in the proposed test workflow which allows it to scale easily for larger projects if needed in future. It\u2019s also worth noting that when new Matlab are adopted, it will be possible to add new Matlab versions in a matter of seconds with a quick tweak to the script.<\/p><p><strong>We would also like to give additional thanks to Mohammad Kurdi for presenting this approach at the Ford-internal Software Quality Tech Day in May 2021.<\/strong><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>The Journey \u2013 from idea to solution It seems like every day more and more software teams are developing software in a model-based way, using Simulink models and auto-generated c-code\u2026 and Ford is no different. Many low-level math and interpolation routines have been developed by the central software team as libraries that can be used [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":9014,"comment_status":"open","ping_status":"closed","sticky":false,"template":"elementor_theme","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[52,54,49,48],"product":[],"use_cases":[],"class_list":["post-3740","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-autosar","tag-jenkins","tag-model-based-development","tag-simulink"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/posts\/3740","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/comments?post=3740"}],"version-history":[{"count":0,"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/posts\/3740\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/media\/9014"}],"wp:attachment":[{"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/media?parent=3740"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/categories?post=3740"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/tags?post=3740"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/product?post=3740"},{"taxonomy":"use_cases","embeddable":true,"href":"https:\/\/www.btc-embedded.com\/de\/wp-json\/wp\/v2\/use_cases?post=3740"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}