// -*- c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t -*-

// Copyright (c) 2001-2007 International Computer Science Institute
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software")
// to deal in the Software without restriction, subject to the conditions
// listed in the XORP LICENSE file. These conditions include: you must
// preserve this copyright notice, and you cannot mention the copyright
// holders in advertising related to the Software without their permission.
// The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
// notice is a summary of the XORP LICENSE file; the license in that file is
// legally binding.

#ident "$XORP: xorp/mrt/test_mrib.cc,v 1.9 2007/02/16 22:46:39 pavlin Exp $"


//
// Multicast Routing Information Base information test program.
//


#include "mrt_module.h"
#include "libxorp/xorp.h"
#include "libxorp/xlog.h"
#include "libxorp/exceptions.hh"
#include "mrt/mrib_table.hh"


//
// Exported variables
//

//
// Local constants definitions
//

//
// Local structures/classes, typedefs and macros
//

//
// Local variables
//

//
// Local functions prototypes
//
static int	run_test1();
static int	run_test2();
static int	run_test3();


int
main(int /* argc */, char *argv[])
{
    
    //
    // Initialize and start xlog
    //
    xlog_init(argv[0], NULL);
    xlog_set_verbose(XLOG_VERBOSE_LOW);		// Least verbose messages
    // XXX: verbosity of the error messages temporary increased
    xlog_level_set_verbose(XLOG_LEVEL_ERROR, XLOG_VERBOSE_HIGH);
    xlog_add_default_output();
    xlog_start();
    
    try {
	//
	// Run the tests
	//
	run_test1();
	run_test2();
	run_test3();
    } catch(...) {
	xorp_catch_standard_exceptions();
    }
    
    //
    // Gracefully stop and exit xlog
    //
    xlog_stop();
    xlog_exit();
    
    exit(0);
}

static int
run_test1()
{
    Mrib *t;
    MribTable mrib_table(AF_INET);
    IPvX s1(IPv4("123.45.0.1"));
    IPvX s2(IPv4("123.45.0.2"));
    IPvX s3(IPv4("123.45.0.255"));
    IPvX s4(IPv4("123.45.1.255"));
    Mrib *mrib1 = new Mrib(IPvXNet(s1, 24));
    Mrib *mrib2 = new Mrib(IPvXNet(s2, 24));
    Mrib *mrib3 = new Mrib(IPvXNet(s3, 24));

    printf("\n\n");
    printf("RUNNING TEST1\n");
    
    // Entries insertion
    printf("\n");
    printf("Installing entry for %s\n", cstring(mrib1->dest_prefix()));
    mrib_table.insert(*mrib1);
    printf("PASS\n");
    printf("Installing entry for %s\n", cstring(mrib2->dest_prefix()));
    mrib_table.insert(*mrib2);
    printf("PASS\n");
    printf("Installing entry for %s\n", cstring(mrib3->dest_prefix()));
    mrib_table.insert(*mrib3);
    printf("PASS\n");
    
    // Entries lookup
    printf("\n");
    printf("Searching for   %s\n", cstring(s1));
    t = mrib_table.find(s1);
    if (t != NULL) {
	printf("Found entry: %s\n", cstring(t->dest_prefix()));
	printf("PASS\n");
    } else {
	printf("Entry not found!\n");
	printf("FAIL\n");
    }
    
    // Lookup for non-existing entry
    printf("\n");
    printf("Searching for   %s\n", cstring(s4));
    t = mrib_table.find(s4);
    if (t == NULL) {
	printf("PASS\n");
    } else {
	printf("Found entry: %s\n", cstring(t->dest_prefix()));
	printf("FAIL\n");
    }
    
    // MribTable size
    printf("\n");
    printf("MribTable size = %u\n", XORP_UINT_CAST(mrib_table.size()));
    printf("PASS\n");
    
    // All entries printout
    printf("\n");
    printf("List of all entries:\n");
    for (MribTable::iterator iter = mrib_table.begin();
	 iter != mrib_table.end(); ++iter) {
	t = *iter;
	if (t != NULL)
	    printf("%s\n", cstring(t->dest_prefix()));
    }
    printf("PASS\n");
    
    return (0);
}

