os/graphics/graphicsresourceservices/graphicsresource/test/tgraphicsresourcesecondprocess.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
/**
sl@0
    17
 @file
sl@0
    18
 @test
sl@0
    19
 @internalComponent - Internal Symbian test code 
sl@0
    20
*/
sl@0
    21
sl@0
    22
#include "tgraphicsresourcemultiprocessthread.h"
sl@0
    23
#include <e32debug.h>
sl@0
    24
#include <graphics/sgimage_sw.h>
sl@0
    25
sl@0
    26
/**
sl@0
    27
Helper function to test the equivalence of two TSgImageInfo structures.
sl@0
    28
sl@0
    29
@param   aInfo1 A TSgImageInfo structure to compare.
sl@0
    30
@param   aInfo2 A TSgImageInfo structure to compare.
sl@0
    31
sl@0
    32
@return  ETrue if the two are identical, EFalse otherwise.
sl@0
    33
*/
sl@0
    34
TBool CompareInfos(TSgImageInfo& aInfo1, TSgImageInfo& aInfo2)
sl@0
    35
	{
sl@0
    36
	TBool result = EFalse;
sl@0
    37
	if(aInfo1.iCpuAccess == aInfo2.iCpuAccess 
sl@0
    38
		&& aInfo1.iPixelFormat == aInfo2.iPixelFormat
sl@0
    39
		&& aInfo1.iScreenId == aInfo2.iScreenId
sl@0
    40
		&& aInfo1.iShareable == aInfo2.iShareable
sl@0
    41
		&& aInfo1.iSizeInPixels == aInfo2.iSizeInPixels
sl@0
    42
		&& aInfo1.iUsage | aInfo2.iUsage
sl@0
    43
		&& aInfo1.iUserAttributeCount == aInfo2.iUserAttributeCount)
sl@0
    44
		{
sl@0
    45
		for(TInt i=0; i<aInfo1.iUserAttributeCount; ++i)
sl@0
    46
			{
sl@0
    47
			if(aInfo1.iUserAttributes[i].iUid != aInfo2.iUserAttributes[i].iUid)
sl@0
    48
				{
sl@0
    49
				break;
sl@0
    50
				}
sl@0
    51
			}
sl@0
    52
		result = ETrue;
sl@0
    53
		}
sl@0
    54
	return result;
sl@0
    55
	}
sl@0
    56
sl@0
    57
/**
sl@0
    58
Opens an image in a different process.
sl@0
    59
@param aInfo The test information passed from outside the current thread
sl@0
    60
@return The test result indicating which tests passed
sl@0
    61
*/
sl@0
    62
TInt TestOpenImageL(TSgresTestInfo& aInfo)
sl@0
    63
	{
sl@0
    64
	TSgDrawableId id = aInfo.iDrawableId;
sl@0
    65
	TSgImageInfo imageInfo1 = aInfo.iImageInfo;
sl@0
    66
	
sl@0
    67
	RSgImage image;
sl@0
    68
	TInt result = 0;
sl@0
    69
	
sl@0
    70
	if(KErrNone == image.Open(id))
sl@0
    71
		{
sl@0
    72
		result |=  EFirstTestPassed;
sl@0
    73
		}
sl@0
    74
	
sl@0
    75
	TSgImageInfo imageInfo2;
sl@0
    76
	if(KErrNone == image.GetInfo(imageInfo2))
sl@0
    77
		{
sl@0
    78
		result |= ESecondTestPassed;
sl@0
    79
		}
sl@0
    80
	if(CompareInfos(imageInfo1, imageInfo2))
sl@0
    81
		{
sl@0
    82
		result |= EThirdTestPassed;
sl@0
    83
		}
sl@0
    84
	if(image.Id() == id)
sl@0
    85
		{
sl@0
    86
		result |= EFourthTestPassed;
sl@0
    87
		}
sl@0
    88
	
sl@0
    89
	image.Close();
sl@0
    90
	
sl@0
    91
	return result;
sl@0
    92
	}
sl@0
    93
sl@0
    94
