|
1 // Copyright (c) 2005-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 // Example CTestStep derived implementation |
|
15 // |
|
16 |
|
17 |
|
18 |
|
19 /** |
|
20 @file CUTrace_Performance_Step.cpp |
|
21 @internalTechnology |
|
22 */ |
|
23 |
|
24 #include <hal.h> |
|
25 #include "te_tracerecord.h" |
|
26 #include "te_suite_defs.h" |
|
27 #include "te_check_record_content_step.h" |
|
28 |
|
29 |
|
30 |
|
31 _LIT(KLogFilename, "CCheckRecordContentStep.utf"); |
|
32 |
|
33 CCheckRecordContentStep::~CCheckRecordContentStep() |
|
34 /** |
|
35 * Destructor |
|
36 */ |
|
37 { |
|
38 iLoggedTraces.ResetAndDestroy(); |
|
39 iLoggedTraces.Close(); |
|
40 iSentTraces.ResetAndDestroy(); |
|
41 iSentTraces.Close(); |
|
42 } |
|
43 |
|
44 CCheckRecordContentStep::CCheckRecordContentStep() |
|
45 /** |
|
46 * Constructor |
|
47 */ |
|
48 { |
|
49 // **MUST** call SetTestStepName in the constructor as the controlling |
|
50 // framework uses the test step name immediately following construction to set |
|
51 // up the step's unique logging ID. |
|
52 SetTestStepName(KCheckRecordContentStep); |
|
53 |
|
54 SetLogFilename(KLogFilename); |
|
55 DeleteLogFile(); |
|
56 } |
|
57 |
|
58 TVerdict CCheckRecordContentStep::doTestStepPreambleL() |
|
59 { |
|
60 if(TestStepResult()==EPass) |
|
61 { |
|
62 //SetTestStepResult(EFail); |
|
63 } |
|
64 return TestStepResult(); |
|
65 } |
|
66 |
|
67 |
|
68 |
|
69 TVerdict CCheckRecordContentStep::doTestStepL() |
|
70 /** |
|
71 * @return - TVerdict code |
|
72 * Override of base class pure virtual |
|
73 * Our implementation only gets called if the base class doTestStepPreambleL() did |
|
74 * not leave. That being the case, the current test result value will be EPass. |
|
75 */ |
|
76 { |
|
77 if (TestStepResult()==EPass) |
|
78 { |
|
79 TInt error = KErrNone; |
|
80 |
|
81 INFO_PRINTF1(_L("-------- Writing traces --------")); |
|
82 error = WriteTraces(); |
|
83 if(error) |
|
84 { |
|
85 INFO_PRINTF2(_L("ERROR: Error when writing traces, error %i"), error); |
|
86 SetTestStepResult(EFail); |
|
87 } |
|
88 INFO_PRINTF1(_L("-------- Reading traces --------")); |
|
89 |
|
90 /* |
|
91 * Note - read Traces currently fails because the config file |
|
92 * c:\logs\testexecute\utrace\checkrecordcontentstep.utf is not closed by RUlogger |
|
93 * |
|
94 */ |
|
95 |
|
96 TInt e = iLogger.StopLogging(); |
|
97 |
|
98 error = ReadTraces(); |
|
99 if(error) |
|
100 { |
|
101 INFO_PRINTF2(_L("ERROR: Error when reading traces, error %i"), error); |
|
102 SetTestStepResult(EFail); |
|
103 } |
|
104 INFO_PRINTF1(_L("-------- Comparing traces --------")); |
|
105 error = CompareTraces(); |
|
106 if(error) |
|
107 { |
|
108 INFO_PRINTF2(_L("ERROR: Error when comparing traces, error %i"), error); |
|
109 SetTestStepResult(EFail); |
|
110 } |
|
111 } |
|
112 return TestStepResult(); |
|
113 } |
|
114 |
|
115 |
|
116 |
|
117 |
|
118 TTraceConfigs* CCheckRecordContentStep::CreateTrace(TTraceApiUsed aApi) |
|
119 { |
|
120 TTraceConfigs* trace = new TTraceConfigs; |
|
121 ASSERT(trace); |
|
122 TTraceConfigsOperator::Init(*trace); |
|
123 TTraceConfigsOperator::SetOptions(*trace, aApi, ETrue, ETrue); |
|
124 TBool setThreadId = EFalse; |
|
125 TInt sequence = (TInt) aApi + 191; |
|
126 switch(aApi) |
|
127 { |
|
128 //Tests for all kinds of traces in order to make sure all |
|
129 //payloads are exactly as wanted depending on what trace api you are using. |
|
130 //SetOptions(TTraceConfigs&, TTraceApiUsed, aLoggingEnabled, aTracingBuiltIn); |
|
131 //SetHeader(TTraceConfigs&, TClassification, TComponentId, THasThreadIdentification, THasProgramCounter, TTraceId); |
|
132 case EPrintTDesC8: |
|
133 case EKernelPrintDesC8: |
|
134 //case ETraceTDesC8: |
|
135 { |
|
136 TTraceConfigsOperator::SetHeader(*trace, sequence, sequence, EAddThreadIdentification, EAddProgramCounter, KFormatPrintf); |
|
137 TTraceConfigsOperator::SetData(*trace, KDefault8); |
|
138 setThreadId = ETrue; |
|
139 } |
|
140 break; |
|
141 case EPrintfchar: |
|
142 case EKernelPrintfchar: |
|
143 { |
|
144 TTraceConfigsOperator::SetHeader(*trace, sequence, sequence, EAddThreadIdentification, EAddProgramCounter, KFormatPrintf); |
|
145 TTraceConfigsOperator::SetData(*trace, KCharString, KCharStringSize); |
|
146 setThreadId = ETrue; |
|
147 } |
|
148 break; |
|
149 case EPrintTDesC16: |
|
150 //case ETraceTDesC16: |
|
151 TTraceConfigsOperator::SetHeader(*trace, sequence, sequence, EAddThreadIdentification, EAddProgramCounter, KFormatPrintfUnicode); |
|
152 TTraceConfigsOperator::SetData(*trace, KAny16); |
|
153 setThreadId = ETrue; |
|
154 break; |
|
155 case EPrintfTRefByValueTDesC8: |
|
156 { |
|
157 TBuf8<42> buf; |
|
158 buf.AppendFormat(KDesCFormatted8,2); |
|
159 TTraceConfigsOperator::SetHeader(*trace, sequence, sequence, EAddThreadIdentification, EAddProgramCounter, KFormatPrintf); |
|
160 TTraceConfigsOperator::SetData(*trace, buf); |
|
161 setThreadId = ETrue; |
|
162 } |
|
163 break; |
|
164 case EPrintfTRefByValueTDesC16: |
|
165 { |
|
166 #ifdef _UNICODE |
|
167 TBuf16<22> buf; |
|
168 buf.AppendFormat(KDesCFormatted16,2); |
|
169 TTraceConfigsOperator::SetHeader(*trace, sequence, sequence, EAddThreadIdentification, EAddProgramCounter, KFormatPrintfUnicode); |
|
170 TTraceConfigsOperator::SetData(*trace, buf); |
|
171 #else |
|
172 TBuf8<41> buf; |
|
173 buf.AppendFormat(KDesCFormatted8,2); |
|
174 TTraceConfigsOperator::SetHeader(*trace, sequence, sequence, EAddThreadIdentification, EAddProgramCounter, traceID); |
|
175 TTraceConfigsOperator::SetData(*trace, buf); |
|
176 #endif |
|
177 setThreadId = ETrue; |
|
178 } |
|
179 break; |
|
180 case ETrace: |
|
181 case EUtfKernelTrace: |
|
182 TTraceConfigsOperator::SetHeader(*trace, sequence, sequence, ENoThreadIdentification, EAddProgramCounter, sequence); |
|
183 //There is no additional data |
|
184 break; |
|
185 case ETraceTUint32: |
|
186 case EKernelTraceTUint32: |
|
187 { |
|
188 TTraceConfigsOperator::SetHeader(*trace, sequence, sequence, EAddThreadIdentification, EAddProgramCounter, sequence); |
|
189 TTraceConfigsOperator::SetData(*trace, 333888); |
|
190 setThreadId = ETrue; |
|
191 } |
|
192 break; |
|
193 case ETraceTUint8: |
|
194 { |
|
195 TTraceConfigsOperator::SetHeader(*trace, sequence, sequence, EAddThreadIdentification, EAddProgramCounter, sequence); |
|
196 TTraceConfigsOperator::SetData(*trace, (TUint8)333); |
|
197 setThreadId = ETrue; |
|
198 } |
|
199 break; |
|
200 case ETraceTUint16: |
|
201 { |
|
202 TTraceConfigsOperator::SetHeader(*trace, sequence, sequence, EAddThreadIdentification, EAddProgramCounter, sequence); |
|
203 TTraceConfigsOperator::SetData(*trace, (TUint16)3333); |
|
204 setThreadId = ETrue; |
|
205 } |
|
206 break; |
|
207 case ETraceTUint32TUint32: |
|
208 case EKernelTraceTUint32TUint32: |
|
209 { |
|
210 TTraceConfigsOperator::SetHeader(*trace, sequence, sequence, EAddThreadIdentification, EAddProgramCounter, sequence); |
|
211 TTraceConfigsOperator::SetData(*trace, 333, 333); |
|
212 setThreadId = ETrue; |
|
213 } |
|
214 break; |
|
215 case ETraceTAnySize: |
|
216 case EKernelTraceTAnySize: |
|
217 TTraceConfigsOperator::SetHeader(*trace, sequence, sequence, ENoThreadIdentification, EAddProgramCounter, sequence); |
|
218 TTraceConfigsOperator::SetData(*trace, KDefault8); |
|
219 break; |
|
220 |
|
221 case ETraceTemplated: |
|
222 case EKernelTraceTemplated: |
|
223 TTraceConfigsOperator::SetHeader(*trace, sequence, sequence, ENoThreadIdentification, EAddProgramCounter, sequence); |
|
224 TTraceConfigsOperator::SetData(*trace, KStructForTemplated); |
|
225 break; |
|
226 //check all headers and stuff |
|
227 case EContextTClassification: |
|
228 TTraceConfigsOperator::SetHeader(*trace, sequence, KComponentId, FW_DEFAULT_HAS_THREAD_IDENTIFICATION, FW_DEFAULT_HAS_PC, sequence); |
|
229 //There is no additional data |
|
230 setThreadId = ETrue; |
|
231 break; |
|
232 case EContextTClassificationTHasContextIdTHasProgramCounter: |
|
233 TTraceConfigsOperator::SetHeader(*trace, sequence, KComponentId, ENoThreadIdentification, EAddProgramCounter, sequence); |
|
234 //There is no additional data |
|
235 break; |
|
236 case EContextTComponentIdTClassification: |
|
237 TTraceConfigsOperator::SetHeader(*trace, sequence, sequence, FW_DEFAULT_HAS_THREAD_IDENTIFICATION, FW_DEFAULT_HAS_PC, sequence); |
|
238 //There is no additional data |
|
239 setThreadId = ETrue; |
|
240 break; |
|
241 case EContextTComponentIdTClassificationTHasContextIdTHasProgramCounter: |
|
242 TTraceConfigsOperator::SetHeader(*trace, sequence, sequence, ENoThreadIdentification, EAddProgramCounter, sequence); |
|
243 //There is no additional data |
|
244 break; |
|
245 case EComponentId: |
|
246 TTraceConfigsOperator::SetHeader(*trace, sequence, sequence, EAddThreadIdentification, ENoProgramCounter, sequence); |
|
247 //There is no additional data |
|
248 setThreadId = ETrue; |
|
249 break; |
|
250 case EClassification: |
|
251 TTraceConfigsOperator::SetHeader(*trace, sequence, sequence, EAddThreadIdentification, ENoProgramCounter, sequence); |
|
252 //There is no additional data |
|
253 setThreadId = ETrue; |
|
254 break; |
|
255 case EUtfIncludeContextId: |
|
256 TTraceConfigsOperator::SetHeader(*trace, sequence, sequence, ENoThreadIdentification, EAddProgramCounter, sequence); |
|
257 //There is no additional data |
|
258 break; |
|
259 case EUtfIncludePc: |
|
260 TTraceConfigsOperator::SetHeader(*trace, sequence, sequence, ENoThreadIdentification, EAddProgramCounter, sequence); |
|
261 //There is no additional data |
|
262 break; |
|
263 case EDefaultComponentId: |
|
264 TTraceConfigsOperator::SetHeader(*trace, sequence, KComponentId, EAddThreadIdentification, ENoProgramCounter, sequence); |
|
265 //There is no additional data |
|
266 setThreadId = ETrue; |
|
267 break; |
|
268 |
|
269 default: |
|
270 delete trace; |
|
271 trace = NULL; |
|
272 break; |
|
273 } |
|
274 if(trace && setThreadId) |
|
275 trace->iContextId = RThread().BTraceId() + 704; //704 is the offset into the RThread and DThread object until we get to the NThread |
|
276 return trace; |
|
277 } |
|
278 |
|
279 TInt CCheckRecordContentStep::WriteTraces() |
|
280 { |
|
281 TInt error = KErrNone; |
|
282 TInt lastError = KErrNone; |
|
283 for(TInt i = 0; i < KAPIMaxNumberOfTraceApis; i++) |
|
284 { |
|
285 TTraceConfigs* trace = CreateTrace((TTraceApiUsed)i); |
|
286 if(trace) |
|
287 { |
|
288 error = iLogger.StartLoggingL(*trace); |
|
289 if(error) |
|
290 { |
|
291 INFO_PRINTF2(_L("ERROR: Logging failed to start, error %i. "), error); |
|
292 lastError = error; |
|
293 } |
|
294 error = TTraceTester::SendTraceL(*trace); |
|
295 if(error) |
|
296 { |
|
297 INFO_PRINTF5(_L("ERROR: Trace was not logged, error %i, API %i, ComponentId %i, Group Id %i"), error, i, trace->iComponentId, trace->iGroupId); |
|
298 lastError = error; |
|
299 } |
|
300 iSentTraces.Append(trace); |
|
301 error = iLogger.StopLogging(); //flush... |
|
302 if( error != KErrNone) |
|
303 { |
|
304 INFO_PRINTF2(_L("ERROR: Logging failed to stop, error %i. "), error); |
|
305 lastError = error; |
|
306 } |
|
307 |
|
308 } |
|
309 } |
|
310 return lastError; |
|
311 } |
|
312 |
|
313 |
|
314 TInt CCheckRecordContentStep::ReadTraces() |
|
315 { |
|
316 //read data... |
|
317 TUint bufferSize = 0; |
|
318 TUint8* traceBuffer = NULL; |
|
319 TRAPD(error, (error = iLogger.GetDataL(traceBuffer, bufferSize))); |
|
320 if(!bufferSize || error) |
|
321 { |
|
322 return error; |
|
323 } |
|
324 // process all the complete traces in buffer... |
|
325 error = iParser.ParseRawBuffer(traceBuffer, bufferSize, iLoggedTraces); |
|
326 delete traceBuffer; //done with it, so delete it |
|
327 return error; |
|
328 } |
|
329 |
|
330 |
|
331 TInt CCheckRecordContentStep::CompareTraces() |
|
332 { |
|
333 TInt error = KErrNone; |
|
334 if(iLoggedTraces.Count() != iSentTraces.Count()) |
|
335 { |
|
336 INFO_PRINTF3(_L("ERROR: Different amount of traces written (%i) and read (%i). "), iSentTraces.Count(), iLoggedTraces.Count()); |
|
337 error = KErrCorrupt;//will be ignored.. |
|
338 } |
|
339 |
|
340 TInt count = 0; |
|
341 if(iLoggedTraces.Count() > iSentTraces.Count()) |
|
342 count = iSentTraces.Count(); |
|
343 else |
|
344 count = iLoggedTraces.Count(); |
|
345 |
|
346 for(TInt i = 0; i < count; i++) |
|
347 { |
|
348 TTraceConfigs* logged = iLoggedTraces[i]; |
|
349 TTraceConfigs* sent = iSentTraces[i]; |
|
350 |
|
351 INFO_PRINTF2(_L("--- Trace %i ---"), sent->iApiUsed); |
|
352 |
|
353 //module uid ... |
|
354 if(logged->iComponentId == sent->iComponentId) |
|
355 INFO_PRINTF2(_L("ComponentId %i - ok"), sent->iComponentId); |
|
356 else |
|
357 { |
|
358 INFO_PRINTF3(_L("ComponentId - ERROR: sent %i, logged %i"), sent->iComponentId, logged->iComponentId); |
|
359 error = KErrCorrupt; |
|
360 } |
|
361 |
|
362 //group id ... |
|
363 if(logged->iGroupId == sent->iGroupId) |
|
364 INFO_PRINTF2(_L("GroupId %i - ok"), logged->iGroupId); |
|
365 else |
|
366 { |
|
367 INFO_PRINTF3(_L("GroupId - ERROR: sent %i, logged %i"), sent->iGroupId, logged->iGroupId); |
|
368 error = KErrCorrupt; |
|
369 } |
|
370 |
|
371 //sub-category ... |
|
372 if(logged->iSubCategory == sent->iSubCategory) |
|
373 INFO_PRINTF2(_L("SubCategory %i - ok"), sent->iSubCategory); |
|
374 else |
|
375 { |
|
376 INFO_PRINTF3(_L("SubCategory - ERROR: sent %i, logged %i"), sent->iSubCategory, logged->iSubCategory); |
|
377 error = KErrCorrupt; |
|
378 } |
|
379 |
|
380 //format id ... |
|
381 if(logged->iTraceId == sent->iTraceId) |
|
382 { |
|
383 INFO_PRINTF2(_L("TraceId %i - ok"), sent->iTraceId); |
|
384 } |
|
385 else |
|
386 { |
|
387 INFO_PRINTF3(_L("TraceId - ERROR: sent %i, logged %i"), sent->iTraceId, logged->iTraceId); |
|
388 error = KErrCorrupt; |
|
389 } |
|
390 |
|
391 //context id present ... |
|
392 if(logged->iHasThreadId == sent->iHasThreadId) |
|
393 INFO_PRINTF2(_L("ContextId included %i - ok"), (TInt) sent->iHasThreadId); |
|
394 else |
|
395 { |
|
396 INFO_PRINTF3(_L("ContextId included - ERROR: sent %i, logged %i"), sent->iHasThreadId, logged->iHasThreadId); |
|
397 error = KErrCorrupt; |
|
398 } |
|
399 |
|
400 //pc present ... |
|
401 if(logged->iHasProgramCounter == sent->iHasProgramCounter) |
|
402 INFO_PRINTF2(_L("Pc included %i - ok"), (TInt) sent->iHasProgramCounter); |
|
403 else |
|
404 { |
|
405 INFO_PRINTF3(_L("Pc included - ERROR: sent %i, logged %i"), sent->iHasProgramCounter, logged->iHasProgramCounter); |
|
406 error = KErrCorrupt; |
|
407 } |
|
408 |
|
409 //context id value ... |
|
410 if(sent->iContextId == logged->iContextId) |
|
411 INFO_PRINTF2(_L("ContextId value 0x%x - ok"), (TInt) sent->iContextId); |
|
412 else |
|
413 { |
|
414 INFO_PRINTF3(_L("ContextId value - ERROR: sent 0x%x, logged 0x%x"), sent->iContextId, logged->iContextId); |
|
415 // error = KErrCorrupt; //get real implementation |
|
416 } |
|
417 |
|
418 //pc value... |
|
419 TInt32 temp = TInt32(sent->iPc-logged->iPc); |
|
420 if ( temp < 4) |
|
421 INFO_PRINTF2(_L("Pc value 0x%x - ok"), (TInt) sent->iPc); |
|
422 else |
|
423 { |
|
424 INFO_PRINTF4(_L("Pc value - ERROR: sent 0x%x, logged 0x%x, temp difference %u"), sent->iPc, logged->iPc, temp); |
|
425 error = KErrCorrupt; |
|
426 } |
|
427 |
|
428 //payload ... |
|
429 TInt j = sizeof(sent->iRawData)/4 - 1; |
|
430 TBool payloadIsEqual = ETrue; |
|
431 while(j >= 0) |
|
432 { |
|
433 if(sent->iRawData[j] != logged->iRawData[j]) |
|
434 { |
|
435 payloadIsEqual = EFalse; |
|
436 break; //bad payload |
|
437 } |
|
438 j--; |
|
439 } |
|
440 if(payloadIsEqual) |
|
441 INFO_PRINTF2(_L("Payload \"%s\" - ok"), sent->iRawData); |
|
442 else |
|
443 { |
|
444 INFO_PRINTF3(_L("Payload - ERROR: sent \"%s\", logged \"%s\""), sent->iRawData, logged->iRawData); |
|
445 INFO_PRINTF7(_L("Payload - sent [0x%x][0x%x][0x%x][0x%x][0x%x][0x%x]"), sent->iRawData[0],sent->iRawData[1],sent->iRawData[2],sent->iRawData[3],sent->iRawData[4],sent->iRawData[5]); |
|
446 INFO_PRINTF7(_L("Payload - logged [0x%x][0x%x][0x%x][0x%x][0x%x][0x%x]"), logged->iRawData[0], logged->iRawData[1], logged->iRawData[2], logged->iRawData[3], logged->iRawData[4], logged->iRawData[5]); |
|
447 error = KErrCorrupt; |
|
448 } |
|
449 } |
|
450 INFO_PRINTF1(_L("Multiparted traces have not been tested!")); |
|
451 INFO_PRINTF1(_L("PC on multiparted traces have not been tested!")); |
|
452 INFO_PRINTF1(_L("Context Id is correct, but the test suite can't get the correct id yet.!")); |
|
453 return error; |
|
454 } |
|
455 |