static int
run_test2()
{
    Mrib *t;
    MribTable mrib_table(AF_INET);
    IPvX s1(IPv4("1.1.0.0"));
    IPvX s2(IPv4("1.2.0.0"));
    IPvX s3(IPv4("1.2.0.0"));
    Mrib  *mrib1 = new Mrib(IPvXNet(s1, 16));
    Mrib  *mrib2 = new Mrib(IPvXNet(s2, 24));
    Mrib  *mrib3 = new Mrib(IPvXNet(s3, 16));
    IPvX s4(IPv4("1.2.0.1"));
    IPvX s5(IPv4("1.2.1.1"));
    
    printf("\n\n");
    printf("RUNNING TEST2\n");
    
    // Entries insertion
    printf("\n");
    printf("Installing entry for %s\n", cstring(mrib1->dest_prefix()));
    mrib_table.insert(*mrib1);
    printf("PASS\n");
    printf("Installing entry for %s\n", cstring(mrib2->dest_prefix()));
    mrib_table.insert(*mrib2);
    printf("PASS\n");
    printf("Installing entry for %s\n", cstring(mrib3->dest_prefix()));
    mrib_table.insert(*mrib3);
    printf("PASS\n");
    
    // Entries lookup
    printf("\n");
    printf("Searching for   %s\n", cstring(s4));
    t = mrib_table.find(s4);
    if (t != NULL) {
	printf("Found entry: %s\n", cstring(t->dest_prefix()));
	printf("PASS\n");
    } else {
	printf("Entry not found!\n");
	printf("FAIL\n");
    }

    printf("\n");
    printf("Searching for   %s\n", cstring(s5));
    t = mrib_table.find(s5);
    if (t != NULL) {
	printf("Found entry: %s\n", cstring(t->dest_prefix()));
	printf("PASS\n");
    } else {
	printf("Entry not found!\n");
	printf("FAIL\n");
    }
    
    // All entries printout
    printf("\n");
    printf("List of all entries:\n");
    for (MribTable::iterator iter = mrib_table.begin();
	 iter != mrib_table.end(); ++iter) {
	t = *iter;
	if (t != NULL)
	    printf("%s\n", cstring(t->dest_prefix()));
    }
    printf("PASS\n");
    
    return (0);
}

static int
run_test3()
{
    Mrib *t;
    MribTable mrib_table(AF_INET);
    IPvX s1(IPv4("1.1.0.0"));
    IPvX s2(IPv4("1.2.1.0"));
    IPvX s3(IPv4("1.2.0.0"));
    Mrib  *mrib1 = new Mrib(IPvXNet(s1, 16));
    Mrib  *mrib2 = new Mrib(IPvXNet(s2, 24));
    Mrib  *mrib3 = new Mrib(IPvXNet(s3, 16));
    IPvX s4(IPv4("1.2.0.1"));
    IPvX s5(IPv4("1.2.1.1"));

    printf("\n\n");
    printf("RUNNING TEST3\n");
    
    // Entries insertion
    printf("\n");
    printf("Installing entry for %s\n", cstring(mrib1->dest_prefix()));
    mrib_table.insert(*mrib1);
    printf("PASS\n");
    printf("Installing entry for %s\n", cstring(mrib2->dest_prefix()));
    mrib_table.insert(*mrib2);
    printf("PASS\n");
    printf("Installing entry for %s\n", cstring(mrib3->dest_prefix()));
    mrib_table.insert(*mrib3);
    printf("PASS\n");
    
    // Entries lookup
    printf("\n");
    printf("Searching for   %s\n", cstring(s4));
    t = mrib_table.find(s4);
    if (t != NULL) {
	printf("Found entry: %s\n", cstring(t->dest_prefix()));
	printf("PASS\n");
    } else {
	printf("Entry not found!\n");
	printf("FAIL\n");
    }

    printf("\n");
    printf("Searching for   %s\n", cstring(s5));
    t = mrib_table.find(s5);
    if (t != NULL) {
	printf("Found entry: %s\n", cstring(t->dest_prefix()));
	printf("PASS\n");
    } else {
	printf("Entry not found!\n");
	printf("FAIL\n");
    }
    
    // All entries printout
    printf("\n");
    printf("List of all entries:\n");
    for (MribTable::iterator iter = mrib_table.begin();
	 iter != mrib_table.end(); ++iter) {
	t = *iter;
	if (t != NULL)
	    printf("%s\n", cstring(t->dest_prefix()));
    }
    printf("PASS\n");
    
    return (0);
}


syntax highlighted by Code2HTML, v. 0.9.1