testexecmgmt/ucc/Source/Uccs.v2/Core/UCCS_Main.cpp
changeset 0 3da2a79470a7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/testexecmgmt/ucc/Source/Uccs.v2/Core/UCCS_Main.cpp	Mon Mar 08 15:04:18 2010 +0800
@@ -0,0 +1,413 @@
+/*
+* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+* Filename: UCCS_Main.cpp
+* System Includes
+*
+*/
+
+
+
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <windows.h>
+#include <direct.h>
+
+
+/********************************************************************************
+ *
+ * Local Includes
+ *
+ ********************************************************************************/
+#include "strncpynt.h"
+#include "UCCS_CBatchEngine.h"
+#include "HTMLOutput.h"
+#include "CRetrieveCommandFromFile.h"
+#include "CRetrieveCommandFromConsole.h"
+#include "../DeviceControlChannel/CUCCSCommandControl.h"
+#include "../DeviceControlChannel/CApplicationControlNull.h"
+#include "../DeviceControlChannel/CommandControlErrors.h"
+
+
+/********************************************************************************
+ *
+ * Definitions
+ *
+ ********************************************************************************/
+#define MAXCONTROLMODULEARGS 256
+#define MAXPATHLENGTH		 1024
+#define WAIT_TIME_RECEIVE_BYTES_ERROR 100
+
+
+/********************************************************************************
+ *
+ * Prototypes
+ *
+ ********************************************************************************/
+int ParseParameters( int argc, char *argv[] );
+int ProcessParameters();
+void PrintUsage();
+
+
+/********************************************************************************
+ *
+ * Types
+ *
+ ********************************************************************************/
+typedef enum {
+	OUTPUT_MODULE_HTML
+} TOutputModule;
+
+typedef enum {
+	INPUT_MODULE_FILE,
+} TInputModule;
+
+typedef enum {
+	CONTROL_MODULE_SERIAL,
+	CONTROL_MODULE_CONSOLE,
+	CONTROL_MODULE_TCP,
+	CONTROL_MODULE_AUTO
+} TControlModule;
+
+typedef struct {
+	TRemoteControlTransport iRemoteControlTransport;
+	TOutputModule	iOutputModule;
+	TInputModule	iInputModule;
+	TControlModule	iControlModule;
+	char			iControlModuleArgs[MAXCONTROLMODULEARGS];
+	int				iUseAlternateScriptDirectory;
+	char			iAlternateScriptDirectory[MAXPATHLENGTH];
+} TControllerArgs;
+
+typedef enum {
+	OPT_HELP,
+
+	// Control moduless
+	OPT_SERIALCONTROL,
+	OPT_CONSOLECONTROL,
+	OPT_TCPCONTROL,
+	OPT_AUTOCONTROL,
+
+	// Input modules
+	OPT_FILEINPUT,
+
+	// Output modules
+	OPT_HTMLOUTPUT,
+
+	// Options
+	OPT_SCRIPTDIR
+} TCommandOptions;
+
+
+/********************************************************************************
+ *
+ * File-scope variables
+ *
+ ********************************************************************************/
+static TControllerArgs gControllerArgs;
+static char *gOptionStrings[] = {	"--help", 
+									"--serialcontrol", 
+									"--consolecontrol", 
+									"--tcpcontrol",
+									"--autocontrol", 
+									"--fileinput",  
+									"--htmloutput", 
+									"--scriptdir", 
+									NULL };
+
+// Module Classes
+static CRetrieveCommandFromFile gRetrieveCommandFromFile;
+static CHTMLOutput gHtmlOutput;
+static CUCCSCommandControl *gApplicationControlPC;
+static CApplicationControlNull *gApplicationControlNull;
+static CBatchEngine *gBatchEngine;
+
+// Module Interfaces
+static IOutput *gOutput;
+static IRetrieveCommand *gInput;
+static IRemoteControl *gRemoteControl;
+
+
+/********************************************************************************
+ *
+ * Main() program entry point
+ *
+ ********************************************************************************/
+int main(int argc, char* argv[])
+{
+	int err, errcode, rv = 0, script_error;
+	TCommandControlError channel_execution_error;
+
+	// parse the parameters
+	err = ParseParameters( argc, argv );
+	if( err != 0 ) {
+		PrintUsage();
+		return -1;
+	}
+
+	// process the parameters 
+	err = ProcessParameters();
+	if( err != 0 ) {
+		return -1;
+	}
+
+	// print a welcome banner
+	fprintf( stdout, "------------------------------------------------------------------\n" );
+	fprintf( stdout, "\n" );
+	fprintf( stdout, " Network Emulator - Use Case Controller\n" );
+	fprintf( stdout, "\n" );
+	fprintf( stdout, " eg. runcmd svcname=\"TestService\"  methodid=\"1\"\n");
+	fprintf( stdout, " eg. runcmd svcname=\"TestService\"  methodid=\"10\" call=\"TestCallOne\" param1=\"one\" param2=\"two\"\n" );
+	fprintf( stdout, " eg. runcmd svcname=\"SyncService\"  methodid=\"1\"\n");
+	fprintf( stdout, " eg. runcmd svcname=\"SyncService\"  methodid=\"10\" call=\"StartSyncTestCase\"\n" );
+	fprintf( stdout, " eg. runcmd svcname=\"ExeService\"   methodid=\"1\"\n");
+	fprintf( stdout, " eg. runcmd svcname=\"ExeService\"   methodid=\"2\"\n");
+	fprintf( stdout, " eg. runcmd svcname=\"ExeService\"   methodid=\"10\" call=\"Start\"       cmd=\"cmd\" args=\"\"\n" );
+	fprintf( stdout, " eg. runcmd svcname=\"ExeService\"   methodid=\"10\" call=\"Start\"       cmd=\"cmd\" args=\"\" isDefault=\"true\"\n" );
+	fprintf( stdout, " eg. runcmd svcname=\"ExeService\"   methodid=\"10\" call=\"Stop\"        handle=\"0\"\n" );
+	fprintf( stdout, " eg. runcmd svcname=\"IperfService\" methodid=\"10\" call=\"StartServer\" isDefault=\"true\"\n" );
+	fprintf( stdout, " eg. runcmd svcname=\"PcapService\"  methodid=\"10\" call=\"StartCapture\" isDefault=\"true\" outputFileName=\"test10\"\n" );
+	fprintf( stdout, " eg. runcmd svcname=\"PcapService\"  methodid=\"10\" call=\"StopCapture\"  isDefault=\"true\"\n" );
+	
+	fprintf( stdout, "------------------------------------------------------------------\n\n" );
+
+	// start the remote control module listening for commands
+	while( 1 ) {
+		channel_execution_error = gRemoteControl->Start( gControllerArgs.iRemoteControlTransport, gControllerArgs.iControlModuleArgs, &errcode, &script_error );
+		if( channel_execution_error == EAC_RECEIVEBYTESERROR ) {
+			Sleep( WAIT_TIME_RECEIVE_BYTES_ERROR );
+		}
+
+		if( (script_error != 0) && (gRemoteControl == gApplicationControlNull) ) {
+			fprintf( stderr, "WARNING: Script error occured, last error was '%s' (%d)\n", GetUccsErrorString((TUCCSErrors)script_error), script_error );
+		}
+	}
+
+	// if err is not quit then print an error
+	if( channel_execution_error != EAC_QUIT ) {
+		fprintf( stdout, "WARNING: Controller completed with errors: '%s' (%d, %d)\n", GetCommandControlErrorString(channel_execution_error), channel_execution_error, errcode );
+		rv = -2;
+	}
+
+
+	// now cleanup all the objects (just delete)
+	gOutput = NULL;
+	gInput = NULL;
+	gRemoteControl = NULL;
+	delete gBatchEngine;
+	gBatchEngine = NULL;
+	if( gApplicationControlPC != NULL ) {
+		delete gApplicationControlPC;
+		gApplicationControlPC = NULL;
+	}
+	if( gApplicationControlNull != NULL ) {
+		delete gApplicationControlNull;
+		gApplicationControlNull = NULL;
+	}
+
+	// done
+	return rv;
+}
+
+
+/********************************************************************************
+ *
+ * Parse parameters
+ *
+ ********************************************************************************/
+int ParseParameters( int argc, char *argv[] )
+{
+	int match, i, j;
+
+	// set the arguments to default values
+	gControllerArgs.iControlModule = CONTROL_MODULE_CONSOLE;
+	gControllerArgs.iControlModuleArgs[0] = 0;
+	gControllerArgs.iInputModule = INPUT_MODULE_FILE;
+	gControllerArgs.iOutputModule = OUTPUT_MODULE_HTML;
+	gControllerArgs.iUseAlternateScriptDirectory = 0;
+	gControllerArgs.iAlternateScriptDirectory[0] = 0;
+	gControllerArgs.iRemoteControlTransport = RCI_CONSOLE;
+
+	// Parse the parameters to get the configuration information
+	for( i = 1; i < argc; i++ ) {
+
+		// search for a matching option string
+		for( j = 0; gOptionStrings[j] != NULL; j++ ) {
+			match = strcmp( argv[i], gOptionStrings[j] );
+			if( match == 0 )
+				break;
+		}
+
+		// if no option found then continue with the next token
+		if( match != 0 ) {
+			fprintf( stderr, "WARNING: unknown option '%s' (ignoring).\n", argv[i] );
+			continue;
+		}
+
+		// otherwise parse each option
+		switch( j ) {
+
+			// just print the usage
+		case OPT_HELP:
+			return -1;
+
+			// use an alternate script directory
+		case OPT_SCRIPTDIR:
+			if( i == (argc-1) ) {
+				fprintf( stderr, "ERROR: --scriptdir requires a directory name to be specified.\n" );
+				return -1;
+			}
+			gControllerArgs.iUseAlternateScriptDirectory = 1;
+			STRNCPY_NULL_TERMINATE( gControllerArgs.iAlternateScriptDirectory, argv[++i], MAXPATHLENGTH );
+			break;
+
+			// use the serial control
+		case OPT_SERIALCONTROL:
+			if( i == (argc-1) ) {
+				fprintf( stderr, "ERROR: --serialcontrol requires a portname to be specified (e.g. --serialcontrol COM2).\n" );
+				return -1;
+			}
+			gControllerArgs.iRemoteControlTransport = RCI_SERIAL;
+			gControllerArgs.iControlModule = CONTROL_MODULE_SERIAL;
+			STRNCPY_NULL_TERMINATE( gControllerArgs.iControlModuleArgs, argv[++i], MAXCONTROLMODULEARGS );
+			break;
+
+			// use the control control
+		case OPT_CONSOLECONTROL:
+			gControllerArgs.iRemoteControlTransport = RCI_CONSOLE;
+			gControllerArgs.iControlModule = CONTROL_MODULE_CONSOLE;
+			break;
+
+			// use the wintunnel control
+		case OPT_TCPCONTROL:
+			if( i == (argc-1) ) {
+				fprintf( stderr, "ERROR: --tcpcontrol requires a portname to be specified (e.g. --tcpcontrol 110).\n" );
+				return -1;
+			}
+			gControllerArgs.iRemoteControlTransport = RCI_TCP;
+			gControllerArgs.iControlModule = CONTROL_MODULE_TCP;
+			STRNCPY_NULL_TERMINATE( gControllerArgs.iControlModuleArgs, argv[++i], MAXCONTROLMODULEARGS );
+			break;
+
+			// use the auto control
+		case OPT_AUTOCONTROL:
+			if( i == (argc-1) ) {
+				fprintf( stderr, "ERROR: --autocontrol requires a config string (i.e. <sid>[:<rc>[:<int>]]).\n" );
+				return -1;
+			}
+			gControllerArgs.iRemoteControlTransport = RCI_NONE;
+			gControllerArgs.iControlModule = CONTROL_MODULE_AUTO;
+			STRNCPY_NULL_TERMINATE( gControllerArgs.iControlModuleArgs, argv[++i], MAXCONTROLMODULEARGS );
+			break;
+
+			// input from a script file
+		case OPT_FILEINPUT:
+			gControllerArgs.iInputModule = INPUT_MODULE_FILE;
+			break;
+
+			// output to html
+		case OPT_HTMLOUTPUT:
+			gControllerArgs.iOutputModule = OUTPUT_MODULE_HTML;
+			break;
+		}
+	}
+
+	// done - success
+	return 0;
+}
+
+
+/********************************************************************************
+ *
+ * Process parameters
+ *
+ ********************************************************************************/
+int ProcessParameters()
+{
+	int err;
+
+	// use alternate directory
+	if( gControllerArgs.iUseAlternateScriptDirectory != 0 ) {
+		err = _chdir( gControllerArgs.iAlternateScriptDirectory );
+		if( err != 0 ) {
+			fprintf( stderr, "ERROR: failed to set directory '%s' - %s.\n", gControllerArgs.iAlternateScriptDirectory, strerror(errno) );
+			return -1;
+		}
+	}
+
+	// set the output module pointer
+	gOutput = &gHtmlOutput;
+
+	// set the script command input module 
+	gInput = &gRetrieveCommandFromFile;
+
+	// create the batchengine
+	gBatchEngine = new CBatchEngine( gInput, gOutput );
+	assert( gBatchEngine != NULL );
+
+	// create the remote channel
+	if( gControllerArgs.iControlModule == CONTROL_MODULE_SERIAL ) {
+		gApplicationControlPC = new CUCCSCommandControl( gBatchEngine, gOutput );
+		assert( gApplicationControlPC != NULL );
+		gRemoteControl = gApplicationControlPC;
+	}
+	if( gControllerArgs.iControlModule == CONTROL_MODULE_CONSOLE ) {
+		gApplicationControlPC = new CUCCSCommandControl( gBatchEngine, gOutput );
+		assert( gApplicationControlPC != NULL );
+		gRemoteControl = gApplicationControlPC;
+	}
+	if( gControllerArgs.iControlModule == CONTROL_MODULE_TCP ) {
+		gApplicationControlPC = new CUCCSCommandControl( gBatchEngine, gOutput );
+		assert( gApplicationControlPC != NULL );
+		gRemoteControl = gApplicationControlPC;
+	}
+	if( gControllerArgs.iControlModule == CONTROL_MODULE_AUTO ) {
+		gApplicationControlNull = new CApplicationControlNull( gBatchEngine, gOutput );
+		assert( gApplicationControlNull != NULL );
+		gRemoteControl = gApplicationControlNull;
+	}
+
+	// done - success
+	return 0;
+}
+
+
+/********************************************************************************
+ *
+ * PrintUsage
+ *
+ ********************************************************************************/
+void PrintUsage()
+{
+	fprintf( stderr, "\n" );
+	fprintf( stderr, "usage: uccs [options]\n" );
+	fprintf( stderr, "\n" );
+
+	fprintf( stderr, "CONTROL COMMAND OPTIONS:\n" );
+	fprintf( stderr, "\t--serialcontrol <comport>\n" );
+	fprintf( stderr, "\t\tControl commands are sent over a serial cable.\n" );
+	fprintf( stderr, "\t--consolecontrol\n" );
+	fprintf( stderr, "\t\tControl commands are entered into the console.\n" );
+	fprintf( stderr, "\t--tcpcontrol <port number>\n" );
+	fprintf( stderr, "\t\tControl commands are sent over tcp/ip using WinTunnel.\n" );
+	fprintf( stderr, "\t--autocontrol <use-case-id>[:<rendezvous-count>[:<interactive_flag>]]\n" );
+	fprintf( stderr, "\t\tControl commands are automatically entered.\n" );
+	fprintf( stderr, "\n" );
+
+	fprintf( stderr, "GENERAL OPTIONS:\n" );
+	fprintf( stderr, "\t--scriptdir <pathname>\n" );
+	fprintf( stderr, "\t\tAlternate directory to look for script files and put output files.\n" );
+	fprintf( stderr, "\n" );
+}