|
1 // Copyright (c) 1997-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 // |
|
15 |
|
16 #include <e32test.h> |
|
17 #include <f32file.h> |
|
18 #include <s32file.h> |
|
19 #include <s32mem.h> |
|
20 #include <cntdb.h> |
|
21 #include <cntitem.h> |
|
22 #include <cntfldst.h> |
|
23 #include <e32def.h> |
|
24 #include "T_EXPDEL.H" |
|
25 #include "T_UTILS.H" |
|
26 #include <coreappstest/testserver.h> |
|
27 |
|
28 CCntTest* CntTest=NULL; |
|
29 LOCAL_D RTest test(_L("T_EXPDEL")); |
|
30 LOCAL_D CContactIdArray* TheIds; |
|
31 |
|
32 LOCAL_D CArrayPtr<CContactItem>* TheItems; |
|
33 LOCAL_D CArrayPtr<CContactItem>* TheItems2; |
|
34 LOCAL_D CTestRegister* FileRegister; |
|
35 |
|
36 const TPtrC KDatabaseFileName=_L("C:T_EXPDEL"); |
|
37 // |
|
38 // CVersitTest |
|
39 // |
|
40 |
|
41 void CVCardTest::GetSampleVersitL() |
|
42 { |
|
43 iParser=CParserVCard::NewL(); |
|
44 iVersit.Zero(); |
|
45 iVersit.Append(KVersitTokenCRLF); |
|
46 iVersit.Append(_L8("BEGIN:VCARD")); |
|
47 iVersit.Append(KVersitTokenCRLF); |
|
48 iVersit.Append(_L8("VERSION:2.1")); |
|
49 iVersit.Append(KVersitTokenCRLF); |
|
50 iVersit.Append(_L8("N:FName1;GName1")); |
|
51 iVersit.Append(KVersitTokenCRLF); |
|
52 iVersit.Append(_L8("TEL;HOME:111")); |
|
53 iVersit.Append(KVersitTokenCRLF); |
|
54 |
|
55 iVersit.Append(_L8("AGENT:")); |
|
56 iVersit.Append(KVersitTokenCRLF); |
|
57 iVersit.Append(_L8("BEGIN:VCARD")); |
|
58 iVersit.Append(KVersitTokenCRLF); |
|
59 iVersit.Append(_L8("VERSION:2.1")); |
|
60 iVersit.Append(KVersitTokenCRLF); |
|
61 iVersit.Append(_L8("N:FName2;GName2")); |
|
62 iVersit.Append(KVersitTokenCRLF); |
|
63 iVersit.Append(_L8("TEL;HOME:222")); |
|
64 iVersit.Append(KVersitTokenCRLF); |
|
65 iVersit.Append(_L8("END:VCARD")); |
|
66 iVersit.Append(KVersitTokenCRLF); |
|
67 |
|
68 |
|
69 iVersit.Append(_L8("END:VCARD")); |
|
70 iVersit.Append(KVersitTokenCRLF); |
|
71 } |
|
72 |
|
73 void CVCardTest::GetSampleVersit2L() |
|
74 { |
|
75 } |
|
76 |
|
77 |
|
78 CVersitTest::CVersitTest() |
|
79 {} |
|
80 |
|
81 CVersitTest::~CVersitTest() |
|
82 { |
|
83 delete iParser; |
|
84 delete iStore; |
|
85 } |
|
86 |
|
87 void CVersitTest::StreamInL() |
|
88 //Convert the iVersit into stream format, save it as "ExpDelVersitIn" |
|
89 //and internalize it as a CVersitParser |
|
90 { |
|
91 RFile file; |
|
92 FileRegister->CreateTempFileLC(file, _L("ExpDelVersit2")); |
|
93 CDirectFileStore* store = CDirectFileStore::NewLC(file); |
|
94 store->SetTypeL(KDirectFileStoreLayoutUid); |
|
95 RStoreWriteStream outstream; |
|
96 TStreamId id = outstream.CreateLC(*store); |
|
97 TInt length=iVersit.Length(); |
|
98 for (TInt ii=0; ii<length; ii++) |
|
99 outstream.WriteInt8L(iVersit[ii]); |
|
100 outstream.CommitL(); |
|
101 CleanupStack::PopAndDestroy(); |
|
102 store->SetRootL(id); |
|
103 store->CommitL(); |
|
104 CleanupStack::PopAndDestroy(2); // store + file |
|
105 FileRegister->OpenTempFileLC(file, _L("ExpDelVersit2")); |
|
106 store = CDirectFileStore::NewLC(file); |
|
107 RStoreReadStream instream; |
|
108 instream.OpenLC(*store,store->Root()); |
|
109 iParser->InternalizeL(instream); |
|
110 CleanupStack::PopAndDestroy(3); //store + stream + file |
|
111 } |
|
112 |
|
113 void CVersitTest::StreamLC(RReadStream& aStream) |
|
114 { |
|
115 GetSampleVersitL(); |
|
116 RFile file; |
|
117 FileRegister->CreateTempFileLC(file, _L("ExpDelVersitIn")); |
|
118 CDirectFileStore* store = CDirectFileStore::NewLC(file); |
|
119 store->SetTypeL(KDirectFileStoreLayoutUid); |
|
120 RStoreWriteStream outstream; |
|
121 TStreamId id = outstream.CreateLC(*store); |
|
122 TInt length=iVersit.Length(); |
|
123 for (TInt ii=0; ii<length; ii++) |
|
124 outstream.WriteInt8L(iVersit[ii]); |
|
125 outstream.CommitL(); |
|
126 CleanupStack::PopAndDestroy(); |
|
127 store->SetRootL(id); |
|
128 store->CommitL(); |
|
129 CleanupStack::PopAndDestroy(2); // store + file |
|
130 FileRegister->OpenTempFileLC(file, _L("ExpDelVersitIn")); |
|
131 store = CDirectFileStore::NewLC(file); |
|
132 RStoreReadStream instream; |
|
133 instream.OpenLC(*store,store->Root()); |
|
134 CleanupStack::Pop(); // instream |
|
135 aStream=RReadStream(instream); |
|
136 } |
|
137 |
|
138 void CVersitTest::Stream2LC(RReadStream& aStream) |
|
139 { |
|
140 GetSampleVersit2L(); |
|
141 RFile file; |
|
142 FileRegister->CreateTempFileLC(file, _L("ExpDelVersitIn2")); |
|
143 CDirectFileStore* store = CDirectFileStore::NewLC(file); |
|
144 store->SetTypeL(KDirectFileStoreLayoutUid); |
|
145 RStoreWriteStream outstream; |
|
146 TStreamId id = outstream.CreateLC(*store); |
|
147 TInt length=iVersit.Length(); |
|
148 for (TInt ii=0; ii<length; ii++) |
|
149 outstream.WriteInt8L(iVersit[ii]); |
|
150 outstream.CommitL(); |
|
151 CleanupStack::PopAndDestroy(); |
|
152 store->SetRootL(id); |
|
153 store->CommitL(); |
|
154 CleanupStack::PopAndDestroy(); // store |
|
155 FileRegister->OpenTempFileLC(file, _L("ExpDelVersitIn2")); |
|
156 store = CDirectFileStore::NewLC(file); |
|
157 RStoreReadStream instream; |
|
158 instream.OpenLC(*store,store->Root()); |
|
159 CleanupStack::Pop(); // instream |
|
160 aStream=RReadStream(instream); |
|
161 } |
|
162 |
|
163 void CVersitTest::StreamOutL() |
|
164 { |
|
165 } |
|
166 |
|
167 void CVersitTest::SaveFileVersitL() |
|
168 // Save iParser into VersitFile |
|
169 { |
|
170 if (iParser) |
|
171 { |
|
172 RFile file; |
|
173 FileRegister->CreateTempFileLC(file, _L("VersitFile")); |
|
174 iParser->ExternalizeL(file); |
|
175 CleanupStack::PopAndDestroy(&file); |
|
176 } |
|
177 } |
|
178 |
|
179 // |
|
180 // CVCardTest |
|
181 // |
|
182 |
|
183 void CVCardTest::LoadFileVersitL() |
|
184 // Read VCard.vcf into iVersit |
|
185 { |
|
186 iParser=CParserVCard::NewL(); |
|
187 RFs fsSession; |
|
188 User::LeaveIfError(fsSession.Connect()); |
|
189 RFile file; |
|
190 FileRegister->OpenTempFileLC(file, _L("VCard.vcf")); |
|
191 TInt start=0; |
|
192 iParser->InternalizeL(file,start); |
|
193 CleanupStack::PopAndDestroy(&file); |
|
194 } |
|
195 |
|
196 LOCAL_C void SetNameL(CContactItem& aItem,TUid aVcardType,const TDesC& aName) |
|
197 // |
|
198 // Set the contents of a text field, creating the field if required |
|
199 // |
|
200 { |
|
201 CContactItemFieldSet& fieldSet=aItem.CardFields(); |
|
202 const TInt pos=fieldSet.Find(KUidContactFieldFamilyName); |
|
203 if (pos!=KErrNotFound) |
|
204 fieldSet[pos].TextStorage()->SetTextL(aName); |
|
205 else |
|
206 { |
|
207 CContactItemField* field=CContactItemField::NewLC(KStorageTypeText,KUidContactFieldFamilyName); |
|
208 field->SetMapping(aVcardType); |
|
209 field->TextStorage()->SetTextL(aName); |
|
210 aItem.AddFieldL(*field); |
|
211 CleanupStack::Pop(); // item |
|
212 } |
|
213 } |
|
214 |
|
215 |
|
216 LOCAL_C void AddNewContactsL() |
|
217 // |
|
218 // Add 20 new contacts |
|
219 // |
|
220 { |
|
221 |
|
222 for (TInt ii=0;ii<20;ii++) |
|
223 { |
|
224 CContactCard* card=CContactCard::NewL(); |
|
225 CleanupStack::PushL(card); |
|
226 TBuf<16> name; |
|
227 name.Format(_L("NAME #%d"),ii); |
|
228 SetNameL(*card,KUidContactFieldVCardMapUnusedN,name); |
|
229 CContactItemField* field=CContactItemField::NewLC(KStorageTypeText,KUidContactFieldPhoneNumber); |
|
230 field->SetMapping(KUidContactFieldVCardMapTEL); |
|
231 field->TextStorage()->SetTextL(_L("123")); |
|
232 card->AddFieldL(*field); |
|
233 CleanupStack::Pop(); // field |
|
234 CntTest->Db()->AddNewContactL(*card); |
|
235 CleanupStack::PopAndDestroy(); // card |
|
236 } |
|
237 |
|
238 } |
|
239 |
|
240 LOCAL_C void EmptyDatabase() |
|
241 { |
|
242 TContactItemId theid; |
|
243 TContactIter iter(*CntTest->Db()); |
|
244 theid=iter.FirstL(); |
|
245 while(theid!=KNullContactId ) |
|
246 { |
|
247 CntTest->Db()->DeleteContactL(theid); |
|
248 theid=iter.NextL(); |
|
249 } |
|
250 } |
|
251 |
|
252 |
|
253 LOCAL_C void IncAccessCount() |
|
254 { |
|
255 TContactItemId theid; |
|
256 TContactIter iter(*CntTest->Db()); |
|
257 theid=iter.FirstL(); |
|
258 while(theid!=KNullContactId ) |
|
259 { |
|
260 CContactItem* contactItem=CntTest->Db()->OpenContactL(theid); |
|
261 CleanupStack::PushL(contactItem); |
|
262 contactItem->IncAccessCount(); |
|
263 theid=iter.NextL(); |
|
264 CntTest->Db()->CommitContactL(*contactItem); |
|
265 CleanupStack::PopAndDestroy(); // contactitem |
|
266 } |
|
267 } |
|
268 |
|
269 |
|
270 LOCAL_C void DecAccessCount() |
|
271 { |
|
272 TContactItemId theid; |
|
273 TContactIter iter(*CntTest->Db()); |
|
274 theid=iter.FirstL(); |
|
275 while(theid!=KNullContactId ) |
|
276 { |
|
277 CContactItem* contactItem=CntTest->Db()->OpenContactL(theid); |
|
278 CleanupStack::PushL(contactItem); |
|
279 if (contactItem->IsDeleted()) |
|
280 test.Next(_L("Synchronizer knows record 2 is deleted")); |
|
281 |
|
282 contactItem->DecAccessCount(); |
|
283 CntTest->Db()->CommitContactL(*contactItem); |
|
284 theid=iter.NextL(); |
|
285 CleanupStack::PopAndDestroy(); // contactitem |
|
286 } |
|
287 } |
|
288 |
|
289 LOCAL_C void Synchronize() |
|
290 { |
|
291 DecAccessCount(); |
|
292 } |
|
293 |
|
294 /** |
|
295 |
|
296 @SYMTestCaseID PIM-T-EXPDEL-0001 |
|
297 |
|
298 */ |
|
299 |
|
300 LOCAL_C void DoTestsL() |
|
301 { |
|
302 // create test database |
|
303 test.Start(_L("@SYMTESTCaseID:PIM-T-EXPDEL-0001 Preparing tests")); |
|
304 |
|
305 |
|
306 FileRegister = CTestRegister::NewLC(); |
|
307 |
|
308 TheIds=CContactIdArray::NewLC(); |
|
309 |
|
310 TRAPD(err,CContactDatabase::DeleteDatabaseL(KDatabaseFileName)); |
|
311 if (err < KErrNotFound) |
|
312 { |
|
313 User::Leave(err); |
|
314 } |
|
315 |
|
316 CVersitTest* vtest=NULL; |
|
317 if (vtest) |
|
318 CleanupStack::PopAndDestroy(); //vtest; |
|
319 vtest=new(ELeave)CVCardTest; |
|
320 CleanupStack::PushL(vtest); |
|
321 CVersitTest* vtest2=NULL; |
|
322 vtest2=new(ELeave)CVCardTest; |
|
323 CleanupStack::PushL(vtest2); |
|
324 |
|
325 //Populating |
|
326 test.Next(_L("creating 20 contacts")); |
|
327 |
|
328 CContactDatabase *db=CntTest->CreateDatabaseL(); |
|
329 AddNewContactsL(); |
|
330 test(db->CountL()==20); |
|
331 test.Next(_L("Increase Access Count")); |
|
332 |
|
333 IncAccessCount(); |
|
334 test.Next(_L("Removing second contact")); |
|
335 |
|
336 TContactIter iter(*db); |
|
337 TContactItemId theid=iter.FirstL(); |
|
338 theid=iter.NextL(); |
|
339 db->DeleteContactL(theid); |
|
340 test(db->CountL()==19); |
|
341 test.Next(_L("Synchronizing")); |
|
342 |
|
343 Synchronize(); |
|
344 test(db->CountL()==19); |
|
345 test.Next(_L("Exporting")); |
|
346 |
|
347 TheIds=CContactIdArray::NewLC(); |
|
348 theid=iter.FirstL(); |
|
349 while(theid!=KNullContactId ) |
|
350 { |
|
351 TheIds->AddL(theid); |
|
352 theid=iter.NextL(); |
|
353 } |
|
354 RFile file; |
|
355 FileRegister->CreateTempFileLC(file, _L("expdela")); |
|
356 CDirectFileStore* store = CDirectFileStore::NewLC(file); |
|
357 store->SetTypeL(KDirectFileStoreLayoutUid); |
|
358 RStoreWriteStream outstream; |
|
359 TStreamId id = outstream.CreateLC(*store); |
|
360 TUid uid; |
|
361 uid.iUid=KVersitEntityUidVCard; |
|
362 db->ExportSelectedContactsL(uid,*TheIds,outstream,CContactDatabase::EIncludeX | CContactDatabase::EIncreaseAccessCount); |
|
363 |
|
364 outstream.CommitL(); |
|
365 store->SetRootL(id); |
|
366 store->CommitL(); |
|
367 CleanupStack::PopAndDestroy(3); // store, oustream, file |
|
368 |
|
369 CleanupStack::PopAndDestroy(); //TheIds |
|
370 test.Next(_L("Emptying database")); |
|
371 |
|
372 EmptyDatabase(); |
|
373 |
|
374 if (TheItems) |
|
375 TheItems->ResetAndDestroy(); |
|
376 delete TheItems; |
|
377 if (TheItems2) |
|
378 TheItems2->ResetAndDestroy(); |
|
379 delete TheItems2; |
|
380 |
|
381 CleanupStack::PopAndDestroy(2); // vtest, vtest2 |
|
382 CntTest->CloseDatabase(); |
|
383 CleanupStack::PopAndDestroy(); //TheIds |
|
384 CleanupStack::PopAndDestroy(FileRegister); |
|
385 } |
|
386 |
|
387 GLDEF_C TInt E32Main() |
|
388 { |
|
389 CntTest=new(ELeave) CCntTest; |
|
390 CntTest->ConstructL(test,KDatabaseFileName); |
|
391 TRAPD(err,DoTestsL()); |
|
392 CntTest->EndTestLib(err); |
|
393 return KErrNone; |
|
394 } |