1016 строки
27 KiB
C
1016 строки
27 KiB
C
|
/*
|
||
|
* Copyright (c) 2017 Amazon.com, Inc. or its affiliates. All Rights
|
||
|
* reserved.
|
||
|
* $COPYRIGHT$
|
||
|
*
|
||
|
* Additional copyrights may follow
|
||
|
*
|
||
|
* $HEADER$
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#include "opal_config.h"
|
||
|
|
||
|
#include "reachable_shared.h"
|
||
|
|
||
|
/* sigh; needs to match with code in reachable_weighted, but those
|
||
|
headers aren't installed. */
|
||
|
enum connection_quality {
|
||
|
CQ_NO_CONNECTION = 0,
|
||
|
CQ_PRIVATE_DIFFERENT_NETWORK = 50,
|
||
|
CQ_PRIVATE_SAME_NETWORK = 80,
|
||
|
CQ_PUBLIC_DIFFERENT_NETWORK = 90,
|
||
|
CQ_PUBLIC_SAME_NETWORK = 100
|
||
|
};
|
||
|
|
||
|
|
||
|
/* SUITE 1:
|
||
|
* Tests IPv4 connections by
|
||
|
* modifying ip addresses and
|
||
|
* subnet masks. Also tests
|
||
|
* IPv4->IPv6 and the other way
|
||
|
* around, to assure no connection
|
||
|
* is returned in that case.
|
||
|
*/
|
||
|
int ipv4_test()
|
||
|
{
|
||
|
opal_if_t *int1;
|
||
|
opal_if_t *int2;
|
||
|
int expected_result;
|
||
|
int result;
|
||
|
int test_no = 0;
|
||
|
int failed_no = 0;
|
||
|
|
||
|
/* TEST1
|
||
|
* Localhost to localhost. Since localhost range is not a
|
||
|
* private network (RFC1918), expected result is public
|
||
|
* same network.
|
||
|
*/
|
||
|
test_no++;
|
||
|
expected_result = CQ_PUBLIC_SAME_NETWORK;
|
||
|
int1 = create_if(AF_INET, "127.0.0.1", 24, 0);
|
||
|
int2 = create_if(AF_INET, "127.0.0.2", 0, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
/* TEST2
|
||
|
* Testing public same network with subnet mask
|
||
|
* 255.255.255.0
|
||
|
*/
|
||
|
test_no++;
|
||
|
expected_result = CQ_PUBLIC_SAME_NETWORK;
|
||
|
int1 = create_if(AF_INET, "31.14.15.92", 24, 0);
|
||
|
int2 = create_if(AF_INET, "31.14.15.27", 0, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
/* TEST3
|
||
|
* Testing public same network with subnet mask
|
||
|
* 255.255.0.0
|
||
|
*/
|
||
|
test_no++;
|
||
|
expected_result = CQ_PUBLIC_SAME_NETWORK;
|
||
|
int1 = create_if(AF_INET, "65.35.89.79", 16, 0);
|
||
|
int2 = create_if(AF_INET, "65.35.27.27", 0, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
/* TEST4
|
||
|
* Testing public same network with subnet mask
|
||
|
* 255.0.0.0
|
||
|
*/
|
||
|
test_no++;
|
||
|
expected_result = CQ_PUBLIC_SAME_NETWORK;
|
||
|
int1 = create_if(AF_INET, "3.23.84.62", 8, 0);
|
||
|
int2 = create_if(AF_INET, "3.27.27.27", 0, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
/* TEST5
|
||
|
* Testing public same network with subnet mask
|
||
|
* 0.0.0.0
|
||
|
*/
|
||
|
test_no++;
|
||
|
expected_result = CQ_PUBLIC_SAME_NETWORK;
|
||
|
int1 = create_if(AF_INET, "64.33.83.27", 0, 0);
|
||
|
int2 = create_if(AF_INET, "27.27.27.27", 0, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
/* TEST6
|
||
|
* Testing public different network with subnet mask
|
||
|
* 255.255.255.0
|
||
|
*/
|
||
|
test_no++;
|
||
|
expected_result = CQ_PUBLIC_DIFFERENT_NETWORK;
|
||
|
int1 = create_if(AF_INET, "95.2.88.41", 24, 0);
|
||
|
int2 = create_if(AF_INET, "95.2.27.27", 0, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
/* TEST7
|
||
|
* Testing public different network with subnet mask
|
||
|
* 255.255.0.0
|
||
|
*/
|
||
|
test_no++;
|
||
|
expected_result = CQ_PUBLIC_DIFFERENT_NETWORK;
|
||
|
int1 = create_if(AF_INET, "97.16.93.99", 16, 0);
|
||
|
int2 = create_if(AF_INET, "97.27.27.27", 0, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
/* TEST8
|
||
|
* Testing public different network with subnet mask
|
||
|
* 255.0.0.0
|
||
|
*/
|
||
|
test_no++;
|
||
|
expected_result = CQ_PUBLIC_DIFFERENT_NETWORK;
|
||
|
int1 = create_if(AF_INET, "37.51.5.82", 8, 0);
|
||
|
int2 = create_if(AF_INET, "27.27.27.27", 0, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
/* TEST9
|
||
|
* Testing private same network with subnet mask
|
||
|
* 255.255.255.0
|
||
|
*/
|
||
|
test_no++;
|
||
|
expected_result = CQ_PRIVATE_SAME_NETWORK;
|
||
|
int1 = create_if(AF_INET, "192.168.0.1", 24, 0);
|
||
|
int2 = create_if(AF_INET, "192.168.0.27", 0, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
/* TEST10
|
||
|
* Testing private same network with subnet mask
|
||
|
* 255.255.0.0
|
||
|
*/
|
||
|
test_no++;
|
||
|
expected_result = CQ_PRIVATE_SAME_NETWORK;
|
||
|
int1 = create_if(AF_INET, "192.168.0.1", 16, 0);
|
||
|
int2 = create_if(AF_INET, "192.168.27.27", 0, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed this test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
/* TEST11
|
||
|
* Testing private same network with subnet mask
|
||
|
* 255.0.0.0
|
||
|
*/
|
||
|
test_no++;
|
||
|
expected_result = CQ_PRIVATE_SAME_NETWORK;
|
||
|
int1 = create_if(AF_INET, "172.16.0.1", 8, 0);
|
||
|
int2 = create_if(AF_INET, "172.27.27.27", 0, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed this test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
/* TEST12
|
||
|
* Testing private same network with subnet mask
|
||
|
* 0.0.0.0
|
||
|
*/
|
||
|
test_no++;
|
||
|
expected_result = CQ_PRIVATE_SAME_NETWORK;
|
||
|
int1 = create_if(AF_INET, "192.168.0.1", 0, 0);
|
||
|
int2 = create_if(AF_INET, "10.27.27.27", 0, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
/* TEST13
|
||
|
* Testing private different network with subnet mask
|
||
|
* 255.255.255.0
|
||
|
*/
|
||
|
test_no++;
|
||
|
expected_result = CQ_PRIVATE_DIFFERENT_NETWORK;
|
||
|
int1 = create_if(AF_INET, "192.168.0.1", 24, 0);
|
||
|
int2 = create_if(AF_INET, "192.168.27.27", 0, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
/* TEST14
|
||
|
* Testing private different network with subnet mask
|
||
|
* 255.255.0.0
|
||
|
*/
|
||
|
test_no++;
|
||
|
expected_result = CQ_PRIVATE_DIFFERENT_NETWORK;
|
||
|
int1 = create_if(AF_INET, "192.168.0.1", 16, 0);
|
||
|
int2 = create_if(AF_INET, "10.1.0.1", 16, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
/* TEST15
|
||
|
* Testing private different network with subnet mask
|
||
|
* 255.0.0.0
|
||
|
*/
|
||
|
test_no++;
|
||
|
expected_result = CQ_PRIVATE_DIFFERENT_NETWORK;
|
||
|
int1 = create_if(AF_INET, "192.168.0.1", 8, 0);
|
||
|
int2 = create_if(AF_INET, "10.27.27.27", 0, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
/* TEST16
|
||
|
* Testing public to private with subnet mask
|
||
|
* 255.255.255.0
|
||
|
*/
|
||
|
test_no++;
|
||
|
expected_result = CQ_NO_CONNECTION;
|
||
|
int1 = create_if(AF_INET, "27.27.27.27", 24 , 0);
|
||
|
int2 = create_if(AF_INET, "192.168.0.1", 16, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
/* TEST17
|
||
|
* Testing private to public with subnet mask
|
||
|
* 255.255.255.0
|
||
|
*/
|
||
|
test_no++;
|
||
|
expected_result = CQ_NO_CONNECTION;
|
||
|
int1 = create_if(AF_INET, "192.168.0.1", 24, 0);
|
||
|
int2 = create_if(AF_INET, "27.27.27.27", 8, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
/* TEST18
|
||
|
* IPv4->IPv6
|
||
|
*/
|
||
|
expected_result = CQ_NO_CONNECTION;
|
||
|
int1 = create_if(AF_INET, "8.8.8.8", 24, 0);
|
||
|
int2 = create_if(AF_INET6, "2001:4860:4860:0:0:0:0:8888", 0, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
test_no++;
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
/* TEST19
|
||
|
* IPv6->IPv4
|
||
|
*/
|
||
|
expected_result = CQ_NO_CONNECTION;
|
||
|
int1 = create_if(AF_INET6, "2001:4860:4860:0:0:0:0:8888", 64, 0);
|
||
|
int2 = create_if(AF_INET, "8.8.8.8", 0, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
test_no++;
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
opal_output(0, "Finished Reachable IPv4 Tests. %d/%d successful", test_no-failed_no, test_no);
|
||
|
|
||
|
if (0 == failed_no) {
|
||
|
return 0;
|
||
|
} else {
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/* SUITE 2:
|
||
|
* Compares connections with different
|
||
|
* bandwidths to see ensure the
|
||
|
* relative ranking is as expected
|
||
|
*/
|
||
|
int ranking_test()
|
||
|
{
|
||
|
opal_if_t *int1;
|
||
|
opal_if_t *int2;
|
||
|
int result1;
|
||
|
int result2;
|
||
|
int test_no = 0;
|
||
|
int failed_no = 0;
|
||
|
|
||
|
/* TEST1
|
||
|
* Compares pairs with bandwidths 0->0 and 1->0.
|
||
|
* The former connection should be better, as
|
||
|
* there is a smaller difference in bandwidth
|
||
|
* (This is an edge case, but this behavior makes
|
||
|
* sense. We want 0->0 to still work, incase
|
||
|
* bandwidth was never set. Thus, the behavior
|
||
|
* for a->b where a = 0 and a != b should
|
||
|
* act the same as any other case, where
|
||
|
* a greater difference in leads to a greater
|
||
|
* penalty in bandwidth)
|
||
|
*/
|
||
|
test_no++;
|
||
|
|
||
|
int1 = create_if(AF_INET, "31.14.15.92", 24, 0);
|
||
|
int2 = create_if(AF_INET, "31.14.15.27", 0, 0);
|
||
|
result1 = run_single_test(int1, int2);
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
int1 = create_if(AF_INET, "31.14.15.92", 24, 1);
|
||
|
int2 = create_if(AF_INET, "31.14.15.27", 0, 0);
|
||
|
result2 = run_single_test(int1, int2);
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
if (!(result1 > result2)) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
|
||
|
/* TEST2
|
||
|
* Compares interface pairs with bandwidth 0->0 and 1->2.
|
||
|
* The latter should be better as it has greater bandwidth
|
||
|
*/
|
||
|
test_no++;
|
||
|
|
||
|
int1 = create_if(AF_INET, "31.14.15.92", 24, 0);
|
||
|
int2 = create_if(AF_INET, "31.14.15.27", 0, 0);
|
||
|
result1 = run_single_test(int1, int2);
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
int1 = create_if(AF_INET, "31.14.15.92", 24, 1);
|
||
|
int2 = create_if(AF_INET, "31.14.15.27", 0, 2);
|
||
|
result2 = run_single_test(int1, int2);
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
if (!(result1 < result2)) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
|
||
|
/* TEST3
|
||
|
* Compares interface pairs with bandwidth 1->2 and 1->1.
|
||
|
* The later should be better as there is a smaller
|
||
|
* difference in bandwidth
|
||
|
*/
|
||
|
test_no++;
|
||
|
|
||
|
int1 = create_if(AF_INET, "31.14.15.92", 24, 0);
|
||
|
int2 = create_if(AF_INET, "31.14.15.27", 0, 0);
|
||
|
result1 = run_single_test(int1, int2);
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
int1 = create_if(AF_INET, "31.14.15.92", 24, 1);
|
||
|
int2 = create_if(AF_INET, "31.14.15.27", 0, 1);
|
||
|
result2 = run_single_test(int1, int2);
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
if (!(result1 < result2)) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
|
||
|
/* TEST4
|
||
|
* Compares interface pairs with bandwidth 1->3 and 1->2.
|
||
|
* The later should be better as there is a smaller
|
||
|
* difference in bandwidth
|
||
|
*/
|
||
|
test_no++;
|
||
|
|
||
|
int1 = create_if(AF_INET, "31.14.15.92", 24, 1);
|
||
|
int2 = create_if(AF_INET, "31.14.15.27", 0, 3);
|
||
|
result1 = run_single_test(int1, int2);
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
int1 = create_if(AF_INET, "31.14.15.92", 24, 1);
|
||
|
int2 = create_if(AF_INET, "31.14.15.27", 0, 2);
|
||
|
result2 = run_single_test(int1, int2);
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
if (!(result1 < result2)) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
|
||
|
/* TEST5
|
||
|
* Compares interface pairs with bandwidth 1->10 and 1->3.
|
||
|
* The later should be better as there is less discrepancy
|
||
|
* in bandwidth
|
||
|
*/
|
||
|
test_no++;
|
||
|
|
||
|
int1 = create_if(AF_INET, "31.14.15.92", 24, 1);
|
||
|
int2 = create_if(AF_INET, "31.14.15.27", 0, 10);
|
||
|
result1 = run_single_test(int1, int2);
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
int1 = create_if(AF_INET, "31.14.15.92", 24, 1);
|
||
|
int2 = create_if(AF_INET, "31.14.15.27", 0, 3);
|
||
|
result2 = run_single_test(int1, int2);
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
if (!(result1 < result2)) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
|
||
|
/* TEST6
|
||
|
* Compares interface pairs with bandwidth 5->5 and 10->10.
|
||
|
* The later should be better as it has higher bandwidth
|
||
|
*/
|
||
|
test_no++;
|
||
|
|
||
|
int1 = create_if(AF_INET, "31.14.15.92", 24, 5);
|
||
|
int2 = create_if(AF_INET, "31.14.15.27", 0, 5);
|
||
|
result1 = run_single_test(int1, int2);
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
int1 = create_if(AF_INET, "31.14.15.92", 24, 10);
|
||
|
int2 = create_if(AF_INET, "31.14.15.27", 0, 10);
|
||
|
result2 = run_single_test(int1, int2);
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
if (!(result1 < result2)) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
|
||
|
/* TEST7
|
||
|
* Compares interface pairs with bandwidth 10->11 and 10->10.
|
||
|
* The later should be better as there is no discrepancy in
|
||
|
* bandwidth.
|
||
|
*/
|
||
|
test_no++;
|
||
|
|
||
|
int1 = create_if(AF_INET, "31.14.15.92", 24, 10);
|
||
|
int2 = create_if(AF_INET, "31.14.15.27", 0, 11);
|
||
|
result1 = run_single_test(int1, int2);
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
int1 = create_if(AF_INET, "31.14.15.92", 24, 10);
|
||
|
int2 = create_if(AF_INET, "31.14.15.27", 0, 10);
|
||
|
result2 = run_single_test(int1, int2);
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
if (!(result1 < result2)) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
|
||
|
/* TEST8
|
||
|
* Compares interface pairs with bandwidth 10->11 and 11->10.
|
||
|
* These connections should be equivilant, as they have the same
|
||
|
* bandwidth and same discrepancy.
|
||
|
*/
|
||
|
test_no++;
|
||
|
|
||
|
int1 = create_if(AF_INET, "31.14.15.92", 24, 10);
|
||
|
int2 = create_if(AF_INET, "31.14.15.27", 0, 11);
|
||
|
result1 = run_single_test(int1, int2);
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
int1 = create_if(AF_INET, "31.14.15.92", 24, 11);
|
||
|
int2 = create_if(AF_INET, "31.14.15.27", 0, 10);
|
||
|
result2 = run_single_test(int1, int2);
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
if (!(result1 == result2)) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
|
||
|
/* TEST9
|
||
|
* Compares interface pairs with bandwidth 10->14 and 11->15.
|
||
|
* The latter should be better as it has higher bandwidth.
|
||
|
*/
|
||
|
test_no++;
|
||
|
|
||
|
int1 = create_if(AF_INET, "31.14.15.92", 24, 10);
|
||
|
int2 = create_if(AF_INET, "31.14.15.27", 0, 14);
|
||
|
result1 = run_single_test(int1, int2);
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
int1 = create_if(AF_INET, "31.14.15.92", 24, 11);
|
||
|
int2 = create_if(AF_INET, "31.14.15.27", 0, 15);
|
||
|
result2 = run_single_test(int1, int2);
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
if (!(result1 < result2)) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
|
||
|
opal_output(0, "Finished Reachable Weighted Ranking Tests. %d/%d successful", test_no-failed_no, test_no);
|
||
|
if (0 == failed_no) {
|
||
|
return 0;
|
||
|
} else {
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/* SUITE 3:
|
||
|
* Tests interfaces lists of various sizes
|
||
|
* to ensure no crashes occur and results
|
||
|
* are outputted in proper order
|
||
|
*/
|
||
|
int loop_test()
|
||
|
{
|
||
|
int test_no = 0;
|
||
|
int failed_no = 0;
|
||
|
|
||
|
opal_list_t *if_list1, *if_list2;
|
||
|
opal_if_t *intf;
|
||
|
opal_reachable_t *results;
|
||
|
|
||
|
int i;
|
||
|
|
||
|
/* TEST1:
|
||
|
* Ensure opal_reachable doesn't crash
|
||
|
* when called with empty lists
|
||
|
*/
|
||
|
test_no++;
|
||
|
|
||
|
if_list1 = OBJ_NEW(opal_list_t);
|
||
|
if_list2 = OBJ_NEW(opal_list_t);
|
||
|
|
||
|
results = opal_reachable.reachable(if_list1, if_list2);
|
||
|
|
||
|
OBJ_RELEASE(if_list1);
|
||
|
OBJ_RELEASE(if_list2);
|
||
|
|
||
|
if (!(0 == results->num_local && 0 == results->num_remote)) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(results);
|
||
|
|
||
|
/* TEST2:
|
||
|
* Ensure opal_reachable doesn't crash
|
||
|
* when called with empty local list
|
||
|
*/
|
||
|
test_no++;
|
||
|
|
||
|
if_list1 = OBJ_NEW(opal_list_t);
|
||
|
if_list2 = OBJ_NEW(opal_list_t);
|
||
|
|
||
|
intf = create_if(AF_INET, "31.14.19.92", 24, 0);
|
||
|
opal_list_append(if_list2, &(intf->super));
|
||
|
results = opal_reachable.reachable(if_list1, if_list2);
|
||
|
|
||
|
OBJ_RELEASE(if_list1);
|
||
|
OBJ_RELEASE(if_list2);
|
||
|
|
||
|
if (!(0 == results->num_local && 1 == results->num_remote)) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(results);
|
||
|
|
||
|
/* TEST3:
|
||
|
* Ensure opal_reachable doesn't crash
|
||
|
* when called with empty remote list
|
||
|
*/
|
||
|
test_no++;
|
||
|
|
||
|
if_list1 = OBJ_NEW(opal_list_t);
|
||
|
if_list2 = OBJ_NEW(opal_list_t);
|
||
|
intf = create_if(AF_INET, "31.14.19.92", 24, 0);
|
||
|
opal_list_append(if_list1, &(intf->super));
|
||
|
results = opal_reachable.reachable(if_list1, if_list2);
|
||
|
|
||
|
OBJ_RELEASE(if_list1);
|
||
|
OBJ_RELEASE(if_list2);
|
||
|
|
||
|
if (!(1 == results->num_local && 0 == results->num_remote)) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(results);
|
||
|
|
||
|
/* TEST4:
|
||
|
* Ensure opal_reachable doesn't crash
|
||
|
* when the remote list has more elements
|
||
|
* than the local list
|
||
|
*/
|
||
|
test_no++;
|
||
|
|
||
|
if_list1 = OBJ_NEW(opal_list_t);
|
||
|
if_list2 = OBJ_NEW(opal_list_t);
|
||
|
for (i = 0; i < 3; i++) {
|
||
|
intf = create_if(AF_INET, "31.14.19.92", 24, 0);
|
||
|
opal_list_append(if_list1, &(intf->super));
|
||
|
}
|
||
|
for (i = 0; i < 14; i++) {
|
||
|
intf = create_if(AF_INET, "31.14.19.92", 24, 0);
|
||
|
opal_list_append(if_list2, &(intf->super));
|
||
|
}
|
||
|
results = opal_reachable.reachable(if_list1, if_list2);
|
||
|
|
||
|
OBJ_RELEASE(if_list1);
|
||
|
OBJ_RELEASE(if_list2);
|
||
|
|
||
|
if (!(3 == results->num_local && 14 == results->num_remote)) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(results);
|
||
|
|
||
|
/* TEST5:
|
||
|
* Ensure opal_reachable doesn't crash
|
||
|
* when the local list has more elements
|
||
|
* than the remote list
|
||
|
*/
|
||
|
test_no++;
|
||
|
|
||
|
if_list1 = OBJ_NEW(opal_list_t);
|
||
|
if_list2 = OBJ_NEW(opal_list_t);
|
||
|
for (i = 0; i < 14; i++) {
|
||
|
intf = create_if(AF_INET, "31.14.19.92", 24, 0);
|
||
|
opal_list_append(if_list1, &(intf->super));
|
||
|
}
|
||
|
for (i = 0; i < 3; i++) {
|
||
|
intf = create_if(AF_INET, "31.14.19.92", 24, 0);
|
||
|
opal_list_append(if_list2, &(intf->super));
|
||
|
}
|
||
|
results = opal_reachable.reachable(if_list1, if_list2);
|
||
|
|
||
|
OBJ_RELEASE(if_list1);
|
||
|
OBJ_RELEASE(if_list2);
|
||
|
|
||
|
if (!(14 == results->num_local && 3 == results->num_remote)) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(results);
|
||
|
|
||
|
/* TEST6:
|
||
|
* Ensure opal_reachable doesn't crash
|
||
|
* when the local list has the same number
|
||
|
* of elements as the remote list
|
||
|
*/
|
||
|
test_no++;
|
||
|
|
||
|
if_list1 = OBJ_NEW(opal_list_t);
|
||
|
if_list2 = OBJ_NEW(opal_list_t);
|
||
|
for (i = 0; i < 27; i++) {
|
||
|
intf = create_if(AF_INET, "31.14.19.92", 24, 0);
|
||
|
opal_list_append(if_list1, &(intf->super));
|
||
|
}
|
||
|
for (i = 0; i < 27; i++) {
|
||
|
intf = create_if(AF_INET, "31.14.19.92", 24, 0);
|
||
|
opal_list_append(if_list2, &(intf->super));
|
||
|
}
|
||
|
results = opal_reachable.reachable(if_list1, if_list2);
|
||
|
|
||
|
OBJ_RELEASE(if_list1);
|
||
|
OBJ_RELEASE(if_list2);
|
||
|
|
||
|
if (!(27 == results->num_local && 27 == results->num_remote)) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(results);
|
||
|
|
||
|
/* TEST7:
|
||
|
* Tests proper ordering of results
|
||
|
* when same number of local interfaces and
|
||
|
* remote interfaces
|
||
|
*/
|
||
|
test_no++;
|
||
|
if_list1 = OBJ_NEW(opal_list_t);
|
||
|
if_list2 = OBJ_NEW(opal_list_t);
|
||
|
|
||
|
intf = create_if(AF_INET, "31.14.19.92", 24, 0);
|
||
|
opal_list_append(if_list1, &(intf->super));
|
||
|
intf = create_if(AF_INET, "31.14.20.92", 24, 0);
|
||
|
opal_list_append(if_list1, &(intf->super));
|
||
|
|
||
|
intf = create_if(AF_INET, "31.14.19.93", 24, 0);
|
||
|
opal_list_append(if_list2, &(intf->super));
|
||
|
intf = create_if(AF_INET, "31.14.20.93", 24, 0);
|
||
|
opal_list_append(if_list2, &(intf->super));
|
||
|
|
||
|
results = opal_reachable.reachable(if_list1, if_list2);
|
||
|
|
||
|
OBJ_RELEASE(if_list1);
|
||
|
OBJ_RELEASE(if_list2);
|
||
|
|
||
|
if (!(CQ_PUBLIC_SAME_NETWORK == results->weights[0][0] &&
|
||
|
CQ_PUBLIC_DIFFERENT_NETWORK == results->weights[0][1] &&
|
||
|
CQ_PUBLIC_DIFFERENT_NETWORK == results->weights[1][0] &&
|
||
|
CQ_PUBLIC_SAME_NETWORK == results->weights[1][1])) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(results);
|
||
|
|
||
|
/* TEST8:
|
||
|
* Tests proper ordering of results
|
||
|
* when greater number of remote interfaces
|
||
|
* than local interfaces
|
||
|
*/
|
||
|
test_no++;
|
||
|
if_list1 = OBJ_NEW(opal_list_t);
|
||
|
if_list2 = OBJ_NEW(opal_list_t);
|
||
|
|
||
|
intf = create_if(AF_INET, "31.14.19.92", 24, 0);
|
||
|
opal_list_append(if_list1, &(intf->super));
|
||
|
intf = create_if(AF_INET, "31.14.20.92", 24, 0);
|
||
|
opal_list_append(if_list1, &(intf->super));
|
||
|
|
||
|
intf = create_if(AF_INET, "31.14.19.93", 24, 0);
|
||
|
opal_list_append(if_list2, &(intf->super));
|
||
|
intf = create_if(AF_INET, "31.14.20.93", 24, 0);
|
||
|
opal_list_append(if_list2, &(intf->super));
|
||
|
intf = create_if(AF_INET, "31.14.21.93", 24, 0);
|
||
|
opal_list_append(if_list2, &(intf->super));
|
||
|
|
||
|
results = opal_reachable.reachable(if_list1, if_list2);
|
||
|
|
||
|
OBJ_RELEASE(if_list1);
|
||
|
OBJ_RELEASE(if_list2);
|
||
|
|
||
|
if (!(CQ_PUBLIC_SAME_NETWORK == results->weights[0][0] &&
|
||
|
CQ_PUBLIC_DIFFERENT_NETWORK == results->weights[0][1] &&
|
||
|
CQ_PUBLIC_DIFFERENT_NETWORK == results->weights[0][2] &&
|
||
|
CQ_PUBLIC_DIFFERENT_NETWORK == results->weights[1][0] &&
|
||
|
CQ_PUBLIC_SAME_NETWORK == results->weights[1][1]) &&
|
||
|
CQ_PUBLIC_DIFFERENT_NETWORK == results->weights[1][2]) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(results);
|
||
|
|
||
|
/* TEST9:
|
||
|
* Tests proper ordering of results
|
||
|
* when greater number of local interfaces
|
||
|
* than remote interfaces
|
||
|
*/
|
||
|
test_no++;
|
||
|
if_list1 = OBJ_NEW(opal_list_t);
|
||
|
if_list2 = OBJ_NEW(opal_list_t);
|
||
|
|
||
|
intf = create_if(AF_INET, "31.14.19.92", 24, 0);
|
||
|
opal_list_append(if_list1, &(intf->super));
|
||
|
intf = create_if(AF_INET, "31.14.20.92", 24, 0);
|
||
|
opal_list_append(if_list1, &(intf->super));
|
||
|
intf = create_if(AF_INET, "31.14.21.93", 24, 0);
|
||
|
opal_list_append(if_list1, &(intf->super));
|
||
|
|
||
|
intf = create_if(AF_INET, "31.14.19.93", 24, 0);
|
||
|
opal_list_append(if_list2, &(intf->super));
|
||
|
intf = create_if(AF_INET, "31.14.20.93", 24, 0);
|
||
|
opal_list_append(if_list2, &(intf->super));
|
||
|
|
||
|
results = opal_reachable.reachable(if_list1, if_list2);
|
||
|
|
||
|
OBJ_RELEASE(if_list1);
|
||
|
OBJ_RELEASE(if_list2);
|
||
|
|
||
|
if (!(CQ_PUBLIC_SAME_NETWORK == results->weights[0][0] &&
|
||
|
CQ_PUBLIC_DIFFERENT_NETWORK == results->weights[0][1] &&
|
||
|
CQ_PUBLIC_DIFFERENT_NETWORK == results->weights[1][0] &&
|
||
|
CQ_PUBLIC_SAME_NETWORK == results->weights[1][1] &&
|
||
|
CQ_PUBLIC_DIFFERENT_NETWORK == results->weights[2][0]) &&
|
||
|
CQ_PUBLIC_DIFFERENT_NETWORK == results->weights[2][1]) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(results);
|
||
|
|
||
|
opal_output(0, "Finished Reachable Weighted Loop Tests. %d/%d successful", test_no-failed_no, test_no);
|
||
|
|
||
|
if (0 == failed_no) {
|
||
|
return 0;
|
||
|
} else {
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
/* SUITE 4:
|
||
|
* Test IPv6
|
||
|
*/
|
||
|
int test_ipv6()
|
||
|
{
|
||
|
int failed_no = 0;
|
||
|
|
||
|
#if OPAL_ENABLE_IPV6
|
||
|
opal_if_t *int1;
|
||
|
opal_if_t *int2;
|
||
|
int expected_result;
|
||
|
int result;
|
||
|
int test_no = 0;
|
||
|
|
||
|
/* TEST1
|
||
|
* Testing ipv6 same network with subnet mask
|
||
|
* \64
|
||
|
*/
|
||
|
expected_result = CQ_PUBLIC_SAME_NETWORK;
|
||
|
int1 = create_if(AF_INET6, "2001:4860:4860:0:0:0:0:8888", 64, 0);
|
||
|
int2 = create_if(AF_INET6, "2001:4860:4860:0:0:0:0:8889", 8, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
test_no++;
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
/* TEST2
|
||
|
* Testing ipv6 different network with subnet mask
|
||
|
* \64
|
||
|
*/
|
||
|
expected_result = CQ_PUBLIC_DIFFERENT_NETWORK;
|
||
|
int1 = create_if(AF_INET6, "2001:4860:4860:0:0:0:0:8888", 64, 0);
|
||
|
int2 = create_if(AF_INET6, "2001:4860:4860:1:0:0:0:8888", 0, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
test_no++;
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
expected_result = CQ_PRIVATE_SAME_NETWORK;
|
||
|
int1 = create_if(AF_INET6, "fe80::8888", 64, 0);
|
||
|
int2 = create_if(AF_INET6, "fe80::8889", 64, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
test_no++;
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
expected_result = CQ_NO_CONNECTION;
|
||
|
int1 = create_if(AF_INET6, "2001::8888", 64, 0);
|
||
|
int2 = create_if(AF_INET6, "fe80::8889", 64, 0);
|
||
|
result = run_single_test(int1, int2);
|
||
|
test_no++;
|
||
|
if (result != expected_result) {
|
||
|
++failed_no;
|
||
|
opal_output(0, "Failed test #%d", test_no);
|
||
|
}
|
||
|
OBJ_RELEASE(int1);
|
||
|
OBJ_RELEASE(int2);
|
||
|
|
||
|
opal_output(0, "Finished Reachable Weighted IPv6 Tests. %d/%d successful", test_no-failed_no, test_no);
|
||
|
|
||
|
if (0 == failed_no) {
|
||
|
return 0;
|
||
|
} else {
|
||
|
return 1;
|
||
|
}
|
||
|
#else
|
||
|
opal_output(0, "No IPv6 support; skipped tests");
|
||
|
return 0;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
int main(int argc, char **argv)
|
||
|
{
|
||
|
int failed = 0;
|
||
|
int total = 0;
|
||
|
|
||
|
opal_init(&argc, &argv);
|
||
|
opal_output(0, "\n\nBeginning Reachable Weighted tests\n\n");
|
||
|
|
||
|
total++;
|
||
|
if (ipv4_test()) {
|
||
|
failed++;
|
||
|
}
|
||
|
|
||
|
total++;
|
||
|
if (ranking_test()) {
|
||
|
failed++;
|
||
|
}
|
||
|
|
||
|
total++;
|
||
|
if (loop_test()) {
|
||
|
failed++;
|
||
|
}
|
||
|
|
||
|
total++;
|
||
|
if (test_ipv6()) {
|
||
|
failed++;
|
||
|
}
|
||
|
|
||
|
if (0 != failed) {
|
||
|
opal_output(0, "\n\nFailed %d/%d Reachable Weighted Test Suites :(\n\n", failed, total);
|
||
|
} else {
|
||
|
opal_output(0, "\n\nPassed %d/%d Reachable Weighted Test Suites :)\n\n", total, total);
|
||
|
}
|
||
|
|
||
|
return failed;
|
||
|
}
|