kerneltest/e32test/dmav2/dma_api_tests.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 8 538db54a451d
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// 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:
// e32test\dma\dma_api_tests.cpp
// 
// Overview:
//  This file contains API tests for the new DMA framework
//

#define __E32TEST_EXTENSION__
#include "d_dma2.h"
#include "u32std.h"
#include "t_dma2.h"
#include "cap_reqs.h"

#include <e32test.h>
#include <e32debug.h>
#include <e32svr.h>

static RTest test(_L("DMA Test Framework API"));
//----------------------------------------------------------------------------------------------
//! @SYMTestCaseID      KBASE-DMA-2564
//! @SYMTestType        CIT
//! @SYMPREQ            REQ
//! @SYMTestCaseDesc    This test checks the correct behaviour of Open API in the new DMA framework
//!
//! @SYMTestActions     
//!						1.  Open a DMA channel
//!						2.	Verify that channel is really open.
//!
//! @SYMTestExpectedResults 
//!						1.  DMA channel opens and KErrNone returned
//!						2.  Call to ChannelIsOpened() return as ETrue.
//!
//! @SYMTestPriority        High
//! @SYMTestStatus          Implemented
//----------------------------------------------------------------------------------------------
void test_open_api()
{
	//TO DO : Expose TInt Open(const SCreateInfo& aInfo, TDmaChannel*& aChannel)
	//TO DO : Implement more test cases
	test.Start(_L("*** Testing Open() API  ***"));

	test.Next(_L("Open session"));
	RDmaSession session;
	TInt r = session.Open();
	test_KErrNone(r);

	TUint channelCookie_open_api=0;
	
	test.Next(_L("Open DMA Channel"));
	channelCookie_open_api=0;
	r = session.ChannelOpen(16, channelCookie_open_api);
	test.Printf(_L("cookie recieved = 0x%08x\n"), channelCookie_open_api);
	test_KErrNone(r);

	//Check if channel is open
	// test.Printf(_L("Verify that the specified DMA channel is opened\n"));	
	// TBool channelOpened;
	// TBool channelNotOpened = EFalse;
	// r = session.ChannelIsOpened(channelCookie_open_api,  channelOpened);
	// test_KErrNone(r);	
 	// TEST_ASSERT(channelOpened != channelNotOpened)
	
	//close channel
	test.Next(_L("Channel close"));
	r = session.ChannelClose(channelCookie_open_api);
	test_KErrNone(r);
	
	RTest::CloseHandleAndWaitForDestruction(session);
	test.End();
}

//----------------------------------------------------------------------------------------------
//! @SYMTestCaseID      KBASE-DMA-2568
//! @SYMTestType        CIT
//! @SYMPREQ            REQ
//! @SYMTestCaseDesc    This test checks the correct behaviour of Close API in the new DMA framework
//!
//! @SYMTestActions     
//!						1.  Open a DMA channel
//!						2.	Open DMA Channel again
//!						3	Close the DMA channel.
//!						4	Open DMA channel to verify that the DMA channel closed.
//!						5.	Open DMA channel again.
//!						6.	Queue a request on the channel.
//!						7.	Close DMA channel while request is still queued on it.
//!
//! @SYMTestExpectedResults 
//!						1.  DMA channel opens and KErrNone returned.
//!						2.	DMA Framework returns KErrInUse as channel is already open.					
//!						3.	DMA channel closes and KErrNone returned.
//!						4.	DMA channel opens and KErrNone returned.
//!						5.	DMA Framework returns KErrInUse as channel is already open.
//!						6.	DMA request queued and KErrNone returned.
//!						7.	DMA channel closes and DMA framework flags an error.
//!							
//!
//! @SYMTestPriority        High
//! @SYMTestStatus          Implemented
//----------------------------------------------------------------------------------------------
void test_close_api()
{
	test.Start(_L("*** Testing Close() API  ***"));
	
	test.Next(_L("Open session"));
	RDmaSession session;
	TInt r = session.Open();
	test_KErrNone(r);

	const TInt size = 64 * KKilo;
	TUint reqCookieNewStyle_close_api=0;	
	TUint channelCookie_close_api=0;
	
	test.Next(_L("Open a single DMA channel"));
	r = session.ChannelOpen(16, channelCookie_close_api);
	test.Printf(_L("cookie recieved = 0x%08x\n"), channelCookie_close_api);
	test_KErrNone(r);

	// test.Next(_L("Open DMA channel again"));
	// TUint channelCookie_close_api_1=0;
	// r = session.ChannelOpen(16, channelCookie_close_api_1);
	// test.Printf(_L("Verify that DMA channel is already opened\n"));
	// test_Equal(KErrInUse,r); 

	test.Next(_L("Close the DMA channel"));
	r = session.ChannelClose(channelCookie_close_api);
	test_KErrNone(r);

	test.Next(_L("Open DMA channel again"));
	r = session.ChannelOpen(16, channelCookie_close_api);
	test.Printf(_L("Verify that DMA channel was closed\n"));
	test_KErrNone(r); 

	//Fails if a request is created and cancel
	test.Next(_L("Queue a request on the channel"));
  	r = session.RequestCreateNew(channelCookie_close_api, reqCookieNewStyle_close_api); //Create Dma request (with new-style callback)
  	test.Printf(_L("cookie recieved for open channel = 0x%08x\n"), reqCookieNewStyle_close_api);
  	test_KErrNone(r);
  
  	TDmaTransferArgs transferArgs_close_api;
  	transferArgs_close_api.iSrcConfig.iAddr = 0;
  	transferArgs_close_api.iDstConfig.iAddr = size;
  	transferArgs_close_api.iSrcConfig.iFlags = KDmaMemAddr;
  	transferArgs_close_api.iDstConfig.iFlags = KDmaMemAddr;
  	transferArgs_close_api.iTransferCount = size;
  	r = session.FragmentRequest(reqCookieNewStyle_close_api, transferArgs_close_api);
  	test_KErrNone(r);
  	
  	test.Next(_L("Queue DMA Request"));
  	TCallbackRecord record_close_api;
  	r = session.QueueRequest(reqCookieNewStyle_close_api, &record_close_api);
  	test_KErrNone(r);
	
	test.Next(_L("Destroy Dma request"));
	r = session.RequestDestroy(reqCookieNewStyle_close_api);
	test_KErrNone(r);

	test.Next(_L("Close the DMA channel"));
	r = session.ChannelClose(channelCookie_close_api);
	test_KErrNone(r);

	test.End();
	RTest::CloseHandleAndWaitForDestruction(session);
}

void RDmaSession::ApiTest()
	{
    test_open_api();     // Verify that Open() opens a DMA channel
    test_close_api();    // Verify that Close() closes a DMA channel
	}

void ApiTests()
	{
	test.Next(_L("Running framework API tests"));
	RDmaSession::ApiTest();	
	test.Close();
	}