/**
sl@0
    95
Opens an image in a different process into a RSgDrawable object.
sl@0
    96
@param aInfo The test information passed from outside the current thread
sl@0
    97
@return The test result indicating which tests passed
sl@0
    98
*/
sl@0
    99
TInt TestOpenDrawableL(TSgresTestInfo& aInfo)
sl@0
   100
	{
sl@0
   101
	TSgDrawableId id = aInfo.iDrawableId;
sl@0
   102
	
sl@0
   103
	RSgDrawable drawable;
sl@0
   104
	TInt result = 0;
sl@0
   105
	
sl@0
   106
	if(KErrNone == drawable.Open(id))
sl@0
   107
		{
sl@0
   108
		result |=  EFirstTestPassed;
sl@0
   109
		}
sl@0
   110
	TSgDrawableId id2 = drawable.Id();
sl@0
   111
	if(id2 != KSgNullDrawableId)
sl@0
   112
		{
sl@0
   113
		result |= ESecondTestPassed;
sl@0
   114
		}
sl@0
   115
	if(id2 == id)
sl@0
   116
		{
sl@0
   117
		result |= EThirdTestPassed;
sl@0
   118
		}
sl@0
   119
sl@0
   120
	drawable.Close();
sl@0
   121
	return result;
sl@0
   122
	}
sl@0
   123
sl@0
   124
/**
sl@0
   125
Opens an image in a different process with different invalid operations.
sl@0
   126
@param aInfo The test information passed from outside the current thread
sl@0
   127
@return The test result indicating which tests passed
sl@0
   128
*/
sl@0
   129
TInt TestOpenImageInvalidL(TSgresTestInfo& aInfo)
sl@0
   130
	{	
sl@0
   131
	TSgDrawableId id = aInfo.iDrawableId;
sl@0
   132
	TSgImageInfo imageInfo = aInfo.iImageInfo;
sl@0
   133
	
sl@0
   134
	RSgImage image;
sl@0
   135
	TInt result = 0;
sl@0
   136
	
sl@0
   137
	//create image
sl@0
   138
	if(KErrNone == image.Create(imageInfo, NULL, 0))
sl@0
   139
		{
sl@0
   140
		result |= EFirstTestPassed;
sl@0
   141
		}
sl@0
   142
	//  non-empty handle
sl@0
   143
	if(KErrInUse == image.Open(id))
sl@0
   144
		{
sl@0
   145
		result |= ESecondTestPassed;
sl@0
   146
		}
sl@0
   147
	image.Close();
sl@0
   148
	
sl@0
   149
	//  null drawable id	
sl@0
   150
	if(KErrArgument == image.Open(KSgNullDrawableId))
sl@0
   151
		{
sl@0
   152
		result |= EThirdTestPassed;
sl@0
   153
		}
sl@0
   154
	image.Close();
sl@0
   155
	
sl@0
   156
	//  non-existing drawable id
sl@0
   157
	TSgDrawableId fakeid = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF};
sl@0
   158
	if(KErrNotFound == image.Open(fakeid))
sl@0
   159
		{
sl@0
   160
		result |= EFourthTestPassed;
sl@0
   161
		}
sl@0
   162
	image.Close();
sl@0
   163
	
sl@0
   164
	//  open a non-sharable image
sl@0
   165
	TInt openResult = image.Open(id);
sl@0
   166
	if(KErrPermissionDenied == openResult || KErrNotFound == openResult)
sl@0
   167
		{
sl@0
   168
		result |= EFifthTestPassed;
sl@0
   169
		}
sl@0
   170
	image.Close();
sl@0
   171
	
sl@0
   172
	return result;
sl@0
   173
	}
sl@0
   174
sl@0
   175
/**
sl@0
   176
Calls SgDriver::AllocMarkEnd() without closing all the resources.
sl@0
   177
@param aInfo The test information passed from outside the current thread
sl@0
   178
@panic SGRES-ADAPTER 0
sl@0
   179
@return The test result indicating which tests passed
sl@0
   180
*/
sl@0
   181
