2
|
1 |
/*
|
|
2 |
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
|
3 |
* All rights reserved.
|
|
4 |
* This component and the accompanying materials are made available
|
|
5 |
* under the terms of "Eclipse Public License v1.0"
|
|
6 |
* which accompanies this distribution, and is available
|
|
7 |
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
|
|
8 |
*
|
|
9 |
* Initial Contributors:
|
|
10 |
* Nokia Corporation - initial contribution.
|
|
11 |
*
|
|
12 |
* Contributors:
|
|
13 |
*
|
|
14 |
* Description: This module contains implementation of
|
|
15 |
* CTestModuleContainer class member functions. CTestModuleContainer
|
|
16 |
* class contains interface * to execute various functions in context
|
|
17 |
* of test execution thread.
|
|
18 |
*
|
|
19 |
* CTestModuleContainer is the owner of the test execution thread
|
|
20 |
* object and the owner of the test module instance.
|
|
21 |
*
|
|
22 |
*/
|
|
23 |
|
|
24 |
// INCLUDE FILES
|
|
25 |
#include <e32std.h>
|
|
26 |
#include <e32svr.h>
|
|
27 |
#include <e32uid.h>
|
|
28 |
#include "TestEngineClient.h"
|
|
29 |
#include <StifTestModule.h>
|
|
30 |
#include <stifinternal/TestServerClient.h>
|
|
31 |
#include "TestServer.h"
|
|
32 |
#include "TestServerModuleIf.h"
|
|
33 |
#include "TestServerCommon.h"
|
|
34 |
#include "PrintQueue.h"
|
|
35 |
#include "TestThreadContainer.h"
|
|
36 |
//--PYTHON-- begin
|
|
37 |
#include "StifPython.h"
|
|
38 |
//--PYTHON-- end
|
|
39 |
|
|
40 |
// EXTERNAL DATA STRUCTURES
|
|
41 |
|
|
42 |
// EXTERNAL FUNCTION PROTOTYPES
|
|
43 |
|
|
44 |
// The test module execution thread function
|
|
45 |
TInt ExecutionThread( TAny* aParams );
|
|
46 |
|
|
47 |
// CONSTANTS
|
|
48 |
|
|
49 |
// MACROS
|
|
50 |
|
|
51 |
// LOCAL CONSTANTS AND MACROS
|
|
52 |
|
|
53 |
// MODULE DATA STRUCTURES
|
|
54 |
|
|
55 |
// LOCAL FUNCTION PROTOTYPES
|
|
56 |
typedef TInt( *CTestInterfaceFactoryTestModule )( CTestModuleParam*&, TUint32& );
|
|
57 |
|
|
58 |
// FORWARD DECLARATIONS
|
|
59 |
|
|
60 |
// ==================== LOCAL FUNCTIONS =======================================
|
|
61 |
|
|
62 |
// ================= MEMBER FUNCTIONS =========================================
|
|
63 |
|
|
64 |
|
|
65 |
/*
|
|
66 |
-------------------------------------------------------------------------------
|
|
67 |
|
|
68 |
Class: CTestModuleContainer
|
|
69 |
|
|
70 |
Method: NewL
|
|
71 |
|
|
72 |
Description: Returns new CTestModuleContainer instance.
|
|
73 |
|
|
74 |
Parameters: const TDesC& aName: in: Module name
|
|
75 |
CTestModule* aSession: in: "Parent"
|
|
76 |
const TDesC& aConfig: in: Test case (config) file name.
|
|
77 |
|
|
78 |
Return Values: CTestModuleContainer* New instance
|
|
79 |
|
|
80 |
Errors/Exceptions: Function leaves if memory allocation fails or
|
|
81 |
CTestModuleContainer ConstructL leaves.
|
|
82 |
Panics if aSession is NULL.
|
|
83 |
|
|
84 |
Status: Proposal
|
|
85 |
|
|
86 |
-------------------------------------------------------------------------------
|
|
87 |
*/
|
|
88 |
CTestModuleContainer* CTestModuleContainer::NewL( const TDesC& aName,
|
|
89 |
CTestModule* aSession,
|
|
90 |
const TDesC& aConfig )
|
|
91 |
{
|
|
92 |
|
|
93 |
__ASSERT_ALWAYS ( aSession,
|
|
94 |
CTestServer::PanicServer( ENullTestModule ) );
|
|
95 |
|
|
96 |
CTestModuleContainer* self = new ( ELeave ) CTestModuleContainer();
|
|
97 |
CleanupStack::PushL( self );
|
|
98 |
self->ConstructL( aName, aSession, aConfig );
|
|
99 |
CleanupStack::Pop( self );
|
|
100 |
return self;
|
|
101 |
|
|
102 |
}
|
|
103 |
|
|
104 |
/*
|
|
105 |
-------------------------------------------------------------------------------
|
|
106 |
|
|
107 |
Class: CTestModuleContainer
|
|
108 |
|
|
109 |
Method: ConstructL
|
|
110 |
|
|
111 |
Description: Second level constructor.
|
|
112 |
|
|
113 |
Function creates the execution thread, creates exception
|
|
114 |
handler and the thread undertaker for it and then resumes the thread.
|
|
115 |
|
|
116 |
Parameters: const TDesC& aName: in: Module name
|
|
117 |
CTestModule* aSession: in: "Parent"
|
|
118 |
const TDesC& aConfig: in: Test case (config) file name.
|
|
119 |
|
|
120 |
Return Values: CTestModuleContainer* New instance
|
|
121 |
|
|
122 |
Errors/Exceptions: Function leaves if thread creation fails,
|
|
123 |
memory allocation fails or undertaker creation leaves.
|
|
124 |
|
|
125 |
Status: Proposal
|
|
126 |
|
|
127 |
-------------------------------------------------------------------------------
|
|
128 |
*/
|
|
129 |
void CTestModuleContainer::ConstructL( const TDesC& aName,
|
|
130 |
CTestModule* aSession,
|
|
131 |
const TDesC& aConfig )
|
|
132 |
{
|
|
133 |
|
|
134 |
RDebug::Print( aName );
|
|
135 |
|
|
136 |
iNestedActiveScheduler = new (ELeave) CActiveSchedulerWait;
|
|
137 |
|
|
138 |
iCTestModule = aSession;
|
|
139 |
|
|
140 |
// Create error print handler
|
|
141 |
iErrorPrintHandler = CErrorPrintHandler::NewL( *this );
|
|
142 |
User::LeaveIfError( iErrorPrintSem.CreateLocal( 0 ) );
|
|
143 |
|
|
144 |
// Construct unique thread name
|
|
145 |
const TInt KAddressLen = 8;
|
|
146 |
const TInt KMaxName = 50; // Something smaller than max thread name
|
|
147 |
TInt len = aName.Length();
|
|
148 |
if ( KAddressLen + len > KMaxName )
|
|
149 |
{
|
|
150 |
len = KMaxName - KAddressLen;
|
|
151 |
}
|
|
152 |
|
|
153 |
// Default heap and stack sizes that may configure by user.
|
|
154 |
TInt heapMinSize( KTestThreadMinHeap );
|
|
155 |
TInt heapMaxSize( KTestThreadMaxHeap );
|
|
156 |
TInt stackSize( KStackSize );
|
|
157 |
|
|
158 |
// Check is user give heap or stack sizes and verify sizes.
|
|
159 |
GetTestModuleParams( aName, aConfig, stackSize, heapMinSize, heapMaxSize );
|
|
160 |
|
|
161 |
// Create a new thread
|
|
162 |
TInt ret = KErrAlreadyExists;
|
|
163 |
for( TInt i = 0; ret == KErrAlreadyExists; i++ )
|
|
164 |
{
|
|
165 |
TName threadName = aName.Left( len );
|
|
166 |
threadName.AppendFormat( _L( "%x" ), ( TUint32 ) this );
|
|
167 |
threadName.AppendFormat( _L( "%x" ), i );
|
|
168 |
//RDebug::Print( threadName );
|
|
169 |
|
|
170 |
RDebug::Print(_L("CTestModuleContainer::ConstructL create thread=[%S] stackSize=(%d)"), &threadName, stackSize);
|
|
171 |
|
|
172 |
if ( iCTestModule->GetTestServer()->IsUiTestingSupported() && iCTestModule->UiTesting() )
|
|
173 |
{
|
|
174 |
ret = iThread.Create(
|
|
175 |
threadName, // name of thread
|
|
176 |
CTestThreadContainer::UIExecutionThread,// thread function
|
|
177 |
stackSize, // Stack size
|
|
178 |
heapMinSize, // Heap sizes
|
|
179 |
heapMaxSize,
|
|
180 |
this // Parameter to thread function
|
|
181 |
);
|
|
182 |
}
|
|
183 |
else
|
|
184 |
{
|
|
185 |
ret = iThread.Create(
|
|
186 |
threadName, // name of thread
|
|
187 |
CTestThreadContainer::ExecutionThread,// thread function
|
|
188 |
stackSize, // Stack size
|
|
189 |
heapMinSize, // Heap sizes
|
|
190 |
heapMaxSize,
|
|
191 |
this // Parameter to thread function
|
|
192 |
);
|
|
193 |
}
|
|
194 |
|
|
195 |
// If test execution thread exist try to create new one
|
|
196 |
if( ret == KErrAlreadyExists )
|
|
197 |
{
|
|
198 |
RDebug::Print( _L( "Thread[%S] allready exist, creating new one" ), &threadName );
|
|
199 |
__TRACE ( KInit, ( CStifLogger::ERed, _L( "Thread[%S] allready exist, creating new one" ), &threadName ) );
|
|
200 |
}
|
|
201 |
}
|
|
202 |
|
|
203 |
// If thread creation fails, leave here.
|
|
204 |
if( ret != KErrNone )
|
|
205 |
{
|
|
206 |
RDebug::Print( _L( "Execution thread creation fails with: [%d]" ), ret );
|
|
207 |
__TRACE ( KError, ( CStifLogger::ERed, _L( "Execution thread creation fails with: [%d]" ), ret ) );
|
|
208 |
User::Leave( ret );
|
|
209 |
}
|
|
210 |
|
|
211 |
// Doing nothing
|
|
212 |
// ChangeOperationNoError ( ESuspend, 0 );
|
|
213 |
// Thread suspends always first by default
|
|
214 |
|
|
215 |
// Construct the undertaker to get notifications about the
|
|
216 |
// thread death.
|
|
217 |
// This must be trapped to allow to kill just created thread
|
|
218 |
// nicely without a mess in destructor.
|
|
219 |
TRAPD ( r,
|
|
220 |
iUnderTaker = CUnderTaker::NewL ( this );
|
|
221 |
CActiveScheduler::Add( iUnderTaker );
|
|
222 |
iUnderTaker->StartL();
|
|
223 |
);
|
|
224 |
|
|
225 |
// Can't create or start the undertaker. Kill the thread.
|
|
226 |
// Undertaker will be deleted in destructor if needed.
|
|
227 |
if ( r != KErrNone )
|
|
228 |
{
|
|
229 |
iThread.Kill ( r );
|
|
230 |
iThread.Close();
|
|
231 |
User::Leave( r );
|
|
232 |
}
|
|
233 |
|
|
234 |
// Get server thread id ( i.e current thread id )
|
|
235 |
RThread tmpThread;
|
|
236 |
iServerThreadId = tmpThread.Id();
|
|
237 |
|
|
238 |
// Resume the thread
|
|
239 |
iThread.Resume(); // Start the thread
|
|
240 |
iUpAndRunning = ETrue; // Thread is created
|
|
241 |
|
|
242 |
// Add "this" container to active scheduler
|
|
243 |
CActiveScheduler::Add ( this );
|
|
244 |
|
|
245 |
// Start error print handler
|
|
246 |
iErrorPrintHandler->StartL();
|
|
247 |
|
|
248 |
}
|
|
249 |
|
|
250 |
/*
|
|
251 |
-------------------------------------------------------------------------------
|
|
252 |
|
|
253 |
Class: CTestModuleContainer
|
|
254 |
|
|
255 |
Method: CTestModuleContainer
|
|
256 |
|
|
257 |
Description: Constructor.
|
|
258 |
|
|
259 |
Initialise semaphores.
|
|
260 |
|
|
261 |
Parameters: None
|
|
262 |
|
|
263 |
Return Values: None
|
|
264 |
|
|
265 |
Errors/Exceptions: None
|
|
266 |
|
|
267 |
Status: Proposal
|
|
268 |
|
|
269 |
-------------------------------------------------------------------------------
|
|
270 |
*/
|
|
271 |
CTestModuleContainer::CTestModuleContainer() :
|
|
272 |
CActive( CActive::EPriorityStandard ),
|
|
273 |
iOperationName ( 0, 0 ),
|
|
274 |
iIsPaused( EFalse )
|
|
275 |
{
|
|
276 |
|
|
277 |
// Create operation start semaphore
|
|
278 |
iOperationStartSemaphore.CreateLocal( 0 );
|
|
279 |
|
|
280 |
// Operation can be changed without first waiting.
|
|
281 |
iOperationChangeSemaphore.CreateLocal( 1 );
|
|
282 |
|
|
283 |
}
|
|
284 |
|
|
285 |
/*
|
|
286 |
-------------------------------------------------------------------------------
|
|
287 |
|
|
288 |
Class: CTestModuleContainer
|
|
289 |
|
|
290 |
Method: ~CTestModuleContainer
|
|
291 |
|
|
292 |
Description: Destructor
|
|
293 |
|
|
294 |
Delete the test execution thread, if it is up and running. Delete
|
|
295 |
undertaker and close handles.
|
|
296 |
|
|
297 |
Parameters: None
|
|
298 |
|
|
299 |
Return Values: None
|
|
300 |
|
|
301 |
Errors/Exceptions: None
|
|
302 |
|
|
303 |
Status: Proposal
|
|
304 |
|
|
305 |
-------------------------------------------------------------------------------
|
|
306 |
*/
|
|
307 |
CTestModuleContainer::~CTestModuleContainer()
|
|
308 |
{
|
|
309 |
|
|
310 |
__TRACE ( KThreadOperation, ( _L( "CTestModuleContainer::~CTestModuleContainer in" ) ) );
|
|
311 |
|
|
312 |
if ( iUpAndRunning )
|
|
313 |
{
|
|
314 |
if( iUnderTaker != NULL )
|
|
315 |
{
|
|
316 |
iUnderTaker->Cancel();
|
|
317 |
}
|
|
318 |
|
|
319 |
// Set the operation
|
|
320 |
ChangeOperationNoError ( EExit, 0 );
|
|
321 |
|
|
322 |
// Do operation
|
|
323 |
StartAndWaitOperation();
|
|
324 |
|
|
325 |
}
|
|
326 |
|
|
327 |
delete iErrorPrintHandler;
|
|
328 |
iErrorPrintHandler = NULL;
|
|
329 |
|
|
330 |
// Delete heap descriptor
|
|
331 |
delete iModuleNameBuffer;
|
|
332 |
iModuleNameBuffer = NULL;
|
|
333 |
|
|
334 |
// Delete undertaker
|
|
335 |
delete iUnderTaker;
|
|
336 |
iUnderTaker = NULL;
|
|
337 |
|
|
338 |
// Close error semaphore
|
|
339 |
if ( iErrorPrintSem.Handle() != 0 ) iErrorPrintSem.Close();
|
|
340 |
|
|
341 |
// Close the semaphores
|
|
342 |
iOperationStartSemaphore.Close();
|
|
343 |
iOperationChangeSemaphore.Close();
|
|
344 |
|
|
345 |
// Close handle to thread
|
|
346 |
iThread.Close();
|
|
347 |
|
|
348 |
Cancel();
|
|
349 |
|
|
350 |
delete iNestedActiveScheduler;
|
|
351 |
iNestedActiveScheduler = NULL;
|
|
352 |
|
|
353 |
__TRACE ( KThreadOperation, ( _L( "CTestModuleContainer::~CTestModuleContainer out" ) ) );
|
|
354 |
|
|
355 |
}
|
|
356 |
|
|
357 |
/*
|
|
358 |
-------------------------------------------------------------------------------
|
|
359 |
|
|
360 |
Class: CTestModuleContainer
|
|
361 |
|
|
362 |
Method: StartAndWaitOperation
|
|
363 |
|
|
364 |
Description: Signals operation and waits until operation is completed.
|
|
365 |
|
|
366 |
Function executes active scheduler locally to handle both request
|
|
367 |
completion from execution thread and thread undertaker operations.
|
|
368 |
|
|
369 |
Parameters: None
|
|
370 |
|
|
371 |
Return Values: None
|
|
372 |
|
|
373 |
Errors/Exceptions: None
|
|
374 |
|
|
375 |
Status: Proposal
|
|
376 |
|
|
377 |
-------------------------------------------------------------------------------
|
|
378 |
*/
|
|
379 |
TInt CTestModuleContainer::StartAndWaitOperation()
|
|
380 |
{
|
|
381 |
|
|
382 |
// Change undertaker mode to synchronous
|
|
383 |
iUnderTaker->SetSynchronousMode( ETrue );
|
|
384 |
|
|
385 |
iStatus = KRequestPending;
|
|
386 |
// Get ready to handle operation completion
|
|
387 |
SetActive();
|
|
388 |
|
|
389 |
// Start operation
|
|
390 |
iOperationStartSemaphore.Signal();
|
|
391 |
|
|
392 |
// Start "nested" active scheduler "locally"
|
|
393 |
//CActiveScheduler::Start();
|
|
394 |
iNestedActiveScheduler->Start();
|
|
395 |
|
|
396 |
// Request completed or operation crashed, everything
|
|
397 |
// is done in ModuleContainer's RunL function or in UnderTaker's RunL.
|
|
398 |
|
|
399 |
// Cancel the original request in case than it was the undertaker
|
|
400 |
// that stopped the active scheduler. Does not do anything if original
|
|
401 |
// request is already finished.
|
|
402 |
Cancel();
|
|
403 |
|
|
404 |
// Undertaker back to "normal" mode
|
|
405 |
iUnderTaker->SetSynchronousMode ( EFalse );
|
|
406 |
|
|
407 |
return iModuleResult;
|
|
408 |
|
|
409 |
}
|
|
410 |
|
|
411 |
|
|
412 |
|
|
413 |
/*
|
|
414 |
-------------------------------------------------------------------------------
|
|
415 |
|
|
416 |
Class: CTestModuleContainer
|
|
417 |
|
|
418 |
Method: Initialise
|
|
419 |
|
|
420 |
Description: Initialise the test module
|
|
421 |
|
|
422 |
Initialisation is done in context of test execution thread.
|
|
423 |
|
|
424 |
Parameters: const TDesC& aName :in: Module name
|
|
425 |
TBool aFirstTime :in: First init?
|
|
426 |
|
|
427 |
|
|
428 |
Return Values: TInt Result from init
|
|
429 |
|
|
430 |
Errors/Exceptions: None
|
|
431 |
|
|
432 |
Status: Proposal
|
|
433 |
|
|
434 |
-------------------------------------------------------------------------------
|
|
435 |
*/
|
|
436 |
TInt CTestModuleContainer::Initialize( const TFileName& aName,
|
|
437 |
TBool aFirstTime
|
|
438 |
)
|
|
439 |
{
|
|
440 |
|
|
441 |
__TRACE ( KInit, ( _L( "Initializing test module" ) ) );
|
|
442 |
|
|
443 |
// Set the operation
|
|
444 |
iErrorResult = ChangeOperation ( EInitializeModule, aName, aFirstTime );
|
|
445 |
iModuleResult = KErrNone;
|
|
446 |
|
|
447 |
if ( iErrorResult == KErrNone )
|
|
448 |
{
|
|
449 |
// Wait until operation is completed
|
|
450 |
StartAndWaitOperation();
|
|
451 |
}
|
|
452 |
|
|
453 |
if ( iErrorResult )
|
|
454 |
{
|
|
455 |
__TRACE ( KError, ( CStifLogger::ERed, _L( "Initializing test module failed %d" ), iErrorResult ) );
|
|
456 |
}
|
|
457 |
else if ( iModuleResult )
|
|
458 |
{
|
|
459 |
__TRACE ( KError, ( CStifLogger::ERed, _L( "Initializing test module failed code from module = %d" ), iModuleResult ) );
|
|
460 |
}
|
|
461 |
else
|
|
462 |
{
|
|
463 |
__TRACE ( KInit, ( CStifLogger::EBold, _L( "Test module initialization done" ) ) );
|
|
464 |
}
|
|
465 |
|
|
466 |
// Return result
|
|
467 |
return iModuleResult;
|
|
468 |
|
|
469 |
}
|
|
470 |
|
|
471 |
/*
|
|
472 |
-------------------------------------------------------------------------------
|
|
473 |
|
|
474 |
Class: CTestModuleContainer
|
|
475 |
|
|
476 |
Method: EnumerateTestCases
|
|
477 |
|
|
478 |
Description: Enumerate test cases of the test module
|
|
479 |
|
|
480 |
Enumeration is done in context of test execution thread.
|
|
481 |
|
|
482 |
Parameters: const TDesC& aName :in: Configuration file
|
|
483 |
|
|
484 |
Return Values: TInt Result from enumeration
|
|
485 |
|
|
486 |
Errors/Exceptions: None
|
|
487 |
|
|
488 |
Status: Proposal
|
|
489 |
|
|
490 |
-------------------------------------------------------------------------------
|
|
491 |
*/
|
|
492 |
TInt CTestModuleContainer::EnumerateTestCases( const TFileName& aName )
|
|
493 |
{
|
|
494 |
|
|
495 |
__TRACE ( KInit, ( CStifLogger::EBold, _L( "Enumerating test cases from [%S] (might be empty)" ), &aName ) );
|
|
496 |
|
|
497 |
// Set the operation
|
|
498 |
iErrorResult = ChangeOperation( EEnumerateInThread, aName, 0 );
|
|
499 |
iModuleResult = KErrNone;
|
|
500 |
|
|
501 |
if ( iErrorResult == KErrNone )
|
|
502 |
{
|
|
503 |
// Wait until operation is completed
|
|
504 |
StartAndWaitOperation();
|
|
505 |
}
|
|
506 |
|
|
507 |
if ( iErrorResult )
|
|
508 |
{
|
|
509 |
__TRACE ( KError, ( CStifLogger::ERed, _L( "Enumerating test cases failed %d" ), iErrorResult ) );
|
|
510 |
}
|
|
511 |
else if ( iModuleResult )
|
|
512 |
{
|
|
513 |
__TRACE ( KError, ( CStifLogger::ERed, _L( "Enumerating test cases failed, code from module = %d" ), iModuleResult ) );
|
|
514 |
}
|
|
515 |
else
|
|
516 |
{
|
|
517 |
__TRACE ( KInit, ( _L( "Enumerating test cases done" ) ) );
|
|
518 |
}
|
|
519 |
|
|
520 |
// Return result
|
|
521 |
return iModuleResult;
|
|
522 |
|
|
523 |
}
|
|
524 |
|
|
525 |
|
|
526 |
|
|
527 |
/*
|
|
528 |
-------------------------------------------------------------------------------
|
|
529 |
|
|
530 |
Class: CTestModuleContainer
|
|
531 |
|
|
532 |
Method: FreeEnumerationData
|
|
533 |
|
|
534 |
Description: Frees the enumeration data
|
|
535 |
|
|
536 |
Memory deallocation is done in context of test execution thread.
|
|
537 |
|
|
538 |
Parameters: None
|
|
539 |
|
|
540 |
Return Values: TInt Result from operation
|
|
541 |
|
|
542 |
Errors/Exceptions: None
|
|
543 |
|
|
544 |
Status: Proposal
|
|
545 |
|
|
546 |
-------------------------------------------------------------------------------
|
|
547 |
*/
|
|
548 |
|
|
549 |
TInt CTestModuleContainer::FreeEnumerationData()
|
|
550 |
{
|
|
551 |
|
|
552 |
// Set the operation
|
|
553 |
ChangeOperationNoError( EFreeEnumerationData, 0 );
|
|
554 |
|
|
555 |
// Do the operation
|
|
556 |
StartAndWaitOperation();
|
|
557 |
|
|
558 |
// Return result
|
|
559 |
return iModuleResult;
|
|
560 |
|
|
561 |
}
|
|
562 |
|
|
563 |
/*
|
|
564 |
-------------------------------------------------------------------------------
|
|
565 |
|
|
566 |
Class: CTestModuleContainer
|
|
567 |
|
|
568 |
Method: RunTestCase
|
|
569 |
|
|
570 |
Description: Run a test case
|
|
571 |
|
|
572 |
Running a test case is done in context of test execution thread. This
|
|
573 |
function is asynchronous ( i.e test is not finished when this function
|
|
574 |
returns ).
|
|
575 |
|
|
576 |
Parameters: const TFileName& aName :in: Configuration file
|
|
577 |
TInt aCaseNumber :in: Case number
|
|
578 |
const RMessage :in: Handle to test msg.
|
|
579 |
|
|
580 |
Return Values: None
|
|
581 |
|
|
582 |
Errors/Exceptions: None
|
|
583 |
|
|
584 |
Status: Proposal
|
|
585 |
|
|
586 |
-------------------------------------------------------------------------------
|
|
587 |
*/
|
|
588 |
void CTestModuleContainer::RunTestCase ( const TFileName& aName,
|
|
589 |
const TInt aCaseNumber,
|
|
590 |
const RMessage2& aMessage
|
|
591 |
)
|
|
592 |
{
|
|
593 |
|
|
594 |
__TRACE ( KInit, ( CStifLogger::EBold, _L( "Running test case [%S], case [%d]" ), &aName, aCaseNumber ) );
|
|
595 |
|
|
596 |
// Set the operation
|
|
597 |
iErrorResult = ChangeOperation( EExecuteTestInThread, aName, aCaseNumber );
|
|
598 |
|
|
599 |
if ( iErrorResult != KErrNone )
|
|
600 |
{
|
|
601 |
aMessage.Complete ( iErrorResult );
|
|
602 |
return;
|
|
603 |
}
|
|
604 |
|
|
605 |
// Set data
|
|
606 |
iMessage = aMessage;
|
|
607 |
|
|
608 |
iStatus = KRequestPending;
|
|
609 |
// Get ready to handle operation completion
|
|
610 |
SetActive();
|
|
611 |
|
|
612 |
// Do operation
|
|
613 |
iOperationStartSemaphore.Signal();
|
|
614 |
|
|
615 |
// This is asynchronous operation,
|
|
616 |
// do not wait until completed.
|
|
617 |
|
|
618 |
}
|
|
619 |
|
|
620 |
/*
|
|
621 |
-------------------------------------------------------------------------------
|
|
622 |
|
|
623 |
Class: CTestModuleContainer
|
|
624 |
|
|
625 |
Method: SetExecutionSubSession
|
|
626 |
|
|
627 |
Description: Set execution subsession
|
|
628 |
|
|
629 |
Sets module container test execution subsession. Execution subsession
|
|
630 |
is changed when a module container is reused to run another
|
|
631 |
test case.
|
|
632 |
|
|
633 |
Parameters: CTestExecution* aExecution :in: Subsession pointer
|
|
634 |
|
|
635 |
Return Values: None
|
|
636 |
|
|
637 |
Errors/Exceptions: None
|
|
638 |
|
|
639 |
Status: Proposal
|
|
640 |
|
|
641 |
-------------------------------------------------------------------------------
|
|
642 |
*/
|
|
643 |
void CTestModuleContainer::SetExecutionSubSession( CTestExecution* aExecution )
|
|
644 |
{
|
|
645 |
|
|
646 |
iCTestExecution = aExecution;
|
|
647 |
|
|
648 |
}
|
|
649 |
|
|
650 |
/*
|
|
651 |
-------------------------------------------------------------------------------
|
|
652 |
|
|
653 |
Class: CTestModuleContainer
|
|
654 |
|
|
655 |
Method: PauseThread
|
|
656 |
|
|
657 |
Description: Pauses the thread
|
|
658 |
|
|
659 |
Parameters: None
|
|
660 |
|
|
661 |
Return Values: None
|
|
662 |
|
|
663 |
Errors/Exceptions: None
|
|
664 |
|
|
665 |
Status: Proposal
|
|
666 |
|
|
667 |
-------------------------------------------------------------------------------
|
|
668 |
*/
|
|
669 |
TInt CTestModuleContainer::PauseThread()
|
|
670 |
{
|
|
671 |
|
|
672 |
if( iThread.ExitType() != EExitPending )
|
|
673 |
{
|
|
674 |
// Thread is not alive anymore
|
|
675 |
return KErrDied;
|
|
676 |
}
|
|
677 |
|
|
678 |
if(iCTestExecution != NULL)
|
|
679 |
{
|
|
680 |
RMutex printMutex;
|
|
681 |
printMutex.SetHandle( iCTestExecution->PrintMutexHandle() );
|
|
682 |
RMutex eventMutex;
|
|
683 |
eventMutex.SetHandle( iCTestExecution->EventMutexHandle() );
|
|
684 |
RMutex sndMutex;
|
|
685 |
sndMutex.SetHandle( iCTestExecution->SndMutexHandle() );
|
|
686 |
RMutex rcvMutex;
|
|
687 |
rcvMutex.SetHandle( iCTestExecution->RcvMutexHandle() );
|
|
688 |
|
|
689 |
printMutex.Wait(); // wait that print operation is done
|
|
690 |
eventMutex.Wait(); // wait that event operation is done
|
|
691 |
sndMutex.Wait(); // wait that and operation is done
|
|
692 |
rcvMutex.Wait(); // wait that event operation is done
|
|
693 |
|
|
694 |
iThread.Suspend();
|
|
695 |
|
|
696 |
printMutex.Signal();
|
|
697 |
eventMutex.Signal();
|
|
698 |
sndMutex.Signal();
|
|
699 |
rcvMutex.Signal();
|
|
700 |
}
|
|
701 |
else
|
|
702 |
{
|
|
703 |
__TRACE( KError,( _L( "STIF internal error - iCTestExecution is NULL in CTestModuleContainer::PauseThread" ) ) );
|
|
704 |
User::Panic(_L("NULL pointer exception"), KErrGeneral);
|
|
705 |
}
|
|
706 |
|
|
707 |
iIsPaused = ETrue;
|
|
708 |
|
|
709 |
return KErrNone;
|
|
710 |
|
|
711 |
}
|
|
712 |
|
|
713 |
/*
|
|
714 |
-------------------------------------------------------------------------------
|
|
715 |
|
|
716 |
Class: CTestModuleContainer
|
|
717 |
|
|
718 |
Method: ResumeThread
|
|
719 |
|
|
720 |
Description: Resumes the thread
|
|
721 |
|
|
722 |
Parameters: None
|
|
723 |
|
|
724 |
Return Values: None
|
|
725 |
|
|
726 |
Errors/Exceptions: None
|
|
727 |
|
|
728 |
Status: Proposal
|
|
729 |
|
|
730 |
-------------------------------------------------------------------------------
|
|
731 |
*/
|
|
732 |
TInt CTestModuleContainer::ResumeThread()
|
|
733 |
{
|
|
734 |
|
|
735 |
if( iThread.ExitType() != EExitPending )
|
|
736 |
{
|
|
737 |
// Thread is not alive anymore
|
|
738 |
return KErrDied;
|
|
739 |
}
|
|
740 |
|
|
741 |
iThread.Resume();
|
|
742 |
|
|
743 |
// Pause() - Resume() operations done successfully.
|
|
744 |
iIsPaused = EFalse;
|
|
745 |
|
|
746 |
return KErrNone;
|
|
747 |
|
|
748 |
}
|
|
749 |
|
|
750 |
/*
|
|
751 |
-------------------------------------------------------------------------------
|
|
752 |
|
|
753 |
Class: CTestModuleContainer
|
|
754 |
|
|
755 |
Method: KillThread
|
|
756 |
|
|
757 |
Description: Kills the thread
|
|
758 |
|
|
759 |
Parameters: const TInt aCode :in: Kill code
|
|
760 |
|
|
761 |
Return Values: None
|
|
762 |
|
|
763 |
Errors/Exceptions: None
|
|
764 |
|
|
765 |
Status: Proposal
|
|
766 |
|
|
767 |
-------------------------------------------------------------------------------
|
|
768 |
*/
|
|
769 |
void CTestModuleContainer::KillThread( const TInt aCode )
|
|
770 |
{
|
|
771 |
|
|
772 |
iUpAndRunning = EFalse;
|
|
773 |
iUnderTaker->Cancel();
|
|
774 |
|
|
775 |
if(iCTestExecution != NULL)
|
|
776 |
{
|
|
777 |
RMutex printMutex;
|
|
778 |
printMutex.SetHandle( iCTestExecution->PrintMutexHandle() );
|
|
779 |
RMutex eventMutex;
|
|
780 |
eventMutex.SetHandle( iCTestExecution->EventMutexHandle() );
|
|
781 |
RMutex sndMutex;
|
|
782 |
sndMutex.SetHandle( iCTestExecution->SndMutexHandle() );
|
|
783 |
RMutex rcvMutex;
|
|
784 |
rcvMutex.SetHandle( iCTestExecution->RcvMutexHandle() );
|
|
785 |
|
|
786 |
printMutex.Wait(); // wait that print operation is done
|
|
787 |
eventMutex.Wait(); // wait that event operation is done
|
|
788 |
sndMutex.Wait(); // wait that snd operation is done
|
|
789 |
rcvMutex.Wait(); // wait that event operation is done
|
|
790 |
|
|
791 |
iThread.Kill ( aCode );
|
|
792 |
|
|
793 |
printMutex.Signal();
|
|
794 |
eventMutex.Signal();
|
|
795 |
sndMutex.Signal();
|
|
796 |
rcvMutex.Signal();
|
|
797 |
}
|
|
798 |
else
|
|
799 |
{
|
|
800 |
__TRACE( KError,( _L( "STIF internal error - iCTestExecution is NULL in CTestModuleContainer::KillThread" ) ) );
|
|
801 |
User::Panic(_L("NULL pointer exception"), KErrGeneral);
|
|
802 |
}
|
|
803 |
|
|
804 |
}
|
|
805 |
|
|
806 |
/*
|
|
807 |
-------------------------------------------------------------------------------
|
|
808 |
|
|
809 |
Class: CTestModuleContainer
|
|
810 |
|
|
811 |
Method: ChangeOperation
|
|
812 |
|
|
813 |
Description: Multithread safe way to change operation
|
|
814 |
|
|
815 |
Parameters: const TOperation aOperation :in: Operation type
|
|
816 |
const TFileName* aNameBuffer :in: Filename ( or NULL )
|
|
817 |
const TInt aInt :in: Operation specific int
|
|
818 |
|
|
819 |
Return Values: TInt Error code
|
|
820 |
|
|
821 |
Errors/Exceptions: None
|
|
822 |
|
|
823 |
Status: Proposal
|
|
824 |
|
|
825 |
-------------------------------------------------------------------------------
|
|
826 |
*/
|
|
827 |
TInt CTestModuleContainer::ChangeOperation( const TOperation aOperation,
|
|
828 |
const TFileName& aNameBuffer,
|
|
829 |
const TInt aInt )
|
|
830 |
{
|
|
831 |
|
|
832 |
TInt ret = KErrNone;
|
|
833 |
|
|
834 |
iOperationChangeSemaphore.Wait();
|
|
835 |
|
|
836 |
iErrorResult = KErrNone;
|
|
837 |
iModuleResult = KErrNone;
|
|
838 |
|
|
839 |
TFileName newNameBuffer;
|
|
840 |
// Check is TestScripter
|
|
841 |
TInt check = CheckModuleName( aNameBuffer, newNameBuffer );
|
|
842 |
delete iModuleNameBuffer;
|
|
843 |
iModuleNameBuffer = NULL;
|
|
844 |
if( check == KErrNone )
|
|
845 |
{
|
|
846 |
// Construct heap buffer for configuration file
|
|
847 |
TRAP( ret, iModuleNameBuffer = HBufC::NewL( newNameBuffer.Length() ) );
|
|
848 |
|
|
849 |
if( ret == KErrNone )
|
|
850 |
{
|
|
851 |
iOperationName.Set ( iModuleNameBuffer->Des() );
|
|
852 |
iOperationName.Copy ( newNameBuffer );
|
|
853 |
|
|
854 |
iOperationIntBuffer = aInt;
|
|
855 |
iOperationType = aOperation;
|
|
856 |
}
|
|
857 |
else
|
|
858 |
{
|
|
859 |
__TRACE ( KError, ( CStifLogger::ERed, _L( "CTestModuleContainer::ChangeOperation NoMemory" ) ) );
|
|
860 |
}
|
|
861 |
}
|
|
862 |
else
|
|
863 |
{
|
|
864 |
// Construct heap buffer for configuration file
|
|
865 |
TRAP( ret, iModuleNameBuffer = HBufC::NewL( aNameBuffer.Length() ) );
|
|
866 |
|
|
867 |
if( ret == KErrNone )
|
|
868 |
{
|
|
869 |
iOperationName.Set ( iModuleNameBuffer->Des() );
|
|
870 |
iOperationName.Copy ( aNameBuffer );
|
|
871 |
|
|
872 |
iOperationIntBuffer = aInt;
|
|
873 |
iOperationType = aOperation;
|
|
874 |
}
|
|
875 |
else
|
|
876 |
{
|
|
877 |
__TRACE ( KError, ( CStifLogger::ERed, _L( "CTestModuleContainer::ChangeOperation NoMemory" ) ) );
|
|
878 |
}
|
|
879 |
}
|
|
880 |
|
|
881 |
iOperationChangeSemaphore.Signal();
|
|
882 |
|
|
883 |
return ret;
|
|
884 |
|
|
885 |
}
|
|
886 |
|
|
887 |
/*
|
|
888 |
-------------------------------------------------------------------------------
|
|
889 |
|
|
890 |
Class: CTestModuleContainer
|
|
891 |
|
|
892 |
Method: ChangeOperationNoError
|
|
893 |
|
|
894 |
Description: Multithread safe way to change operation. This version
|
|
895 |
of function can't fail.
|
|
896 |
|
|
897 |
Parameters: const TOperation aOperation :in: Operation type
|
|
898 |
const TInt aInt :in: Operation specific int
|
|
899 |
|
|
900 |
Return Values: None
|
|
901 |
|
|
902 |
Errors/Exceptions: None
|
|
903 |
|
|
904 |
Status: Proposal
|
|
905 |
|
|
906 |
-------------------------------------------------------------------------------
|
|
907 |
*/
|
|
908 |
void CTestModuleContainer::ChangeOperationNoError( const TOperation aOperation,
|
|
909 |
const TInt aInt
|
|
910 |
)
|
|
911 |
{
|
|
912 |
|
|
913 |
iOperationChangeSemaphore.Wait();
|
|
914 |
|
|
915 |
iErrorResult = KErrNone;
|
|
916 |
iModuleResult = KErrNone;
|
|
917 |
iOperationIntBuffer = aInt;
|
|
918 |
iOperationType = aOperation;
|
|
919 |
|
|
920 |
iOperationChangeSemaphore.Signal();
|
|
921 |
|
|
922 |
}
|
|
923 |
|
|
924 |
/*
|
|
925 |
-------------------------------------------------------------------------------
|
|
926 |
|
|
927 |
Class: CTestModuleContainer
|
|
928 |
|
|
929 |
Method: Operation
|
|
930 |
|
|
931 |
Description: Multithread safe way to obtain current operation.
|
|
932 |
|
|
933 |
Parameters: None
|
|
934 |
|
|
935 |
Return Values: TBool Operation
|
|
936 |
|
|
937 |
Errors/Exceptions: None
|
|
938 |
|
|
939 |
Status: Proposal
|
|
940 |
|
|
941 |
-------------------------------------------------------------------------------
|
|
942 |
*/
|
|
943 |
//@spe const CTestModuleContainer::TOperation CTestModuleContainer::Operation()
|
|
944 |
CTestModuleContainer::TOperation CTestModuleContainer::Operation()
|
|
945 |
{
|
|
946 |
TOperation operation;
|
|
947 |
iOperationChangeSemaphore.Wait();
|
|
948 |
operation = iOperationType;
|
|
949 |
iOperationChangeSemaphore.Signal();
|
|
950 |
|
|
951 |
return operation;
|
|
952 |
|
|
953 |
}
|
|
954 |
|
|
955 |
/*
|
|
956 |
-------------------------------------------------------------------------------
|
|
957 |
|
|
958 |
Class: CTestModuleContainer
|
|
959 |
|
|
960 |
Method: ModuleResult
|
|
961 |
|
|
962 |
Description: Returns error code from test module
|
|
963 |
|
|
964 |
Parameters: None
|
|
965 |
|
|
966 |
Return Values: TInt Result code from module
|
|
967 |
|
|
968 |
Errors/Exceptions: None
|
|
969 |
|
|
970 |
Status: Proposal
|
|
971 |
|
|
972 |
-------------------------------------------------------------------------------
|
|
973 |
*/
|
|
974 |
TInt& CTestModuleContainer::ModuleResult()
|
|
975 |
{
|
|
976 |
|
|
977 |
return iModuleResult;
|
|
978 |
|
|
979 |
}
|
|
980 |
|
|
981 |
/*
|
|
982 |
-------------------------------------------------------------------------------
|
|
983 |
|
|
984 |
Class: CTestModuleContainer
|
|
985 |
|
|
986 |
Method: OperationErrorResult
|
|
987 |
|
|
988 |
Description: Returns error code from test module
|
|
989 |
|
|
990 |
Parameters: None
|
|
991 |
|
|
992 |
Return Values: TInt Result code from module
|
|
993 |
|
|
994 |
Errors/Exceptions: None
|
|
995 |
|
|
996 |
Status: Proposal
|
|
997 |
|
|
998 |
-------------------------------------------------------------------------------
|
|
999 |
*/
|
|
1000 |
TInt& CTestModuleContainer::OperationErrorResult()
|
|
1001 |
{
|
|
1002 |
|
|
1003 |
return iModuleResult;
|
|
1004 |
|
|
1005 |
}
|
|
1006 |
|
|
1007 |
/*
|
|
1008 |
-------------------------------------------------------------------------------
|
|
1009 |
|
|
1010 |
Class: CTestModuleContainer
|
|
1011 |
|
|
1012 |
Method: TestModuleName
|
|
1013 |
|
|
1014 |
Description: Returns test module name.
|
|
1015 |
|
|
1016 |
Parameters: None
|
|
1017 |
|
|
1018 |
Return Values: const TDesC&: test module name
|
|
1019 |
|
|
1020 |
Errors/Exceptions: None
|
|
1021 |
|
|
1022 |
Status: Proposal
|
|
1023 |
|
|
1024 |
-------------------------------------------------------------------------------
|
|
1025 |
*/
|
|
1026 |
const TDesC& CTestModuleContainer::TestModuleName()
|
|
1027 |
{
|
|
1028 |
|
|
1029 |
return iCTestModule->Name();
|
|
1030 |
|
|
1031 |
}
|
|
1032 |
|
|
1033 |
/*
|
|
1034 |
-------------------------------------------------------------------------------
|
|
1035 |
|
|
1036 |
Class: CTestModuleContainer
|
|
1037 |
|
|
1038 |
Method: TestModuleName
|
|
1039 |
|
|
1040 |
Description: Returns test module name.
|
|
1041 |
|
|
1042 |
Parameters: None
|
|
1043 |
|
|
1044 |
Return Values: const TDesC&: test module name
|
|
1045 |
|
|
1046 |
Errors/Exceptions: None
|
|
1047 |
|
|
1048 |
Status: Proposal
|
|
1049 |
|
|
1050 |
-------------------------------------------------------------------------------
|
|
1051 |
*/
|
|
1052 |
const TDesC& CTestModuleContainer::TestModuleIniFile()
|
|
1053 |
{
|
|
1054 |
|
|
1055 |
return iCTestModule->IniName();
|
|
1056 |
|
|
1057 |
}
|
|
1058 |
|
|
1059 |
/*
|
|
1060 |
-------------------------------------------------------------------------------
|
|
1061 |
|
|
1062 |
Class: CTestModuleContainer
|
|
1063 |
|
|
1064 |
Method: ModuleResult
|
|
1065 |
|
|
1066 |
Description: Returns constant pointer to test case array
|
|
1067 |
|
|
1068 |
Parameters: None
|
|
1069 |
|
|
1070 |
Return Values: const RPointerArray<TTestCaseInfo>* Test cases
|
|
1071 |
|
|
1072 |
Errors/Exceptions: None
|
|
1073 |
|
|
1074 |
Status: Proposal
|
|
1075 |
|
|
1076 |
-------------------------------------------------------------------------------
|
|
1077 |
*/
|
|
1078 |
const RPointerArray<TTestCaseInfo>* CTestModuleContainer::TestCases() const
|
|
1079 |
{
|
|
1080 |
|
|
1081 |
if( !iUpAndRunning )
|
|
1082 |
{
|
|
1083 |
return NULL;
|
|
1084 |
}
|
|
1085 |
|
|
1086 |
if( iThreadContainer == NULL )
|
|
1087 |
{
|
|
1088 |
CTestServer::PanicServer( ENullTestThreadContainer );
|
|
1089 |
}
|
|
1090 |
return iThreadContainer->TestCases();
|
|
1091 |
|
|
1092 |
}
|
|
1093 |
|
|
1094 |
/*
|
|
1095 |
-------------------------------------------------------------------------------
|
|
1096 |
|
|
1097 |
Class: CTestModuleContainer
|
|
1098 |
|
|
1099 |
Method: Complete
|
|
1100 |
|
|
1101 |
Description: Completes operation from any thread
|
|
1102 |
|
|
1103 |
Parameters: const TInt aCompletionCode :in: Completion code
|
|
1104 |
|
|
1105 |
Return Values: None
|
|
1106 |
|
|
1107 |
Errors/Exceptions: Function panics if server's thread can't be opened.
|
|
1108 |
|
|
1109 |
Status: Proposal
|
|
1110 |
|
|
1111 |
-------------------------------------------------------------------------------
|
|
1112 |
*/
|
|
1113 |
void CTestModuleContainer::Complete( const TInt aCompletionCode )
|
|
1114 |
{
|
|
1115 |
|
|
1116 |
TRequestStatus* req = &iStatus;
|
|
1117 |
User::RequestComplete( req, aCompletionCode );
|
|
1118 |
|
|
1119 |
}
|
|
1120 |
|
|
1121 |
/*
|
|
1122 |
-------------------------------------------------------------------------------
|
|
1123 |
|
|
1124 |
Class: CTestModuleContainer
|
|
1125 |
|
|
1126 |
Method: DoErrorPrint
|
|
1127 |
|
|
1128 |
Description: Handle error prints.
|
|
1129 |
|
|
1130 |
Parameters: None
|
|
1131 |
|
|
1132 |
Return Values: None
|
|
1133 |
|
|
1134 |
Errors/Exceptions: None
|
|
1135 |
|
|
1136 |
Status: Proposal
|
|
1137 |
|
|
1138 |
-------------------------------------------------------------------------------
|
|
1139 |
*/
|
|
1140 |
void CTestModuleContainer::DoErrorPrint()
|
|
1141 |
{
|
|
1142 |
|
|
1143 |
iCTestModule->ErrorPrint( iErrorPrint.iPriority, iErrorPrint.iText );
|
|
1144 |
|
|
1145 |
}
|
|
1146 |
|
|
1147 |
/*
|
|
1148 |
-------------------------------------------------------------------------------
|
|
1149 |
|
|
1150 |
Class: CTestModuleContainer
|
|
1151 |
|
|
1152 |
Method: KillTestinterferenceThread
|
|
1153 |
|
|
1154 |
Description: Make sure that any of the test interference thread's won't
|
|
1155 |
stay to run if test case is crashed of test interference
|
|
1156 |
object is not deleted.
|
|
1157 |
|
|
1158 |
Parameters: None
|
|
1159 |
|
|
1160 |
Return Values: None
|
|
1161 |
|
|
1162 |
Errors/Exceptions: None
|
|
1163 |
|
|
1164 |
Status: Proposal
|
|
1165 |
|
|
1166 |
-------------------------------------------------------------------------------
|
|
1167 |
*/
|
|
1168 |
void CTestModuleContainer::KillTestinterferenceThread()
|
|
1169 |
{
|
|
1170 |
if (iCTestExecution != NULL)
|
|
1171 |
{
|
|
1172 |
iCTestExecution->KillTestinterferenceThread();
|
|
1173 |
}
|
|
1174 |
else
|
|
1175 |
{
|
|
1176 |
__TRACE( KError,( _L( "STIF internal error - iCTestExecution is NULL in CTestModuleContainer::KillTestinterferenceThread" ) ) );
|
|
1177 |
User::Panic(_L("NULL pointer exception"), KErrGeneral);
|
|
1178 |
}
|
|
1179 |
}
|
|
1180 |
|
|
1181 |
/*
|
|
1182 |
-------------------------------------------------------------------------------
|
|
1183 |
|
|
1184 |
Class: CTestModuleContainer
|
|
1185 |
|
|
1186 |
Method: KillTestMeasurement
|
|
1187 |
|
|
1188 |
Description: Make sure that any of the test measurement process's won't
|
|
1189 |
stay to run if test case is crashed of test measurement object
|
|
1190 |
is not deleted.
|
|
1191 |
|
|
1192 |
Parameters: None
|
|
1193 |
|
|
1194 |
Return Values: None
|
|
1195 |
|
|
1196 |
Errors/Exceptions: None
|
|
1197 |
|
|
1198 |
Status: Approved
|
|
1199 |
|
|
1200 |
-------------------------------------------------------------------------------
|
|
1201 |
*/
|
|
1202 |
void CTestModuleContainer::KillTestMeasurement()
|
|
1203 |
{
|
|
1204 |
if (iCTestExecution != NULL)
|
|
1205 |
{
|
|
1206 |
iCTestExecution->KillTestMeasurement();
|
|
1207 |
}
|
|
1208 |
else
|
|
1209 |
{
|
|
1210 |
__TRACE( KError,( _L( "STIF internal error - iCTestExecution is NULL in CTestModuleContainer::KillTestMeasurement" ) ) );
|
|
1211 |
User::Panic(_L("NULL pointer exception"), KErrGeneral);
|
|
1212 |
}
|
|
1213 |
}
|
|
1214 |
|
|
1215 |
/*
|
|
1216 |
-------------------------------------------------------------------------------
|
|
1217 |
|
|
1218 |
Class: CTestModuleContainer
|
|
1219 |
|
|
1220 |
Method: GetRequest
|
|
1221 |
|
|
1222 |
Description: Return status flags.
|
|
1223 |
|
|
1224 |
Parameters: TRequestType aType: in: request type
|
|
1225 |
|
|
1226 |
Return Values: TRequestStatus*: pointer to TRequestStatus
|
|
1227 |
|
|
1228 |
Errors/Exceptions: None
|
|
1229 |
|
|
1230 |
Status: Proposal
|
|
1231 |
|
|
1232 |
-------------------------------------------------------------------------------
|
|
1233 |
*/
|
|
1234 |
TRequestStatus* CTestModuleContainer::GetRequest( TRequestType aType )
|
|
1235 |
{
|
|
1236 |
|
|
1237 |
TRequestStatus* status = NULL;
|
|
1238 |
|
|
1239 |
switch( aType )
|
|
1240 |
{
|
|
1241 |
case ERqTestCase:
|
|
1242 |
status = &iStatus;
|
|
1243 |
break;
|
|
1244 |
case ERqErrorPrint:
|
|
1245 |
status = &iErrorPrintHandler->iStatus;
|
|
1246 |
break;
|
|
1247 |
default:
|
|
1248 |
break;
|
|
1249 |
}
|
|
1250 |
|
|
1251 |
return status;
|
|
1252 |
|
|
1253 |
}
|
|
1254 |
|
|
1255 |
/*
|
|
1256 |
-------------------------------------------------------------------------------
|
|
1257 |
|
|
1258 |
Class: CTestModuleContainer
|
|
1259 |
|
|
1260 |
Method: RunL
|
|
1261 |
|
|
1262 |
Description: Stops active scheduler when operation in another thread
|
|
1263 |
is completed.
|
|
1264 |
|
|
1265 |
Parameters: None
|
|
1266 |
|
|
1267 |
Return Values: None
|
|
1268 |
|
|
1269 |
Errors/Exceptions: None
|
|
1270 |
|
|
1271 |
Status: Proposal
|
|
1272 |
|
|
1273 |
-------------------------------------------------------------------------------
|
|
1274 |
*/
|
|
1275 |
void CTestModuleContainer::RunL()
|
|
1276 |
{
|
|
1277 |
|
|
1278 |
if( iOperationType == CTestModuleContainer::EExecuteTestInThread )
|
|
1279 |
{
|
|
1280 |
// Make sure that any of the test interference thread's won't stay
|
|
1281 |
// to run.
|
|
1282 |
KillTestinterferenceThread();
|
|
1283 |
|
|
1284 |
// Make sure that any of the test measurement process's won't stay
|
|
1285 |
// to run.
|
|
1286 |
KillTestMeasurement();
|
|
1287 |
|
|
1288 |
if(iCTestExecution == NULL)
|
|
1289 |
{
|
|
1290 |
__TRACE( KError,( _L( "STIF internal error - iCTestExecution is NULL in CTestModuleContainer::RunL" ) ) );
|
|
1291 |
User::Leave(KErrGeneral);
|
|
1292 |
}
|
|
1293 |
else
|
|
1294 |
{
|
|
1295 |
// Set the thread state
|
|
1296 |
iCTestExecution->SetThreadState( CTestExecution::EFinished );
|
|
1297 |
|
|
1298 |
// If test print queue is empty, then complete request with KEof. If Queue
|
|
1299 |
// is not empty, then do not complete. Queue will be emptied by UI.
|
|
1300 |
iCTestExecution->CompletePrintRequestIfQueueEmpty();
|
|
1301 |
|
|
1302 |
// Event queue clean-up
|
|
1303 |
iCTestExecution->CleanupEvents();
|
|
1304 |
|
|
1305 |
// Complete the test request
|
|
1306 |
iCTestExecution->CompleteTestExecution( iStatus.Int() );
|
|
1307 |
|
|
1308 |
// Test case execution OK and test module thread's pause operation
|
|
1309 |
// is not ongoing. Re-use old test module execution thread
|
|
1310 |
if( iCTestExecution->TestThreadFailure() == CTestExecution::ETestThreadOk && !iIsPaused )
|
|
1311 |
{
|
|
1312 |
// Return this module to pool
|
|
1313 |
__TRACE( KInit, ( _L("Freeing test module container at 0x%x"),
|
|
1314 |
(TUint32) this ) );
|
|
1315 |
iCTestModule->FreeTestModule( this );
|
|
1316 |
}
|
|
1317 |
// Problems in test case execution. Delete this test module thread and
|
|
1318 |
// start next test case in new test module thread.
|
|
1319 |
else
|
|
1320 |
{
|
|
1321 |
if( iIsPaused )
|
|
1322 |
{
|
|
1323 |
// Test case is paused by user and this RunL is executed also.
|
|
1324 |
// This RunL will make Resume() operation to fail because test
|
|
1325 |
// case is finished. Next test case cannot complete and that is
|
|
1326 |
// why next test case will start at the "clean table".
|
|
1327 |
__TRACE( KInit, ( _L( "Delete test module container at 0x%x because test module thread is paused while test case is finished(Cannot Resume())" ), (TUint32) this ) );
|
|
1328 |
}
|
|
1329 |
else
|
|
1330 |
{
|
|
1331 |
// delete test module thread if some thread problem has occurred
|
|
1332 |
__TRACE( KInit, ( _L("Delete test module container at 0x%x because of thread leak (0x%x)"),
|
|
1333 |
(TUint32) this, iCTestExecution->TestThreadFailure() ) );
|
|
1334 |
}
|
|
1335 |
delete this;
|
|
1336 |
}
|
|
1337 |
}
|
|
1338 |
}
|
|
1339 |
else
|
|
1340 |
{
|
|
1341 |
// Synchronous operation is completed, stop "nested" active scheduler.
|
|
1342 |
//CActiveScheduler::Stop();
|
|
1343 |
iNestedActiveScheduler->AsyncStop();
|
|
1344 |
// Execution continues from CTestModuleContainer::WaitOperation().
|
|
1345 |
}
|
|
1346 |
}
|
|
1347 |
|
|
1348 |
|
|
1349 |
/*
|
|
1350 |
-------------------------------------------------------------------------------
|
|
1351 |
|
|
1352 |
Class: CTestModuleContainer
|
|
1353 |
|
|
1354 |
Method: DoCancel
|
|
1355 |
|
|
1356 |
Description: Cancel asyncronous request.
|
|
1357 |
|
|
1358 |
Parameters: None
|
|
1359 |
|
|
1360 |
Return Values: None
|
|
1361 |
|
|
1362 |
Errors/Exceptions: None
|
|
1363 |
|
|
1364 |
Status: Proposal
|
|
1365 |
|
|
1366 |
-------------------------------------------------------------------------------
|
|
1367 |
*/
|
|
1368 |
void CTestModuleContainer::DoCancel()
|
|
1369 |
{
|
|
1370 |
|
|
1371 |
if ( iUpAndRunning == EFalse )
|
|
1372 |
{
|
|
1373 |
|
|
1374 |
// Before the completion check if the status was not already completed
|
|
1375 |
// from other thread in CTestThreadContainer::TestComplete().
|
|
1376 |
// For details see Jira STIF-564
|
|
1377 |
if(iStatus == KRequestPending)
|
|
1378 |
Complete ( KErrCancel );
|
|
1379 |
|
|
1380 |
}
|
|
1381 |
|
|
1382 |
}
|
|
1383 |
|
|
1384 |
|
|
1385 |
|
|
1386 |
/*
|
|
1387 |
-------------------------------------------------------------------------------
|
|
1388 |
|
|
1389 |
Class: CTestModuleContainer
|
|
1390 |
|
|
1391 |
Method: RunError
|
|
1392 |
|
|
1393 |
Description: Handle errors.
|
|
1394 |
|
|
1395 |
Because RunL does not leave, one should never come here. Just forward
|
|
1396 |
error code and let framework panic the server in case of error.
|
|
1397 |
|
|
1398 |
Parameters: TInt aError: :in: Error code
|
|
1399 |
|
|
1400 |
Return Values: TInt Error code
|
|
1401 |
|
|
1402 |
Errors/Exceptions: None
|
|
1403 |
|
|
1404 |
Status: Proposal
|
|
1405 |
|
|
1406 |
-------------------------------------------------------------------------------
|
|
1407 |
*/
|
|
1408 |
TInt CTestModuleContainer::RunError( TInt aError )
|
|
1409 |
{
|
|
1410 |
|
|
1411 |
__TRACE( KError,( _L( "CTestModuleContainer::RunError %d" ), aError ) );
|
|
1412 |
|
|
1413 |
return aError;
|
|
1414 |
|
|
1415 |
}
|
|
1416 |
|
|
1417 |
/*
|
|
1418 |
-------------------------------------------------------------------------------
|
|
1419 |
|
|
1420 |
Class: CTestModuleContainer
|
|
1421 |
|
|
1422 |
Method: ReadParametersFromScriptFileL
|
|
1423 |
|
|
1424 |
Description: Read test class parameters from script file if parameter(s)
|
|
1425 |
are/is set(TestScripter and TestCombiner).
|
|
1426 |
|
|
1427 |
Parameters: const TDesC& aConfig: in: Test case (config) file name.
|
|
1428 |
TUint32& aStackSize: inout: Stack size.
|
|
1429 |
TUint32& aHeapMinSize: inout: Heap's minimum size.
|
|
1430 |
TUint32& aHeapMaxSize: inout: Heap's maximum size.
|
|
1431 |
|
|
1432 |
Return Values: Symbian error code.
|
|
1433 |
|
|
1434 |
Errors/Exceptions: Leaves if User::LeaveIfError() leaves
|
|
1435 |
Leaves if User::LeaveIfNull() leaves
|
|
1436 |
|
|
1437 |
Status: Approved
|
|
1438 |
|
|
1439 |
-------------------------------------------------------------------------------
|
|
1440 |
*/
|
|
1441 |
TInt CTestModuleContainer::ReadParametersFromScriptFileL(
|
|
1442 |
const TDesC& aConfig,
|
|
1443 |
TInt& aStackSize,
|
|
1444 |
TInt& aHeapMinSize,
|
|
1445 |
TInt& aHeapMaxSize )
|
|
1446 |
{
|
|
1447 |
// __UHEAP_MARK;
|
|
1448 |
|
|
1449 |
RFs fileServer;
|
|
1450 |
RFile file;
|
|
1451 |
TInt ret( KErrNone );
|
|
1452 |
|
|
1453 |
User::LeaveIfError( fileServer.Connect() );
|
|
1454 |
CleanupClosePushL( fileServer );
|
|
1455 |
|
|
1456 |
__TRACE( KInit, ( _L( "ReadParametersFromScriptFile(): Open configfile [%S]" ), &aConfig ) );
|
|
1457 |
|
|
1458 |
TParse parse;
|
|
1459 |
parse.Set( aConfig, NULL, NULL );
|
|
1460 |
|
|
1461 |
User::LeaveIfError( fileServer.SetSessionPath( parse.DriveAndPath() ) );
|
|
1462 |
|
|
1463 |
User::LeaveIfError( file.Open( fileServer, aConfig, EFileRead | EFileShareAny ) );
|
|
1464 |
CleanupClosePushL( file );
|
|
1465 |
|
|
1466 |
TInt size( 0 );
|
|
1467 |
User::LeaveIfError( file.Size( size ) );
|
|
1468 |
|
|
1469 |
const TInt tmpSize = KMaxName; // 128
|
|
1470 |
TInt offset( 0 ); // Offset value to parts reading
|
|
1471 |
|
|
1472 |
// Indications for tags
|
|
1473 |
TBool start_tag_found( EFalse );
|
|
1474 |
TBool end_tag_found( EFalse );
|
|
1475 |
// Offset values for start and end position parsing
|
|
1476 |
TInt offset_start( 0 );
|
|
1477 |
TInt offset_end( 0 );
|
|
1478 |
|
|
1479 |
/* Search is combined to section that include tags. After this create new
|
|
1480 |
combined section that include second buffer data and new buffer data.
|
|
1481 |
Section: 1) 1+2
|
|
1482 |
2) 2+1
|
|
1483 |
2) 1+2 etc. This should ensure that all data is search.
|
|
1484 |
*/
|
|
1485 |
|
|
1486 |
// Construct modifiable heap-based descriptor. tmp1 to CleanupStack
|
|
1487 |
// This for first data buffer
|
|
1488 |
HBufC8* tmp1 = HBufC8::NewLC( tmpSize ); // 128
|
|
1489 |
TPtr8 buf1 = tmp1->Des();
|
|
1490 |
|
|
1491 |
// Construct modifiable heap-based descriptor. tmp2 to CleanupStack
|
|
1492 |
// This for second data buffer
|
|
1493 |
HBufC8* tmp2 = HBufC8::NewLC( tmpSize ); // 128
|
|
1494 |
TPtr8 buf2 = tmp2->Des();
|
|
1495 |
|
|
1496 |
// Construct modifiable heap-based descriptor. tmp3 to CleanupStack
|
|
1497 |
// This includes both first and second data buffers
|
|
1498 |
HBufC* tmp3 = HBufC::NewLC( tmpSize + tmpSize ); // 256
|
|
1499 |
TPtr currentSection = tmp3->Des();
|
|
1500 |
|
|
1501 |
// Construct modifiable heap-based descriptor. tmp4 to CleanupStack
|
|
1502 |
// This is for changing 8 bit to 16 bit
|
|
1503 |
HBufC* tmp4 = HBufC::NewLC( tmpSize ); // 128
|
|
1504 |
TPtr to16bit = tmp4->Des();
|
|
1505 |
|
|
1506 |
ret = KErrNone;
|
|
1507 |
|
|
1508 |
// Read data to buffer 1
|
|
1509 |
// tmp4, tmp3, tmp2 and tmp1 are in CleanupStack => Leave OK
|
|
1510 |
// CleanupClosePushL is used to fileServer and file => Leave OK
|
|
1511 |
User::LeaveIfError( file.Read( offset, buf1, tmpSize ) );
|
|
1512 |
|
|
1513 |
// For next buffer reading
|
|
1514 |
offset += tmpSize;
|
|
1515 |
|
|
1516 |
// Read data to buffer 2
|
|
1517 |
// tmp4, tmp3, tmp2 and tmp1 are in CleanupStack => Leave OK
|
|
1518 |
// CleanupClosePushL is used to fileServer and file => Leave OK
|
|
1519 |
User::LeaveIfError( file.Read( offset, buf2, tmpSize ) );
|
|
1520 |
|
|
1521 |
// 8 bit to 16. Create first combined buffer 1 and buffer 2 that
|
|
1522 |
// is used for searching.
|
|
1523 |
to16bit.Copy( buf1 );
|
|
1524 |
currentSection.Copy( to16bit );
|
|
1525 |
to16bit.Copy( buf2 );
|
|
1526 |
currentSection.Append( to16bit );
|
|
1527 |
|
|
1528 |
// Check if small files to be parsed(e.g. settings + one short case).
|
|
1529 |
TInt bigsize( 0 );
|
|
1530 |
// Check if parsed section is smaller than 256
|
|
1531 |
if( size < ( tmpSize + tmpSize ) )
|
|
1532 |
{
|
|
1533 |
bigsize = size;
|
|
1534 |
}
|
|
1535 |
else
|
|
1536 |
{
|
|
1537 |
bigsize = tmpSize + tmpSize; // 256
|
|
1538 |
}
|
|
1539 |
|
|
1540 |
do
|
|
1541 |
{
|
|
1542 |
// Start the next buffer reading
|
|
1543 |
offset += tmpSize;
|
|
1544 |
|
|
1545 |
// Search the start tag
|
|
1546 |
ret = currentSection.Find( KStifSettingsStartTag );
|
|
1547 |
if( ret != KErrNotFound )
|
|
1548 |
{
|
|
1549 |
// Succesfully search, take the start offset
|
|
1550 |
ret = file.Seek( ESeekCurrent, offset_start );
|
|
1551 |
if( ret == KErrNone )
|
|
1552 |
{
|
|
1553 |
start_tag_found = ETrue;
|
|
1554 |
// Current section is end so offset to beging of the
|
|
1555 |
// combined section.
|
|
1556 |
offset_start = ( offset_start - ( bigsize ) );
|
|
1557 |
}
|
|
1558 |
}
|
|
1559 |
// Search the end tag
|
|
1560 |
ret = currentSection.Find( KStifSettingsEndTag );
|
|
1561 |
if( ret != KErrNotFound )
|
|
1562 |
{
|
|
1563 |
// Succesfully search, take the end offset
|
|
1564 |
ret = file.Seek( ESeekCurrent, offset_end );
|
|
1565 |
if( ret == KErrNone )
|
|
1566 |
{
|
|
1567 |
end_tag_found = ETrue;
|
|
1568 |
}
|
|
1569 |
}
|
|
1570 |
|
|
1571 |
// Both start and end tags are founded, start parsing sizes.
|
|
1572 |
if( start_tag_found && end_tag_found )
|
|
1573 |
{
|
|
1574 |
TInt length = ( offset_end - offset_start );
|
|
1575 |
|
|
1576 |
// Construct modifiable heap-based descriptor.
|
|
1577 |
// setting_buf to CleanupStack
|
|
1578 |
HBufC8* setting_buf = HBufC8::NewLC( length );// 8 bit for reading
|
|
1579 |
TPtr8 setting8 = setting_buf->Des();
|
|
1580 |
|
|
1581 |
// Construct modifiable heap-based descriptor.
|
|
1582 |
// setting_buf2 to CleanupStack
|
|
1583 |
HBufC* setting_buf2 = HBufC::NewLC( length );// 16 bit for parsing
|
|
1584 |
TPtr setting16 = setting_buf2->Des();
|
|
1585 |
|
|
1586 |
// Read data from the founded STIF settings sections
|
|
1587 |
ret = KErrNone;
|
|
1588 |
// HBufCs are in CleanupStack => Leave OK
|
|
1589 |
// CleanupClosePushL is used to fileServer and file => Leave OK
|
|
1590 |
User::LeaveIfError( file.Read( offset_start, setting8, length ) );
|
|
1591 |
|
|
1592 |
// Section 8 bit to 16.
|
|
1593 |
setting16.Copy( setting8 );
|
|
1594 |
|
|
1595 |
// Start create parser for parsing heap and stack sizes.
|
|
1596 |
// NOTE: Comments are parsed away from the section.
|
|
1597 |
CStifParser* parser = NULL;
|
|
1598 |
User::LeaveIfNull( parser = CStifParser::NewL( setting16,
|
|
1599 |
CStifParser::ECStyleComments ) );
|
|
1600 |
CleanupStack::PushL(parser);
|
|
1601 |
|
|
1602 |
CStifSectionParser* section = NULL;
|
|
1603 |
User::LeaveIfNull( section = parser->SectionL( KStifSettingsStartTag,
|
|
1604 |
KStifSettingsEndTag ) );
|
|
1605 |
CleanupStack::PushL(section);
|
|
1606 |
TInt lineRet( KErrNone );
|
|
1607 |
TInt integer( 0 );
|
|
1608 |
|
|
1609 |
// Try to get stack size
|
|
1610 |
CStifItemParser* itemLine = NULL;
|
|
1611 |
TRAPD( parse_ret, itemLine = section->GetItemLineL(
|
|
1612 |
KUserDefStackSize ) );
|
|
1613 |
if ( parse_ret == KErrNone && itemLine != NULL )
|
|
1614 |
{
|
|
1615 |
lineRet = itemLine->GetInt( KUserDefStackSize, integer );
|
|
1616 |
if ( lineRet == KErrNone )
|
|
1617 |
{
|
|
1618 |
aStackSize = integer;
|
|
1619 |
}
|
|
1620 |
}
|
|
1621 |
delete itemLine;
|
|
1622 |
itemLine = NULL;
|
|
1623 |
|
|
1624 |
// Try to get minimum heap size
|
|
1625 |
TRAP( parse_ret, itemLine = section->GetItemLineL(
|
|
1626 |
KUserDefMinHeap ) );
|
|
1627 |
if ( parse_ret == KErrNone && itemLine != NULL )
|
|
1628 |
{
|
|
1629 |
lineRet = itemLine->GetInt( KUserDefMinHeap, integer );
|
|
1630 |
if ( lineRet == KErrNone )
|
|
1631 |
{
|
|
1632 |
aHeapMinSize = integer;
|
|
1633 |
}
|
|
1634 |
}
|
|
1635 |
delete itemLine;
|
|
1636 |
itemLine = NULL;
|
|
1637 |
|
|
1638 |
// Try to get maximum heap size
|
|
1639 |
TRAP( parse_ret, itemLine = section->GetItemLineL(
|
|
1640 |
KUserDefMaxHeap ) );
|
|
1641 |
if ( parse_ret == KErrNone && itemLine != NULL )
|
|
1642 |
{
|
|
1643 |
lineRet = itemLine->GetInt( KUserDefMaxHeap, integer );
|
|
1644 |
if ( lineRet == KErrNone )
|
|
1645 |
{
|
|
1646 |
aHeapMaxSize = integer;
|
|
1647 |
}
|
|
1648 |
}
|
|
1649 |
delete itemLine;
|
|
1650 |
|
|
1651 |
CleanupStack::Pop(section);
|
|
1652 |
CleanupStack::Pop(parser);
|
|
1653 |
|
|
1654 |
CleanupStack::PopAndDestroy( setting_buf2 );
|
|
1655 |
CleanupStack::PopAndDestroy( setting_buf );
|
|
1656 |
|
|
1657 |
delete section;
|
|
1658 |
delete parser;
|
|
1659 |
|
|
1660 |
break; // Stop the do branch
|
|
1661 |
}
|
|
1662 |
|
|
1663 |
// Start to create new section for search
|
|
1664 |
|
|
1665 |
// 8 bit to 16. Last buffer to first
|
|
1666 |
to16bit.Copy( buf2 );
|
|
1667 |
currentSection.Copy( to16bit );
|
|
1668 |
|
|
1669 |
// Read new data to buffer 1
|
|
1670 |
ret = KErrNone;
|
|
1671 |
User::LeaveIfError( file.Read( offset, buf1, tmpSize ) );
|
|
1672 |
|
|
1673 |
// 8 bit to 16. Append
|
|
1674 |
to16bit.Copy( buf1 );
|
|
1675 |
currentSection.Append( to16bit );
|
|
1676 |
|
|
1677 |
// Copy first buffer data to buffer 2. This is added to first
|
|
1678 |
// in section in next run
|
|
1679 |
buf2.Copy( buf1 );
|
|
1680 |
|
|
1681 |
} while( offset < size );
|
|
1682 |
|
|
1683 |
CleanupStack::PopAndDestroy( tmp4 );
|
|
1684 |
CleanupStack::PopAndDestroy( tmp3 );
|
|
1685 |
CleanupStack::PopAndDestroy( tmp2 );
|
|
1686 |
CleanupStack::PopAndDestroy( tmp1 );
|
|
1687 |
|
|
1688 |
CleanupStack::PopAndDestroy( &file );
|
|
1689 |
CleanupStack::PopAndDestroy( &fileServer );
|
|
1690 |
file.Close();
|
|
1691 |
fileServer.Close();
|
|
1692 |
|
|
1693 |
//__UHEAP_MARKEND;
|
|
1694 |
|
|
1695 |
return KErrNone;
|
|
1696 |
|
|
1697 |
}
|
|
1698 |
|
|
1699 |
/*
|
|
1700 |
-------------------------------------------------------------------------------
|
|
1701 |
|
|
1702 |
Class: CTestModuleContainer
|
|
1703 |
|
|
1704 |
Method: ReadParametersFromTestModule
|
|
1705 |
|
|
1706 |
Description: Loads dynamically testmodule and calls SetRequirements()-
|
|
1707 |
method for test module parameter handling.
|
|
1708 |
|
|
1709 |
Parameters: const TDesC& aModuleName: in: Test module name
|
|
1710 |
CTestModuleParam*& aTestModuleParam: inout: Object for handling
|
|
1711 |
test module parameters.
|
|
1712 |
|
|
1713 |
Return Values: TInt: Symbian error code.
|
|
1714 |
|
|
1715 |
Errors/Exceptions: None.
|
|
1716 |
|
|
1717 |
Status: Proposal
|
|
1718 |
|
|
1719 |
-------------------------------------------------------------------------------
|
|
1720 |
*/
|
|
1721 |
TInt CTestModuleContainer::ReadParametersFromTestModule(
|
|
1722 |
const TDesC& aModuleName,
|
|
1723 |
CTestModuleParam*& aTestModuleParam )
|
|
1724 |
{
|
|
1725 |
__TRACE( KInit, ( _L( "ReadParametersFromTestModule() [%S]" ), &aModuleName ) );
|
|
1726 |
RLibrary testModule;
|
|
1727 |
// Load the module
|
|
1728 |
TPtrC dllName;
|
|
1729 |
|
|
1730 |
// Remove optional index appended to module name
|
|
1731 |
TFileName validModuleName;
|
|
1732 |
RemoveOptionalIndex(aModuleName, validModuleName);
|
|
1733 |
__TRACE(KInit, (_L( "Valid module name is [%S] (extracted from [%S])"), &validModuleName, &aModuleName));
|
|
1734 |
dllName.Set(validModuleName);
|
|
1735 |
|
|
1736 |
// Loading should work with and without '.dll' extension.
|
|
1737 |
TInt r = testModule.Load( dllName );
|
|
1738 |
if ( r != KErrNone )
|
|
1739 |
{
|
|
1740 |
__TRACE( KError, ( CStifLogger::EError, _L("Can't initialize test module[%S], code = %d"), &dllName, r ) );
|
|
1741 |
return KErrNotFound;
|
|
1742 |
}
|
|
1743 |
else
|
|
1744 |
{
|
|
1745 |
// Print reset module name
|
|
1746 |
__TRACE( KInit, ( _L("Loaded test module[%S]"), &dllName ) );
|
|
1747 |
}
|
|
1748 |
|
|
1749 |
|
|
1750 |
CTestInterfaceFactoryTestModule libEntry = NULL;
|
|
1751 |
|
|
1752 |
#if defined( __ARMCC__ )
|
|
1753 |
{
|
|
1754 |
// In this environment the heap and stack feature may crash if
|
|
1755 |
// test module not include a workaround for ARM RVCT(ARMv5) compiler
|
|
1756 |
// error. For more information see STIF user guide.
|
|
1757 |
__TRACE ( KInit, ( _L( "Workaround for ARM RVCT(ARMv5) compiler error should be included to TestModule." ) ) );
|
|
1758 |
}
|
|
1759 |
#endif // #if defined(__ARMCC__)
|
|
1760 |
|
|
1761 |
// Get pointer to second exported function
|
|
1762 |
// Verify that there is function
|
|
1763 |
//CTestInterfaceFactoryTestModule libEntry;
|
|
1764 |
libEntry = (CTestInterfaceFactoryTestModule) testModule.Lookup( 2 );
|
|
1765 |
if ( libEntry == NULL )
|
|
1766 |
{
|
|
1767 |
// New instance can't be created
|
|
1768 |
__TRACE( KInit, (_L( "Test module is old version and has not SetRequirements() feature." ) ) );
|
|
1769 |
testModule.Close();
|
|
1770 |
return KErrNotSupported;
|
|
1771 |
}
|
|
1772 |
else
|
|
1773 |
{
|
|
1774 |
__TRACE ( KInit, ( _L("Pointer to 2st exported received")));
|
|
1775 |
}
|
|
1776 |
|
|
1777 |
// Calls dynamically loaded module's second method.
|
|
1778 |
__TRACE ( KVerbose, (_L("Calling 2st exported at 0x%x"), (TUint32) libEntry ));
|
|
1779 |
TUint32 check = 0;
|
|
1780 |
TInt ret = (*libEntry)( aTestModuleParam, check );
|
|
1781 |
if( check != KStifTestModuleParameterChanged )
|
|
1782 |
{
|
|
1783 |
// Problems in def-file definitions. Test module is old wersion
|
|
1784 |
// and has not SetRequirements feature.
|
|
1785 |
RDebug::Print( ( _L( "STIF TF: Test module is old version and has not SetRequirements() feature." ) ) );
|
|
1786 |
__TRACE( KInit, (_L( "Test module is old version and has not SetRequirements() feature." ) ) );
|
|
1787 |
testModule.Close();
|
|
1788 |
return KErrNotSupported;
|
|
1789 |
}
|
|
1790 |
if( ret != KErrNone )
|
|
1791 |
{
|
|
1792 |
__TRACE (KInit, (_L("ReadParametersFromTestModule; SetRequirements fails with error: %d"), ret ) );
|
|
1793 |
testModule.Close();
|
|
1794 |
return ret;
|
|
1795 |
}
|
|
1796 |
|
|
1797 |
libEntry = NULL;
|
|
1798 |
testModule.Close(); // After close test module's pointer is not
|
|
1799 |
// valid anymore.
|
|
1800 |
|
|
1801 |
return KErrNone;
|
|
1802 |
|
|
1803 |
}
|
|
1804 |
|
|
1805 |
/*
|
|
1806 |
-------------------------------------------------------------------------------
|
|
1807 |
|
|
1808 |
Class: CTestModuleContainer
|
|
1809 |
|
|
1810 |
Method: GetTestModuleParams
|
|
1811 |
|
|
1812 |
Description: Load test module dynamically. If loading is done succesfully
|
|
1813 |
then set test module's parameters according to version.
|
|
1814 |
Verify received parameters.
|
|
1815 |
|
|
1816 |
Parameters: const TDesC& aModuleName: in: Test module name.
|
|
1817 |
const TDesC& aConfig: in: Test case (config) file name.
|
|
1818 |
TInt& aStackSize: inout: Stack size.
|
|
1819 |
TInt& aHeapMinSize: inout: Heap's minimum size.
|
|
1820 |
TInt& aHeapMaxSize: inout: Heap's maximum size.
|
|
1821 |
|
|
1822 |
Return Values: TInt: Symbian error code.
|
|
1823 |
|
|
1824 |
Errors/Exceptions: None
|
|
1825 |
|
|
1826 |
Status: Proposal
|
|
1827 |
|
|
1828 |
-------------------------------------------------------------------------------
|
|
1829 |
*/
|
|
1830 |
TInt CTestModuleContainer::GetTestModuleParams( const TDesC& aModuleName,
|
|
1831 |
const TDesC& aConfig,
|
|
1832 |
TInt& aStackSize,
|
|
1833 |
TInt& aHeapMinSize,
|
|
1834 |
TInt& aHeapMaxSize )
|
|
1835 |
{
|
|
1836 |
TInt r( KErrNone );
|
|
1837 |
|
|
1838 |
// There is lower case despite what is initialization file given.
|
|
1839 |
// Module name is without dll extension.
|
|
1840 |
// Check is TestScripter or TestCombiner and test case (config) file
|
|
1841 |
// name is given.
|
|
1842 |
if( ( aModuleName.Find( KTestScripterName ) != KErrNotFound ||
|
|
1843 |
aModuleName == _L( "testcombiner" ) ) && aConfig != KNullDesC )
|
|
1844 |
{
|
|
1845 |
TRAPD( ret, r = ReadParametersFromScriptFileL( aConfig, aStackSize,
|
|
1846 |
aHeapMinSize, aHeapMaxSize ) );
|
|
1847 |
if( r != KErrNone )
|
|
1848 |
{
|
|
1849 |
__TRACE( KInit, ( CStifLogger::ERed, _L( "Cannot set Test Class's stack or heap sizes, fail with error: %d" ), r ) );
|
|
1850 |
__TRACE( KInit, ( _L( "Default sizes will be use(See KTestThreadMinHeap, KTestThreadMinHeap and KStackSize)" ) ) );
|
|
1851 |
return r;
|
|
1852 |
}
|
|
1853 |
if( ret != KErrNone )
|
|
1854 |
{
|
|
1855 |
__TRACE( KInit, ( CStifLogger::ERed, _L( "Cannot set Test Class's stack or heap sizes, leaves with error: %d" ), r ) );
|
|
1856 |
__TRACE( KInit, ( _L( "Default sizes will be use(See KTestThreadMinHeap, KTestThreadMinHeap and KStackSize)" ) ) );
|
|
1857 |
return ret;
|
|
1858 |
}
|
|
1859 |
}
|
|
1860 |
else
|
|
1861 |
{
|
|
1862 |
CTestModuleParam* testModuleParam = NULL;
|
|
1863 |
//--PYTHON-- begin
|
|
1864 |
if(aModuleName.Find(KPythonScripter) != KErrNotFound)
|
|
1865 |
{
|
|
1866 |
RDebug::Print(_L("CTestModuleContainer::GetTestModuleParams reading params for PythonScripter, aModuleName=[%S]"), &aModuleName);
|
|
1867 |
TName n;
|
|
1868 |
n.Copy(KPythonScripter);
|
|
1869 |
r = ReadParametersFromTestModule( n, testModuleParam );
|
|
1870 |
}
|
|
1871 |
else
|
|
1872 |
//--PYTHON-- end
|
|
1873 |
r = ReadParametersFromTestModule( aModuleName, testModuleParam );
|
|
1874 |
|
|
1875 |
if( r != KErrNone )
|
|
1876 |
{
|
|
1877 |
__TRACE( KInit, ( _L( "Cannot set Test Module's stack or heap sizes, fails with: %d" ), r ) );
|
|
1878 |
__TRACE( KInit, ( _L( "Default sizes will be use(See KTestThreadMinHeap, KTestThreadMinHeap and KStackSize)" ) ) );
|
|
1879 |
delete testModuleParam;
|
|
1880 |
return r;
|
|
1881 |
}
|
|
1882 |
|
|
1883 |
if ( testModuleParam->Version() == 1 )
|
|
1884 |
{
|
|
1885 |
// Casting
|
|
1886 |
CTestModuleParamVer01* paramVer01 = ( CTestModuleParamVer01* ) testModuleParam;
|
|
1887 |
aStackSize = paramVer01->iTestThreadStackSize;
|
|
1888 |
aHeapMinSize = paramVer01->iTestThreadMinHeap;
|
|
1889 |
aHeapMaxSize = paramVer01->iTestThreadMaxHeap;
|
|
1890 |
}
|
|
1891 |
|
|
1892 |
delete testModuleParam;
|
|
1893 |
}
|
|
1894 |
|
|
1895 |
// Verify that sizes are valid. If problems are notices then use default
|
|
1896 |
// value
|
|
1897 |
|
|
1898 |
// 1) "The panic occurs when the value of the stack size is negative."
|
|
1899 |
if( aStackSize < 0 )
|
|
1900 |
{
|
|
1901 |
RDebug::Print( ( _L("STIF TF: GetTestModuleParams() fails because value of the stack size is negative, default value is taken into use") ) );
|
|
1902 |
__TRACE( KInit, ( CStifLogger::ERed, _L("STIF TF: GetTestModuleParams() fails because value of the stack size is negative, default value is taken into use" ) ) );
|
|
1903 |
// Use default value
|
|
1904 |
aStackSize = KStackSize;
|
|
1905 |
}
|
|
1906 |
|
|
1907 |
// 2) "The panic occurs if the minimum heap size specified is less
|
|
1908 |
// than KMinHeapSize".
|
|
1909 |
// KMinHeapSize: "Functions that require a new heap to be allocated will
|
|
1910 |
// either panic, or will reset the required heap size to this value if a
|
|
1911 |
// smaller heap size is specified".
|
|
1912 |
if( aHeapMinSize < KMinHeapSize )
|
|
1913 |
{
|
|
1914 |
RDebug::Print( _L( "STIF TF: GetTestModuleParams() fails because test module minimum heap size is less than KMinHeapSize:[%d], default value is taken into use" ), KMinHeapSize );
|
|
1915 |
__TRACE( KInit, ( CStifLogger::ERed, _L("STIF TF: GetTestModuleParams() fails because test module minimum heap size is less than KMinHeapSize:[%d], default value is taken into use"), KMinHeapSize ) );
|
|
1916 |
// Use default value(Note: This is used for now on)
|
|
1917 |
aHeapMinSize = KTestThreadMinHeap;
|
|
1918 |
}
|
|
1919 |
|
|
1920 |
// 3) "The panic occurs if the minimum heap size specified is greater than
|
|
1921 |
// the maximum size to which the heap can grow".
|
|
1922 |
// Check this last !
|
|
1923 |
if( aHeapMinSize > aHeapMaxSize )
|
|
1924 |
{
|
|
1925 |
RDebug::Print( ( _L("STIF TF: GetTestModuleParams() fails because the maximum heap size is specified less than minimum heap size, default values is taken into use" ) ) );
|
|
1926 |
__TRACE( KInit, ( CStifLogger::ERed, _L( "STIF TF: GetTestModuleParams() fails because the maximum heap size is specified less than minimum heap size, default values is taken into use" ) ) );
|
|
1927 |
// Use default values
|
|
1928 |
aHeapMinSize = KTestThreadMinHeap;
|
|
1929 |
aHeapMaxSize = KTestThreadMaxHeap;
|
|
1930 |
}
|
|
1931 |
|
|
1932 |
__TRACE( KInit, ( _L( "[%S] uses:" ), &aModuleName ) );
|
|
1933 |
__TRACE( KInit, ( _L( "Stack size: [%d]" ), aStackSize ) );
|
|
1934 |
__TRACE( KInit, ( _L( "Minimum heap size: [%d]" ), aHeapMinSize ) );
|
|
1935 |
__TRACE( KInit, ( _L( "Maximum heap size: [%d]" ), aHeapMaxSize ) );
|
|
1936 |
|
|
1937 |
return KErrNone;
|
|
1938 |
|
|
1939 |
}
|
|
1940 |
|
|
1941 |
/*
|
|
1942 |
-------------------------------------------------------------------------------
|
|
1943 |
|
|
1944 |
Class: CTestModuleContainer
|
|
1945 |
|
|
1946 |
Method: GetTestCaseTitleL
|
|
1947 |
|
|
1948 |
Description: Gets title of currently running test case.
|
|
1949 |
|
|
1950 |
Parameters: TDes& aTestCaseTitle: out: Test case title.
|
|
1951 |
|
|
1952 |
Return Values: None
|
|
1953 |
|
|
1954 |
Errors/Exceptions: None
|
|
1955 |
|
|
1956 |
Status: Proposal
|
|
1957 |
|
|
1958 |
-------------------------------------------------------------------------------
|
|
1959 |
*/
|
|
1960 |
void CTestModuleContainer::GetTestCaseTitleL(TDes& aTestCaseTitle)
|
|
1961 |
{
|
|
1962 |
//currently run test case stored in the iOperationIntBuffer variable
|
|
1963 |
iCTestModule->GetTestCaseTitleL( iOperationIntBuffer,
|
|
1964 |
iCTestExecution->GetConfigFileName(),
|
|
1965 |
aTestCaseTitle);
|
|
1966 |
}
|
|
1967 |
|
|
1968 |
|
|
1969 |
/*
|
|
1970 |
-------------------------------------------------------------------------------
|
|
1971 |
|
|
1972 |
Class: CTestModuleContainer
|
|
1973 |
|
|
1974 |
Method: GetTestModule
|
|
1975 |
|
|
1976 |
Description: Gets pointer to test module
|
|
1977 |
|
|
1978 |
Parameters: none
|
|
1979 |
|
|
1980 |
Return Values: CTestModule* : Pointer to test module
|
|
1981 |
|
|
1982 |
Errors/Exceptions: None
|
|
1983 |
|
|
1984 |
Status: Proposal
|
|
1985 |
|
|
1986 |
-------------------------------------------------------------------------------
|
|
1987 |
*/
|
|
1988 |
CTestModule* CTestModuleContainer::GetTestModule()
|
|
1989 |
{
|
|
1990 |
|
|
1991 |
return iCTestModule;
|
|
1992 |
}
|
|
1993 |
|
|
1994 |
|
|
1995 |
/*
|
|
1996 |
-------------------------------------------------------------------------------
|
|
1997 |
|
|
1998 |
DESCRIPTION
|
|
1999 |
|
|
2000 |
This module contains implementation of CPrintHandler class member functions.
|
|
2001 |
CErrorPrintHandler listens print notifications from test thread.
|
|
2002 |
|
|
2003 |
-------------------------------------------------------------------------------
|
|
2004 |
*/
|
|
2005 |
|
|
2006 |
// ================= MEMBER FUNCTIONS =========================================
|
|
2007 |
|
|
2008 |
|
|
2009 |
/*
|
|
2010 |
-------------------------------------------------------------------------------
|
|
2011 |
|
|
2012 |
Class: CErrorPrintHandler
|
|
2013 |
|
|
2014 |
Method: NewL
|
|
2015 |
|
|
2016 |
Description: Constructs a new CErrorPrintHandler object.
|
|
2017 |
|
|
2018 |
Parameters: CTestExecution& aExecution: in: "Parent"
|
|
2019 |
|
|
2020 |
Return Values: CErrorPrintHandler*: New undertaker
|
|
2021 |
|
|
2022 |
Errors/Exceptions: Leaves if memory allocation or ConstructL leaves.
|
|
2023 |
|
|
2024 |
Status: Proposal
|
|
2025 |
|
|
2026 |
-------------------------------------------------------------------------------
|
|
2027 |
*/
|
|
2028 |
CErrorPrintHandler* CErrorPrintHandler::NewL( CTestModuleContainer& aContainer )
|
|
2029 |
{
|
|
2030 |
|
|
2031 |
CErrorPrintHandler* self = new( ELeave ) CErrorPrintHandler( aContainer );
|
|
2032 |
CleanupStack::PushL( self );
|
|
2033 |
self->ConstructL();
|
|
2034 |
CleanupStack::Pop( self );
|
|
2035 |
return self;
|
|
2036 |
|
|
2037 |
}
|
|
2038 |
|
|
2039 |
/*
|
|
2040 |
-------------------------------------------------------------------------------
|
|
2041 |
|
|
2042 |
Class: CErrorPrintHandler
|
|
2043 |
|
|
2044 |
Method: ConstructL
|
|
2045 |
|
|
2046 |
Description: Second level constructor.
|
|
2047 |
|
|
2048 |
Parameters: None
|
|
2049 |
|
|
2050 |
Return Values: None
|
|
2051 |
|
|
2052 |
Errors/Exceptions: None
|
|
2053 |
|
|
2054 |
Status: Proposal
|
|
2055 |
|
|
2056 |
-------------------------------------------------------------------------------
|
|
2057 |
*/
|
|
2058 |
void CErrorPrintHandler::ConstructL()
|
|
2059 |
{
|
|
2060 |
|
|
2061 |
}
|
|
2062 |
|
|
2063 |
/*
|
|
2064 |
-------------------------------------------------------------------------------
|
|
2065 |
|
|
2066 |
Class: CErrorPrintHandler
|
|
2067 |
|
|
2068 |
Method: CErrorPrintHandler
|
|
2069 |
|
|
2070 |
Description: Constructor
|
|
2071 |
|
|
2072 |
Parameters: CTestModuleContainer& aExecution :in: "Parent"
|
|
2073 |
|
|
2074 |
Return Values: None
|
|
2075 |
|
|
2076 |
Errors/Exceptions: None
|
|
2077 |
|
|
2078 |
Status: Proposal
|
|
2079 |
|
|
2080 |
-------------------------------------------------------------------------------
|
|
2081 |
*/
|
|
2082 |
CErrorPrintHandler::CErrorPrintHandler( CTestModuleContainer& aContainer ) :
|
|
2083 |
CActive( CActive::EPriorityStandard ),
|
|
2084 |
iContainer( aContainer )
|
|
2085 |
{
|
|
2086 |
|
|
2087 |
CActiveScheduler::Add ( this );
|
|
2088 |
|
|
2089 |
}
|
|
2090 |
|
|
2091 |
/*
|
|
2092 |
-------------------------------------------------------------------------------
|
|
2093 |
|
|
2094 |
Class: CErrorPrintHandler
|
|
2095 |
|
|
2096 |
Method: ~CErrorPrintHandler
|
|
2097 |
|
|
2098 |
Description: Destructor.
|
|
2099 |
Cancels active request.
|
|
2100 |
|
|
2101 |
Parameters: None
|
|
2102 |
|
|
2103 |
Return Values: None
|
|
2104 |
|
|
2105 |
Errors/Exceptions: None
|
|
2106 |
|
|
2107 |
Status: Proposal
|
|
2108 |
|
|
2109 |
-------------------------------------------------------------------------------
|
|
2110 |
*/
|
|
2111 |
CErrorPrintHandler::~CErrorPrintHandler()
|
|
2112 |
{
|
|
2113 |
|
|
2114 |
Cancel();
|
|
2115 |
|
|
2116 |
}
|
|
2117 |
|
|
2118 |
/*
|
|
2119 |
-------------------------------------------------------------------------------
|
|
2120 |
|
|
2121 |
Class: CErrorPrintHandler
|
|
2122 |
|
|
2123 |
Method: StartL
|
|
2124 |
|
|
2125 |
Description: Starts to monitor thread.
|
|
2126 |
|
|
2127 |
Parameters: None
|
|
2128 |
|
|
2129 |
Return Values: TInt Always KErrNone
|
|
2130 |
|
|
2131 |
Errors/Exceptions: None
|
|
2132 |
|
|
2133 |
Status: Proposal
|
|
2134 |
|
|
2135 |
-------------------------------------------------------------------------------
|
|
2136 |
*/
|
|
2137 |
void CErrorPrintHandler::StartL()
|
|
2138 |
{
|
|
2139 |
|
|
2140 |
__TRACE( KPrint, ( _L( "CErrorPrintHandler::StartL" ) ) );
|
|
2141 |
|
|
2142 |
iStatus = KRequestPending;
|
|
2143 |
SetActive();
|
|
2144 |
|
|
2145 |
// Signal test thread
|
|
2146 |
iContainer.iErrorPrintSem.Signal();
|
|
2147 |
|
|
2148 |
}
|
|
2149 |
|
|
2150 |
/*
|
|
2151 |
-------------------------------------------------------------------------------
|
|
2152 |
|
|
2153 |
Class: CErrorPrintHandler
|
|
2154 |
|
|
2155 |
Method: RunL
|
|
2156 |
|
|
2157 |
Description: Handles thread death.
|
|
2158 |
Function does:
|
|
2159 |
1 ) Stops monitoring thread
|
|
2160 |
1 ) Marks thread death
|
|
2161 |
2 ) Completes ongoing requests
|
|
2162 |
3 ) Cleans the memory
|
|
2163 |
|
|
2164 |
Parameters: None
|
|
2165 |
|
|
2166 |
Return Values: None
|
|
2167 |
|
|
2168 |
Errors/Exceptions: None
|
|
2169 |
|
|
2170 |
Status: Proposal
|
|
2171 |
|
|
2172 |
-------------------------------------------------------------------------------
|
|
2173 |
*/
|
|
2174 |
void CErrorPrintHandler::RunL()
|
|
2175 |
{
|
|
2176 |
|
|
2177 |
__TRACE( KPrint, ( _L( "CErrorPrintHandler::RunL [%d]" ), iStatus.Int() ) );
|
|
2178 |
|
|
2179 |
iContainer.DoErrorPrint();
|
|
2180 |
|
|
2181 |
// enable error print request
|
|
2182 |
iContainer.iErrorPrintHandler->StartL();
|
|
2183 |
|
|
2184 |
}
|
|
2185 |
|
|
2186 |
/*
|
|
2187 |
-------------------------------------------------------------------------------
|
|
2188 |
|
|
2189 |
Class: CErrorPrintHandler
|
|
2190 |
|
|
2191 |
Method: DoCancel
|
|
2192 |
|
|
2193 |
Description: Stops print notification listening.
|
|
2194 |
|
|
2195 |
Parameters: None
|
|
2196 |
|
|
2197 |
Return Values: None
|
|
2198 |
|
|
2199 |
Errors/Exceptions: None
|
|
2200 |
|
|
2201 |
Status: Proposal
|
|
2202 |
|
|
2203 |
-------------------------------------------------------------------------------
|
|
2204 |
*/
|
|
2205 |
|
|
2206 |
void CErrorPrintHandler::DoCancel()
|
|
2207 |
{
|
|
2208 |
|
|
2209 |
__TRACE( KPrint, ( _L( "CErrorPrintHandler::DoCancel" ) ) );
|
|
2210 |
|
|
2211 |
// Signal test thread
|
|
2212 |
iContainer.iErrorPrintSem.Wait();
|
|
2213 |
|
|
2214 |
TRequestStatus* status = &iStatus;
|
|
2215 |
User::RequestComplete( status, KErrCancel );
|
|
2216 |
|
|
2217 |
}
|
|
2218 |
|
|
2219 |
/*
|
|
2220 |
-------------------------------------------------------------------------------
|
|
2221 |
|
|
2222 |
Class: CErrorPrintHandler
|
|
2223 |
|
|
2224 |
Method: RunError
|
|
2225 |
|
|
2226 |
Description: Handle errors. RunL function does not leave, so one should
|
|
2227 |
never come here.
|
|
2228 |
|
|
2229 |
Print trace and let framework handle error( i.e to do Panic )
|
|
2230 |
|
|
2231 |
Parameters: TInt aError: :in: Error code
|
|
2232 |
|
|
2233 |
Return Values: TInt Error code
|
|
2234 |
|
|
2235 |
Errors/Exceptions: None
|
|
2236 |
|
|
2237 |
Status: Proposal
|
|
2238 |
|
|
2239 |
-------------------------------------------------------------------------------
|
|
2240 |
*/
|
|
2241 |
TInt CErrorPrintHandler::RunError( TInt aError )
|
|
2242 |
{
|
|
2243 |
|
|
2244 |
__TRACE( KError,( _L( "CErrorPrintHandler::RunError" ) ) );
|
|
2245 |
|
|
2246 |
return aError;
|
|
2247 |
|
|
2248 |
}
|
|
2249 |
|
|
2250 |
/*
|
|
2251 |
-------------------------------------------------------------------------------
|
|
2252 |
|
|
2253 |
Class: -
|
|
2254 |
|
|
2255 |
Method: CheckModuleName
|
|
2256 |
|
|
2257 |
Description: Check is module TestScripter. Does parsing and returns new
|
|
2258 |
module name and error codes(Needed operations when creating
|
|
2259 |
server sessions to TestScripter).
|
|
2260 |
|
|
2261 |
Parameters: TFileName aModuleName: in: Module name for checking.
|
|
2262 |
TFileName& aNewModuleName: inout: Parsed module name.
|
|
2263 |
|
|
2264 |
Return Values: KErrNone if TestScripter releated module.
|
|
2265 |
KErrNotFound if not TestScripter releated module.
|
|
2266 |
|
|
2267 |
Errors/Exceptions: None
|
|
2268 |
|
|
2269 |
Status: Proposal
|
|
2270 |
|
|
2271 |
-------------------------------------------------------------------------------
|
|
2272 |
*/
|
|
2273 |
TInt CheckModuleName( TFileName aModuleName, TFileName& aNewModuleName )
|
|
2274 |
{
|
|
2275 |
//--PYTHON-- old code has been replaced with the new one
|
|
2276 |
/*
|
|
2277 |
// Check that length is greated than KTestScripterNameLength
|
|
2278 |
if( aModuleName.Length() < KTestScripterNameLength )
|
|
2279 |
{
|
|
2280 |
return KErrNotFound;
|
|
2281 |
}
|
|
2282 |
// Check is TestScripter
|
|
2283 |
TPtrC check( aModuleName.Mid( 0, KTestScripterNameLength ) );
|
|
2284 |
TInt ret = check.Compare( KTestScripterName );
|
|
2285 |
if( ret == KErrNone )
|
|
2286 |
{
|
|
2287 |
aNewModuleName.Copy( aModuleName.Mid( 0, KTestScripterNameLength ) );
|
|
2288 |
}
|
|
2289 |
else
|
|
2290 |
{
|
|
2291 |
return KErrNotFound;
|
|
2292 |
}
|
|
2293 |
|
|
2294 |
return KErrNone;
|
|
2295 |
*/
|
|
2296 |
|
|
2297 |
// Check that length is greated than KTestScripterNameLength
|
|
2298 |
if( aModuleName.Length() >= KTestScripterNameLength )
|
|
2299 |
{
|
|
2300 |
TPtrC check( aModuleName.Mid( 0, KTestScripterNameLength ) );
|
|
2301 |
TInt ret = check.Compare( KTestScripterName );
|
|
2302 |
if( ret == KErrNone )
|
|
2303 |
{
|
|
2304 |
aNewModuleName.Copy( aModuleName.Mid( 0, KTestScripterNameLength ) );
|
|
2305 |
return KErrNone;
|
|
2306 |
}
|
|
2307 |
}
|
|
2308 |
|
|
2309 |
// Check that length is greated than KTestScripterNameLength
|
|
2310 |
if( aModuleName.Length() >= KPythonScripterLength )
|
|
2311 |
{
|
|
2312 |
TPtrC check( aModuleName.Mid( 0, KPythonScripterLength ) );
|
|
2313 |
TInt ret = check.Compare( KPythonScripter );
|
|
2314 |
if( ret == KErrNone )
|
|
2315 |
{
|
|
2316 |
aNewModuleName.Copy( aModuleName.Mid( 0, KPythonScripterLength ) );
|
|
2317 |
return KErrNone;
|
|
2318 |
}
|
|
2319 |
}
|
|
2320 |
|
|
2321 |
return KErrNotFound;
|
|
2322 |
}
|
|
2323 |
|
|
2324 |
/*
|
|
2325 |
-------------------------------------------------------------------------------
|
|
2326 |
|
|
2327 |
Class: -
|
|
2328 |
|
|
2329 |
Method: RemoveOptionalIndex
|
|
2330 |
|
|
2331 |
Description: Remove optional index appended to module name.
|
|
2332 |
If it is found (@ char) then set new module name without it.
|
|
2333 |
This feature is used when iSeparateProcesses is set in
|
|
2334 |
TestEngine.
|
|
2335 |
|
|
2336 |
Parameters: TFileName aModuleName: in: Module name for checking.
|
|
2337 |
TFileName& aNewModuleName: inout: Parsed module name.
|
|
2338 |
|
|
2339 |
Return Values: None
|
|
2340 |
|
|
2341 |
Errors/Exceptions: None
|
|
2342 |
|
|
2343 |
Status: Proposal
|
|
2344 |
|
|
2345 |
-------------------------------------------------------------------------------
|
|
2346 |
*/
|
|
2347 |
void RemoveOptionalIndex(const TDesC& aModuleName, TDes& aNewModuleName)
|
|
2348 |
{
|
|
2349 |
//Copy module name to destination buffer
|
|
2350 |
aNewModuleName.Copy(aModuleName);
|
|
2351 |
|
|
2352 |
//Search for @ char (it means that some index has been appended)
|
|
2353 |
TInt index = aNewModuleName.Find(_L("@"));
|
|
2354 |
|
|
2355 |
//Remove index form name (if found)
|
|
2356 |
if(index != KErrNotFound)
|
|
2357 |
{
|
|
2358 |
aNewModuleName.Delete(index, aNewModuleName.Length() - index);
|
|
2359 |
}
|
|
2360 |
}
|
|
2361 |
|
|
2362 |
// End of File
|