lowlevellibsandfws/apputils/tsrc/T_SSND.CPP
author hgs
Thu, 05 Aug 2010 18:45:56 +0530
changeset 48 ab61c4cedc64
parent 0 e4d67989cc36
permissions -rw-r--r--
201027

// Copyright (c) 1997-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:
// TA_ARRAY.CPP
// 
//

#include <e32test.h>
#include <basched.h>
#include <f32file.h>
#include <centralrepository.h>

#include <bassnd.h>
#include "BASSNDUID.h"
#include "BASSNDPriorityDecoder.h"

LOCAL_D RTest test(_L("T_SSND"));
RFs TheFs;
TBool TestingOOM = EFalse;

const TUid KRing1={100};
const TUid KRing2={101};
const TUid KAlarm1={201};
const TUid KAlarm2={202};
const TUid KMessage1={203};

_LIT(KSndNameWarble,"c:\\system\\data\\warble.wav");
_LIT(KSndNameMozart,"c:\\system\\data\\mozart.wav");
_LIT(KSndNameBach,"c:\\system\\data\\bach.wav");
_LIT(KSndNameVivaldi,"c:\\system\\data\\vivaldi.wav");

#define TEST2(err, cond) \
	{\
	if (TestingOOM && err == KErrNoMemory) \
		{\
		User::LeaveNoMemory();\
		}\
	test(cond);\
	}

// Delete all entries in sound table
LOCAL_C void ClearSoundTableL()
	{
	CRepository *repository = CRepository::NewLC(KSystemSoundRepositoryUID);
	repository->Reset();
	CleanupStack::PopAndDestroy( repository );
	}

LOCAL_C void TestSetSounds1L()
	{
	TBaSystemSoundType sndType(KSystemSoundRingUID,KRing1);
	TBaSystemSoundInfo sndInfo(sndType,KSndNameWarble());
	BaSystemSound::SetSoundL(TheFs,sndInfo);
	}

LOCAL_C void TestSetSounds2L()
	{
	TBaSystemSoundType sndType(KSystemSoundRingUID,KRing2);
	TBaSystemSoundInfo sndInfo(sndType,KSndNameMozart());
	BaSystemSound::SetSoundL(TheFs,sndInfo);
	}

LOCAL_C void TestSetSounds3L()
	{
	TBaSystemSoundType sndType(KSystemSoundAlarmUID,KAlarm1);
	TBaSystemSoundInfo sndInfo(sndType,KSndNameBach());
	sndInfo.iVolume=100;
	sndInfo.iPriority=TBaSoundPriorityEncoder(16).Int();
	BaSystemSound::SetSoundL(TheFs,sndInfo);
	}

LOCAL_C void TestSetSounds4L()
	{
	TBaSystemSoundType sndType(KSystemSoundAlarmUID,KAlarm2);
	TBaSystemSoundInfo sndInfo(sndType,KSndNameVivaldi());
	sndInfo.iVolume=83;
	TBaSoundPriorityEncoder priority(-100,(TMdaPriorityPreference(0xFF030001)));
	sndInfo.iPriority=priority.Int();
	BaSystemSound::SetSoundL(TheFs,sndInfo);
	}

/**
@SYMTestCaseID          SYSLIB-BAFL-CT-1286
@SYMTestCaseDesc        Tests for BaSystemSound::SetSoundL() function
@SYMTestPriority        High
@SYMTestActions         Tests for KErrArgument,when TSoundCategory is passed with out being set as a tone
@SYMTestExpectedResults Test must not fail
@SYMREQ                 REQ0000
*/
LOCAL_C void TestSetSounds5L()
	{
	// Testing SetSoundL.
	// Should leave with KErrArgument when TSoundCategory of sndInfo
	// parameter is passed with out being set either as a tone, a file
    // or a sequence.
	test.Next(_L(" @SYMTestCaseID:SYSLIB-BAFL-CT-1286 "));
	TBaSystemSoundInfo sndInfo;
	TRAPD(err,BaSystemSound::SetSoundL(TheFs,sndInfo));
	TEST2(err, err==KErrArgument);
	}

/**
@SYMTestCaseID          SYSLIB-BAFL-CT-3395
@SYMTestCaseDesc        Tests for BaSystemSound::SetSound() function
@SYMTestPriority        High
@SYMTestActions         Set sounds of different types: file, tone and seq
@SYMTestExpectedResults Test must not fail
@SYMDEF					DEF095280
*/
LOCAL_C void TestSetSoundsL()
	{
	test.Next(_L(" @SYMTestCaseID:SYSLIB-BAFL-CT-3395 "));
	// split into stupidly small chunks to avoid _chkstk errors

	//set sounds
	TestSetSounds1L();
	TestSetSounds2L();
	TestSetSounds3L();
	TestSetSounds4L();
	TestSetSounds5L();
	}

