First public contribution.
2 * Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
4 * This component and the accompanying materials are made available
5 * under the terms of the License "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".
9 * Initial Contributors:
10 * Nokia Corporation - initial contribution.
15 * Test program exercises the swi observer UPS API.
16 * See individual test functions for more information.
26 #include <e32ldr_private.h>
27 #include "rtestwrapper.h"
29 #include <ups/upsclient.h>
32 using namespace UserPromptService;
34 /** Top-level test object renders stages and confirms conditions. */
35 static RTestWrapper test(_L("UPSTESTOBSIF"));
37 static RUpsManagement sMngmntSession;
39 void PopulateDatabaseL()
41 test.Start(_L("Populate database"));
43 User::LeaveIfError(session.Connect());
44 CleanupClosePushL(session);
47 RUpsSubsession clientSubsession;
48 TInt r = clientSubsession.Initialise(session, thd);
50 CleanupClosePushL(clientSubsession);
53 destination.CreateL(100);
54 CleanupClosePushL(destination);
56 for(TInt i=0 ; i<100; ++i)
58 TServiceId serviceId = {42};
59 if( i & 1) serviceId.iUid = 43;
61 destination.AppendFormat(_L("destination %x"), i);
63 TUpsDecision dec = EUpsDecNo;
65 clientSubsession.Authorise(EFalse, serviceId, destination, _L8("Opaque data"), dec, rs);
66 User::WaitForRequest(rs);
68 if(serviceId.iUid == 42)
70 test(dec == EUpsDecYes);
74 test(dec == EUpsDecNo);
79 CleanupStack::PopAndDestroy(&destination);
80 CleanupStack::PopAndDestroy(&clientSubsession);
81 CleanupStack::PopAndDestroy(&session);
88 NONSHARABLE_CLASS(CRequest) : public CActive
91 static CRequest *NewL(RUpsSession &aSession, CTestSwiIf &aParent, TInt aId, TUpsDecision aExpected);
94 CRequest(CTestSwiIf &aParent, TUpsDecision aExpected);
95 void ConstructL(RUpsSession &aSession, TInt aId);
98 virtual void DoCancel();
99 virtual TInt RunError(TInt aError);
103 RUpsSubsession iSubSession;
106 TUpsDecision iExpected;
110 NONSHARABLE_CLASS(CTestSwiIf) : public CActive
113 static CTestSwiIf *NewL();
132 virtual void DoCancel();
133 virtual TInt RunError(TInt aError);
139 RUpsSession iUpsSession;
140 RUpsManagement iManagementSession;
143 CTestSwiIf *CTestSwiIf::NewL()
145 CTestSwiIf *self = new(ELeave) CTestSwiIf;
146 CleanupStack::PushL(self);
148 CleanupStack::Pop(self);
152 CTestSwiIf::CTestSwiIf()
153 : CActive(CActive::EPriorityStandard), iState(EPrePolicyChange)
155 CActiveScheduler::Add(this);
158 _LIT(KCheckIfFailed, "z:\\private\\10283558\\policies\\ups_102836c3_0000002b_checkiffailed.rsc");
159 _LIT(KResourceFileDirC, "c:\\private\\10283558\\policies\\");
160 _LIT(KResourceFileOnC, "c:\\private\\10283558\\policies\\ups_102836c3_0000002b.rsc");
162 void CTestSwiIf::ConstructL()
164 User::LeaveIfError(iFs.Connect());
166 // Make sure the C: policy is deleted.
167 (void)iFs.Delete(KResourceFileOnC);
169 // Make sure server is not holding cached values for the C: policy
170 sMngmntSession.ShutdownServer();
171 sMngmntSession.Close();
172 User::LeaveIfError(sMngmntSession.Connect());
174 User::LeaveIfError(iUpsSession.Connect());
175 User::LeaveIfError(iManagementSession.Connect());
178 TRequestStatus *rs = &iStatus;
179 *rs = KRequestPending;
180 User::RequestComplete(rs, KErrNone);
185 CTestSwiIf::~CTestSwiIf()
188 iManagementSession.Close();
193 void CTestSwiIf::IncUsers()
198 void CTestSwiIf::DecUsers()
201 if((iUsers <= 0) && (iState == ETestingComplete))
203 CActiveScheduler::Stop();
208 void CTestSwiIf::RunL()
210 test(iStatus.Int() == KErrNone);
213 case EPrePolicyChange:
217 (void)CRequest::NewL(iUpsSession, *this, 42, EUpsDecYes);
218 (void)CRequest::NewL(iUpsSession, *this, 18, EUpsDecYes);
219 (void)CRequest::NewL(iUpsSession, *this, 75, EUpsDecNo);
220 (void)CRequest::NewL(iUpsSession, *this, 20, EUpsDecYes);
221 (void)CRequest::NewL(iUpsSession, *this, 15, EUpsDecNo);
223 (void)iFs.MkDirAll(KResourceFileDirC);
225 CFileMan *fileman = CFileMan::NewL(iFs);
226 CleanupStack::PushL(fileman);
227 TInt r = fileman->Copy(KCheckIfFailed, KResourceFileOnC);
228 User::LeaveIfError(r);
229 CleanupStack::PopAndDestroy(fileman);
232 iManagementSession.NotifyPolicyFilesChanged(rs);
233 iManagementSession.CancelNotifyPolicyFilesChanged();
234 User::WaitForRequest(rs);
235 if(rs.Int() != KErrCancel) User::Leave(rs.Int());
237 iState = EPostPolicyChange;
238 iManagementSession.NotifyPolicyFilesChanged(iStatus);
242 case EPostPolicyChange:
243 // Notify complete, do some more queries
244 (void)CRequest::NewL(iUpsSession, *this, 42, EUpsDecYes);
245 (void)CRequest::NewL(iUpsSession, *this, 18, EUpsDecYes);
246 (void)CRequest::NewL(iUpsSession, *this, 75, EUpsDecYes);
247 (void)CRequest::NewL(iUpsSession, *this, 20, EUpsDecYes);
248 (void)CRequest::NewL(iUpsSession, *this, 15, EUpsDecYes);
251 User::LeaveIfError(iFs.Delete(KResourceFileOnC));
253 iState = ERevertPolicyChange;
254 iManagementSession.NotifyPolicyFilesChanged(iStatus);
258 case ERevertPolicyChange:
259 iState = ETestingComplete;
262 CActiveScheduler::Stop();
266 case ETestingComplete:
271 void CTestSwiIf::DoCancel()
275 case EPrePolicyChange:
277 TRequestStatus *rs = &iStatus;
278 if(*rs == KRequestPending)
280 User::RequestComplete(rs, KErrCancel);
285 case EPostPolicyChange:
286 iManagementSession.CancelNotifyPolicyFilesChanged();
289 case ERevertPolicyChange:
290 iManagementSession.CancelNotifyPolicyFilesChanged();
293 case ETestingComplete:
299 TInt CTestSwiIf::RunError(TInt aError)
301 User::Panic(_L("CTestSwiIf::RunError"), aError);
302 /*lint -unreachable */
306 CRequest *CRequest::NewL(RUpsSession &aSession, CTestSwiIf &aParent, TInt aId, TUpsDecision aExpected)
308 CRequest *self = new(ELeave) CRequest(aParent, aExpected);
309 CleanupStack::PushL(self);
310 self->ConstructL(aSession, aId);
311 CleanupStack::Pop(self);
315 CRequest::CRequest(CTestSwiIf &aParent, TUpsDecision aExpected)
316 : CActive(CActive::EPriorityStandard-1),
320 CActiveScheduler::Add(this);
324 void CRequest::ConstructL(RUpsSession &aSession, TInt aId)
327 User::LeaveIfError(iSubSession.Initialise(aSession, thd));
328 TServiceId serviceId = {42};
329 if( aId & 1) serviceId.iUid = 43;
331 destination.CreateL(100);
332 CleanupClosePushL(destination);
333 destination.AppendFormat(_L("destination %x"), aId);
336 iSubSession.Authorise(EFalse, serviceId, destination, _L8("Opaque data"), iDec, iStatus);
339 CleanupStack::PopAndDestroy(&destination);
342 CRequest::~CRequest()
348 void CRequest::RunL()
350 test(iStatus.Int() == KErrNone);
351 test(iDec == iExpected);
355 void CRequest::DoCancel()
359 TInt CRequest::RunError(TInt aError)
361 User::Panic(_L("CRequest::RunError"), aError);
362 /*lint -unreachable */
368 void TestSwiObserverL()
370 test.Start(_L("Testing swi observer functions work from here..."));
372 RUpsManagement session;
373 User::LeaveIfError(session.Connect());
374 CleanupClosePushL(session);
376 session.NotifyPluginsMayHaveChangedL();
379 session.NotifyPolicyFilesChanged(rs);
380 User::WaitForRequest(rs);
382 test(rs.Int() == KErrNone);
384 session.CancelNotifyPolicyFilesChanged();
386 TSecureId ourSid(0x10283559);
387 session.DeleteDecisionsForExeL(ourSid);
390 CleanupStack::PopAndDestroy(&session);
395 // -------- entrypoint --------
400 CActiveScheduler *scheduler = new(ELeave) CActiveScheduler;
401 CActiveScheduler::Install(scheduler);
402 CleanupStack::PushL(scheduler);
404 test.Title(_L("c:\\upstestobsif.log"));
405 test.Start(_L(" @SYMTestCaseID:SEC-UPS-OBSIF-0001 Testing RUpsSession SWI observer IF "));
408 User::LeaveIfError(fs.Connect());
409 CleanupClosePushL(fs);
411 User::LeaveIfError(sMngmntSession.Connect());
412 sMngmntSession.ShutdownServer();
413 sMngmntSession.Close();
415 TBuf<21> notifierConfig(_L("!:\\upsrefnotifier.txt"));
416 notifierConfig[0] = fs.GetSystemDriveChar();
418 TInt lineLength = User::CommandLineLength();
422 // fall through - extra command line arguments are ignored
424 // 2 char arg - Delete DB and run interactive
425 (void) fs.Delete(_L("c:\\Private\\10283558\\database\\ups.db"));
426 // Fall through to also delete notifier config file
428 // 1 char arg - Run interactive, without deleting DB
429 (void) fs.Delete(notifierConfig);
433 // No args - delete DB and run in silent mode
434 (void) fs.Delete(_L("c:\\Private\\10283558\\database\\ups.db"));
436 (void) fs.Delete(notifierConfig);
438 User::LeaveIfError(file.Create(fs, notifierConfig, EFileShareExclusive | EFileWrite));
439 User::LeaveIfError(file.Write(_L8("Always")));
445 User::LeaveIfError(sMngmntSession.Connect());
446 CleanupClosePushL(sMngmntSession);
449 CTestSwiIf *t = CTestSwiIf::NewL();
450 CActiveScheduler::Start();
456 sMngmntSession.ShutdownServer();
458 // Close top level session (low level session was closed by
459 // ShutdownServer, but we still need to do the RUpsManagement
461 CleanupStack::PopAndDestroy(&sMngmntSession);
463 (void) fs.Delete(notifierConfig);
464 CleanupStack::PopAndDestroy(&fs);
469 CleanupStack::PopAndDestroy(scheduler);
472 void PanicIfError(TInt r)
476 User::Panic(_L("upstest failed: "), r);
483 Executable entrypoint establishes connection with UPS server
484 and then invokes tests for each functional area.
486 @return Symbian OS error code where KErrNone indicates
487 success and any other value indicates failure.
490 // disable lazy DLL unloading so kernel heap balances at end
492 PanicIfError(l.Connect());
493 PanicIfError(l.CancelLazyDllUnload());
499 // allocating a cleanup stack also installs it
500 CTrapCleanup* tc = CTrapCleanup::New();
508 User::Panic(_L("upstest failed: "), err);