summaryrefslogtreecommitdiffstats
path: root/src/gtest
diff options
context:
space:
mode:
authorIdo Barnea <ibarnea@cisco.com>2016-11-22 18:03:52 +0200
committerIdo Barnea <ibarnea@cisco.com>2016-11-22 18:03:52 +0200
commit31a4ef5afc56c5d6ff6870da71a954e4bcbee057 (patch)
tree64b4feac4e912c1a0cfce9e6278cc6611cd3b590 /src/gtest
parent4a2d56b6a04833b78d2d1b6fe50a4a4f54a049ec (diff)
client config gtest
Signed-off-by: Ido Barnea <ibarnea@cisco.com>
Diffstat (limited to 'src/gtest')
-rw-r--r--src/gtest/client_cfg_test.cpp186
1 files changed, 186 insertions, 0 deletions
diff --git a/src/gtest/client_cfg_test.cpp b/src/gtest/client_cfg_test.cpp
new file mode 100644
index 00000000..1e84e1d5
--- /dev/null
+++ b/src/gtest/client_cfg_test.cpp
@@ -0,0 +1,186 @@
+/*
+ Ido Barnea
+
+ Cisco Systems, Inc.
+*/
+
+/*
+Copyright (c) 2016-2016 Cisco Systems, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+#include <stdio.h>
+#include "../bp_sim.h"
+#include <common/gtest.h>
+#include <common/basic_utils.h>
+
+class basic_client_cfg : public testing::Test {
+ protected:
+ virtual void SetUp() {
+ }
+ virtual void TearDown() {
+ }
+ public:
+};
+
+TEST_F(basic_client_cfg, test1) {
+ uint32_t ip_start = 0x10010101;
+ uint32_t ip_end = 0x100101ff;
+ uint32_t next_hop_init = 0x01010101;
+ uint32_t next_hop_resp = 0x02020202;
+ uint16_t vlan_init = 5;
+ uint16_t vlan_resp = 7;
+ uint32_t dual_if_mask = 0x01000000;
+ uint32_t test_count = 2;
+ ClientCfgDB cfg_db;
+ ClientCfgDB test_db;
+ ClientCfgEntry cfg_ent;
+ ClientCfgExt cfg_ext;
+ std::vector<ClientCfgCompactEntry *> ent_list;
+ struct CTupleGenPoolYaml c_pool;
+
+ // Create tuple gen, so we can have ip->port translation
+ CTupleGenYamlInfo tg_yam_info;
+ struct CTupleGenPoolYaml s_pool;
+ s_pool.m_ip_start = ip_start;
+ s_pool.m_ip_end = ip_end;
+ s_pool.m_dual_interface_mask = dual_if_mask;
+ tg_yam_info.m_client_pool.push_back(s_pool);
+
+ CGlobalInfo::m_options.m_expected_portd = 4;
+ printf("Expected ports %d\n", CGlobalInfo::m_options.m_expected_portd);
+
+ std::string tmp_file_name = "/tmp/client_cfg_gtest.yaml";
+ FILE *fd = fopen(tmp_file_name.c_str(), "w");
+
+ if (fd == NULL) {
+ fprintf(stderr, "Failed opening %s file for write\n", tmp_file_name.c_str());
+ }
+
+ // We create config file with 3 groups (Should match 6 ports).
+ cfg_ext.m_initiator.set_next_hop(next_hop_init);
+ cfg_ext.m_responder.set_next_hop(next_hop_resp);
+ cfg_ext.m_initiator.set_vlan(vlan_init);
+ cfg_ext.m_responder.set_vlan(vlan_resp);
+
+ cfg_ent.set_params(ip_start, ip_end, test_count);
+ cfg_ent.set_cfg(cfg_ext);
+
+ // first group
+ cfg_db.set_vlan(true);
+ cfg_db.add_group(ip_start, cfg_ent);
+
+ //second group
+ cfg_ent.set_params(ip_start + dual_if_mask, ip_end + dual_if_mask
+ , test_count);
+ cfg_db.add_group(ip_start + dual_if_mask, cfg_ent);
+
+ // third group
+ cfg_ent.set_params(ip_start + 2 * dual_if_mask, ip_end + 2 * dual_if_mask
+ , test_count);
+ cfg_db.add_group(ip_start + dual_if_mask * 2, cfg_ent);
+
+ cfg_db.dump(fd);
+ fclose(fd);
+ test_db.load_yaml_file(tmp_file_name);
+ test_db.set_tuple_gen_info(&tg_yam_info);
+ test_db.get_entry_list(ent_list);
+
+
+ // We expect ports for first two groups to be found.
+ // This group addresses should not appear in the list, since
+ // we simulate system with only 4 ports
+ int i = 0;
+ for (std::vector<ClientCfgCompactEntry *>::iterator
+ it = ent_list.begin(); it != ent_list.end(); it++) {
+ uint8_t port = (*it)->get_port();
+ uint16_t vlan = (*it)->get_vlan();
+ uint32_t count = (*it)->get_count();
+ uint32_t dst_ip = (*it)->get_dst_ip();
+
+ assert(count == test_count);
+ switch(i) {
+ case 0:
+ case 2:
+ assert(port == i);
+ assert(vlan == vlan_init);
+ assert(dst_ip == next_hop_init);
+ break;
+ case 1:
+ case 3:
+ assert(port == i);
+ assert(vlan == vlan_resp);
+ assert(dst_ip == next_hop_resp);
+ break;
+ default:
+ fprintf(stderr, "Test failed. Too many entries returned\n");
+ exit(1);
+ }
+ i++;
+ delete *it;
+ }
+
+ // Simulate the pre test phase, and hand results to client config
+ CManyIPInfo many_ip;
+ MacAddress mac0, mac1, mac2, mac3;
+ mac0.set(0x0, 0x1, 0x2, 0x3, 0x4, 0);
+ mac1.set(0x0, 0x1, 0x2, 0x3, 0x4, 0x1);
+ mac2.set(0x0, 0x1, 0x2, 0x3, 0x4, 0x2);
+ mac3.set(0x0, 0x1, 0x2, 0x3, 0x4, 0x3);
+ COneIPv4Info ip0_1(next_hop_init, vlan_init, mac0, 0);
+ COneIPv4Info ip0_2(next_hop_init + 1, vlan_init, mac1, 0);
+ COneIPv4Info ip1_1(next_hop_resp, vlan_resp, mac2, 1);
+ COneIPv4Info ip1_2(next_hop_resp + 1, vlan_resp, mac3, 1);
+
+ many_ip.insert(ip0_1);
+ many_ip.insert(ip0_2);
+ many_ip.insert(ip1_1);
+ many_ip.insert(ip1_2);
+
+ test_db.set_resolved_macs(many_ip);
+
+ ClientCfgBase cfg0;
+
+ ClientCfgEntry *ent0 = test_db.lookup(ip_start);
+ ClientCfgEntry *ent1 = test_db.lookup(ip_start + dual_if_mask);
+
+ assert (ent0 != NULL);
+ ent0->assign(cfg0);
+ assert (!memcmp(cfg0.m_initiator.get_dst_mac_addr()
+ , mac0.GetConstBuffer(), ETHER_ADDR_LEN));
+ ent0->assign(cfg0);
+ assert (!memcmp(cfg0.m_initiator.get_dst_mac_addr()
+ , mac1.GetConstBuffer(), ETHER_ADDR_LEN));
+ ent0->assign(cfg0);
+ assert (!memcmp(cfg0.m_responder.get_dst_mac_addr()
+ , mac2.GetConstBuffer(), ETHER_ADDR_LEN));
+ ent0->assign(cfg0);
+ assert (!memcmp(cfg0.m_responder.get_dst_mac_addr()
+ , mac3.GetConstBuffer(), ETHER_ADDR_LEN));
+
+ assert(ent1 != NULL);
+ ent1->assign(cfg0);
+ assert (!memcmp(cfg0.m_initiator.get_dst_mac_addr()
+ , mac0.GetConstBuffer(), ETHER_ADDR_LEN));
+ ent1->assign(cfg0);
+ assert (!memcmp(cfg0.m_initiator.get_dst_mac_addr()
+ , mac1.GetConstBuffer(), ETHER_ADDR_LEN));
+ ent1->assign(cfg0);
+ assert (!memcmp(cfg0.m_responder.get_dst_mac_addr()
+ , mac2.GetConstBuffer(), ETHER_ADDR_LEN));
+ ent1->assign(cfg0);
+ assert (!memcmp(cfg0.m_responder.get_dst_mac_addr()
+ , mac3.GetConstBuffer(), ETHER_ADDR_LEN));
+
+}
+