TInt TestDriverMemoryLeakL(TSgresTestInfo& /*aInfo*/)
sl@0
   182
	{
sl@0
   183
	SgDriver::AllocMarkStart();
sl@0
   184
	TSgImageInfo info;
sl@0
   185
	info.iSizeInPixels = TSize(8, 8);
sl@0
   186
	info.iUsage = ESgUsageDirectGdiSource;
sl@0
   187
	info.iPixelFormat = EUidPixelFormatRGB_565;
sl@0
   188
	info.iCpuAccess = ESgCpuAccessReadWrite;
sl@0
   189
	info.iShareable = EFalse;
sl@0
   190
	info.iScreenId = 0;
sl@0
   191
	
sl@0
   192
	RSgImage image;
sl@0
   193
	image.Create(info, NULL, 0);
sl@0
   194
	SgDriver::AllocMarkEnd(0); //should panic here
sl@0
   195
	image.Close();
sl@0
   196
	return KErrNone;
sl@0
   197
	}
sl@0
   198
sl@0
   199
/**
sl@0
   200
Shuts down the driver when there are still resources open.
sl@0
   201
@param aInfo The test information passed from outside the current thread
sl@0
   202
@panic SGRES 1
sl@0
   203
@return The test result indicating which tests passed
sl@0
   204
*/
sl@0
   205
TInt TestShutdownMemoryLeakL(TSgresTestInfo& /*aInfo*/)
sl@0
   206
	{
sl@0
   207
	TSgImageInfo info;
sl@0
   208
	info.iSizeInPixels = TSize(8, 8);
sl@0
   209
	info.iUsage = ESgUsageDirectGdiSource;
sl@0
   210
	info.iPixelFormat = EUidPixelFormatRGB_565;
sl@0
   211
	info.iCpuAccess = ESgCpuAccessReadWrite;
sl@0
   212
	info.iShareable = EFalse;
sl@0
   213
	info.iScreenId = 0;
sl@0
   214
	
sl@0
   215
	RSgImage image;
sl@0
   216
	TInt ret = image.Create(info, NULL, 0);
sl@0
   217
	if(KErrNone != ret)
sl@0
   218
		{
sl@0
   219
		return ret;
sl@0
   220
		}		
sl@0
   221
	SgDriver::Close(); //should panic here
sl@0
   222
	return KErrNone;
sl@0
   223
	}
sl@0
   224
sl@0
   225
/**
sl@0
   226
Opens a drawable in a different process with different invalid operations.
sl@0
   227
@param aInfo The test information passed from outside the current thread
sl@0
   228
@return The test result indicating which tests passed
sl@0
   229
*/
sl@0
   230
TInt TestOpenDrawableInvalidL(TSgresTestInfo& aInfo)
sl@0
   231
	{	
sl@0
   232
	TSgDrawableId id = aInfo.iDrawableId;
sl@0
   233
	
sl@0
   234
	RSgDrawable  drawable;
sl@0
   235
	TInt result = 0;
sl@0
   236
	
sl@0
   237
	//null drawable id	
sl@0
   238
	if(KErrArgument == drawable.Open(KSgNullDrawableId))
sl@0
   239
		{
sl@0
   240
		result |= EFirstTestPassed;
sl@0
   241
		}
sl@0
   242
	drawable.Close();
sl@0
   243
	
sl@0
   244
	//non-existing drawable id
sl@0
   245
	TSgDrawableId fakeid = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF};
sl@0
   246
	if(KErrNotFound == drawable.Open(fakeid))
sl@0
   247
		{
sl@0
   248
		result |= ESecondTestPassed;
sl@0
   249
		}
sl@0
   250
	drawable.Close();
sl@0
   251
	
sl@0
   252
	//open a non-sharable image - should fail
sl@0
   253
	TInt openResult = drawable.Open(id);
sl@0
   254
	if(KErrPermissionDenied == openResult || KErrNotFound == openResult)
sl@0
   255
		{
sl@0
   256
		result |= EThirdTestPassed;
sl@0
   257
		}
sl@0
   258
	drawable.Close();
sl@0
   259
	
sl@0
   260
	//non-empty handle
sl@0
   261
	//create an image
sl@0
   262
	TSgImageInfo info1;
sl@0
   263
	info1.iSizeInPixels = TSize(8, 8);
