|
1 #ifndef __BASE_TEST_CASE_H |
|
2 #define __BASE_TEST_CASE_H |
|
3 |
|
4 /* |
|
5 * Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). |
|
6 * All rights reserved. |
|
7 * This component and the accompanying materials are made available |
|
8 * under the terms of the License "Eclipse Public License v1.0" |
|
9 * which accompanies this distribution, and is available |
|
10 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
11 * |
|
12 * Initial Contributors: |
|
13 * Nokia Corporation - initial contribution. |
|
14 * |
|
15 * Contributors: |
|
16 * |
|
17 * Description: |
|
18 * @file BaseTestCase.h |
|
19 * @internalComponent |
|
20 * |
|
21 * |
|
22 */ |
|
23 |
|
24 |
|
25 |
|
26 #include <e32base.h> |
|
27 #include <d32usbdi.h> |
|
28 #include "FDFActor.h" |
|
29 #include "testdebug.h" |
|
30 |
|
31 namespace NUnitTesting_USBDI |
|
32 { |
|
33 |
|
34 #ifdef _DEBUG |
|
35 #define _LITDBG(a) _LIT(lit, a) |
|
36 #else |
|
37 #define _LITDBG(a) |
|
38 #endif |
|
39 |
|
40 // Constants for CBaseTestCase::GetEndpointAddress |
|
41 |
|
42 extern const TUint8 KEpDirectionIn; |
|
43 extern const TUint8 KEpDirectionOut; |
|
44 extern const TUint8 KTransferTypeControl; |
|
45 extern const TUint8 KTransferTypeIsoch; |
|
46 extern const TUint8 KTransferTypeBulk; |
|
47 extern const TUint8 KTransferTypeInterrupt; |
|
48 |
|
49 // Forward declarations |
|
50 |
|
51 class CBasicTestPolicy; |
|
52 |
|
53 #define WS_FILENAME(f) _LIT(KFileName, f); |
|
54 #define WS_CONDITION(c) _LIT(KCondition, c); |
|
55 _LIT(KFailText, "CHECK fails ---> %S, in file %S @ line %i"); |
|
56 |
|
57 // Utility macro to tidy up the test |
|
58 #define CHECK(aCondition)\ |
|
59 if(!(aCondition))\ |
|
60 {\ |
|
61 WS_FILENAME(__FILE__);\ |
|
62 WS_CONDITION(#aCondition);\ |
|
63 CBaseTestCase::LogWithCondAndInfo(KCondition, KFileName, __LINE__);\ |
|
64 return TestFailed(KErrAbort);\ |
|
65 }\ |
|
66 |
|
67 // Utility macro to tidy up the test |
|
68 #define CHECK_RET_BOOL(aCondition)\ |
|
69 if(!(aCondition))\ |
|
70 {\ |
|
71 WS_FILENAME(__FILE__);\ |
|
72 WS_CONDITION(#aCondition);\ |
|
73 CBaseTestCase::LogWithCondAndInfo(KCondition, KFileName, __LINE__);\ |
|
74 return EFalse;\ |
|
75 }\ |
|
76 /** |
|
77 Base policy class for test cases. Test cases are active objects that execute their respective test cases |
|
78 and asynchronously complete when test case has finished |
|
79 */ |
|
80 class CBaseTestCase : public CActive |
|
81 { |
|
82 public: |
|
83 /** |
|
84 Destructor |
|
85 */ |
|
86 virtual ~CBaseTestCase(); |
|
87 |
|
88 /** |
|
89 */ |
|
90 void SetTestPolicy(CBasicTestPolicy* aTestPolicy); |
|
91 |
|
92 /** |
|
93 Performs the test case |
|
94 */ |
|
95 void PerformTestL(); |
|
96 |
|
97 /** |
|
98 Provides to the caller the identity of this test case |
|
99 @return descriptor referrence to the test case identity |
|
100 */ |
|
101 TDesC& TestCaseId(); |
|
102 |
|
103 /** |
|
104 Retrieve the test result for the executed test case |
|
105 @return the test case result |
|
106 */ |
|
107 TInt TestResult() const; |
|
108 |
|
109 /** |
|
110 Check if the test is only be run on the host(no synch. with client needed) |
|
111 @return True if test to be run in host only. |
|
112 */ |
|
113 TBool IsHostOnly() const; |
|
114 |
|
115 /** |
|
116 Check if the test is only be run on the host(no synch. with client needed) |
|
117 @return True if test to be run in host only. |
|
118 */ |
|
119 TBool IsHost() const; |
|
120 |
|
121 /** |
|
122 static method(util), used to log a test condition. |
|
123 @param[in] aCondition checked condition |
|
124 @param[in] aFileName __FILE__ |
|
125 @param[in] aLine __LINE__ |
|
126 */ |
|
127 static void LogWithCondAndInfo(const TDesC& aCondition, const TDesC& aFileName, TInt aLine); |
|
128 |
|
129 protected: // From CActive |
|
130 |
|
131 /** |
|
132 Called when Cancel is called (if active) |
|
133 */ |
|
134 void DoCancel(); |
|
135 |
|
136 /** |
|
137 Called when the this AO has been scheduled |
|
138 */ |
|
139 void RunL(); |
|
140 |
|
141 /** |
|
142 This default implementation just informs the test controller that this specific test case RunL |
|
143 left with the error code so that the active scheduler will not Panic. This indicates that the test case failed. |
|
144 Derived test cases are expected to override for exact knowledge of error |
|
145 @param aError the error from a derived test case execution |
|
146 @return KErrNone |
|
147 */ |
|
148 virtual TInt RunError(TInt aError); |
|
149 |
|
150 protected: // Tree checks |
|
151 |
|
152 /** |
|
153 Store dev. and config. desc into internal buffer and check if it is identical to the reference one. |
|
154 @param[in] aDevDesc parsed device descriptor |
|
155 @param[in] aConfigDesc parsed config. descriptor |
|
156 @param[in] aFileName file to be compared with the current tree(doesn't contain the path nor extension) |
|
157 or to build a reference tree(after being manually checked once, it could be used as a ref.) |
|
158 @return KErrNone if tree is identical to the ref. tree |
|
159 */ |
|
160 TInt CheckTree(TUsbGenericDescriptor& aDevDesc, TUsbGenericDescriptor& aConfigDesc, const TDesC& aFileName); |
|
161 |
|
162 /** |
|
163 Parse configuration descriptor raw data and check if the generated tree is identical to the ref. one. |
|
164 FAILS the test if there is any difference. |
|
165 @param[in] devDesc already parsed device descriptor |
|
166 @param[in] configSet configuration descriptor raw data to be parsed |
|
167 @param[in] indexTest index of the test(used to append a number to the generated file name) |
|
168 @return KErrNone if parsing is ok and tree is identical to the ref. tree |
|
169 */ |
|
170 TInt ParseConfigDescriptorAndCheckTree(TUsbDeviceDescriptor *devDesc, const TDesC8& configSet, TUint indexTest); |
|
171 /** |
|
172 Parse configuration descriptor raw data and check if the generated tree is identical to the ref. one. |
|
173 FAILS the test if there is any difference. |
|
174 @param[in] aTestDevice device being tested tested |
|
175 @param[in] aFileName file to be compared with the current tree(doesn't contain the path nor extension) |
|
176 @return KErrNone if tree is identical to the ref. tree after a real device has been inserted. |
|
177 */ |
|
178 TInt CheckTreeAfterDeviceInsertion(CUsbTestDevice& aTestDevice, const TDesC& aFileName); |
|
179 |
|
180 protected: |
|
181 /** |
|
182 Constructor |
|
183 @param aTestCaseId the identity that this test case is to represent |
|
184 @param aHostFlag the flag for host role |
|
185 */ |
|
186 CBaseTestCase(const TDesC& aTestCaseId,TBool aHostFlag, TBool aHostOnly = EFalse); |
|
187 |
|
188 /** |
|
189 Base class 2nd phase constructor |
|
190 */ |
|
191 void BaseConstructL(); |
|
192 virtual void ConstructL() = 0; |
|
193 |
|
194 /** |
|
195 State that the test case has failed with the given error code |
|
196 @param aFailResult the failiure result for the test case |
|
197 */ |
|
198 void TestFailed(TInt aFailResult); |
|
199 |
|
200 /** |
|
201 Instruct the test case that it has passed |
|
202 */ |
|
203 void TestPassed(); |
|
204 |
|
205 /** |
|
206 Instruct the test case to asynchronously complete itself now |
|
207 */ |
|
208 void SelfComplete(); |
|
209 |
|
210 /** |
|
211 Instruct the test case to asynchronously complete itself now with the supplied error code. |
|
212 @param aError the error code to complete this test case with. |
|
213 */ |
|
214 void SelfComplete(TInt aError); |
|
215 |
|
216 /** |
|
217 Timeout in the specified number of seconds |
|
218 @param aTimeoutPeriod the timeout interval |
|
219 */ |
|
220 void TimeoutIn(TInt aTimeoutPeriod); |
|
221 |
|
222 /** |
|
223 Cancels the timeout for the test case step |
|
224 */ |
|
225 void CancelTimeout(); |
|
226 |
|
227 /** |
|
228 */ |
|
229 CBasicTestPolicy& TestPolicy(); |
|
230 |
|
231 /** |
|
232 */ |
|
233 virtual void ExecuteHostTestCaseL() = 0; |
|
234 virtual void HostRunL() = 0; |
|
235 virtual void HostDoCancel() = 0; |
|
236 |
|
237 /** |
|
238 */ |
|
239 virtual void ExecuteDeviceTestCaseL() = 0; |
|
240 virtual void DeviceRunL() = 0; |
|
241 virtual void DeviceDoCancel() = 0; |
|
242 |
|
243 protected: |
|
244 |
|
245 /** |
|
246 Finds the address of the first endpoint with the specification of direction and type |
|
247 @param aUsbInterface the interface that has the correct interface setting |
|
248 @param aInterfaceSetting the alternate interface setting which has the endpoint |
|
249 @param aTransferType the type of transfer for this endpoint |
|
250 @param aDirection the direction of the endpoint in the host transfer |
|
251 @param[out] on return, the first endpoint address found |
|
252 @return KErrNone if successful or a system wide error code |
|
253 */ |
|
254 TInt GetEndpointAddress(RUsbInterface& aUsbInterface,TInt aInterfaceSetting, |
|
255 TUint8 aTransferType,TUint8 aDirection,TInt& aEndpointAddress); |
|
256 |
|
257 /** |
|
258 Finds the address of the (index+1)th endpoint with the specification of direction and type |
|
259 @param aUsbInterface the interface that has the correct interface setting |
|
260 @param aInterfaceSetting the alternate interface setting which has the endpoint |
|
261 @param aTransferType the type of transfer for this endpoint |
|
262 @param aDirection the direction of the endpoint in the host transfer |
|
263 @param[out] on return, the first endpoint address found |
|
264 @return KErrNone if successful or a system wide error code |
|
265 */ |
|
266 TInt GetEndpointAddress(RUsbInterface& aUsbInterface,TInt aInterfaceSetting, |
|
267 TUint8 aTransferType,TUint8 aDirection,TUint8 aIndex, TInt& aEndpointAddress); |
|
268 |
|
269 protected: |
|
270 |
|
271 /** |
|
272 The timer resource for timeout of test actions |
|
273 and possibly other uses |
|
274 */ |
|
275 RTimer iTimer; |
|
276 |
|
277 /** |
|
278 The execution result for the test case |
|
279 */ |
|
280 TInt iTestResult; |
|
281 |
|
282 private: // Tree |
|
283 |
|
284 /** |
|
285 Print the tree(logging) and store it into iTreeBuffer. |
|
286 @param[in] aDesc usb descriptor(likely to be device descriptor or configuration one) |
|
287 @param[in] aDepth tree depth |
|
288 */ |
|
289 void PrintAndStoreTree(TUsbGenericDescriptor& aDesc, TInt aDepth = 0); |
|
290 |
|
291 /** |
|
292 Print a blob(logging) and store it into iTreeBuffer. |
|
293 @param[in] aBuf usb descriptor(likely to be device descriptor or configuration one) |
|
294 @param[in] aBlob tree depth |
|
295 */ |
|
296 void PrintAndStoreBlob(TDes8& aBuf, TPtrC8& aBlob); |
|
297 |
|
298 /** |
|
299 Print a chunk(logging) and store it into iTreeBuffer. |
|
300 @param[in] aChunk chunk buffer |
|
301 @param[in] aSize nb of data(for writtings in one go) |
|
302 @param[in] aBlob whole Blob |
|
303 @param[in] aOffset offset of blob(for writtings in several times) |
|
304 @param[in] aIter index of chunk(for writtings in several times) |
|
305 @param[in] aBuf buffer needed for proper indentation |
|
306 */ |
|
307 void PrintAndStoreChunk(HBufC8* aChunk, TUint aSize, TPtrC8& aBlob, TUint aOffset, TUint aIter, TDes8& aBuf); |
|
308 |
|
309 /** |
|
310 Generate a Ref. file representing the tree(flushing iTreeBuffer) |
|
311 @param[in] aFileName file name(doesn't contain the path nor extension) |
|
312 @return KErrNone if successfull. |
|
313 */ |
|
314 TInt GenerateRefFile(const TDesC& aFileName); |
|
315 |
|
316 /** |
|
317 Compare the current tree(iTreeBuffer) to a reference. |
|
318 @param[in] aFileName ref. file name(doesn't contain the path nor extension) |
|
319 @param[out] aIsIdentical True if equal to the ref. |
|
320 @return KErrNone if successfull. |
|
321 */ |
|
322 TInt CompareCurrentTreeToRef(const TDesC& aFileName, TBool& aIsIdentical); |
|
323 |
|
324 private : |
|
325 |
|
326 /** |
|
327 The identity of the test case |
|
328 */ |
|
329 TBuf<KMaxName> iTestCaseId; |
|
330 |
|
331 /** |
|
332 */ |
|
333 CBasicTestPolicy* iTestPolicy; |
|
334 |
|
335 /** |
|
336 The flag to indicate if this is a test case that performs host test actions |
|
337 */ |
|
338 TBool iHost; |
|
339 |
|
340 /** |
|
341 The flag to indicate if this is a test case that is only run in host, and doesn't need synch. with a device. |
|
342 */ |
|
343 TBool iHostOnly; |
|
344 |
|
345 /** |
|
346 Heap buffer which contains the descriptors tree. |
|
347 */ |
|
348 RBuf8 iTreeBuffer; |
|
349 |
|
350 /** |
|
351 Hanlde to a file session server |
|
352 */ |
|
353 RFs iFs; |
|
354 }; |
|
355 |
|
356 } |
|
357 |
|
358 #endif |