--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lowlevellibsandfws/apputils/tsrc/T_CLIPB.CPP Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,423 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Started by DWW, October 1996
+// Tests cliboard
+//
+//
+
+#include <e32test.h>
+#include <baclipb.h>
+#include <bautils.h>
+#include <f32file.h>
+#include <s32strm.h>
+#include <s32stor.h>
+#include <s32file.h>
+
+LOCAL_D RTest test(_L("T_CLIPB"));
+
+const TUid KClipboardFileUid={268435515};
+const TUid KUidNameClipboardType={77001};
+const TUid KUidAddressClipboardType={77002};
+const TUid KUidNumberClipboardType={77003};
+const TUid KUidTestType={77004};
+
+const TPtrC KClipboardFileCDrive=_L("C:\\System\\Data\\ClpBoard.cbd");
+const TPtrC KClipboardFileDDrive=_L("D:\\System\\Data\\ClpBoard.cbd");
+const TPtrC KClipboardFileEDrive=_L("E:\\System\\Data\\ClpBoard.cbd");
+/**
+ * NOTE :- On order to run this test in WINS, there must exist a mapping for the drives
+ * used above. So in Epoc32\Data add the following lines to epoc.ini...
+ *
+ * _epoc_drive_d \epoc32\wins\d
+ * _epoc_drive_e \epoc32\wins\e
+ *
+ * only needed for drive D & E as there is a mapping for drive C.
+ * Plus make sure that the the above directories (\epoc32\wins\d & e) exist.
+ */
+
+class TClBase
+ {
+public:
+ virtual void CopyToClipboardL(CStreamStore& aStore,CStreamDictionary& aDictionary) const=0;
+ virtual TBool PasteFromClipboardL(CStreamStore& aStore,CStreamDictionary& aDictionary)=0;
+ void CopyL();
+ TBool PasteL();
+ TBool PasteWithoutClipboardL();
+private:
+ void DoCopyL(RFs& aFsSession);
+ TBool DoPasteL(RFs& aFsSession);
+ };
+
+void TClBase::CopyL()
+ {
+ RFs fsSession;
+ User::LeaveIfError(fsSession.Connect());
+ TRAPD(err,DoCopyL(fsSession));
+ fsSession.Close();
+ User::LeaveIfError(err);
+ }
+
+void TClBase::DoCopyL(RFs& aFsSession)
+ {
+ CClipboard* cb=CClipboard::NewForWritingLC(aFsSession);
+ CopyToClipboardL(cb->Store(),cb->StreamDictionary());
+ cb->CommitL();
+ CleanupStack::PopAndDestroy();
+ }
+
+TBool TClBase::PasteL()
+ {
+ RFs fsSession;
+ User::LeaveIfError(fsSession.Connect());
+ TBool res=EFalse;
+ TRAPD(err,res=DoPasteL(fsSession));
+ fsSession.Close();
+ User::LeaveIfError(err);
+ return(res);
+ }
+
+TBool TClBase::DoPasteL(RFs& aFsSession)
+ {
+ CClipboard* cb=CClipboard::NewForReadingLC(aFsSession);
+ TBool res=PasteFromClipboardL(cb->Store(),cb->StreamDictionary());
+ CleanupStack::PopAndDestroy();
+ return(res);
+ }
+
+class TClName : public TClBase
+ {
+public:
+ void CopyToClipboardL(CStreamStore& aStore,CStreamDictionary& aDictionary) const;
+ TBool PasteFromClipboardL(CStreamStore& aStore,CStreamDictionary& aDictionary);
+public:
+ TBuf<4> iName;
+ };
+
+class TClNameWithAddress : public TClName
+ {
+ void CopyToClipboardL(CStreamStore& aStore,CStreamDictionary& aDictionary) const;
+ TBool PasteFromClipboardL(CStreamStore& aStore,CStreamDictionary& aDictionary);
+public:
+ TBuf<10> iAddress;
+ };
+
+class TClNameWithNumber : public TClName
+ {
+ void CopyToClipboardL(CStreamStore& aStore,CStreamDictionary& aDictionary) const;
+ TBool PasteFromClipboardL(CStreamStore& aStore,CStreamDictionary& aDictionary);
+public:
+ TInt32 iNumber;
+ };
+
+class TClInteger : public TClBase
+ {
+public:
+ void CopyToClipboardL(CStreamStore& aStore,CStreamDictionary& aDictionary) const;
+ TBool PasteFromClipboardL(CStreamStore& aStore,CStreamDictionary& aDictionary);
+public:
+ TInt32 iInteger;
+ };
+
+void TClName::CopyToClipboardL(CStreamStore& aStore,CStreamDictionary& aDictionary) const
+ {
+ RStoreWriteStream stream;
+ TStreamId streamId=stream.CreateLC(aStore);
+ stream<<iName;
+ CleanupStack::PopAndDestroy();
+ aDictionary.AssignL(KUidNameClipboardType,streamId);
+ }
+
+TBool TClName::PasteFromClipboardL(CStreamStore& aStore,CStreamDictionary& aDictionary)
+ {
+ TStreamId streamId=aDictionary.At(KUidNameClipboardType);
+ if (streamId==KNullStreamId)
+ return(EFalse);
+ RStoreReadStream stream;
+ stream.OpenLC(aStore,streamId);
+ stream>>iName;
+ CleanupStack::PopAndDestroy();
+ return(ETrue);
+ }
+
+void TClNameWithAddress::CopyToClipboardL(CStreamStore& aStore,CStreamDictionary& aDictionary) const
+ {
+ TClName::CopyToClipboardL(aStore,aDictionary);
+ RStoreWriteStream stream;
+ TStreamId streamId=stream.CreateLC(aStore);
+ stream<<iAddress;
+ CleanupStack::PopAndDestroy();
+ aDictionary.AssignL(KUidAddressClipboardType,streamId);
+ }
+
+TBool TClNameWithAddress::PasteFromClipboardL(CStreamStore& aStore,CStreamDictionary& aDictionary)
+ {
+ TBool namePasted=TClName::PasteFromClipboardL(aStore,aDictionary);
+ TStreamId streamId=aDictionary.At(KUidAddressClipboardType);
+ if (streamId==KNullStreamId)
+ return(namePasted);
+ RStoreReadStream stream;
+ stream.OpenLC(aStore,streamId);
+ stream>>iAddress;
+ CleanupStack::PopAndDestroy();
+ return(ETrue);
+ }
+
+void TClNameWithNumber::CopyToClipboardL(CStreamStore& aStore,CStreamDictionary& aDictionary) const
+ {
+ TClName::CopyToClipboardL(aStore,aDictionary);
+ RStoreWriteStream stream;
+ TStreamId streamId=stream.CreateLC(aStore);
+ stream<<iNumber;
+ CleanupStack::PopAndDestroy();
+ aDictionary.AssignL(KUidNumberClipboardType,streamId);
+ }
+
+TBool TClNameWithNumber::PasteFromClipboardL(CStreamStore& aStore,CStreamDictionary& aDictionary)
+ {
+ TBool namePasted=TClName::PasteFromClipboardL(aStore,aDictionary);
+ TStreamId streamId=aDictionary.At(KUidNumberClipboardType);
+ if (streamId==KNullStreamId)
+ return(namePasted);
+ RStoreReadStream stream;
+ stream.OpenLC(aStore,streamId);
+ stream>>iNumber;
+ CleanupStack::PopAndDestroy();
+ return(ETrue);
+ }
+
+void TClInteger::CopyToClipboardL(CStreamStore& aStore,CStreamDictionary& aDictionary) const
+ {
+ RStoreWriteStream stream;
+ TStreamId streamId=stream.CreateLC(aStore);
+ stream<<iInteger;
+ CleanupStack::PopAndDestroy();
+ aDictionary.AssignL(KUidNumberClipboardType,streamId);
+ }
+
+TBool TClInteger::PasteFromClipboardL(CStreamStore& aStore,CStreamDictionary& aDictionary)
+ {
+ TStreamId streamId=aDictionary.At(KUidNumberClipboardType);
+ if (streamId==KNullStreamId)
+ return(EFalse);
+ RStoreReadStream stream;
+ stream.OpenLC(aStore,streamId);
+ stream>>iInteger;
+ CleanupStack::PopAndDestroy();
+ return(ETrue);
+ }
+
+/**
+@SYMTestCaseID SYSLIB-BAFL-CT-0404
+@SYMTestCaseDesc Tests the CClipboard::Store(),StreamDictionary functions
+@SYMTestPriority High
+@SYMTestActions Tests the clipboard's file store with various cases(no file,file in use,corrupt file,non-store file)
+@SYMTestExpectedResults Tests must not fail
+@SYMREQ REQ0000
+*/
+void TestErrorHandling(const TDesC& aTestPath)
+ {
+
+ test.Next(_L(" @SYMTestCaseID:SYSLIB-BAFL-CT-0404 "));
+ TPtrC KClipboardFile(aTestPath);
+ RFs fs;
+ test (fs.Connect()==KErrNone);
+//
+ test.Next(_L("No clipboard file"));
+ fs.Delete(KClipboardFile);
+ test (CClipboard::Clear(fs)==KErrNone);
+ CClipboard* cb=NULL;
+ TRAPD(err,cb=CClipboard::NewForReadingL(fs));
+ test (err==KErrNone);
+ test (&cb->Store()==NULL);
+ test (&cb->StreamDictionary()!=NULL);
+ test (cb->StreamDictionary().IsNull());
+ delete cb;
+//
+ test.Next(_L("In use"));
+ RFile file;
+ test (file.Create(fs,KClipboardFile,EFileRead|EFileWrite)==KErrNone);
+ TRAP(err,cb=CClipboard::NewForReadingL(fs));
+ test (err==KErrNone);
+ test (&cb->Store()==NULL);
+ test (&cb->StreamDictionary()!=NULL);
+ test (cb->StreamDictionary().IsNull());
+ delete cb;
+//
+ test.Next(_L("Clear while in use"));
+ test (CClipboard::Clear(fs)==KErrInUse);
+//
+ test.Next(_L("Bogus clipboard file"));
+ file.Close();
+ TRAP(err,cb=CClipboard::NewForReadingL(fs));
+ test (err==KErrNone);
+ test (&cb->Store()==NULL);
+ test (&cb->StreamDictionary()!=NULL);
+ test (cb->StreamDictionary().IsNull());
+ delete cb;
+//
+ test.Next(_L("Non-store file"));
+ test (file.Replace(fs,KClipboardFile,EFileRead|EFileWrite)==KErrNone);
+ test (file.Write(_L8("some data which does not make this a file store"))==KErrNone);
+ file.Close();
+ TRAP(err,cb=CClipboard::NewForReadingL(fs));
+ test (err==KErrNone);
+ test (&cb->Store()==NULL);
+ test (&cb->StreamDictionary()!=NULL);
+ test (cb->StreamDictionary().IsNull());
+ delete cb;
+//
+ test.Next(_L("Wrong type file"));
+ CFileStore* store=CDirectFileStore::ReplaceLC(fs,KClipboardFile,EFileRead|EFileWrite);
+ store->SetTypeL(TUidType(KDirectFileStoreLayoutUid,KUidTestType));
+ store->CommitL();
+ CleanupStack::PopAndDestroy();
+ TRAP(err,cb=CClipboard::NewForReadingL(fs));
+ test (err==KErrNone);
+ test (&cb->Store()==NULL);
+ test (&cb->StreamDictionary()!=NULL);
+ test (cb->StreamDictionary().IsNull());
+ delete cb;
+//
+ test.Next(_L("Corrupted clipboard"));
+ store=CDirectFileStore::ReplaceLC(fs,KClipboardFile,EFileRead|EFileWrite);
+ store->SetTypeL(TUidType(KDirectFileStoreLayoutUid,KClipboardFileUid));
+ store->CommitL();
+ CleanupStack::PopAndDestroy();
+ TRAP(err,cb=CClipboard::NewForReadingL(fs));
+ test (err==KErrNone);
+ test (&cb->Store()==NULL);
+ test (&cb->StreamDictionary()!=NULL);
+ test (cb->StreamDictionary().IsNull());
+ delete cb;
+//
+ test.Next(_L("Clear clipboard"));
+ test (CClipboard::Clear(fs)==KErrNone);
+ TRAP(err,cb=CClipboard::NewForReadingL(fs));
+ test (err==KErrNone);
+ test (&cb->Store()==NULL);
+ test (&cb->StreamDictionary()!=NULL);
+ test (cb->StreamDictionary().IsNull());
+ delete cb;
+//
+#if defined(_DEBUG)
+ test.Next(_L("Out of memory failure"));
+//
+ cb=CClipboard::NewForWritingLC(fs);
+ RStoreWriteStream stream;
+ TStreamId testId=stream.CreateLC(cb->Store());
+ stream.WriteInt32L(0);
+ stream.CommitL();
+ CleanupStack::PopAndDestroy();
+ cb->StreamDictionary().AssignL(KUidTestType,testId);
+ cb->CommitL();
+ CleanupStack::PopAndDestroy();
+//
+ __UHEAP_MARK;
+ for (TInt ii=0;;++ii)
+ {
+ __UHEAP_FAILNEXT(ii);
+ TRAP(err,cb=CClipboard::NewForReadingL(fs));
+ if (err==KErrNone)
+ break;
+ test(err==KErrNoMemory);
+ __UHEAP_CHECK(0);
+ }
+ __UHEAP_RESET;
+ test (&cb->Store()!=NULL);
+ test (cb->StreamDictionary().At(KUidTestType)==testId);
+ delete cb;
+ __UHEAP_MARKEND;
+//
+#endif
+//
+ test.Next(_L("Fail to commit clipboard"));
+ TRAP(err,cb=CClipboard::NewForWritingLC(fs);CleanupStack::Pop());
+ test (err==KErrNone);
+ delete cb;
+ test (!BaflUtils::FileExists(fs,KClipboardFile));
+//
+ fs.Close();
+ }
+
+/**
+@SYMTestCaseID SYSLIB-BAFL-CT-0405
+@SYMTestCaseDesc Tests the CClipboard::NewForWritingLC,NewForReadingL
+@SYMTestPriority High
+@SYMTestActions Tests for copy and paste operations on TClName,TClNameWithAddress,TClInteger,TClNameWithNumber
+@SYMTestExpectedResults Tests must not fail
+@SYMREQ REQ0000
+*/
+void DoTestsOnDrive(const TDesC& aDrivePath)
+ {
+ test.Start(_L(" @SYMTestCaseID:SYSLIB-BAFL-CT-0405 Test single paste "));
+ TClName n1,n2;
+ n1.iName=_L("Fred");
+ n2.iName=_L("Dino");
+ n1.CopyL();
+ TClNameWithAddress na1,na2;
+ test(na1.PasteL());
+ n2.CopyL();
+ test(na2.PasteL());
+ test(na1.iName==_L("Fred"));
+ test(na2.iName==_L("Dino"));
+ na1.iAddress=_L("Bedrock");
+ test.Next(_L("Test double paste"));
+ na1.CopyL();
+ test(na2.PasteL());
+ test(na2.iAddress==_L("Bedrock"));
+ test(na2.iName==_L("Fred"));
+ test.Next(_L("Test paste failure if type not present"));
+ TClInteger i1,i2;
+ test(!i1.PasteL());
+ test.Next(_L("Test selecting the right data type"));
+ TClNameWithNumber nn1,nn2;
+ nn1.iNumber=36363;
+ test(nn1.PasteL());
+ test(nn1.iNumber==36363);
+ test(nn1.iName==_L("Fred"));
+ nn1.iName=_L("Wilm");
+ nn1.CopyL();
+ test(i2.PasteL());
+ test(i2.iInteger==36363);
+ test(n1.PasteL());
+ test(n1.iName==_L("Wilm"));
+ test(nn2.PasteL());
+ test(nn2.iName==_L("Wilm"));
+ test(nn2.iNumber==36363);
+//
+ TestErrorHandling(aDrivePath);
+ test.End();
+ }
+
+void DoTests()
+ {
+ // Tests for the HAL attribute ClipboardDrive set in the device.
+ // C Drive
+ DoTestsOnDrive(KClipboardFileCDrive);
+ }
+
+GLDEF_C TInt E32Main()
+ {
+ __UHEAP_MARK;
+ CTrapCleanup *cleanup=CTrapCleanup::New();
+ test.Title();
+ test.Start(_L("Testing CClipboard "));
+ TRAPD(err,DoTests());
+ test(err==KErrNone);
+ test.End();
+ test.Close();
+ delete cleanup;
+ __UHEAP_MARKEND;
+ return(0);
+ }