/**
@SYMTestCaseID          SYSLIB-BAFL-CT-1287
@SYMTestCaseDesc        Tests for BaSystemSound::GetSound() function
@SYMTestPriority        High
@SYMTestActions         Attempt for getting back sounds
@SYMTestExpectedResults Test must not fail
@SYMDEF					DEF095280
*/
LOCAL_C void TestGetSoundsL()
	{
	test.Next(_L(" @SYMTestCaseID:SYSLIB-BAFL-CT-1287 "));
	TBaSystemSoundInfo info;

	//get sounds
	//should return warble
	TBaSystemSoundType sndType(KSystemSoundRingUID,KRing1);
	TInt e=BaSystemSound::GetSound(TheFs,sndType,info);
	TEST2(e, e==KErrNone);
	test(info.FileName()==KSndNameWarble);
	//should return mozart
	sndType=TBaSystemSoundType(KSystemSoundRingUID,KRing2);
	e=BaSystemSound::GetSound(TheFs,sndType,info);
	TEST2(e, e==KErrNone);
	test(info.FileName()==KSndNameMozart);
	//should return bach
	sndType=TBaSystemSoundType(KSystemSoundAlarmUID,KAlarm1);
	e=BaSystemSound::GetSound(TheFs,sndType,info);
	TEST2(e, e==KErrNone);
	test(info.FileName()==KSndNameBach);
	test(info.iVolume=100);
	TBaSoundPriorityDecoder priorityDecode(info.iPriority);
	test(priorityDecode.Priority()==16);
	test(priorityDecode.PriorityPreference()==EMdaPriorityPreferenceTimeAndQuality);
	//should rturn vivaldi
	sndType=TBaSystemSoundType(KSystemSoundAlarmUID,KAlarm2);
	e=BaSystemSound::GetSound(TheFs,sndType,info);
	TEST2(e, e==KErrNone);
	test(info.FileName()==KSndNameVivaldi);
	test(info.iVolume=83);
	priorityDecode=TBaSoundPriorityDecoder(info.iPriority);
	test(priorityDecode.Priority()==-100);
	test(priorityDecode.PriorityPreference()==(TMdaPriorityPreference(0xFF030001)));
	}

// ---------------------------------------------------
// OomTest
//
// Function to convert a test into an OOM test

/**
@SYMTestCaseID          SYSLIB-BAFL-CT-1288
@SYMTestCaseDesc        Out of memory tests
@SYMTestPriority        High
@SYMTestActions         Turns a basic test function into OOM test.
@SYMTestExpectedResults Test must not fail
@SYMDEF					DEF095280
@SYMREQ                 REQ0000
*/
LOCAL_C void OomTest( void (*testFuncL)() )
	{
	test.Next(_L(" @SYMTestCaseID:SYSLIB-BAFL-CT-1288 "));
	TInt error;
	TestingOOM = ETrue;
	TInt count = 0;

	do
		{
		User::__DbgMarkStart( RHeap::EUser );

		// find out the number of open handles
		TInt startProcessHandleCount;
		TInt startThreadHandleCount;
		RThread().HandleCount(startProcessHandleCount, startThreadHandleCount);

		User::__DbgSetAllocFail( RHeap::EUser, RHeap::EFailNext, ++count );

		TRAP( error, (testFuncL)() );

		User::__DbgSetAllocFail( RHeap::EUser, RHeap::ENone, 1 );

		// check that no handles have leaked
		TInt endProcessHandleCount;
		TInt endThreadHandleCount;
		RThread().HandleCount(endProcessHandleCount, endThreadHandleCount);

		test(startProcessHandleCount == endProcessHandleCount);
		test(startThreadHandleCount  == endThreadHandleCount);

		User::__DbgMarkEnd( RHeap::EUser, 0 );
		} while( error == KErrNoMemory );

	TestingOOM = EFalse;

	_LIT( KTestFailed, "Out of memory test failure on iteration %d\n" );
	__ASSERT_ALWAYS( error == KErrNone, test.Panic( error, KTestFailed, count ) );

	test.Printf( _L( "Out of memory tests succeeded at heap failure rate of %i\n" ), count );
	}

