loggingservices/eventlogger/test/src/t_lognotify.cpp
changeset 0 08ec8eefde2f
child 11 667e88a979d7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loggingservices/eventlogger/test/src/t_lognotify.cpp	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,566 @@
+// Copyright (c) 2002-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:
+//
+
+#include "TEST.H"
+#include <logview.h>
+
+#undef test  //there is a "test" macro which hides "RTest test" declaration.
+
+RTest test(_L("Log Change Notification Test Harness"));
+
+_LIT(KTestRemoteParty1, "Remote Party");
+_LIT(KTestDirection1, "Direction");
+const TLogDurationType KTestDurationType1 = 1;
+const TLogDuration KTestDuration1 = 0x1234;
+_LIT(KTestStatus1, "Status");
+_LIT(KTestSubject1, "Subject");
+_LIT(KTestNumber1, "TheNumber");
+const TLogContactItemId KTestContact1 = 0x1234;
+const TLogLink KTestLink1 = 0x1234;
+_LIT8(KTestData1, "ABCDEFGH");
+const TLogFlags KTestFlags1 = 0x5;
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0926
+@SYMTestCaseDesc	    Tests for CLogClient::NotifyChange() function
+@SYMTestPriority 	    High
+@SYMTestActions  	    Tests for notification of changes to the logengine database.
+                        Add events within the time intervals ,check for the notification of an event
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestNotificationL()
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0926 "));
+	CLogClient* client = CLogClient::NewL(theFs);
+	CleanupStack::PushL(client);
+
+	CTestActive* active1 = new(ELeave)CTestActive;
+	CleanupStack::PushL(active1);
+
+	CTestActive* active2 = new(ELeave)CTestActive;
+	CleanupStack::PushL(active2);
+
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	event->SetEventType(KLogCallEventTypeUid);
+	event->SetRemoteParty(KTestRemoteParty1);
+	event->SetDirection(KTestDirection1);
+	event->SetDurationType(KTestDurationType1);
+	event->SetDuration(KTestDuration1);
+	event->SetStatus(KTestStatus1);
+	event->SetSubject(KTestSubject1);
+	event->SetNumber(KTestNumber1);
+	event->SetContact(KTestContact1);
+	event->SetLink(KTestLink1);
+	event->SetDataL(KTestData1);
+	event->SetFlags(KTestFlags1);
+
+	// *** Notification when change made - no delay
+	active1->StartL();
+	client->NotifyChange(0, active1->iStatus);
+
+	// Add an event
+	active2->StartL();
+	client->AddEvent(*event, active2->iStatus);
+	
+	// Not sure which will finish first
+	CActiveScheduler::Start();
+	if (!active1->IsActive())
+		{
+		TEST(active2->IsActive());
+		TEST(active1->iStatus.Int() >= 0);
+		CActiveScheduler::Start();
+		TEST2(active2->iStatus.Int(), KErrNone);
+		}
+	else
+		{
+		TEST2(active2->iStatus.Int(), KErrNone);
+		CActiveScheduler::Start();
+		TEST(active1->iStatus.Int() >= 0);
+		}
+
+	// Remember the time
+	TTime before;
+	before.UniversalTime();
+
+	const TTimeIntervalMicroSeconds32 delay = 3000000;
+
+	// *** Notification when change made - with long delay
+	active1->StartL();
+	client->NotifyChange(delay, active1->iStatus);
+
+	// Add an event
+	active2->StartL();
+	client->AddEvent(*event, active2->iStatus);
+	
+	// We can be fairly certain that the function will complete first
+	CActiveScheduler::Start();
+	TEST2(active2->iStatus.Int(), KErrNone);
+	TEST(active1->IsActive());
+	CActiveScheduler::Start();
+	TEST(active1->iStatus.Int() >= 0);
+
+	User::After(1000000);
+
+	// Check delay
+	TTime after;
+	after.UniversalTime();
+	TEST(before + delay <= after);
+
+	before.UniversalTime();
+
+	// *** Notification when change made - with long delay - multiple changes
+	active1->StartL();
+	client->NotifyChange(delay, active1->iStatus);
+
+	// Add an event
+	active2->StartL();
+	client->AddEvent(*event, active2->iStatus);
+	
+	// The function should complete
+	CActiveScheduler::Start();
+	TEST(active1->IsActive());
+	TEST2(active2->iStatus.Int(), KErrNone);
+
+	// Change the event
+	active2->StartL();
+	client->ChangeEvent(*event, active2->iStatus);
+	
+	// The function should complete
+	CActiveScheduler::Start();
+	TEST(active1->IsActive());
+	TEST2(active2->iStatus.Int(), KErrNone);
+
+	// The notification should complete
+	CActiveScheduler::Start();
+	TEST(active1->iStatus.Int() >= 0);
+
+#ifdef __WINS__
+	User::After(1000000);
+#endif
+
+	// Check delay
+	after.UniversalTime();
+	TEST(before + TTimeIntervalMicroSeconds32(delay) <= after);
+
+	// *** Notification when change made - after long delay
+	active1->StartL();
+	client->NotifyChange(delay, active1->iStatus);
+
+	// Wait around for a time equal to the delay
+	CTestTimer* timer = CTestTimer::NewL();
+	timer->After(delay);
+	CActiveScheduler::Start();
+	delete timer;
+
+	// Add an event
+	active2->StartL();
+	client->AddEvent(*event, active2->iStatus);
+	
+	// Not sure which will finish first
+	CActiveScheduler::Start();
+	if (!active1->IsActive())
+		{
+		TEST(active2->IsActive());
+		TEST(active1->iStatus.Int() >= 0);
+		CActiveScheduler::Start();
+		TEST2(active2->iStatus.Int(), KErrNone);
+		}
+	else
+		{
+		TEST2(active2->iStatus.Int(), KErrNone);
+		CActiveScheduler::Start();
+		TEST(active1->iStatus.Int() >= 0);
+		}
+
+	CleanupStack::PopAndDestroy(4); // event, active2, active1, client
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0927
+@SYMTestCaseDesc	    Tests for CLogClient::NotifyChangeCancel() function
+@SYMTestPriority 	    High
+@SYMTestActions  	    Tests for cancelling of any outstanding notification requests for changes to log engine database
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestCancelNotificationL()
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0927 "));
+	CLogClient* client = CLogClient::NewL(theFs);
+	CleanupStack::PushL(client);
+
+	CTestActive* active1 = new(ELeave)CTestActive;
+	CleanupStack::PushL(active1);
+
+	// *** Cancel without delay
+	active1->StartL();
+	client->NotifyChange(0, active1->iStatus);
+	client->NotifyChangeCancel();
+	CActiveScheduler::Start();
+	TEST2(active1->iStatus.Int(), KErrCancel);
+
+	const TInt delay = 3000000;
+
+	// *** Cancel with delay	
+	active1->StartL();
+	client->NotifyChange(delay, active1->iStatus);
+
+	// Wait around for a bit
+	CTestTimer* timer = CTestTimer::NewL();
+	timer->After(delay / 2);
+	CActiveScheduler::Start();
+	delete timer;
+
+	client->NotifyChangeCancel();
+	CActiveScheduler::Start();
+	TEST2(active1->iStatus.Int(), KErrCancel);
+
+	// *** Cancel with long delay	
+	active1->StartL();
+	client->NotifyChange(delay, active1->iStatus);
+
+	// Wait around for a bit
+	timer = CTestTimer::NewL();
+	timer->After(delay * 2);
+	CActiveScheduler::Start();
+	delete timer;
+
+	client->NotifyChangeCancel();
+	CActiveScheduler::Start();
+	TEST2(active1->iStatus.Int(), KErrCancel);
+
+	// *** Cancel after change
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+	event->SetEventType(KLogCallEventTypeUid);
+
+	active1->StartL();
+	client->NotifyChange(delay, active1->iStatus);
+
+	CTestActive* active2 = new(ELeave)CTestActive;
+	CleanupStack::PushL(active2);
+
+	active2->StartL();
+	client->AddEvent(*event, active2->iStatus);
+	CActiveScheduler::Start();
+	TEST(active1->IsActive());
+	TEST2(active2->iStatus.Int(), KErrNone);
+
+	client->NotifyChangeCancel();
+	CActiveScheduler::Start();
+	TEST2(active1->iStatus.Int(), KErrCancel);
+
+	// *** Cancel after change and delay
+	active1->StartL();
+	client->NotifyChange(delay, active1->iStatus);
+
+	// Wait around for a bit
+	timer = CTestTimer::NewL();
+	timer->After(delay / 2);
+	CActiveScheduler::Start();
+	delete timer;
+
+	active2->StartL();
+	client->AddEvent(*event, active2->iStatus);
+	CActiveScheduler::Start();
+	TEST(active1->IsActive());
+	TEST2(active2->iStatus.Int(), KErrNone);
+
+	client->NotifyChangeCancel();
+	CActiveScheduler::Start();
+	TEST2(active1->iStatus.Int(), KErrCancel);
+
+	// *** Cancel after change and delay
+	active1->StartL();
+	client->NotifyChange(delay, active1->iStatus);
+
+	active2->StartL();
+	client->AddEvent(*event, active2->iStatus);
+	CActiveScheduler::Start();
+	TEST(active1->IsActive());
+	TEST2(active2->iStatus.Int(), KErrNone);
+
+	// Wait around for a bit
+	timer = CTestTimer::NewL();
+	timer->After(delay / 2);
+	CActiveScheduler::Start();
+	delete timer;
+
+	client->NotifyChangeCancel();
+	CActiveScheduler::Start();
+	TEST2(active1->iStatus.Int(), KErrCancel);
+
+	// *** Cancel when not active
+	client->NotifyChangeCancel();
+
+	CleanupStack::PopAndDestroy(4); // active2, event, active, client
+	}
+
+/**
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0928
+@SYMTestCaseDesc	    Tests for notification requests on view purge
+@SYMTestPriority 	    High
+@SYMTestActions  	    Notify changes on log view event
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void TestViewPurgeNotifyL()
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0928 "));
+	CTestTimer* timer = CTestTimer::NewL();
+	CleanupStack::PushL(timer);
+
+	CTestActive* active = new(ELeave)CTestActive();
+	CleanupStack::PushL(active);
+
+	CLogClient* client = CLogClient::NewL(theFs);
+	CleanupStack::PushL(client);
+
+	CLogViewEvent* view = CLogViewEvent::NewL(*client);
+	CleanupStack::PushL(view);
+
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+
+	CTestActive* notify = new(ELeave)CTestActive;
+	CleanupStack::PushL(notify);
+
+	// Start notifier
+	notify->StartL();
+	client->NotifyChange(1000000, notify->iStatus);
+
+	// Wait for 10 seconds
+	TEST(notify->IsActive());
+	timer = CTestTimer::NewL();
+	timer->After(7000000);
+	CActiveScheduler::Start();
+	delete timer;
+
+	// Setup a view
+	TEST(notify->IsActive());
+	if (view->SetFilterL(*filter, active->iStatus))
+		{
+		active->StartL();
+		CActiveScheduler::Start();
+		TEST(view->CountL() > 0);
+		}
+
+	// Wait for 10 seconds
+	TEST(notify->IsActive());
+	timer = CTestTimer::NewL();
+	timer->After(10000000);
+	CActiveScheduler::Start();
+	delete timer;
+
+	// We shouldn't be notified because nothing has changed
+	TEST(notify->IsActive());
+	client->NotifyChangeCancel();
+	CActiveScheduler::Start();
+	TEST2(notify->iStatus.Int(), KErrCancel);
+
+	CleanupStack::PopAndDestroy(6); // notify, client, filter, view, active, timer
+	}
+
+/**
+INC045485 - AV20 Messaging App crashes when attempting to write New SMS
+
+@SYMTestCaseID          SYSLIB-LOGENG-CT-0929
+@SYMTestCaseDesc	    Tests for defect number INC045485L.
+@SYMTestPriority 	    High
+@SYMTestActions  	    Tests by adding a fax event type
+@SYMTestExpectedResults Test must not fail
+@SYMREQ                 REQ0000
+*/
+LOCAL_C void INC045485L()
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-0929 "));
+	const TInt KEventCnt = 5;//test events count
+	const TInt KSizeOfEventData = 400;//should be bigger than KLogSizeOfEventGuess constant
+	//Create client, active, event
+	CLogClient* client = CLogClient::NewL(theFs);
+	CleanupStack::PushL(client);
+	CTestActive* active = new (ELeave) CTestActive;
+	CleanupStack::PushL(active);
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+	//Add KEventCnt events
+	for(TInt i=0;i<KEventCnt;++i)
+		{
+		event->SetId(0x13579 + i);
+		event->SetEventType(KLogFaxEventTypeUid);
+		TUint8 buf[KSizeOfEventData];
+		Mem::Fill(buf, KSizeOfEventData, TChar('1' + i));
+		TPtr8 ptr(buf, KSizeOfEventData, KSizeOfEventData);
+		event->SetDataL(ptr);
+		//
+		active->StartL();
+		client->AddEvent(*event, active->iStatus);
+		CActiveScheduler::Start();
+		TEST(!active->IsActive());
+		client->Cancel();
+		TEST2(active->iStatus.Int(), KErrNone);
+		}
+	//Create LogViewEvent, CLogFilter
+	CLogViewEvent* view = CLogViewEvent::NewL(*client);
+	CleanupStack::PushL(view);
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	filter->SetEventType(KLogFaxEventTypeUid);//the same as the type UID of added events
+	//Filter the events
+	if(view->SetFilterL(*filter, active->iStatus))
+		{
+		active->StartL();
+		CActiveScheduler::Start();
+		TEST(view->CountL() == KEventCnt);
+		}
+	//Visit the events
+	TInt j = 0;
+	TEST(view->FirstL(active->iStatus));
+	do
+		{
+		active->StartL();
+		CActiveScheduler::Start();
+		TEST2(active->iStatus.Int(), KErrNone);//If the defect is not fixed this check fails with "KErrOverflow"
+		const CLogEvent& e = view->Event();
+		RDebug::Print(_L("View Entry[%d]: Id:%d, Type:%x\n"), j, e.Id(), e.EventType().iUid);
+		const TDesC8& data = e.Data();
+		TEST(data.Length() == KSizeOfEventData);
+		//Touch the data.
+		for(TInt k=0;k<KSizeOfEventData;++k)
+			{
+			TChar c = data[k];
+			TEST(c >= TChar('1') && c < TChar('1' + KEventCnt));
+			}
+		++j;
+		}
+	while(view->NextL(active->iStatus));
+	//Destroy filter, view, event, active, client
+	CleanupStack::PopAndDestroy(filter);
+	CleanupStack::PopAndDestroy(view);
+	CleanupStack::PopAndDestroy(event);
+	CleanupStack::PopAndDestroy(active);
+	CleanupStack::PopAndDestroy(client);
+	}
+
+//DEF060381  Propagated: Receiving Chinese SMSes causes the battery to drain too fast 
+static void DEF060381L()
+	{
+	const TInt KSizeOfEventData = 1025; //should be bigger than KLogSizeOfEventGuess constant
+
+	//Create two clients. The first one will be used to send one message to the server,
+	//which length is too big. The second client will be used to receive the message from
+	//the server.
+	//If the defect is not fixed, the function hangs and its return point is never reached.
+	CLogClient* client1 = CLogClient::NewL(theFs);
+	CleanupStack::PushL(client1);
+
+	CLogClient* client2 = CLogClient::NewL(theFs);
+	CleanupStack::PushL(client2);
+
+	CTestActive* active = new (ELeave) CTestActive;
+	CleanupStack::PushL(active);
+
+	//Create one SMS event, which holds a block of data with size bigger than the default 
+	//size of the client side buffer (KLogSizeOfEventGuess).
+	CLogEvent* event = CLogEvent::NewL();
+	CleanupStack::PushL(event);
+
+	event->SetId(0x9991118);
+	event->SetEventType(KLogShortMessageEventTypeUid);
+	TUint8 buf[KSizeOfEventData];
+	for(TInt i=0;i<KSizeOfEventData;++i)
+		{
+		buf[i] = static_cast <TUint8> (i % 256);
+		}
+	TPtr8 ptr(buf, KSizeOfEventData, KSizeOfEventData);
+	event->SetDataL(ptr);
+
+	//Send the created event to the server unsing the first client.
+	active->StartL();
+	client1->AddEvent(*event, active->iStatus);
+	CActiveScheduler::Start();
+	TEST(!active->IsActive());
+	TEST2(active->iStatus.Int(), KErrNone);
+
+	//Create a view using the second client.
+	//Create a filter for SMS messages.
+	CLogViewEvent* view = CLogViewEvent::NewL(*client2);
+	CleanupStack::PushL(view);
+	CLogFilter* filter = CLogFilter::NewL();
+	CleanupStack::PushL(filter);
+	filter->SetEventType(KLogShortMessageEventTypeUid);//the same as the type UID of added events
+	//Filter the events
+	if(view->SetFilterL(*filter, active->iStatus))
+		{
+		active->StartL();
+		CActiveScheduler::Start();//Here the test fucntion hangs and never returns, if the defect is not fixed.
+		TEST(view->CountL() == 1);
+		}
+	//Visit the events
+	TInt j = 0;
+	TEST(view->FirstL(active->iStatus));
+	do
+		{
+		active->StartL();
+		CActiveScheduler::Start();
+		TEST2(active->iStatus.Int(), KErrNone);
+		const CLogEvent& e = view->Event();
+		RDebug::Print(_L("View Entry[%d]: Id:%d, Type:%x\n"), j, e.Id(), e.EventType().iUid);
+		const TDesC8& data = e.Data();
+		TEST(data.Length() == KSizeOfEventData);
+		//Touch the data.
+		for(TInt k=0;k<KSizeOfEventData;++k)
+			{
+			TUint8 c = data[k];
+			TEST(c == static_cast <TUint8> (k % 256));
+			}
+		++j;
+		}
+	while(view->NextL(active->iStatus));
+
+	CleanupStack::PopAndDestroy(filter);
+	CleanupStack::PopAndDestroy(view);
+	CleanupStack::PopAndDestroy(event);
+	CleanupStack::PopAndDestroy(active);
+	CleanupStack::PopAndDestroy(client2);
+	CleanupStack::PopAndDestroy(client1);
+	}
+
+void doTestsL()
+	{
+	TestUtils::Initialize(_L("T_LOGNOTIFY"));
+	TestUtils::DeleteDatabaseL();
+
+	test.Start(_L("Notifications"));
+	TestNotificationL();
+	theLog.Write(_L8("Test 1 OK\n"));
+
+	test.Next(_L("INC045485"));
+	::INC045485L();
+
+	test.Next(_L("Cancelling Notifications"));
+	TestCancelNotificationL();
+	theLog.Write(_L8("Test 2 OK\n"));
+
+	test.Next(_L("Notify with View Purge"));
+	TestViewPurgeNotifyL();
+	theLog.Write(_L8("Test 3 OK\n"));
+
+	test.Next(_L("DEF060381"));
+	::DEF060381L();
+	}