Magnesium support for mdsal netconf
[integration/test.git] / csit / suites / netconf / MDSAL / northbound.robot
1 *** Settings ***
2 Documentation     Metconf MDSAL Northbound test suite.
3 ...
4 ...               Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
5 ...
6 ...               This program and the accompanying materials are made available under the
7 ...               terms of the Eclipse Public License v1.0 which accompanies this distribution,
8 ...               and is available at http://www.eclipse.org/legal/epl-v10.html
9 ...
10 ...
11 ...               The request produced by test cases "Get Config Running", "Get Config Running
12 ...               To Confirm No_Edit Before Commit", "Get Config Running To Confirm Delete
13 ...               After Commit" and "Get Config Candidate To Confirm Discard" all use the same
14 ...               message id ("empty") for their requests. This is possible because the
15 ...               requests produced by this suite are strictly serialized. The RFC 6241 does
16 ...               not state that these IDs are unique, it only requires that each ID used is
17 ...               "XML attribute normalized" if the client wants it to be returned unmodified.
18 ...               The RFC specifically says that "the content of this attribute is not
19 ...               interpreted in any way, it only is stored to be returned with the reply to
20 ...               the request. The reuse of the "empty" string for the 4 test cases was chosen
21 ...               for simplicity.
22 ...
23 ...               TODO: Change the 4 testcases to use unique message IDs.
24 ...
25 ...               TODO: There are many sections with too many "Should_[Not_]Contain" keyword
26 ...               invocations (see Check_Multiple_Modules_Merge_Replace for a particularly bad
27 ...               example). Create a resource that will be able to extract the data from the
28 ...               requests and search for them in the response, then convert to usage of this
29 ...               resource (think "Thou shall not repeat yourself"). The following resource was
30 ...               found when doing research on this:
31 ...               http://robotframework.org/robotframework/latest/libraries/XML.html
32 Suite Setup       Setup_Everything
33 Suite Teardown    Teardown_Everything
34 Test Setup        SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
35 Test Teardown     SetupUtils.Teardown_Test_Show_Bugs_If_Test_Failed
36 Library           RequestsLibrary
37 Library           SSHLibrary
38 Library           String
39 Library           XML
40 Resource          ${CURDIR}/../../../libraries/CompareStream.robot
41 Resource          ${CURDIR}/../../../libraries/FailFast.robot
42 Resource          ${CURDIR}/../../../libraries/SetupUtils.robot
43 Resource          ${CURDIR}/../../../libraries/SSHKeywords.robot
44 Resource          ${CURDIR}/../../../libraries/Utils.robot
45 Variables         ${CURDIR}/../../../variables/Variables.py
46
47 *** Variables ***
48 ${datadir}        ${CURDIR}/../../../variables/netconf/MDSAL
49 ${dataext}        msg
50 ${ssh_netconf_pid}    -1
51
52 *** Test Cases ***
53 Connect_To_ODL_Netconf
54     [Documentation]    Connect to ODL Netconf and fail if that is not possible.
55     Create_ODL_Netconf_Connection
56     Open_ODL_Netconf_Connection
57
58 Get_Config_Running
59     [Documentation]    Make sure the configuration has only the default elements in it.
60     Check_Test_Objects_Not_Present_In_Config    get-config
61
62 Missing_Message_ID_Attribute
63     [Documentation]    Check that messages with missing "message-ID" attribute are rejected with the correct error (RFC 6241, section 4.1).
64     Perform_Test    missing-attr
65
66 Additional_Attributes_In_Message
67     [Documentation]    Check that additional attributes in messages are returned properly (RFC 6241, sections 4.1 and 4.2).
68     ${reply}=    Load_And_Send_Message    additional-attr
69     BuiltIn.Should_Contain    ${reply}    xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
70     BuiltIn.Should_Contain    ${reply}    message-id="1"
71     BuiltIn.Should_Contain    ${reply}    attribute="something"
72     BuiltIn.Should_Contain    ${reply}    additional="otherthing"
73     BuiltIn.Should_Contain    ${reply}    xmlns:prefix="http://www.example.com/my-schema-example.html"
74
75 Send_Stuff_In_Undefined_Namespace
76     [Documentation]    Try to send something within an undefined namespace and check the reply complains about the nonexistent namespace and element.
77     ${reply}=    Load_And_Send_Message    merge-nonexistent-namespace
78     SetupUtils.Set_Known_Bug_Id    5125
79     BuiltIn.Should_Not_Contain    ${reply}    java.lang.NullPointerException
80     SetupUtils.Set_Unknown_Bug_Id
81     BuiltIn.Should_Contain    ${reply}    urn:this:is:in:a:nonexistent:namespace
82     BuiltIn.Should_Contain    ${reply}    <rpc-error>
83
84 Edit_Config_First_Batch_Merge
85     [Documentation]    Request a "merge" operation adding an element in candidate configuration and check the reply.
86     Perform_Test    merge-1
87
88 Get_Config_Running_To_Confirm_No_Edit_Before_Commit
89     [Documentation]    Make sure the running configuration is still unchanged as the change was not commited yet.
90     Check_Test_Objects_Not_Present_In_Config    get-config-no-edit-before-commit
91
92 Commit_Edit
93     [Documentation]    Commit the change and check the reply.
94     Perform_Test    commit-edit
95
96 First_Batch_In_Config_Running_To_Confirm_Edit_After_Commit
97     [Documentation]    Check that the change is now in the configuration.
98     ${reply}=    Load_And_Send_Message    get-config-edit-after-commit
99     Check_First_Batch_Data_Present    ${reply}
100
101 Terminate_Connection_Gracefully
102     [Documentation]    Close the session and disconnect.
103     Close_ODL_Netconf_Connection_Gracefully
104
105 Reconnect_To_ODL_Netconf_After_Graceful_Session_End
106     [Documentation]    Reconnect to ODL Netconf and fail if that is not possible.
107     Open_ODL_Netconf_Connection
108
109 First_Batch_In_Config_Running_After_Reconnect
110     [Documentation]    Check that the change is now in the configuration.
111     ${reply}=    Load_And_Send_Message    get-config-edit-after-commit
112     Check_First_Batch_Data_Present    ${reply}
113
114 Edit_Config_Create_Shall_Fail_Now
115     [Documentation]    Request a "create" operation of an element that already exists and check that it fails with the correct error (RFC 6241, section 7.2, operation "create").
116     Perform_Test    create
117
118 Delete_First_Batch
119     [Documentation]    Delete the created element from the candidate configuration and check the reply.
120     Perform_Test    delete
121
122 Get_Config_Running_To_Confirm_No_Delete_Before_Commit
123     [Documentation]    Make sure the element is still present in the running configuration as the delete command was not committed yet.
124     ${reply}=    Load_And_Send_Message    get-config-no-delete-before-commit
125     Check_First_Batch_Data_Present    ${reply}
126
127 Commit_Delete
128     [Documentation]    Commit the deletion of the element and check the reply.
129     Perform_Test    commit-delete
130
131 Get_Config_Running_To_Confirm_Delete_After_Commit
132     [Documentation]    Check that the element is gone.
133     Check_Test_Objects_Not_Present_In_Config    get-config-delete-after-commit
134
135 Commit_No_Transaction
136     [Documentation]    Attempt to perform "commit" when there are no changes in the candidate configuration and check that it returns OK status.
137     Perform_Test    commit-no-transaction
138     [Teardown]    Utils.Report_Failure_Due_To_Bug    4455
139
140 Edit_Config_Second_Batch_Merge
141     [Documentation]    Create an element to be discarded and check the reply.
142     Perform_Test    merge-2
143
144 Get_And_Check_Config_Candidate_For_Discard
145     [Documentation]    Check that the element to be discarded is present in the candidate configuration.
146     ${reply}=    Load_And_Send_Message    get-config-candidate
147     Check_First_Batch_Data_Not_Present    ${reply}
148     Check_Second_Batch_Data_Present    ${reply}
149
150 Discard_Changes_Using_Discard_Request
151     [Documentation]    Ask the server to discard the candidate and check the reply.
152     Perform_Test    commit-discard
153
154 Get_And_Check_Config_Candidate_To_Confirm_Discard
155     [Documentation]    Check that the element was really discarded.
156     Check_Test_Objects_Not_Present_In_Config    get-config-candidate-discard
157
158 Edit_Config_Multiple_Batch_Merge_Create
159     [Documentation]    Use a create request with the third batch to create the infrastructure.
160     Perform_Test    merge-multiple-create
161
162 Edit_Config_Multiple_Batch_Merge_Third
163     [Documentation]    Use a create request with the third batch to create the infrastructure.
164     Perform_Test    merge-multiple-1
165
166 Edit_Config_Multiple_Batch_Merge_Fourth
167     [Documentation]    Use a merge request with the third batch to create the infrastructure.
168     Perform_Test    merge-multiple-2
169
170 Edit_Config_Multiple_Batch_Merge_Fifth
171     [Documentation]    Add a "name4" subelement to the element and check the reply.
172     Perform_Test    merge-multiple-3
173
174 Commit_Multiple_Merge
175     [Documentation]    Commit the changes and check the reply.
176     Perform_Test    merge-multiple-commit
177
178 Multiple_Batch_Data_In_Running_Config
179     [Documentation]    Check that the 3 subelements are now present in the running configuration.
180     ${reply}=    Load_And_Send_Message    merge-multiple-check
181     Check_Multiple_Batch_Data_Present    ${reply}
182
183 Abort_Connection_To_Simulate_Session_Failure
184     [Documentation]    Simulate session failure by disconnecting without terminating the session.
185     Abort_ODL_Netconf_Connection
186
187 Reconnect_To_ODL_Netconf_After_Session_Failure
188     [Documentation]    Reconnect to ODL Netconf and fail if that is not possible.
189     Open_ODL_Netconf_Connection
190
191 Multiple_Batch_Data_In_Running_Config_After_Session_Failure
192     [Documentation]    Check that the 3 subelements are now present in the running configuration.
193     ${reply}=    Load_And_Send_Message    merge-multiple-check
194     Check_Multiple_Batch_Data_Present    ${reply}
195
196 Edit_Multiple_Merge_Data
197     [Documentation]    Add another subelement named "test" to the element and check the reply.
198     Perform_Test    merge-multiple-edit
199
200 Commit_Multiple_Modules_Merge_Edit
201     [Documentation]    Commit the addition of the "test" subelement and check the reply.
202     Perform_Test    merge-multiple-edit-commit
203
204 Check_Multiple_Modules_Merge_Edit
205     [Documentation]    Check that the "test" subelement exists and has correct value for "port" subelement.
206     ${reply}=    Load_And_Send_Message    merge-multiple-edit-check
207     BuiltIn.Should_Contain    ${reply}    <id>test</id>
208     BuiltIn.Should_Contain    ${reply}    <model>Dixi</model>
209     BuiltIn.Should_Contain    ${reply}    <manufacturer>BMW</manufacturer>
210     BuiltIn.Should_Contain    ${reply}    <year>1928</year>
211
212 Update_Multiple_Modules_Merge
213     [Documentation]    Update the value of the "port" subelement of the "test" subelement and check the reply.
214     Perform_Test    merge-multiple-update
215
216 Commit_Multiple_Modules_Merge_Update
217     [Documentation]    Commit the update and check the reply.
218     Perform_Test    merge-multiple-update-commit
219
220 Check_Multiple_Modules_Merge_Update
221     [Documentation]    Check that the value of the "port" was really updated.
222     ${reply}=    Load_And_Send_Message    merge-multiple-update-check
223     BuiltIn.Should_Contain    ${reply}    <id>test</id>
224     BuiltIn.Should_Contain    ${reply}    <model>Bentley Speed Six</model>
225     BuiltIn.Should_Contain    ${reply}    <manufacturer>Bentley</manufacturer>
226     BuiltIn.Should_Contain    ${reply}    <year>1930</year>
227     BuiltIn.Should_Not_Contain    ${reply}    <model>Dixi</model>
228     BuiltIn.Should_Not_Contain    ${reply}    <manufacturer>BMW</manufacturer>
229     BuiltIn.Should_Not_Contain    ${reply}    <year>1928</year>
230
231 Replace_Multiple_Modules_Merge
232     [Documentation]    Replace the content of the "test" with another completely different and check the reply.
233     Perform_Test    merge-multiple-replace
234
235 Commit_Multiple_Modules_Merge_Replace
236     [Documentation]    Commit the replace and check the reply.
237     Perform_Test    merge-multiple-replace-commit
238
239 Check_Multiple_Modules_Merge_Replace
240     [Documentation]    Check that the new content is there and the old content is gone.
241     ${reply}=    Load_And_Send_Message    merge-multiple-replace-check
242     BuiltIn.Should_Contain    ${reply}    <id>REPLACE</id>
243     BuiltIn.Should_Contain    ${reply}    <manufacturer>FIAT</manufacturer>
244     BuiltIn.Should_Contain    ${reply}    <model>Panda</model>
245     BuiltIn.Should_Contain    ${reply}    <year>2003</year>
246     BuiltIn.Should_Contain    ${reply}    <car-id>REPLACE</car-id>
247     BuiltIn.Should_Not_Contain    ${reply}    <id>TOY001</id>
248     BuiltIn.Should_Not_Contain    ${reply}    <id>CUST001</id>
249     BuiltIn.Should_Not_Contain    ${reply}    <car-id>TOY001</car-id>
250     BuiltIn.Should_Not_Contain    ${reply}    <person-id>CUST001</person-id>
251     BuiltIn.Should_Not_Contain    ${reply}    <id>OLD001</id>
252     BuiltIn.Should_Not_Contain    ${reply}    <id>CUST002</id>
253     BuiltIn.Should_Not_Contain    ${reply}    <car-id>OLD001</car-id>
254     BuiltIn.Should_Not_Contain    ${reply}    <person-id>CUST002</person-id>
255     BuiltIn.Should_Not_Contain    ${reply}    <id>CAROLD</id>
256     BuiltIn.Should_Contain    ${reply}    <id>CUSTOLD</id>
257     BuiltIn.Should_Not_Contain    ${reply}    <car-id>CAROLD</car-id>
258     BuiltIn.Should_Not_Contain    ${reply}    <person-id>CUSTOLD</person-id>
259     BuiltIn.Should_Not_Contain    ${reply}    <id>CARYOUNG</id>
260     BuiltIn.Should_Contain    ${reply}    <id>CUSTYOUNG</id>
261     BuiltIn.Should_Not_Contain    ${reply}    <car-id>CARYOUNG</car-id>
262     BuiltIn.Should_Contain    ${reply}    <person-id>CUSTYOUNG</person-id>
263     BuiltIn.Should_Not_Contain    ${reply}    <id>CARMID</id>
264     BuiltIn.Should_Contain    ${reply}    <id>CUSTMID</id>
265     BuiltIn.Should_Not_Contain    ${reply}    <car-id>CARMID</car-id>
266     BuiltIn.Should_Not_Contain    ${reply}    <person-id>CUSTMID</person-id>
267     BuiltIn.Should_Not_Contain    ${reply}    <id>CAROLD2</id>
268     BuiltIn.Should_Contain    ${reply}    <id>CUSTOLD2</id>
269     BuiltIn.Should_Not_Contain    ${reply}    <car-id>CAROLD2</car-id>
270     BuiltIn.Should_Not_Contain    ${reply}    <person-id>CUSTOLD2</person-id>
271     BuiltIn.Should_Not_Contain    ${reply}    <id>CUSTBAD</id>
272     BuiltIn.Should_Not_Contain    ${reply}    <id>test</id>
273
274 Remove_Test_Data
275     [Documentation]    Remove the testing elements and all their subelements and check the reply.
276     Perform_Test    merge-multiple-remove
277
278 Commit_Test_Data_Removal
279     [Documentation]    Commit the removal and check the reply.
280     Perform_Test    merge-multiple-remove-commit
281
282 Connector_Simplified_Pattern
283     [Documentation]    Several requests in a (simplified) pattern typical for requests from netconf-connector.
284     Perform_Test    none-replace
285     Perform_Test    commit-edit
286     Perform_Test    delete
287     Perform_Test    commit-edit
288
289 Test_Bug_7791
290     [Documentation]    Send (checking replies) series of netconf messages to trigger
291     ...    https://bugs.opendaylight.org/show_bug.cgi?id=7791
292     Perform_Test    bug7791-1
293     Perform_Test    bug7791-2
294     Perform_Test    commit-edit
295     Perform_Test    delete
296     Perform_Test    commit-edit
297     [Teardown]    Utils.Report_Failure_Due_To_Bug    7791
298
299 Delete_Not_Existing_Element
300     [Documentation]    Attempt to delete the elements again and check that it fails with the correct error.
301     Perform_Test    delete-not-existing
302
303 Commit_Delete_Not_Existing_Module
304     [Documentation]    Attempt to commit and check the reply.
305     Perform_Test    commit-no-transaction
306     [Teardown]    Utils.Report_Failure_Due_To_Bug    4455
307
308 Remove_Not_Existing_Module
309     [Documentation]    Attempt to remove the "module" element again and check that the operation is "silently ignored".
310     Perform_Test    remove-not-existing
311
312 Commit_Remove_Not_Existing_Module
313     [Documentation]    Attempt to commit and check the reply.
314     Perform_Test    remove-not-existing-commit
315     [Teardown]    Utils.Report_Failure_Due_To_Bug    4455
316
317 Close_Session
318     [Documentation]    Close the session and check that it was closed properly.
319     Perform_Test    close-session
320
321 *** Keywords ***
322 Get_Data
323     [Arguments]    ${name}
324     [Documentation]    Load the specified data from the data directory and return it.
325     ${data}=    OperatingSystem.Get_File    ${datadir}${/}${name}.${dataext}
326     [Return]    ${data}
327
328 Create_ODL_Netconf_Connection
329     [Arguments]    ${host}=${ODL_SYSTEM_IP}    ${port}=${ODL_NETCONF_MDSAL_PORT}    ${user}=${ODL_NETCONF_USER}    ${password}=${ODL_NETCONF_PASSWORD}
330     [Documentation]    Open a netconf connecion to the given machine.
331     # The "-s netconf" flag (see the "SSHLibrary.Write" line below)    is not
332     # supported by SSHLibrary, therefore we need to use this elaborate and
333     # pretty tricky way to connect to the ODL Netconf port.
334     # TODO: Extract into NetconfKeywords as there are other tests that are
335     #    going to need to use this operation (Netconf Performance and Scaling
336     #    comes to my mind now as one of the things tested is the performance
337     #    of the direct netconf connection.
338     # TODO: Make this keyword return a dictionary object with all the
339     #    data about the prepared connection neatly packaged. Make all
340     #    the other keywords handling the connection accept such an
341     #    object and pull the data out of it rather than relying on
342     #    global variables. This will allow for tracking more Netconf
343     #    connections, increasing utility.
344     ${control}=    SSHLibrary.Open_Connection    ${host}    prompt=${ODL_SYSTEM_PROMPT}    timeout=60s
345     SSHKeywords.Flexible_Controller_Login
346     BuiltIn.Set_Suite_Variable    ${ssh_control}    ${control}
347     ${netconf}=    SSHLibrary.Open_Connection    ${host}    prompt=${ODL_SYSTEM_PROMPT}    timeout=60s
348     SSHKeywords.Flexible_Controller_Login
349     BuiltIn.Set_Suite_Variable    ${ssh_netconf}    ${netconf}
350     BuiltIn.Set_Suite_Variable    ${ssh_port}    ${port}
351     BuiltIn.Set_Suite_Variable    ${ssh_user}    ${user}
352     BuiltIn.Set_Suite_Variable    ${ssh_password}    ${password}
353
354 Reopen_ODL_Netconf_Connection
355     [Documentation]    Reopen a closed netconf connection.
356     SSHLibrary.Write    sshpass -p ${ssh_password} ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no ${ssh_user}\@127.0.0.1 -p ${ssh_port} -s netconf
357     ${hello}=    SSHLibrary.Read_Until    ${ODL_NETCONF_PROMPT}
358     SSHLibrary.Switch_Connection    ${ssh_control}
359     ${pid}=    SSHLibrary.Execute_Command    ps -A | grep sshpass | cut -b 1-6
360     BuiltIn.Set_Suite_Variable    ${ssh_netconf_pid}    ${pid}
361     SSHLibrary.Switch_Connection    ${ssh_netconf}
362     [Return]    ${hello}
363
364 Open_ODL_Netconf_Connection
365     [Documentation]    Open a prepared netconf connecion.
366     ${hello}=    Reopen_ODL_Netconf_Connection
367     ${hello_message}=    Get_Data    hello
368     Transmit_Message    ${hello_message}
369     [Return]    ${hello}
370
371 Transmit_Message
372     [Arguments]    ${message}
373     [Documentation]    Transmit message to Netconf connection and discard the echo of the message.
374     SSHLibrary.Write    ${message}
375     SSHLibrary.Write    ${ODL_NETCONF_PROMPT}
376     SSHLibrary.Read_Until    ${ODL_NETCONF_PROMPT}
377
378 Send_Message
379     [Arguments]    ${message}
380     [Documentation]    Send message to Netconf connection and get the reply.
381     Transmit_Message    ${message}
382     ${reply}=    SSHLibrary.Read_Until    ${ODL_NETCONF_PROMPT}
383     [Return]    ${reply}
384
385 Prepare_For_Search
386     [Arguments]    ${searched_string}
387     [Documentation]    Prepare the specified string for searching in Netconf connection replies.
388     ...    The string passed to this keyword is coming from a data
389     ...    file which has different end of line conventions than
390     ...    the actual Netconf reply. This keyword patches the string
391     ...    to match what Netconf actually returns.
392     ${result}=    BuiltIn.Evaluate    "\\r\\n".join("""${searched_string}""".split("\\n"))
393     [Return]    ${result}
394
395 Load_And_Send_Message
396     [Arguments]    ${name}
397     [Documentation]    Load a message from the data file set, send it to Netconf and return the reply.
398     ${request}=    Get_Data    ${name}-request
399     ${reply}=    Send_Message    ${request}
400     [Return]    ${reply}
401
402 Load_Expected_Reply
403     [Arguments]    ${name}
404     [Documentation]    Load the expected reply from the data file set and return it.
405     ${expected_reply}=    Get_Data    ${name}-reply
406     [Return]    ${expected_reply}
407
408 Abort_ODL_Netconf_Connection
409     [Documentation]    Correctly close the Netconf connection and make sure it is really dead.
410     BuiltIn.Return_From_Keyword_If    ${ssh_netconf_pid} == -1
411     ${kill_command}=    BuiltIn.Set_Variable    kill ${ssh_netconf_pid}
412     BuiltIn.Set_Suite_Variable    ${ssh_netconf_pid}    -1
413     SSHLibrary.Switch_Connection    ${ssh_control}
414     SSHLibrary.Write    ${kill_command}
415     SSHLibrary.Read_Until_Prompt
416     SSHLibrary.Switch_Connection    ${ssh_netconf}
417     SSHLibrary.Read_Until_Prompt
418
419 Close_ODL_Netconf_Connection_Gracefully
420     Perform_Test    close-session
421     Abort_ODL_Netconf_Connection
422
423 Setup_Everything
424     [Documentation]    Setup resources and create session for Restconf checking.
425     SetupUtils.Setup_Utils_For_Setup_And_Teardown
426     RequestsLibrary.Create_Session    config    http://${ODL_SYSTEM_IP}:${RESTCONFPORT}${CONFIG_API}    auth=${AUTH}
427
428 Teardown_Everything
429     [Documentation]    Close the Netconf connection and destroy all sessions in the requests library.
430     Abort_ODL_Netconf_Connection
431     RequestsLibrary.Delete_All_Sessions
432
433 Check_First_Batch_Data
434     [Arguments]    ${reply}    ${keyword}
435     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>TOY001</id>
436     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CUST001</id>
437     BuiltIn.RunKeyword    ${keyword}    ${reply}    <car-id>TOY001</car-id>
438     BuiltIn.RunKeyword    ${keyword}    ${reply}    <person-id>CUST001</person-id>
439
440 Check_First_Batch_Data_Present
441     [Arguments]    ${reply}
442     Check_First_Batch_Data    ${reply}    BuiltIn.Should_Contain
443
444 Check_First_Batch_Data_Not_Present
445     [Arguments]    ${reply}
446     Check_First_Batch_Data    ${reply}    BuiltIn.Should_Not_Contain
447
448 Check_Second_Batch_Data
449     [Arguments]    ${reply}    ${keyword}
450     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>OLD001</id>
451     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CUST002</id>
452     BuiltIn.RunKeyword    ${keyword}    ${reply}    <car-id>OLD001</car-id>
453     BuiltIn.RunKeyword    ${keyword}    ${reply}    <person-id>CUST002</person-id>
454
455 Check_Second_Batch_Data_Present
456     [Arguments]    ${reply}
457     Check_Second_Batch_Data    ${reply}    BuiltIn.Should_Contain
458
459 Check_Multiple_Batch_Data
460     [Arguments]    ${reply}    ${keyword}
461     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CAROLD</id>
462     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CUSTOLD</id>
463     BuiltIn.RunKeyword    ${keyword}    ${reply}    <car-id>CAROLD</car-id>
464     BuiltIn.RunKeyword    ${keyword}    ${reply}    <person-id>CUSTOLD</person-id>
465     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CARYOUNG</id>
466     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CUSTYOUNG</id>
467     BuiltIn.RunKeyword    ${keyword}    ${reply}    <car-id>CARYOUNG</car-id>
468     BuiltIn.RunKeyword    ${keyword}    ${reply}    <person-id>CUSTYOUNG</person-id>
469     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CARMID</id>
470     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CUSTMID</id>
471     BuiltIn.RunKeyword    ${keyword}    ${reply}    <car-id>CARMID</car-id>
472     BuiltIn.RunKeyword    ${keyword}    ${reply}    <person-id>CUSTMID</person-id>
473     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CAROLD2</id>
474     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CUSTOLD2</id>
475     BuiltIn.RunKeyword    ${keyword}    ${reply}    <car-id>CAROLD2</car-id>
476     BuiltIn.RunKeyword    ${keyword}    ${reply}    <person-id>CUSTOLD2</person-id>
477
478 Check_Multiple_Batch_Data_Absent
479     [Arguments]    ${reply}
480     Check_Multiple_Batch_Data    ${reply}    BuiltIn.Should_not_Contain
481
482 Check_Multiple_Batch_Data_Present
483     [Arguments]    ${reply}
484     Check_Multiple_Batch_Data    ${reply}    BuiltIn.Should_Contain
485
486 Check_Auxiliary_Data
487     [Arguments]    ${reply}    ${keyword}
488     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CUSTBAD</id>
489     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>test</id>
490
491 Check_Test_Objects_Absent
492     [Arguments]    ${reply}
493     Check_First_Batch_Data_Not_Present    ${reply}
494     Check_Second_Batch_Data    ${reply}    BuiltIn.Should_not_Contain
495     Check_Multiple_Batch_Data_Absent    ${reply}
496     Check_Auxiliary_Data    ${reply}    BuiltIn.Should_not_Contain
497     BuiltIn.Should_not_Contain    ${reply}    <id>test</id>
498
499 Check_Test_Objects_Not_Present_In_Config
500     [Arguments]    ${name}
501     [Documentation]    Use dataset with the specified name to get the configuration and check that none of our test objects are there.
502     ${reply}=    Load_And_Send_Message    ${name}
503     Check_Test_Objects_Absent    ${reply}
504     BuiltIn.Should_not_Contain    ${reply}    <id>REPLACE</id>
505     [Return]    ${reply}
506
507 Perform_Test
508     [Arguments]    ${name}
509     [Documentation]    Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.
510     ${actual}=    Load_And_Send_Message    ${name}
511     ${expected}=    Load_Expected_Reply    ${name}
512     ${actual}=    String.Remove String    ${actual}    ]]>]]>
513     ${actual}=    String.Strip String    ${actual}    mode=both
514     XML.Elements Should Be Equal    ${actual}    ${expected}    normalize_whitespace=True
515     [Return]    ${actual}
516
517 Send_And_Check
518     [Arguments]    ${name}    ${expected}
519     ${actual}=    Load_And_Send_Message    ${name}
520     BuiltIn.Should_Be_Equal    ${expected}    ${actual}