1
0
Files
irix-657m-src/irix/cmd/cms/cms_test.c
2022-09-29 17:59:04 +03:00

170 lines
3.2 KiB
C

#include "cms_base.h"
#include "cms_kernel.h"
#include "cms_cell_status.h"
#include "sys/mman.h"
extern int cms_num_cells;
#define POLL_TIME 2
void test_case1(void);
void test_case2(void);
void test_case3(void);
void test_case4(void);
void test_case5(void);
void cms_monitor(int);
void wait_for_stable_membership(void);
extern cms_cell_status_t *cms_cell_status;
typedef void (*func_ptr_t)();
func_ptr_t test_funcs[] = {
test_case1,
test_case2,
test_case3,
test_case4,
test_case5
};
int num_test_funcs = (sizeof(test_funcs)/sizeof(func_ptr_t));
void
wait_for_stable_membership(void)
{
boolean_t stable;
int i;
do {
stable = B_TRUE;
sleep(POLL_TIME);
for (i = 0; i < cms_num_cells; i++) {
if (cms_get_cell_status(i) &&
(cms_cell_status->cms_info[i].cms_state
!= CMS_STABLE)) {
stable = B_FALSE;
break;
}
}
} while (!stable);
}
void
cms_monitor(int test_num)
{
func_ptr_t func;
int i;
if (test_num < 0) {
for (i = 0; i <num_test_funcs; i++) {
func = test_funcs[i];
func();
}
} else {
func = test_funcs[test_num];
func();
}
}
/*
* Set a node dead.
*/
void
test_case1(void)
{
wait_for_stable_membership();
printf("Test case 1: Setting node %d to dead\n", cms_num_cells - 1);
cms_set_cell_status( cms_num_cells - 1, B_FALSE);
wait_for_stable_membership();
printf("Test case 1: Bringing up node %d \n", cms_num_cells - 1);
cms_set_cell_status(cms_num_cells - 1, B_TRUE);
}
/*
* Assumes that node 0 is the leader.
* Brings down all but one cell and brings them up again.
*/
void
test_case2(void)
{
int i;
wait_for_stable_membership();
for (i = 1; i < cms_num_cells; i++) {
printf("Test case 2: Setting node %d to dead\n", i);
cms_set_cell_status(i, B_FALSE);
wait_for_stable_membership();
}
/*
* Bringing up the dead cells. This includes 0
*/
cms_set_cell_status(0, B_TRUE);
for (i = 1; i < cms_num_cells; i++) {
printf("Test case 2: Setting node %d to alive\n", i);
cms_set_cell_status(i, B_TRUE);
wait_for_stable_membership();
}
}
void
test_case3(void)
{
/*
* Bring down the leader.
*/
cell_t leader, cell;
int leader_age;
leader = 0;
leader_age = cms_cell_status->cms_info[0].cms_age[0];
for (cell = 1; cell < cms_num_cells; cell++) {
if (cms_cell_status->cms_info[cell].cms_age[cell]
> leader_age) {
leader = cell;
leader_age = cms_cell_status->cms_info[cell].
cms_age[cell];
}
}
printf("Test case 3: Kill the leader %d\n", leader);
cms_set_cell_status(leader, B_FALSE);
wait_for_stable_membership();
printf("Test case 3: Bring up the leader %d\n", leader);
cms_set_cell_status(leader, B_TRUE);
}
/*
* Test link failure.
*/
void
test_case4(void)
{
wait_for_stable_membership();
printf("Breaking link between 1 and 2\n");
cms_set_link_status(1,2, B_FALSE);
wait_for_stable_membership();
}
/*
* Cause an indirect link. This should cause forwarding.
*/
void
test_case5(void)
{
printf("Breaking link between 3 and 2\n");
wait_for_stable_membership();
printf("setting link to false\n");
cms_set_link_status(3,2, B_FALSE);
wait_for_stable_membership();
cms_set_cell_status(3, B_TRUE);
cms_set_link_status(3,2, B_TRUE);
printf("Setting 3 to be alive. "
"Also reconnecting link between 3 and 2\n");
wait_for_stable_membership();
}