sl@0
   264
	info1.iUsage = ESgUsageDirectGdiTarget;
sl@0
   265
	info1.iPixelFormat = EUidPixelFormatRGB_565;
sl@0
   266
	info1.iCpuAccess = ESgCpuAccessNone;
sl@0
   267
	info1.iShareable = ETrue;
sl@0
   268
	
sl@0
   269
	RSgImage image;
sl@0
   270
	TInt err = image.Create(info1, NULL, 0);
sl@0
   271
	if(KErrNoMemory == err)
sl@0
   272
		{
sl@0
   273
		result = KErrNoMemory;
sl@0
   274
		}
sl@0
   275
	else if(KErrNone != err)
sl@0
   276
		{
sl@0
   277
		result = err;
sl@0
   278
		}
sl@0
   279
	else
sl@0
   280
		{		
sl@0
   281
		if(KErrNone == drawable.Open(image.Id()))
sl@0
   282
			{
sl@0
   283
			result |= EFourthTestPassed;
sl@0
   284
			}		
sl@0
   285
		
sl@0
   286
		//handle is non-null now
sl@0
   287
		if(KErrInUse == drawable.Open(id))
sl@0
   288
			{
sl@0
   289
			result |= EFifthTestPassed;
sl@0
   290
			}
sl@0
   291
		drawable.Close();
sl@0
   292
		}
sl@0
   293
	image.Close();
sl@0
   294
	return result;
sl@0
   295
	}
sl@0
   296
sl@0
   297
/**
sl@0
   298
Maps an image in a different process.
sl@0
   299
The operation should fail.
sl@0
   300
@param aInfo The test information passed from outside the current thread
sl@0
   301
@return The test result indicating which tests passed
sl@0
   302
*/
sl@0
   303
TInt TestMapImageNonOwnerL(TSgresTestInfo& aInfo)
sl@0
   304
	{
sl@0
   305
	TSgDrawableId id = aInfo.iDrawableId;
sl@0
   306
	
sl@0
   307
	RSgImage image;
sl@0
   308
	const TAny* dataAddressRead;
sl@0
   309
	TAny* dataAddressWrite;
sl@0
   310
	TInt dataStride;
sl@0
   311
	TInt result = 0;
sl@0
   312
	
sl@0
   313
	if(KErrNone == image.Open(id))
sl@0
   314
		{
sl@0
   315
		result |= EFirstTestPassed;
sl@0
   316
		}
sl@0
   317
	if(KErrPermissionDenied == image.MapReadOnly(dataAddressRead, dataStride))
sl@0
   318
		{
sl@0
   319
		result |= ESecondTestPassed;
sl@0
   320
		}
sl@0
   321
	if(KErrPermissionDenied == image.MapWriteOnly(dataAddressWrite, dataStride))
sl@0
   322
		{
sl@0
   323
		result |= EThirdTestPassed;
sl@0
   324
		}
sl@0
   325
	if(KErrPermissionDenied == image.MapReadWrite(dataAddressWrite, dataStride))
sl@0
   326
		{
sl@0
   327
		result |= EFourthTestPassed;
sl@0
   328
		}
sl@0
   329
sl@0
   330
	TInt unmapResult = image.Unmap();
sl@0
   331
	if(KErrGeneral == unmapResult || KErrPermissionDenied == unmapResult)
sl@0
   332
		{
sl@0
   333
		result |= EFifthTestPassed;
sl@0
   334
		}
sl@0
   335
	
sl@0
   336
	image.Close();
sl@0
   337
	return result;
sl@0
   338
	}
sl@0
   339
sl@0
   340
/**
sl@0
   341
Unmaps an image in another process.
sl@0
   342
@param aInfo The test information passed from outside the current thread
sl@0
   343
@return The test result indicating which tests passed
sl@0
   344
*/
sl@0
   345
