--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libtelepathy/tsrc/src/telepathygabblelogintest.cpp Tue Feb 02 01:10:06 2010 +0200
@@ -0,0 +1,680 @@
+/*
+* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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: Used for Login-Logout related Test Cases
+*
+*/
+
+
+
+
+//Include files
+#include <e32err.h>
+#include <e32const.h>
+#include <e32base.h>
+
+#include <glib.h>
+#include <StifLogger.h>
+
+#include "telepathygabbleutils.h"
+#include "telepathygabblelogintest.h"
+#include "telepathygabbletestdata.h"
+#include "telepathygabbleadddeletecontact.h"
+
+static void test_log_handler1 (
+ const gchar *message
+ )
+{
+ FILE* fp;
+
+ fp = fopen("c:\\tplogs.txt","a");
+ if(fp)
+ {
+ fprintf(fp,message);
+ fprintf(fp,"\n");
+ fclose(fp);
+ }
+
+
+}
+
+
+//-----------------------------------------------------------------------------
+// function_name : CTelepathyGabbleLoginTest
+// description : Constructor
+// Returns : None
+//-----------------------------------------------------------------------------
+
+CTelepathyGabbleLoginTest::CTelepathyGabbleLoginTest()
+ {
+ }
+
+//-----------------------------------------------------------------------------
+// function_name : ConstructL
+// description : Constructor
+// Returns : None
+//-----------------------------------------------------------------------------
+
+void CTelepathyGabbleLoginTest::ConstructL()
+ {
+
+ }
+
+//-----------------------------------------------------------------------------
+// function_name : NewL
+// description : Constructor
+// Returns : None
+//-----------------------------------------------------------------------------
+CTelepathyGabbleLoginTest* CTelepathyGabbleLoginTest::NewL()
+ {
+
+ CTelepathyGabbleLoginTest* self = new(ELeave) CTelepathyGabbleLoginTest;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+//-----------------------------------------------------------------------------
+// function_name : ~CTelepathyGabbleLoginTest
+// description : destructor
+// Returns : None
+//-----------------------------------------------------------------------------
+CTelepathyGabbleLoginTest::~CTelepathyGabbleLoginTest()
+ {
+
+ //class variables
+ //delete conn;
+ //conn = NULL;
+
+ }
+
+//-----------------------------------------------------------------------------
+// function_name : action_login
+// description : login
+// Returns : gboolean
+//-----------------------------------------------------------------------------
+TInt CTelepathyGabbleLoginTest::action_login(char* username,char* password,
+ char* server, char* resource, char* ssl_flag,
+ char *port, char *proxy_server, char *proxy_port,
+ CTestData* aTestData)
+{
+
+
+ TpConnMgr *connmgr = NULL;
+ GError *error = NULL;
+
+ test_log_handler1(username);
+ test_log_handler1(password);
+ test_log_handler1(server);
+ test_log_handler1(resource);
+ test_log_handler1(ssl_flag);
+ test_log_handler1(port);
+
+
+ GHashTable *connection_parameters = g_hash_table_new(g_str_hash, g_str_equal);
+
+ DBusGConnection *dbus_connection;
+ TpConn *tp_conn;
+
+ //Use the values passed from the cfg file.
+ gchar* def1 = g_strdup(username);
+ gchar* def2 = g_strdup(password);
+
+ gchar* def3 = g_strdup(server);
+ gchar* def4 = g_strdup(resource);
+
+ guint def5 = atoi(port); //443;
+
+ #ifdef __WINSCW__
+ gchar* def6 = g_strdup(proxy_server); //g_strdup("172.16.42.135"); //for emulater
+ guint def7 = atoi(proxy_port); //8080; //for emulater
+ #endif
+
+ GValue *value1 = g_new0(GValue, 1);
+ GValue *value2 = g_new0(GValue, 1);
+ GValue *value3 = g_new0(GValue, 1);
+ GValue *value4 = g_new0(GValue, 1);
+ GValue *value5 = g_new0(GValue, 1);
+
+ #ifdef __WINSCW__
+ GValue *value6 = g_new0(GValue, 1);
+ GValue *value7 = g_new0(GValue, 1);
+ #endif
+
+ GValue *value8 = g_new0(GValue, 1);
+ g_type_init();
+
+
+ // just use system bus and do not bother about others
+ dbus_connection = dbus_g_bus_get( DBUS_BUS_SESSION , &error);
+
+ aTestData->GetStifLogger()->Log( _L("after dbus_g_bus_get") );
+ /* bsr 4 sep: this was null as host parsing failed -> transport was zero -> connectionw as 0 */
+ if (dbus_connection == NULL)
+ {
+ // if we get error as part of above step, connection variable is NULL, so we are here
+ //_dbus_verboseerr("Failed to open connection to bus: %s\n", error->message);
+ //test_log_handler("Found Error in dbus_g_bus_get exiting.\n");
+ aTestData->GetStifLogger()->Log( _L("dbus_connection == NULL") );
+ g_error_free(error);
+ return (aTestData->GetConnectionState());
+ }
+ else
+ {
+ aTestData->SetDBusConnection(dbus_connection);
+ }
+
+ aTestData->GetStifLogger()->Log( _L("b4 tp_connmgr_new") );
+ /* Create a connection manager object */
+ connmgr = tp_connmgr_new(dbus_connection, CONNMGR_BUS, CONNMGR_PATH,
+ /*CONNMGR_BUS*/ TP_IFACE_CONN_MGR_INTERFACE);
+ aTestData->GetStifLogger()->Log( _L("after tp_connmgr_new") );
+ if (connmgr == NULL)
+ {
+ aTestData->GetStifLogger()->Log( _L("connmgr == NULL") );
+ g_error("Failed to create a connection manager, skipping manager startup.");
+ return (aTestData->GetConnectionState());
+ }
+ else
+ {
+ aTestData->SetTpConnMgr(connmgr);
+ }
+
+ g_value_init(value1, G_TYPE_STRING);
+ g_value_set_string (value1, def1);
+ g_hash_table_insert(connection_parameters, (gpointer)"account", (gpointer)value1);
+
+ g_value_init(value2, G_TYPE_STRING);
+ g_value_set_string (value2, def2);
+ g_hash_table_insert(connection_parameters,(gpointer) "password",(gpointer) value2);
+
+ g_value_init(value3, G_TYPE_STRING);
+ g_value_set_string (value3, def3);
+ g_hash_table_insert(connection_parameters,(gpointer) "server",(gpointer)value3 );
+
+ g_value_init(value4, G_TYPE_STRING);
+ g_value_set_string (value4, def4);
+ g_hash_table_insert(connection_parameters, (gpointer)"resource", (gpointer)value4);
+
+
+ g_value_init(value5, G_TYPE_UINT);
+ g_value_set_uint (value5, def5);
+ g_hash_table_insert(connection_parameters, (gpointer)"port", (gpointer)value5);
+
+ //convert the ssl_flag to ascii
+ TInt ssl_bool = atoi(ssl_flag);
+
+ //if (ssl_flag == "1") //def8 ==1
+ if (ssl_bool == 1) //i.e. only for gtalk, not for gizmo
+ {
+ gboolean def8 = TRUE; //for gtalk
+ g_value_init(value8, G_TYPE_BOOLEAN);
+ g_value_set_boolean (value8, def8);
+ g_hash_table_insert(connection_parameters, (gpointer)"old-ssl", (gpointer)value8);
+ }
+
+#ifdef __WINSCW__
+ g_value_init(value6, G_TYPE_STRING);
+ g_value_set_string (value6, def6);
+ g_hash_table_insert(connection_parameters, (gpointer)"https-proxy-server", (gpointer)value6);
+
+
+ g_value_init(value7, G_TYPE_UINT);
+ g_value_set_uint (value7, def7);
+ g_hash_table_insert(connection_parameters, (gpointer)"https-proxy-port",(gpointer) value7);
+#endif
+
+
+ // Create a new actual connection with the connection manager
+ //Ensure that conn is global.
+ // The same conn object is used for logout.
+ aTestData->GetStifLogger()->Log( _L("b4 tp_connmgr_new_connection") );
+ tp_conn = tp_connmgr_new_connection(connmgr,connection_parameters, PROTOCOL);
+ aTestData->GetStifLogger()->Log( _L("after tp_connmgr_new_connection") );
+ if( tp_conn == NULL )
+ {
+ aTestData->GetStifLogger()->Log( _L("tp_conn is null") );
+ return (aTestData->GetConnectionState());
+ }
+ else
+ {
+ aTestData->SetTpConn(tp_conn);
+ }
+
+
+
+ // add a callback for StatusChange signal
+ dbus_g_proxy_connect_signal(DBUS_G_PROXY(tp_conn), "StatusChanged",
+ (G_CALLBACK(status_changed_cb)),
+ aTestData,NULL );
+
+ g_hash_table_destroy(connection_parameters);
+
+ //Run the mainloop
+ g_main_loop_run (aTestData->GetMainLoop());
+
+ //Quit of main loop happened in thecallback.
+ //unref this mainloop
+ // same main loop can be used for all classes,
+ // unref after logout in each test case when logintest object gets destroyed
+ //g_main_loop_unref ( mainloop );
+
+ //After the status_changed_cb , the control back here
+ //Check the value of global variable that was updated
+ //in the callback and return the same.
+
+
+ //Get the connected state for login and return the same.
+ return (aTestData->GetConnectionState());
+}
+
+//-----------------------------------------------------------------------------
+// function_name : action_logout
+// description : Does logout
+// Returns : None
+//-----------------------------------------------------------------------------
+
+TInt CTelepathyGabbleLoginTest::action_logout(CTestData* aTestData)
+{
+ GError *error = NULL;
+
+ //Do the disconnect
+ tp_conn_disconnect (DBUS_G_PROXY( aTestData->GetTpConn()), &error);
+
+ //g_hash_table_destroy(global_data_ptr->Getptrhashtable_textchan());
+
+ //Start the main loop
+ g_main_loop_run (aTestData->GetMainLoop());
+
+
+ //After this see that the callback status_changed_cb
+ //is hit with TP_CONN_STATUS_DISCONNECTED as the status.
+
+ //After the status_changed_cb , the control back here
+ //Check the value of global variable that was updated in the
+ //callback and return the same.
+
+ if (error)
+ {
+ // There is some error
+ g_error_free (error);
+ // Update the global to connected
+ //global_connected = TRUE;
+ }
+ //else global_connected is made FALSE in the status_changed_cb
+
+
+ //return global_connected;
+ //Get the connected state for login and return the same.
+ return (aTestData->GetConnectionState());
+}
+
+//-----------------------------------------------------------------------------
+// function_name : action_cancel
+// description : cancel login
+// Returns : None
+//-----------------------------------------------------------------------------
+
+TInt CTelepathyGabbleLoginTest::action_cancel(char* username,
+ char* password, char* server,char* resource, char* ssl_flag,
+ char *port,char *proxy_server, char *proxy_port,
+ CTestData* aTestData)
+{
+ aTestData->SetTestType(CTestData::ECancel) ;
+ aTestData->GetStifLogger()->Log( _L("inside action_cancel\n") );
+ action_login(username,password,server,resource,ssl_flag,
+ port, proxy_server, proxy_port, aTestData);
+
+ action_logout(aTestData);//Do tp_disconnected.
+
+ return (aTestData->GetConnectionState());
+}
+
+//-----------------------------------------------------------------------------
+// function_name : status_changed_cb
+//-----------------------------------------------------------------------------
+gboolean CTelepathyGabbleLoginTest::status_changed_cb(DBusGProxy* /*proxy*/,
+ guint status, guint reason,
+ gpointer user_data)
+{
+ GHashTable* textChannelsHT = NULL;
+ CTestData* testData = static_cast<CTestData*> (user_data);
+ CStifLogger* logger = testData->GetStifLogger();
+ logger->Log( _L("status_changed_cb\n") );
+
+ if (status == TP_CONN_STATUS_CONNECTED )
+ {
+
+
+ logger->Log( _L("status_changed_cb::connected\n") );
+
+
+ if( testData->GetTestType() != CTestData::ELogin )
+ {
+
+
+ textChannelsHT =
+ g_hash_table_new_full(g_str_hash,
+ g_str_equal,
+ (GDestroyNotify) g_free,
+ (GDestroyNotify) g_object_unref);
+
+ testData->SetTextChannelsHT(textChannelsHT);
+ //Register the callback for new channel
+ //Commented for now has been put in the SendMessage function,
+ dbus_g_proxy_connect_signal(DBUS_G_PROXY(testData->GetTpConn()), "NewChannel",
+ (G_CALLBACK(new_channel_handler)),
+ user_data,NULL);
+ }
+ else
+ {
+ // if the test case is login related test case, new channel callback not required
+ //so dont register for NewChannel
+ g_main_loop_quit(testData->GetMainLoop());
+ testData->ResetLoginCompleteFlag();
+ }
+ //update the state_of_conenction enum
+ testData->SetConnectionState(CTestData::ECONNECTED );
+
+ }
+ else if (status == TP_CONN_STATUS_CONNECTING)
+ {
+ //if the test case is for cancel disconnect here, meaning cancel the login here.
+ //if cancel test case, do disconnect in connecting state
+ testData->SetConnectionState(CTestData::ECONNECTING);
+ if ( testData->GetTestType() == CTestData::ECancel)
+ {
+ //quit from this callback so that we return to point from where
+ //action_login was called.
+ g_main_loop_quit(testData->GetMainLoop());
+ }
+
+ }
+ else if ( status == TP_CONN_STATUS_DISCONNECTED )
+ {
+
+
+ if ( testData->GetTestType() == CTestData::ECancel)
+ {
+ //this disconnect was initiated from the cancel test case
+ logger->Log( _L("status_changed_cb :cancelled \n") );
+ testData->SetConnectionState(CTestData::EDISCONNECTED);
+ //quit the main loop.
+ g_main_loop_quit(testData->GetMainLoop());
+ }
+ else
+ {
+
+ if(reason == TP_CONN_STATUS_REASON_AUTHENTICATION_FAILED)
+ {
+ // Here disconnect is received as the authentication has failed.
+ //it could be because of invalid user_id or invalid passwd issued
+ //while passing the login parameters.
+ //Here we are checking for TP_CONN_STATUS_REASON_AUTHENTICATION_FAILED since
+ // the gabblelogs show the reason value as 3 if invalid user_id and passwd are given.
+
+ testData->SetConnectionState(CTestData::EDISCONNECTED);
+
+ //Quit the main loop started in action_login.
+ g_main_loop_quit(testData->GetMainLoop());
+
+ }
+ else
+ {
+ //this was initiated in the logout testcase,
+ //update the state_of_connection
+ //LOGOUT AFTER SUCCESSFUL LOGIN
+
+ if( testData->GetConnectionState() != CTestData::EDISCONNECTED )
+ {
+
+ logger->Log( _L("status_changed_cb::not disconnected\n") );
+
+ testData->IncLoginCompleteFlag();
+
+ //currently for all the reasons except TP_CONN_STATUS_REASON_AUTHENTICATION_FAILED
+ //disconencted will come here.
+ //This code can be updated for variuos "reason" values
+ //based on the scenarios and the need for the test cases for those scenarios.
+ }
+
+ if( testData->GetLoginCompleteFlag() && testData->GetConnectionState() == CTestData::EDISCONNECTED )
+ {
+ logger->Log( _L("status_changed_cb::disconnected\n") );
+ testData->ResetLoginCompleteFlag();
+ //Quit the main loop started in action_login.
+ g_main_loop_quit(testData->GetMainLoop());
+
+ }
+ logger->Log( _L("status_changed_cb::before SetConnectionState\n") );
+ testData->SetConnectionState(CTestData::EDISCONNECTED);
+
+ }
+ }
+
+ }
+ logger->Log( _L("status_changed_cb out\n") );
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// function_name : new_channel_handler
+// description : callback function for NewChannel signal
+//-----------------------------------------------------------------------------
+void CTelepathyGabbleLoginTest::new_channel_handler(DBusGProxy* /*proxy*/, const char *object_path,
+ const char *channel_type, guint handle_type,
+ guint channel_handle, gboolean /*suppress_handler*/,
+ gpointer user_data)
+{
+CTestData* testData = static_cast<CTestData*> (user_data);
+CStifLogger* logger = testData->GetStifLogger();
+logger->Log( _L("new_channel_handler\n") );
+
+//Use the class data member new_text_channel.
+TpChan *new_chan;
+
+//Get the new_chan
+new_chan = tp_chan_new(testData->GetDBusConnection(),
+ CONNMGR_BUS, object_path,
+ channel_type, handle_type, channel_handle);
+
+
+//channel_type == TP_IFACE_CHANNEL_TYPE_TEXT
+if ((strcmp(channel_type, TP_IFACE_CHANNEL_TYPE_TEXT) == 0) )
+ {
+ g_hash_table_insert(testData->GetTextChannelsHT(), g_strdup(object_path), new_chan);
+ //test_log_handler( "b4 text_channel_init" );
+ //check for new_chan objects for text channel should be loaclly stored/freed
+ text_channel_init( new_chan );
+ }
+
+
+//channel_type == TP_IFACE_CHANNEL_TYPE_CONTACT_LIST
+if( strcmp( channel_type, TP_IFACE_CHANNEL_TYPE_CONTACT_LIST ) == 0
+ && (g_strrstr(object_path, "RosterChannel/subscribe") ) )
+
+ {
+ DBusGProxy* groupInterface = NULL;
+ //Get the group_iface
+ groupInterface =
+ tp_chan_get_interface(new_chan,
+ TELEPATHY_CHAN_IFACE_GROUP_QUARK);
+
+
+ testData->SetGroupSubscribeInterface(groupInterface);
+
+ //register the callback, commented for now.
+ dbus_g_proxy_connect_signal (groupInterface, "MembersChanged",
+ G_CALLBACK (CTelepathyGabbleAddDeleteContact::roster_members_changed_cb ),
+ NULL, NULL);
+
+ //add_contact("testcm6666@gmail.com",NULL);
+
+ testData->IncLoginCompleteFlag();
+
+ }
+
+if( strcmp( channel_type, TP_IFACE_CHANNEL_TYPE_CONTACT_LIST ) == 0
+ && (g_strrstr(object_path, "RosterChannel/publish") ) )
+
+ {
+
+ DBusGProxy* groupInterface = NULL;
+ //Get the group_iface
+ groupInterface ==
+ tp_chan_get_interface(new_chan,
+ TELEPATHY_CHAN_IFACE_GROUP_QUARK);
+
+ testData->SetGroupPublishInterface(groupInterface);
+
+ dbus_g_proxy_connect_signal (groupInterface, "MembersChanged",
+ G_CALLBACK (CTelepathyGabbleAddDeleteContact::roster_members_changed_cb ),
+ NULL, NULL);
+
+
+
+ //Increment the flag.
+ testData->IncLoginCompleteFlag();
+
+ }
+
+if( strcmp( channel_type, TP_IFACE_CHANNEL_TYPE_CONTACT_LIST ) == 0
+ && (g_strrstr(object_path, "RosterChannel/known") ) )
+
+ {
+ DBusGProxy* groupInterface = NULL;
+ //Get the group_iface
+ groupInterface = tp_chan_get_interface(new_chan,
+ TELEPATHY_CHAN_IFACE_GROUP_QUARK);
+
+
+ //remove_contact( "testcm6666@gmail.com", NULL );
+ testData->SetGroupKnownInterface(groupInterface);
+
+ dbus_g_proxy_connect_signal (groupInterface, "MembersChanged",
+ G_CALLBACK (CTelepathyGabbleAddDeleteContact::roster_members_changed_cb ),
+ NULL, NULL);
+
+
+ //increment the flag
+ testData->IncLoginCompleteFlag();
+
+ }
+
+if( strcmp( channel_type, TP_IFACE_CHANNEL_TYPE_CONTACT_LIST ) == 0
+ && (g_strrstr(object_path, "RosterChannel/deny") ) )
+
+ {
+ DBusGProxy* groupInterface = NULL;
+ //Get the group_iface
+ groupInterface = tp_chan_get_interface(new_chan,
+ TELEPATHY_CHAN_IFACE_GROUP_QUARK);
+
+ testData->SetGroupDenyInterface(groupInterface);
+
+ dbus_g_proxy_connect_signal (groupInterface, "MembersChanged",
+ G_CALLBACK (CTelepathyGabbleAddDeleteContact::roster_members_changed_cb ),
+ NULL, NULL);
+
+ //remove_contact( "testcm6666@gmail.com", NULL );
+
+ //increment the flag
+ testData->IncLoginCompleteFlag();
+
+ }
+ //Quit the mainloop started once all the channel-types are recieved.
+ //check the flag.
+
+ if (testData->GetLoginCompleteFlag() == 3)
+ //In case of gizmo, the number of channels is 3.gtalk for deny also we get the callback
+ //we must also store the server name in the login class and check the server name here
+ {
+ //Quit the main loop.
+ testData->ResetLoginCompleteFlag();
+ testData->GetStifLogger()->Log( _L("new_channel_handler::after ResetLoginCompleteFlag\n") );
+ g_main_loop_quit(testData->GetMainLoop());
+
+ }
+
+
+}
+
+//-----------------------------------------------------------------------------
+// function_name : text_channel_init
+// description : To get pending messages after login
+//-----------------------------------------------------------------------------
+
+void CTelepathyGabbleLoginTest::text_channel_init ( TpChan *text_chan )
+ {
+ GPtrArray *messages_list ;
+ guint i;
+ GArray *message_ids;
+ DBusGProxy *text_iface;
+
+
+ text_iface = tp_chan_get_interface(text_chan ,
+ TELEPATHY_CHAN_IFACE_TEXT_QUARK);
+
+
+ //check if need to fetch the pending message or simply register for receive only
+ tp_chan_type_text_list_pending_messages(text_iface,
+ FALSE,
+ &messages_list,
+ NULL);
+
+
+ message_ids = g_array_new (FALSE, TRUE, sizeof (guint));
+
+
+ for (i = 0; i < messages_list->len ; i++)
+ {
+ guint message_id;
+ guint timestamp;
+ guint from_handle;
+ guint message_type;
+ guint message_flags;
+ const gchar *message_body;
+ GValueArray *message_struct;
+
+
+
+ message_struct = (GValueArray *) g_ptr_array_index (messages_list, i);
+
+ message_id = g_value_get_uint(g_value_array_get_nth(message_struct, 0));
+
+ timestamp = g_value_get_uint(g_value_array_get_nth(message_struct, 1));
+
+ from_handle = g_value_get_uint(g_value_array_get_nth(message_struct, 2));
+
+ message_type = g_value_get_uint(g_value_array_get_nth(message_struct, 3));
+
+ message_flags = g_value_get_uint(g_value_array_get_nth(message_struct, 4));
+
+ message_body = g_value_get_string(g_value_array_get_nth(message_struct, 5));
+
+ g_array_append_val (message_ids, message_id);
+
+ }
+
+
+ tp_chan_type_text_acknowledge_pending_messages(text_iface, message_ids,
+ NULL);
+
+
+
+}
+
+
+
+//End of file
\ No newline at end of file