/**
@SYMTestCaseID          SYSLIB-BAFL-CT-3397
@SYMTestCaseDesc        When a client requests a non-existing sound
                        which is in one of the system category,
						BaSystemSound returns the default sound for
						that system category.
@SYMTestPriority        High
@SYMTestActions         With the sound table empty, get sound in the
						alarm, message and ring categories.
@SYMTestExpectedResults The default sound for the category is returned.
@SYMDEF					DEF095280
*/
LOCAL_C void GetNonExistingSoundL()
	{
	test.Next(_L(" @SYMTestCaseID:SYSLIB-BAFL-CT-3397 "));
	TBaSystemSoundInfo info;
	TInt ret(KErrNone);

	//get sound empty file
	TBaSystemSoundType sndType(KSystemSoundAlarmUID,KAlarm1);
	ret = BaSystemSound::GetSound(TheFs,sndType,info);
	TEST2(ret, ret==KErrNotFound);
	_LIT(KSystemSoundDefaultAlarm,"z:\\system\\SystemSounds\\alarm.wav");
	test(info.FileName() == KSystemSoundDefaultAlarm);

	sndType.iMajor = KSystemSoundMessageUID;
	sndType.iMinor = KMessage1;
	ret = BaSystemSound::GetSound(TheFs,sndType,info);
	TEST2(ret, ret==KErrNotFound);
	_LIT(KSystemSoundDefaultMessage,"z:\\system\\SystemSounds\\message.wav");
	test(info.FileName() == KSystemSoundDefaultMessage);

	sndType.iMajor = KSystemSoundRingUID;
	sndType.iMinor = KRing1;
	ret = BaSystemSound::GetSound(TheFs,sndType,info);
	TEST2(ret, ret==KErrNotFound);
	_LIT(KSystemSoundDefaultRing,"z:\\system\\SystemSounds\\ring.wav");
	test(info.FileName() == KSystemSoundDefaultRing);
	}

/**
@SYMTestCaseID          SYSLIB-BAFL-CT-3396
@SYMTestCaseDesc        Test CBaSystemSoundArray APIs.
@SYMTestPriority        High
@SYMTestActions         Use CBaSystemSoundArray to retrieve an entire
						sound category and step through each sound in
						the array.
@SYMTestExpectedResults Test must not fail
@SYMDEF					DEF095280
*/
LOCAL_C void GetSoundArrayL()
	{
	test.Next(_L(" @SYMTestCaseID:SYSLIB-BAFL-CT-3396 "));
	CBaSystemSoundArray* sa= CBaSystemSoundArray::NewLC();
	sa->RestoreL(TheFs,KSystemSoundRingUID);

	TInt count = sa->Count();
	test(count==2);
	TBaSystemSoundInfo i0 = sa->At(0);
	test(i0.iType.iMinor==KRing1);
	test(i0.FileName()==KSndNameWarble);
	TBaSystemSoundInfo i1 = sa->At(1);
	test(i1.iType.iMinor==KRing2);
	test(i1.FileName()==KSndNameMozart);

	CleanupStack::PopAndDestroy(); // sa
	}

/**
@SYMTestCaseID          SYSLIB-BAFL-CT-0441
@SYMTestCaseDesc        Tests for the functionality of TBaSystemSoundInfo
@SYMTestPriority        High
@SYMTestActions         Calls up BaSystemSound test functions
@SYMTestExpectedResults Test must not fail
@SYMREQ                 REQ0000
*/
void DoTestsL()
	{
	test.Next(_L(" @SYMTestCaseID:SYSLIB-BAFL-CT-0441 "));
	//delete all sounds
	ClearSoundTableL();

	test.Next(_L("Get non-existing sound"));
	GetNonExistingSoundL();

	test.Next(_L("Setting sounds"));
	TestSetSoundsL();

	test.Next(_L("Getting back sounds\n"));
	TestGetSoundsL();

	test.Next(_L("CBaSystemSoundArray access"));
	GetSoundArrayL();

	//delete all sounds
	ClearSoundTableL();

	// OOM test
	test.Next(_L("OOM Test get non-existing sound"));
	OomTest(GetNonExistingSoundL);

	test.Next(_L("OOM Test Setting sounds"));
	OomTest(TestSetSoundsL);

	test.Next(_L("OOM Test Getting back sounds"));
	OomTest(TestGetSoundsL);

	test.Next(_L("OOM Test CBaSystemSoundArray access"));
	OomTest(GetSoundArrayL);

	// cleanup
	ClearSoundTableL();
	}

GLDEF_C TInt E32Main()
	{
	__UHEAP_MARK;
	CActiveScheduler::Install(new CActiveScheduler);
	CTrapCleanup* cleanup=CTrapCleanup::New();
	test.Title();
//	test.RunManual();
	test.Start(_L("Testing system sounds"));
	TRAPD(err,DoTestsL());
	test(err==KErrNone);
	test.End();
	test.Close();
	delete cleanup;
	delete CActiveScheduler::Current();
	__UHEAP_MARKEND;
	return(0);
	}