--- /dev/null
+*** Settings ***
+Documentation Robot keyword library (Resource) for common BGP actions concerned with counting prefixes.
+...
+... Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+...
+... This program and the accompanying materials are made available under the
+... terms of the Eclipse Public License v1.0 which accompanies this distribution,
+... and is available at http://www.eclipse.org/legal/epl-v10.html
+...
+...
+... Currently, all keywords count prefixes only in example-ipv4-topology.
+... Prefix is identified by simplistic regular expression on JSON data.
+...
+... This resource assumes that RequestsLibrary has open a connection named "operational"
+... which points to (an analogue of) http://${ODL_SYSTEM_IP}:${RESTCONFPORT}/${OPERATIONAL_API}
+Library RequestsLibrary
+Resource ${CURDIR}/WaitUtils.robot
+
+*** Keywords ***
+PC_Setup
+ [Documentation] Call dependency setups and construct suite variables.
+ WaitUtils.WU_Setup # includes ScalarClosures.SC_Setup
+ ${getter} = ScalarClosures.Closure_From_Keyword_And_Arguments Get_Ipv4_Topology_Count
+ BuiltIn.Set_Suite_Variable ${PrefixCounting__getter} ${getter}
+
+Get_Ipv4_Topology
+ [Documentation] GET the example-ipv4-topology data, check status is 200, return the topology data.
+ ...
+ ... Contrary to Utils.Get_Data_From_URI, this does not Log the (potentially huge) content.
+ ${response} = RequestsLibrary.Get_Request operational network-topology:network-topology/topology/example-ipv4-topology
+ Run_Keyword_If ${response.status_code} != 200 Fail Get on example-ipv4-topology returned status code ${response.status_code} with message: ${response.text}
+ [Return] ${response.text}
+
+Get_Ipv4_Topology_Count
+ [Documentation] Get topology. If not fail, return number of prefixes in the topology.
+ ${topology} = Get_Ipv4_Topology
+ # Triple quotes are precaution against formatted output.
+ ${prefix_count} = Builtin.Evaluate len(re.findall('"prefix":"', '''${topology}''')) modules=re
+ [Return] ${prefix_count}
+
+Check_Ipv4_Topology_Count
+ [Arguments] ${expected_count}
+ [Documentation] Check that the count of prefixes matches the expected count. Fails if it does not. In either case, collect garbage.
+ ${actual_count} = ScalarClosures.Run_Keyword_And_Collect_Garbage Get_Ipv4_Topology_Count
+ BuiltIn.Should_Be_Equal_As_Strings ${actual_count} ${expected_count}
+
+Check_Ipv4_Topology_Is_Empty
+ [Documentation] Example_Ipv4_Topology has to give status 200 with zero prefixes.
+ ...
+ ... Functional suites should use a more strict Keyword which tests for the whole JSON structure.
+ Check_Ipv4_Topology_Count 0
+
+Wait_For_Ipv4_Topology_Prefixes_To_Become_Stable
+ [Arguments] ${timeout}=60s ${period}=5s ${repetitions}=1 ${excluded_count}=-1
+ [Documentation] Each ${period} get prefix count. After ${repetitions} of stable different from ${excluded_count} within ${timeout}, Return validator output. Fail early on getter error.
+ # This is very similar to ChangeCounter keyword, but attempt to extract common code would increase overall code size.
+ ${validator} = ScalarClosures.Closure_From_Keyword_And_Arguments WaitUtils.Excluding_Stability_Safe_Stateful_Validator_As_Keyword state_holder data_holder excluded_value=${excluded_count}
+ ${result} = WaitUtils.Wait_For_Getter_Error_Or_Safe_Stateful_Validator_Consecutive_Success timeout=${timeout} period=${period} count=${repetitions} getter=${PrefixCounting__getter} safe_validator=${validator}
+ ... initial_state=${excluded_count}
+ [Return] ${result}