TInt TestUnmapImageL(TSgresTestInfo& aInfo)
sl@0
   346
	{
sl@0
   347
	TSgDrawableId id = aInfo.iDrawableId;
sl@0
   348
	
sl@0
   349
	RSgImage image;
sl@0
   350
	TInt result = 0;
sl@0
   351
	
sl@0
   352
	if(KErrNone == image.Open(id))
sl@0
   353
		{
sl@0
   354
		result |= EFirstTestPassed;
sl@0
   355
		}
sl@0
   356
	if(KErrGeneral == image.Unmap())
sl@0
   357
		{
sl@0
   358
		result |= ESecondTestPassed;
sl@0
   359
		}
sl@0
   360
	image.Close();
sl@0
   361
	return result;
sl@0
   362
	}
sl@0
   363
sl@0
   364
// Real main function
sl@0
   365
TInt MainL()
sl@0
   366
	{				
sl@0
   367
	TInt procHandles1  =0;
sl@0
   368
	TInt threadHandles1=0;
sl@0
   369
	RThread().HandleCount(procHandles1, threadHandles1);
sl@0
   370
	
sl@0
   371
	TPckgBuf<TSgresTestInfo> infoPkg;
sl@0
   372
	User::LeaveIfError(User::GetDesParameter(KSecondProcessParametersSlot, infoPkg));
sl@0
   373
	TSgresTestInfo& info = infoPkg();
sl@0
   374
	TSgresTestCase testCase = info.iTestCase;
sl@0
   375
	TInt result = 0;
sl@0
   376
sl@0
   377
	if(KErrNone == SgDriver::Open())
sl@0
   378
		{
sl@0
   379
			switch(testCase)
sl@0
   380
			{
sl@0
   381
			case ESgresSecondProcessOpenImage:
sl@0
   382
				result = TestOpenImageL(info);
sl@0
   383
				break;
sl@0
   384
			case ESgresSecondProcessOpenDrawable:
sl@0
   385
				result = TestOpenDrawableL(info);
sl@0
   386
				break;
sl@0
   387
			case ESgresSecondProcessOpenImageInvalid:
sl@0
   388
				result = TestOpenImageInvalidL(info);
sl@0
   389
				break;
sl@0
   390
			case ESgresSecondProcessOpenDrawableInvalid:
sl@0
   391
				result = TestOpenDrawableInvalidL(info);
sl@0
   392
				break;
sl@0
   393
			case ESgresSecondProcessMapImage:
sl@0
   394
				result = TestMapImageNonOwnerL(info);
sl@0
   395
				break;
sl@0
   396
			case ESgresSecondProcessUnmapImage:
sl@0
   397
				result = TestUnmapImageL(info);
sl@0
   398
				break;
sl@0
   399
			case ESgresSecondProcessPanicDriverUnclosedResources:
sl@0
   400
				result = TestShutdownMemoryLeakL(info);
sl@0
   401
				break;
sl@0
   402
			case ESgresSecondProcessPanicMemoryLeak:
sl@0
   403
				result = TestDriverMemoryLeakL(info);
sl@0
   404
				break;
sl@0
   405
			}
sl@0
   406
		}	
sl@0
   407
	
sl@0
   408
	SgDriver::Close();
sl@0
   409
	
sl@0
   410
	// Handle check
sl@0
   411
	TInt procHandles2  =0;
sl@0
   412
	TInt threadHandles2=0;  
sl@0
   413
	RThread().HandleCount(procHandles2,threadHandles2);
sl@0
   414
	if (threadHandles1 != threadHandles2)
sl@0
   415
		{
sl@0
   416
		result = KErrBadHandle;  // Thread-owned handles not closed
sl@0
   417
		}
sl@0
   418
	
sl@0
   419
	return result;
sl@0
   420
	}
sl@0
   421
sl@0
   422
GLDEF_C TInt E32Main()
sl@0
   423
	{
sl@0
   424
	__UHEAP_MARK;
sl@0
   425
	CTrapCleanup* cleanupStack = CTrapCleanup::New();
sl@0
   426
	if(cleanupStack == NULL)
sl@0
   427
		{
sl@0
   428
			return KErrNoMemory;
sl@0
   429
		}
sl@0
   430
	TInt ret = 0;
sl@0
   431
	TRAP_IGNORE(ret=MainL());
sl@0
   432
	delete cleanupStack;
sl@0
   433
	__UHEAP_MARKEND;
sl@0
   434
	return ret;
sl@0
   435
	}