|
1 // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). |
|
2 // All rights reserved. |
|
3 // This component and the accompanying materials are made available |
|
4 // under the terms of "Eclipse Public License v1.0" |
|
5 // which accompanies this distribution, and is available |
|
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
7 // |
|
8 // Initial Contributors: |
|
9 // Nokia Corporation - initial contribution. |
|
10 // |
|
11 // Contributors: |
|
12 // |
|
13 // Description: |
|
14 // This contains CTestCase which is the base class for all the TestCase DLLs |
|
15 // |
|
16 // |
|
17 |
|
18 /** |
|
19 @file TestStep.cpp |
|
20 */ |
|
21 |
|
22 // EPOC includes |
|
23 #include <e32base.h> |
|
24 |
|
25 // Test system includes |
|
26 #include "../inc/Log.h" |
|
27 #include "../inc/TestStep.h" |
|
28 #include "../inc/TestSuite.h" |
|
29 |
|
30 EXPORT_C CTestStep::CTestStep(const TDesC &aName):iTestStepName(aName),iTestStepResult(EPass) |
|
31 /** |
|
32 constructor |
|
33 */ |
|
34 {} |
|
35 |
|
36 EXPORT_C CTestStep::CTestStep():iTestStepResult(EPass) |
|
37 /** |
|
38 constructor |
|
39 */ |
|
40 {} |
|
41 |
|
42 EXPORT_C CTestStep::~CTestStep() |
|
43 /** |
|
44 destructor |
|
45 */ |
|
46 { |
|
47 } |
|
48 |
|
49 EXPORT_C void CTestStep::Log( TRefByValue<const TDesC16> format, ... ) |
|
50 /** |
|
51 general purpose log interface for TestSteps |
|
52 |
|
53 @param format "printf" format string |
|
54 */ |
|
55 { |
|
56 |
|
57 VA_LIST aList; |
|
58 VA_START( aList, format ); |
|
59 |
|
60 TIntegrationTestLog16Overflow iOverflow16; |
|
61 |
|
62 // decode formated data for display on console |
|
63 TBuf <MAX_LOG_LINE_LENGTH> LineBuf; |
|
64 LineBuf.AppendFormatList( format, aList, &iOverflow16 ); |
|
65 |
|
66 // send the data to the log system via the suite |
|
67 iSuite->Log( _L("%S"),&LineBuf ); |
|
68 |
|
69 VA_END( aList ); |
|
70 |
|
71 } |
|
72 |
|
73 EXPORT_C void CTestStep::Log( TInt aSeverity, TRefByValue<const TDesC16> format, ... ) |
|
74 /** |
|
75 Display the log data on the console. |
|
76 If there is a log file open write to it. |
|
77 |
|
78 @param aSeverity severity level |
|
79 @param format "printf" format string |
|
80 */ |
|
81 { |
|
82 VA_LIST aList; |
|
83 VA_START( aList, format ); |
|
84 |
|
85 TIntegrationTestLog16Overflow iOverflow16; |
|
86 |
|
87 // decode formated data for display on console |
|
88 TBuf <MAX_LOG_LINE_LENGTH> LineBuf; |
|
89 LineBuf.AppendFormatList( format, aList, &iOverflow16 ); |
|
90 |
|
91 // send the data to the log system via the suite |
|
92 if( aSeverity & iSuite->Severity()) iSuite->Log( aSeverity, _L("%S"),&LineBuf ); |
|
93 |
|
94 VA_END( aList ); |
|
95 } |
|
96 |
|
97 EXPORT_C void CTestStep::LogExtra(const TText8* aFile, TInt aLine, TInt aSeverity, |
|
98 TRefByValue<const TDesC> aFmt,...) |
|
99 /** |
|
100 Display the log data on the console |
|
101 if there is a log file open write to it. |
|
102 |
|
103 @param aFile source file name |
|
104 @param aLine line number |
|
105 @param aSeverity severity level |
|
106 @param aFmt "printf" format string |
|
107 */ |
|
108 { |
|
109 VA_LIST aList; |
|
110 VA_START( aList, aFmt ); |
|
111 |
|
112 TIntegrationTestLog16Overflow iOverflow16; |
|
113 |
|
114 // decode formated data for display on console |
|
115 TBuf <MAX_LOG_LINE_LENGTH> LineBuf; |
|
116 LineBuf.AppendFormatList( aFmt, aList, &iOverflow16 ); |
|
117 |
|
118 // send the data to the log system via the suite |
|
119 if( aSeverity & iSuite->Severity()) |
|
120 { |
|
121 iSuite->LogExtra(aFile, aLine, aSeverity, LineBuf ); |
|
122 } |
|
123 |
|
124 VA_END( aList ); |
|
125 } |
|
126 |
|
127 EXPORT_C void CTestStep::LoadConfig( TDesC &config ) |
|
128 /** |
|
129 If a config file is supplied, then create and load CIniData object |
|
130 |
|
131 @param config config file parameter |
|
132 */ |
|
133 { |
|
134 |
|
135 // if a config file supplied then use |
|
136 if ( config.Length() != 0) |
|
137 { |
|
138 |
|
139 // get the full pathname default drive name and extension |
|
140 _LIT(KRelated,"C:\\config.ini"); |
|
141 TParse ConfigFileName; |
|
142 TInt returnCode = ConfigFileName.Set( config, &KRelated, NULL ); |
|
143 |
|
144 if (returnCode != KErrNone ) |
|
145 { |
|
146 // error opening FileManager |
|
147 ERR_PRINTF2( _L("Error opening config file %S"), &ConfigFileName.FullName()); |
|
148 } |
|
149 |
|
150 // create and load the CIniData object |
|
151 TRAPD(r,iConfigData=CIniData::NewL(ConfigFileName.FullName() )); |
|
152 |
|
153 // check if loaded ok |
|
154 if ( r==KErrNone ) |
|
155 { |
|
156 // loaded ok |
|
157 iConfigDataAvailable = ETrue; |
|
158 } |
|
159 else |
|
160 { |
|
161 // failed to load |
|
162 iConfigDataAvailable = EFalse; |
|
163 iConfigData = NULL; |
|
164 |
|
165 // report error |
|
166 TPtrC Errortxt = CLog::EpocErrorToText(r); |
|
167 ERR_PRINTF2(_L("Failed to load config data file error= %S"), &Errortxt ); |
|
168 } |
|
169 } |
|
170 } |
|
171 |
|
172 EXPORT_C void CTestStep::UnLoadConfig( void ) |
|
173 /** |
|
174 If a config file is supplied, then clean up Config data object |
|
175 */ |
|
176 { |
|
177 iConfigDataAvailable = EFalse; |
|
178 |
|
179 // clean up Config data object |
|
180 if (iConfigData) delete iConfigData; |
|
181 } |
|
182 |
|
183 EXPORT_C TBool CTestStep::GetBoolFromConfig(const TDesC &aSectName,const TDesC &aKeyName,TBool &aResult) |
|
184 /** |
|
185 Read a boolean value from the configuration file. |
|
186 |
|
187 @param aSectName SectionName in the config file |
|
188 @param aKeyName textname for bool value in the config file |
|
189 @param aResult textname for bool value in the config file |
|
190 @return ETrue or EFalse |
|
191 */ |
|
192 { |
|
193 // check file available |
|
194 if ( !iConfigDataAvailable ) |
|
195 { |
|
196 ERR_PRINTF1(_L("No config file available")); |
|
197 return EFalse; |
|
198 } |
|
199 |
|
200 TBool ret=EFalse; |
|
201 TPtrC result; |
|
202 |
|
203 // get the value |
|
204 ret=iConfigData->FindVar( aSectName,aKeyName, result); |
|
205 |
|
206 // if failed to decode display error |
|
207 if (!ret) |
|
208 { |
|
209 // display error message |
|
210 ERR_PRINTF3(_L("Failed to read section:%S key:%S "), |
|
211 &aSectName, &aKeyName ); |
|
212 |
|
213 // return fail |
|
214 return EFalse; |
|
215 } |
|
216 |
|
217 // return result as a TBool |
|
218 ( aResult =(result.FindF( _L("true")) == KErrNotFound )? EFalse : ETrue ); |
|
219 return ETrue; |
|
220 } |
|
221 |
|
222 EXPORT_C TBool CTestStep::GetIntFromConfig(const TDesC &aSectName,const TDesC &aKeyName,TInt &aResult) |
|
223 /** |
|
224 Read a integer value from the configuration file. |
|
225 |
|
226 @param aSectName SectionName in the config file |
|
227 @param aKeyName textname for integer value in the config file |
|
228 @param aResult textname for integer value in the config file |
|
229 @return ETrue or EFalse |
|
230 */ |
|
231 { |
|
232 // check file available |
|
233 if ( !iConfigDataAvailable ) |
|
234 { |
|
235 ERR_PRINTF1(_L("No config file available")); |
|
236 return EFalse; |
|
237 } |
|
238 TBool ret=EFalse; |
|
239 TPtrC result; |
|
240 |
|
241 // get the value |
|
242 ret=iConfigData->FindVar( aSectName,aKeyName, result); |
|
243 |
|
244 // if failed to decode display error |
|
245 if (!ret) |
|
246 { |
|
247 // display error message |
|
248 ERR_PRINTF3(_L("Failed to read section:%S key:%S "), |
|
249 &aSectName, &aKeyName ); |
|
250 |
|
251 // return fail |
|
252 return EFalse; |
|
253 } |
|
254 |
|
255 // use Tlex to convert to a TInt |
|
256 TLex lex(result); |
|
257 if (lex.Val(aResult) == KErrNone ) |
|
258 return ETrue; |
|
259 else |
|
260 return EFalse; |
|
261 } |
|
262 |
|
263 EXPORT_C TBool CTestStep::GetStringFromConfig(const TDesC &aSectName,const TDesC &aKeyName,TPtrC &aResult) |
|
264 /** |
|
265 Read a string from the configuration file. |
|
266 |
|
267 @param aSectName SectionName in the config file |
|
268 @param aKeyName textname for string value in the config file |
|
269 @param aResult textname for string value in the config file |
|
270 @return ETrue or EFalse |
|
271 */ |
|
272 { |
|
273 // check file available |
|
274 if ( !iConfigDataAvailable ) |
|
275 { |
|
276 ERR_PRINTF1(_L("No config file available")); |
|
277 return EFalse; |
|
278 } |
|
279 |
|
280 TBool ret=EFalse; |
|
281 |
|
282 // get the value |
|
283 //TPtrC result; |
|
284 ret=iConfigData->FindVar( aSectName,aKeyName, aResult); |
|
285 |
|
286 // if failed to decode display error |
|
287 if (!ret) |
|
288 { |
|
289 // display error message |
|
290 ERR_PRINTF3(_L("Failed to read section:%S key:%S "), |
|
291 &aSectName, &aKeyName ); |
|
292 |
|
293 // return fail |
|
294 return EFalse; |
|
295 } |
|
296 |
|
297 return ETrue; |
|
298 } |
|
299 |
|
300 EXPORT_C enum TVerdict CTestStep::doTestStepPreambleL( void ) |
|
301 /** |
|
302 Default empty implementation of doTestStepPreambleL(). |
|
303 Test steps can overide this to implement required code. |
|
304 This can be used to provide common initialisation for the test steps |
|
305 Preamble should only return EPass or EInconculsive. |
|
306 |
|
307 @return EPass if the step completed successfully |
|
308 or EInconculsive, if the step did not attempt the run. |
|
309 */ |
|
310 { |
|
311 return EPass; |
|
312 } |
|
313 |
|
314 EXPORT_C enum TVerdict CTestStep::doTestStepPostambleL( void ) |
|
315 /** |
|
316 Default empty implementation of doTestStepPostambleL(). |
|
317 Test steps can overide this to implement required code. |
|
318 This can be used to provide common initialisation for the test steps |
|
319 Postamble should only return EPass or EInconculsive. |
|
320 |
|
321 @return EPass if the step completed successfully |
|
322 or EInconculsive, if the step did not attempt the run. |
|
323 */ |
|
324 { |
|
325 return EPass; |
|
326 } |
|
327 |
|
328 EXPORT_C void CTestStep::testBooleanTrue( TBool aCondition, char* aFile, TInt aLine ) |
|
329 /** |
|
330 Check the boolean expression is true. |
|
331 If not record error. |
|
332 |
|
333 @param aCondition Expression to check. |
|
334 @param aFile Current script file name. |
|
335 @param aLine Current line number. |
|
336 */ |
|
337 { |
|
338 |
|
339 // check condition |
|
340 if (aCondition) |
|
341 return; |
|
342 |
|
343 // this is only relevant if the current result is pass |
|
344 if ( iTestStepResult == EPass ) |
|
345 iTestStepResult = EFail; |
|
346 |
|
347 // convert filename for log |
|
348 TBuf<MAX_LOG_FILENAME_LENGTH> fileName; |
|
349 fileName.Copy(TPtrC8((TText8*)aFile)); |
|
350 |
|
351 // display a log message |
|
352 ERR_PRINTF3(_L("Test Failed in file:%S line:%d"), &fileName, aLine); |
|
353 |
|
354 } |
|
355 |
|
356 EXPORT_C void CTestStep::testBooleanTrueL( TBool aCondition, char* aFile, TInt aLine ) |
|
357 /** |
|
358 Check the boolean expression is true. |
|
359 If not record error and then leave. |
|
360 |
|
361 @param aCondition Expression to check. |
|
362 @param aFile Current script file name. |
|
363 @param aLine Current line number. |
|
364 */ |
|
365 { |
|
366 |
|
367 // check condition |
|
368 if (aCondition) |
|
369 return; |
|
370 |
|
371 // this is only relevant if the current result is pass |
|
372 if ( iTestStepResult == EPass ) |
|
373 iTestStepResult = EFail; |
|
374 |
|
375 // convert filename for log |
|
376 TBuf<MAX_LOG_FILENAME_LENGTH> fileName; |
|
377 fileName.Copy(TPtrC8((TText8*)aFile)); |
|
378 |
|
379 // display a log message |
|
380 ERR_PRINTF3(_L("Test Failed in file:%S line:%d"), &fileName, aLine); |
|
381 |
|
382 // leave with error code |
|
383 User::Leave(TEST_ERROR_CODE); |
|
384 |
|
385 } |
|
386 |
|
387 EXPORT_C void CTestStep::testBooleanTrueWithErrorCodeL( TBool aCondition, TInt errorCode , char* aFile, TInt aLine ) |
|
388 /** |
|
389 Check the boolean expression is true. |
|
390 If not record error, error code and then leave. |
|
391 |
|
392 @param aCondition Expression to check. |
|
393 @param errorCode Error code. |
|
394 @param aFile Current script file name. |
|
395 @param aLine Current line number. |
|
396 */ |
|
397 { |
|
398 // check condition |
|
399 if (aCondition) |
|
400 return; |
|
401 |
|
402 // this is only relevant if the current result is pass |
|
403 if ( iTestStepResult == EPass ) |
|
404 iTestStepResult = EFail; |
|
405 |
|
406 // convert filename for log |
|
407 TBuf<MAX_LOG_FILENAME_LENGTH> fileName; |
|
408 fileName.Copy(TPtrC8((TText8*)aFile)); |
|
409 |
|
410 // get the error text |
|
411 TPtrC Error = EpocErrorToText(errorCode); |
|
412 |
|
413 // display a log message |
|
414 ERR_PRINTF4(_L("Test Failed with error:%S in file:%S line:%d"), |
|
415 &Error, &fileName, aLine); |
|
416 |
|
417 // leave with error code |
|
418 User::Leave( errorCode ); |
|
419 |
|
420 } |
|
421 |
|
422 EXPORT_C void CTestStep::testBooleanTrueWithErrorCode( TBool aCondition, TInt errorCode , char* aFile, TInt aLine ) |
|
423 /** |
|
424 Check the boolean expression is true. |
|
425 If not record error and error code. |
|
426 |
|
427 @param aCondition Expression to check. |
|
428 @param errorCode Error code. |
|
429 @param aFile Current script file name. |
|
430 @param aLine Current line number. |
|
431 */ |
|
432 { |
|
433 // check condition |
|
434 if (aCondition) |
|
435 return; |
|
436 |
|
437 // this is only relevant if the current result is pass |
|
438 if ( iTestStepResult == EPass ) |
|
439 iTestStepResult = EFail; |
|
440 |
|
441 // convert filename for log |
|
442 TBuf<MAX_LOG_FILENAME_LENGTH> fileName; |
|
443 fileName.Copy(TPtrC8((TText8*)aFile)); |
|
444 |
|
445 // get the error text |
|
446 TPtrC Error = EpocErrorToText(errorCode); |
|
447 |
|
448 // display a log message |
|
449 ERR_PRINTF4(_L("Test Failed with error:%S in file:%S line:%d"), |
|
450 &Error, &fileName, aLine); |
|
451 } |
|
452 |
|
453 EXPORT_C void CTestStep::TestCheckPointCompareL(TInt aVal,TInt aExpectedVal, |
|
454 const TDesC& aText, char* aFile,TInt aLine) |
|
455 /** |
|
456 Check the value against an expected value. |
|
457 If not record error and error code. |
|
458 |
|
459 @param aVal Value to check. |
|
460 @param aExpectedVal Expected value. |
|
461 @param aText Text for log file. |
|
462 @param aFile Current script file name. |
|
463 @param aLine Current line number. |
|
464 */ |
|
465 { |
|
466 if(aVal != aExpectedVal) |
|
467 { |
|
468 |
|
469 // decode formated data for display on console |
|
470 TBuf <MAX_LOG_LINE_LENGTH> LineBuf; |
|
471 LineBuf.AppendFormat( _L("FAILED test: Val = %d Exp Val = %d %S"), |
|
472 aVal, aExpectedVal, &aText); |
|
473 |
|
474 // send the data to the log system via the suite |
|
475 iSuite->LogExtra((TText8*)aFile, aLine, ESevrErr, LineBuf ); |
|
476 User::Leave(aVal); |
|
477 } |
|
478 } |
|
479 |
|
480 EXPORT_C TPtrC CTestStep::EpocErrorToText(TInt aError) |
|
481 /** |
|
482 Convert a Error code to text. |
|
483 |
|
484 @param aError error code to display as text. |
|
485 @return Text describing the error. |
|
486 */ |
|
487 { |
|
488 switch (aError) |
|
489 { |
|
490 case KErrNone: |
|
491 return _L("KErrNone"); |
|
492 case KErrNotFound: |
|
493 return _L("KErrNotFound"); |
|
494 case KErrGeneral: |
|
495 return _L("KErrGeneral"); |
|
496 case KErrCancel: |
|
497 return _L("KErrCancel"); |
|
498 case KErrNoMemory: |
|
499 return _L("KErrNoMemory"); |
|
500 case KErrNotSupported: |
|
501 return _L("KErrNotSupported"); |
|
502 case KErrArgument: |
|
503 return _L("KErrArgument"); |
|
504 case KErrTotalLossOfPrecision: |
|
505 return _L("KErrTotalLossOfPrecision"); |
|
506 case KErrBadHandle: |
|
507 return _L("KErrBadHandle"); |
|
508 case KErrOverflow: |
|
509 return _L("KErrOverflow"); |
|
510 case KErrUnderflow: |
|
511 return _L("KErrUnderflow"); |
|
512 case KErrAlreadyExists: |
|
513 return _L("KErrAlreadyExists"); |
|
514 case KErrPathNotFound: |
|
515 return _L("KErrPathNotFound"); |
|
516 case KErrDied: |
|
517 return _L("KErrDied"); |
|
518 case KErrInUse: |
|
519 return _L("KErrInUse"); |
|
520 case KErrServerTerminated: |
|
521 return _L("KErrServerTerminated"); |
|
522 case KErrServerBusy: |
|
523 return _L("KErrServerBusy"); |
|
524 case KErrCompletion: |
|
525 return _L("KErrCompletion"); |
|
526 case KErrNotReady: |
|
527 return _L("KErrNotReady"); |
|
528 case KErrUnknown: |
|
529 return _L("KErrUnknown"); |
|
530 case KErrCorrupt: |
|
531 return _L("KErrCorrupt"); |
|
532 case KErrAccessDenied: |
|
533 return _L("KErrAccessDenied"); |
|
534 case KErrLocked: |
|
535 return _L("KErrLocked"); |
|
536 case KErrWrite: |
|
537 return _L("KErrWrite"); |
|
538 case KErrDisMounted: |
|
539 return _L("KErrDisMounted"); |
|
540 case KErrEof: |
|
541 return _L("KErrEof"); |
|
542 case KErrDiskFull: |
|
543 return _L("KErrDiskFull"); |
|
544 case KErrBadDriver: |
|
545 return _L("KErrBadDriver"); |
|
546 case KErrBadName: |
|
547 return _L("KErrBadName"); |
|
548 case KErrCommsLineFail: |
|
549 return _L("KErrCommsLineFail"); |
|
550 case KErrCommsFrame: |
|
551 return _L("KErrCommsFrame"); |
|
552 case KErrCommsOverrun: |
|
553 return _L("KErrCommsOverrun"); |
|
554 case KErrCommsParity: |
|
555 return _L("KErrCommsParity"); |
|
556 case KErrTimedOut: |
|
557 return _L("KErrTimedOut"); |
|
558 case KErrCouldNotConnect: |
|
559 return _L("KErrCouldNotConnect"); |
|
560 case KErrCouldNotDisconnect: |
|
561 return _L("KErrCouldNotDisconnect"); |
|
562 case KErrDisconnected: |
|
563 return _L("KErrDisconnected"); |
|
564 case KErrBadLibraryEntryPoint: |
|
565 return _L("KErrBadLibraryEntryPoint"); |
|
566 case KErrBadDescriptor: |
|
567 return _L("KErrBadDescriptor"); |
|
568 case KErrAbort: |
|
569 return _L("KErrAbort"); |
|
570 case KErrTooBig: |
|
571 return _L("KErrTooBig"); |
|
572 default: |
|
573 iPrnBuf.Format(_L(" %d"),aError); |
|
574 return iPrnBuf; |
|
575 } |
|
576 } |
|
577 |
|
578 |
|
579 /** |
|
580 Active controller |
|
581 */ |
|
582 CActiveControl* CActiveControl::NewL(MControlNotify* aControl) |
|
583 { |
|
584 CActiveControl* self = new(ELeave) CActiveControl(aControl); |
|
585 CleanupStack::PushL(self); |
|
586 self->ConstructL(); |
|
587 CleanupStack::Pop(); |
|
588 return self; |
|
589 } |
|
590 |
|
591 void CActiveControl::ConstructL() |
|
592 { |
|
593 } |
|
594 |
|
595 CActiveControl::CActiveControl(MControlNotify* aControl) |
|
596 : CActive(EPriorityStandard) |
|
597 /** |
|
598 constructor |
|
599 */ |
|
600 { |
|
601 iControl = aControl; |
|
602 } |
|
603 |
|
604 CActiveControl::~CActiveControl() |
|
605 { |
|
606 } |
|
607 |
|
608 EXPORT_C void CActiveControl::ReStart() |
|
609 { |
|
610 TRequestStatus* status = &iStatus; |
|
611 SetActive(); |
|
612 User::RequestComplete(status, KErrNone); |
|
613 } |
|
614 |
|
615 void CActiveControl::RunL() |
|
616 { |
|
617 if(iControl->CallStateMachine()) |
|
618 { |
|
619 SetActive(); |
|
620 } |
|
621 } |
|
622 |
|
623 void CActiveControl::DoCancel() |
|
624 { |
|
625 } |
|
626 |
|
627 EXPORT_C CTestActiveStep::CTestActiveStep(const TDesC &aName):CTestStep(aName) |
|
628 /** |
|
629 constructor |
|
630 */ |
|
631 { |
|
632 |
|
633 } |
|
634 EXPORT_C CTestActiveStep::CTestActiveStep() |
|
635 /** |
|
636 constructor |
|
637 */ |
|
638 { |
|
639 } |
|
640 EXPORT_C CTestActiveStep::~CTestActiveStep() |
|
641 /** |
|
642 destructor |
|
643 */ |
|
644 { |
|
645 } |
|
646 EXPORT_C enum TVerdict CTestActiveStep::doTestStepPreambleL( void ) |
|
647 { |
|
648 TVerdict retVal(EPass); |
|
649 if ((retVal=CTestStep::doTestStepPreambleL())!=EPass) |
|
650 { |
|
651 return retVal; |
|
652 } |
|
653 iScheduler = new(ELeave) CActiveScheduler; |
|
654 CActiveScheduler::Install(iScheduler); |
|
655 iControl = CActiveControl::NewL(this); |
|
656 iScheduler->Add(iControl); |
|
657 iStatus = iControl->Status(); |
|
658 return retVal; |
|
659 } |
|
660 EXPORT_C enum TVerdict CTestActiveStep::doTestStepPostambleL( void ) |
|
661 { |
|
662 TVerdict retVal(EPass); |
|
663 if ((retVal=CTestStep::doTestStepPostambleL())!=EPass) |
|
664 { |
|
665 return retVal; |
|
666 } |
|
667 iStatus=NULL; |
|
668 if (iControl) |
|
669 { |
|
670 delete iControl; |
|
671 iControl = NULL; |
|
672 } |
|
673 if (iScheduler) |
|
674 { |
|
675 delete iScheduler; |
|
676 iScheduler=NULL; |
|
677 } |
|
678 return retVal; |
|
679 } |