//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project
//
//File: messengertest.cpp
//
//Version: $Revision: 1.1 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/06/05 08:18:06 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Harri Sunila
//
//Description:
//      A simple test program to test differences in performance between
//      messengers (PDU) with or without pfStorage
//
//Copyright:
//
//
//Licence:
//
//
//History: 

#include <typeinfo>
#include <iostream.h>
#include <string>

#include "testmessenger.h"

void storageTest(int rounds, int verbose)
{
    cout << "Starting test for pfStorage with "<< rounds << " rounds." << endl;

    int i;
    testMessenger *messenger;
    pfFrame frame;
    
    for (i = 0; i < rounds; i++)
    {
        if (verbose != 0)
        {
            cout << "Creating a new testStorageMessenger..." << endl;
        }
        messenger = new testStorageMessenger;

        if (verbose != 0)
        {
            cout << "Encoding the testStorageMessenger..." << endl;
        }
        messenger->encode();

        if (verbose != 0)
        {
            cout << "Storing the encoded frame..." << endl;
        }
        try
        {
            frame = messenger->getFrame("Frame");
        }
        catch (pfException &exception)
        {
            exception.printInfo();
        }
        
        if (verbose != 0)
        {
            cout << "Destroying the encoded messenger..." << endl;
        }
        delete messenger;

        if (verbose != 0)
        {
            cout << "Creating a messenger from the encoded frame.." << endl;
        }
        try
        {
            messenger = testMessenger::create(frame);
        }
        catch (pfException &exception)
        {
            exception.printInfo();
        }

        if (verbose != 0)
        {
            cout << "Deleting the messenger..." << endl;
        }
        delete messenger;
    }
    return;
}

void referenceTest(int rounds, int verbose)
{
    cout << "Starting test without pfStorage with "
         << rounds << " rounds." << endl;

    int i;
    testMessenger *messenger;
    pfFrame frame;
    
    for (i = 0; i < rounds; i++)
    {
        if (verbose != 0)
        {
            cout << "Creating a new testReferenceMessenger..." << endl;
        }
        messenger = new testReferenceMessenger;

        if (verbose != 0)
        {
            cout << "Encoding the testReferenceMessenger..." << endl;
        }
        messenger->encode();

        if (verbose != 0)
        {
            cout << "Storing the encoded frame..." << endl;
        }
        frame = messenger->returnFrame();
        
        if (verbose != 0)
        {
            cout << "Destroying the encoded messenger..." << endl;
        }
        delete messenger;

        if (verbose != 0)
        {
            cout << "Creating a messenger from the encoded frame.." << endl;
        }
        try
        {
            messenger = testMessenger::create(frame);
        }
        catch (pfException &exception)
        {
            exception.printInfo();
        }

        if (verbose != 0)
        {
            cout << "Deleting the messenger..." << endl;
        }
        delete messenger;
    }
    return;
}



void usage(const char *name_)
{
    cerr << "Usage: " << name_
         << " [s/r] [v] [n rounds]" << endl;
    cerr << "       s: Use messengers with pfStorage" << endl;
    cerr << "       r: Use messengers without pfStorage" << endl;
    cerr << "       v: Verbose" << endl;
    cerr << "       n: Number of encode/decode test rounds" << endl;
    cerr << endl;
    exit(0);
    return;
}

int main(int argc, char *argv[])
{
    if (argc < 1)
    {
        usage(argv[0]);
    }
	   
    int count = 1;

    int rounds = 0;
    pfByte type = 0;
    int verbose = 0;
    
    while (count < argc)
    {
        switch (*argv[count])
	{
	    case 's':
                count++;
                if (count == argc)
                {
                    usage(argv[0]);
                }
                if (type == 0)
                {
                    type = testMessenger::TEST_STORAGEMESSENGER;
                }
                break;

            case 'r':
                count++;
                if (count == argc)
                {
                    usage(argv[0]);
                }
                if (type == 0)
                {
                    type = testMessenger::TEST_REFERENCEMESSENGER;
                }
                break;

	    case 'v':
                count++;
                if (count == argc)
                {
                    usage(argv[0]);
                }
                verbose = 1;
                break;
                
            case 'n':
                count++;
                if (count == argc)
                {
                    usage(argv[0]);
                }
                rounds = atoi(argv[count]);
                break;
                
	    default:
                usage(argv[0]);
                break;
	}
	count++;
    }
    switch (type)
    {
        case testMessenger::TEST_STORAGEMESSENGER:
            storageTest(rounds, verbose);
            cout << "Exiting" << endl;
            break;
        case testMessenger::TEST_REFERENCEMESSENGER:
            referenceTest(rounds, verbose);
            cout << "Exiting" << endl;
            break;
        default:
            cout << "No test selected." << endl
                 << "Use 'r' or 's' option to select a test" << endl
                 << "Exiting" << endl;
            break;
    } 
    return 0;
}
