contentstorage/casrv/cawidgetscanner/tsrc/t_cawidgetscanner/src/t_cawidgetscanner.cpp
changeset 117 c63ee96dbe5f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contentstorage/casrv/cawidgetscanner/tsrc/t_cawidgetscanner/src/t_cawidgetscanner.cpp	Thu Sep 16 12:11:40 2010 +0100
@@ -0,0 +1,1025 @@
+/*
+* Copyright (c) 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:
+*
+*/
+/*
+ * T_cahswidgetscanner.cpp
+ *
+ *  Created on: 2009-09-16
+ *      Author:
+ */
+
+//  CLASS HEADER
+
+
+#include <ecom/ecom.h>
+#include <QScopedPointer>
+#include <utf.h>
+#include <xml/dom/xmlengdocument.h>
+#include <XQConversions>
+#include <usif/sif/sifcommon.h>
+#include <usif/sif/sif.h>
+#include <xmlengelement.h>
+#include <driveinfo.h>
+
+#include "t_cawidgetscanner.h"
+#include "cawidgetscannertestutils.h"
+#include "waitactive.h"
+#include "casrvengutils.h"
+#include "castorageproxy.h"
+#include "casrvmanager.h"
+#include "casrvplugin.h"
+#include "cainnerentry.h"
+#include "cainnerquery.h"
+#include "caarraycleanup.inl"
+#include "testconsts.h"
+#include "cadef.h"
+#include "castorage_global.h"
+
+#include "cawidgetscannerparser.h"
+#include "cawidgetstoragehandler.h"
+#include "cawidgetscannerplugin.h"
+#include "cawidgetscannerdef.h"
+#include "WidgetScannerUtils.h"
+
+
+#include "t_cainstaller.h"
+
+const TUid KHsWidgetPluginUid = {0x20026FB1};
+const TInt installedUid = 0x20053785;
+
+_LIT8( KSisxMimeType, "x-epoc/x-sisx-app" );
+_LIT( KTestLibrary, "C:\\private\\20022F35\\import\\widgetregistry\\20053785\\testwidget" );
+_LIT8( KWidgetUID, "testwidgetprovider.dll" );
+_LIT( KWidgetLibrary2, "C:\\private\\20022F35\\import\\widgetregistry\\20053785\\testwidget22" );
+_LIT( KWidgetLibrary3, "C:\\private\\20022F35\\import\\widgetregistry\\20053785\\testwidget33" );
+
+_LIT( KWidget1PackageName, "c:\\testing\\data\\Installs\\validwidget1.SISX" );
+_LIT( KWidget2PackageName, "c:\\testing\\data\\Installs\\validwidget2.SISX" );
+_LIT( KWidget3PackageName, "c:\\testing\\data\\Installs\\validwidget3.SISX" );
+_LIT( KWidget4PackageName, "c:\\testing\\data\\Installs\\validwidget4.SISX" );
+_LIT( KWidget1ManifestName, "C:\\private\\20022F35\\import\\widgetregistry\\20053785\\validwidget1.manifest" );
+_LIT( KWidget2ManifestName, "C:\\private\\20022F35\\import\\widgetregistry\\20053785\\validwidget2.manifest" );
+_LIT( KWidget3ManifestName, "C:\\private\\20022F35\\import\\widgetregistry\\20053785\\validwidget3.manifest" );
+_LIT( KWidget4ManifestName, "C:\\private\\20022F35\\import\\widgetregistry\\20053785\\validwidget4.manifest" );
+_LIT( KWidgetQmFolder, "c:\\resource\\qt\\translations\\" );
+_LIT( KWidgetQmFolderAndFile, "c:\\resource\\qt\\translations\\" );
+_LIT( KWidgetQmFile, "c:\\testing\\data\\t_cawidgetscanner\\widgettranslation_en_GB.qm" );
+_LIT( KWidgetUri1, "testwidget" );
+_LIT( KWidgetUri2, "testwidget22" );
+_LIT( KWidgetUri3, "testwidget33" );
+_LIT( KWidgetUri4, "testwidget44" );
+_LIT( KTranslationFileNameAsInManifest, "widgettranslation" );
+
+template <typename RClass>
+struct RClassDeleter
+{
+    static inline void cleanup(RClass *ptr)
+    {
+        ptr->Close();
+    }
+};
+
+typedef QScopedPointer<RBuf, 
+    RClassDeleter<RBuf> > RBufGuard;
+typedef QScopedPointer<RBuf8, 
+    RClassDeleter<RBuf8> > RBuf8Guard;
+        
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void T_CaWidgetScanner::WaitL(TInt aMicroSec)
+    {
+    CWaitActive* wait = CWaitActive::NewL();
+    wait->Wait(aMicroSec);
+    delete wait;
+    }
+
+void T_CaWidgetScanner::initTestCase()
+    {
+    const TUid KWidgetHandlerPluginUid = {0x20028707};
+    TRAPD(err,
+        iTestUtils = CTestUtils::NewL();
+        iTestUtils->CopyDb();
+
+        // remove hswidget
+        iStorage = CCaStorageProxy::NewL();
+        iSrvEngUtils = CCaSrvEngUtils::NewL();
+        iScr = new Usif::RSoftwareComponentRegistry;
+        User::LeaveIfError(iScr->Connect());
+
+        iFs.Connect();
+        iImportPath.CreateL( KMaxPath );
+
+        createImportDirectoryL();
+        
+        iInstaller = T_CaInstaller::NewL();
+        TPluginParams params;
+        params.engUtils = iSrvEngUtils;
+        params.storageProxy = iStorage;
+        params.softwareRegistry = iScr;
+        iPlugin = iTestUtils->LoadPluginL( KWidgetHandlerPluginUid, &params);
+        
+        );
+    }
+
+void T_CaWidgetScanner::cleanupTestCase()
+    {
+    QTest::qWait(5000);
+    
+    iTestUtils->RemoveL(KTestDbDest);
+    delete iPlugin;
+    delete iInstaller;
+    delete iStorage;
+    iStorage = NULL;
+    delete iTestUtils;
+    iTestUtils = NULL;
+    delete iSrvEngUtils;
+    iSrvEngUtils = NULL;
+    iScr->Close();
+    delete iScr;
+    iScr = NULL;
+    iFs.Close();
+    REComSession::FinalClose();
+    iImportPath.Close();
+    iWidgetScanFolder.Close();
+    
+    iWidgetScanFile1.Close();
+    }
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void T_CaWidgetScanner::init()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void T_CaWidgetScanner::cleanup()
+    {
+	QTest::qWait(100);
+    }
+
+
+
+void T_CaWidgetScanner::createImportDirectoryL()
+    {
+    //create "parsed" directory if it doesn't exist yet;
+    // create directory on C: drive
+    iWidgetScanFolder.Close();
+    iWidgetScanFile1.Close();
+    iWidgetScanFolder.CreateL(KMaxPath);
+    iWidgetScanFile1.CreateL(KMaxPath);
+    iWidgetScanFolder.Append( KPrivate );
+    iWidgetScanFolder.Append( KHSWidgetScanFolder );
+    iWidgetScanFile1.Append(iWidgetScanFolder);
+    iWidgetScanFile1.Append(KManifestFile1);
+    }
+
+//
+// TESTS  --------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+
+void T_CaWidgetScanner::testPluginNewL()
+{
+//Check only if plugin was created correctly
+    QVERIFY( iPlugin != NULL);
+}
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+
+
+void T_CaWidgetScanner::testAddWidget()
+    {
+    bool widgetExistsInStorage(false);
+    TInt err(KErrNone);
+    
+    
+    TRAP_IGNORE(iInstaller->InstallL(KWidget1PackageName));
+    
+    QTest::qWait(3000);
+
+    TRAP_IGNORE(widgetExistsInStorage = ( iTestUtils->WidgetExistsInStorageL(
+          KAttrWidgetLibrary, KTestLibrary, iStorage ) != EFalse ));
+    
+    // clean after test
+    TRAP_IGNORE(iInstaller->UninstallL(KWidget1ManifestName))
+    QTest::qWait(3000);
+    
+    QVERIFY(widgetExistsInStorage);
+    }
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void T_CaWidgetScanner::testUpdateWidget()
+    {
+	TInt err(KErrNone);
+
+    TRAP(err,
+    		testUpdateWidgetTrapped()
+        );
+    }
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void T_CaWidgetScanner::testUpdateWidgetTrapped()
+	{
+    TInt err(KErrNone);
+    
+    TInt expectedCount(0);
+    TInt actualCount(0);
+    bool widgetAExistsInStorage(false);
+    bool widgetBExistsInStorage(false);
+
+    iInstaller->InstallL(KWidget2PackageName);
+    
+    QTest::qWait(3000);
+
+    expectedCount = iTestUtils->WidgetsCountL(iStorage);
+
+    widgetAExistsInStorage = (iTestUtils->WidgetExistsInStorageL(
+            KAttrWidgetLibrary, KWidgetLibrary2, iStorage) != FALSE);
+
+
+    iInstaller->InstallL(KWidget3PackageName);
+    QTest::qWait(3000);
+
+    widgetBExistsInStorage = (iTestUtils->WidgetExistsInStorageL(
+            KAttrWidgetUri, KWidgetUri2, iStorage) != FALSE);
+
+    actualCount = iTestUtils->WidgetsCountL(iStorage);
+    TRAP_IGNORE(iInstaller->UninstallL(KWidget2ManifestName))
+    QTest::qWait(3000);
+    TRAP_IGNORE(iInstaller->UninstallL(KWidget3ManifestName))
+    QTest::qWait(3000);
+    
+    QCOMPARE(err, KErrNone);
+    QVERIFY(widgetAExistsInStorage);
+    QVERIFY(widgetBExistsInStorage);
+    QCOMPARE(actualCount, expectedCount);
+	}
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void T_CaWidgetScanner::testRemoveMmcWidget()
+    {
+    TInt err(KErrNone);
+    TInt id(KErrNotFound);
+    bool widgetExistsInStorage(false);
+    bool mmcIdAttributeSet1(false);
+    bool mmcIdAttributeSet2(false);
+    
+    TRAP(err,
+
+        //test
+        iInstaller->InstallL(KWidget1PackageName);
+        QTest::qWait(3000);
+
+        id = AppendMmcIdL(_L("TestWidget"));
+
+        mmcIdAttributeSet1 = MmcAttributeSetL(id);
+        
+        // after unistall mmc id should be removed
+        iInstaller->UninstallL(KWidget1ManifestName);
+        
+        QTest::qWait(3000);
+        
+        mmcIdAttributeSet2 = MmcAttributeSetL(id);
+
+    );
+    
+    QCOMPARE(err, KErrNone);
+    QVERIFY(mmcIdAttributeSet1);
+    QVERIFY(!mmcIdAttributeSet2);
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void T_CaWidgetScanner::testUpdateTheSameWidget()
+	{
+    TInt err(KErrNone);
+    TRAP(err,
+		testUpdateTheSameWidgetTrapped()
+    );
+
+	}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void T_CaWidgetScanner::testUpdateTheSameWidgetTrapped()
+    {
+    _LIT( KWText, "TestWidget" );
+    TUint flags0(0U);
+    TUint flags1(0U);
+    TUint flags2(0U);
+    TInt err(KErrNone); 
+    TInt expectedCount(0);
+    TInt actualCount(0);
+	
+    iInstaller->InstallL( KWidget1PackageName );
+        
+    QTest::qWait(3000);
+
+    flags0 = iTestUtils->GetWidgetFlagsL( KWText, iStorage );
+
+    expectedCount = iTestUtils->WidgetsCountL( iStorage );
+
+    CCaWidgetDescription* widget = iTestUtils->GetWidgetEntryL( KWText, iStorage );
+        
+    if (widget == NULL)
+    {
+        User::Leave(KErrNotFound);
+    }
+        
+    CleanupStack::PushL( widget );
+    CCaInnerEntry* innerEntry = widget->GetEntryLC();
+    iStorage->TouchL( innerEntry );
+    QTest::qWait( 500 );
+
+    flags1 = iTestUtils->GetWidgetFlagsL( KWText, iStorage );
+
+    iInstaller->InstallL( KWidget1PackageName );
+    QTest::qWait(3000);
+
+    flags2 = iTestUtils->GetWidgetFlagsL( KWText, iStorage );
+
+    actualCount = iTestUtils->WidgetsCountL(iStorage);
+        
+    CleanupStack::PopAndDestroy( innerEntry );
+    CleanupStack::PopAndDestroy( widget );
+        
+
+    // clean after test
+    iInstaller->UninstallL(KWidget1ManifestName);
+    QTest::qWait(3000);
+//    QCOMPARE(err, KErrNone);
+    QVERIFY( ~(flags0 & EUsed) );
+    QVERIFY( (flags1 & EUsed) );
+    QVERIFY( ~(flags2 & EUsed) );
+    QCOMPARE(actualCount, expectedCount);
+    }
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void T_CaWidgetScanner::testUpdateMmcRemoveInsertTrapped()
+    {
+    _LIT( KWTextCanNotTranslate, "txt_applib_subtitle_downloads" );
+    TPluginParams params;
+    params.engUtils = 0;
+    params.storageProxy = iStorage;
+    params.softwareRegistry = iScr;
+    _LIT( KWTextTranslated, "Downloads" );
+    TUint flags0(0U);
+    TUint flags1(0U);
+    TUint flags2(0U);
+    TUint flags3(0U);
+    TInt err(KErrNone);
+    
+
+            
+        iTestUtils->Copy( KWidgetQmFile, KWidgetQmFolder );    
+
+        CCaWidgetStorageHandler* handler = CCaWidgetStorageHandler::NewL(
+                iStorage, *iScr, iFs );
+
+        iInstaller->InstallL( KWidget2PackageName );
+        QTest::qWait(3000);
+        //get translated widget
+        RBuf widgetName;
+        widgetName.CreateL( KWTextTranslated );
+        CCaWidgetDescription* widget = iTestUtils->GetWidgetEntryL( 
+                KWTextTranslated, iStorage );
+        if( !widget )
+            {
+            widgetName.Close();
+            widgetName.CreateL( KWTextCanNotTranslate );
+            //qm file has not found
+            widget = iTestUtils->GetWidgetEntryL( 
+                    KWTextCanNotTranslate, iStorage );
+            }
+        flags0 = iTestUtils->GetWidgetFlagsL( widgetName, iStorage );
+        CleanupStack::PushL( widget );
+        CCaInnerEntry* innerEntry = widget->GetEntryLC();
+        iStorage->TouchL( innerEntry );
+        QTest::qWait( 500 );
+
+        flags1 = iTestUtils->GetWidgetFlagsL( widgetName, iStorage );
+
+        CCaWidgetDescription* widget2 = iTestUtils->GetWidgetEntryL( widgetName, iStorage );
+        CleanupStack::PushL( widget2 );
+
+        // set missing
+        handler->SetMissingFlagL( widget2 );
+        flags2 = iTestUtils->GetWidgetFlagsL( widgetName, iStorage );
+
+        iInstaller->InstallL( KWidget2PackageName );
+        QTest::qWait( 4000 );
+
+        flags3 = iTestUtils->GetWidgetFlagsL( widgetName, iStorage );
+        widgetName.Close();
+        CleanupStack::PopAndDestroy( widget2 );
+        CleanupStack::PopAndDestroy( innerEntry );
+        CleanupStack::PopAndDestroy( widget );
+        iTestUtils->RemoveL( KWidgetQmFolderAndFile );        
+
+
+    // clean after test
+    iInstaller->UninstallL(KWidget2ManifestName);
+
+    QTest::qWait(3000);
+    QCOMPARE(err, KErrNone);
+    QVERIFY( ~(flags0 & EUsed) );
+    QVERIFY( flags1 & EUsed );
+    QVERIFY( ~(flags1 & EMissing) );
+    QVERIFY( flags2 & EUsed );
+    QVERIFY( flags2 & EMissing );
+    QVERIFY( flags3 & ~EUsed );
+    QVERIFY( flags3 & ~EMissing );
+    }
+
+void T_CaWidgetScanner::testUpdateMmcRemoveInsert()
+    {
+    TInt err(KErrNone);
+    TRAP(err,
+    		testUpdateMmcRemoveInsertTrapped()
+    );
+    }
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void T_CaWidgetScanner::testRemoveWidget()
+    {
+    TInt err(KErrNone);
+    bool widgetExistedInStorage(false);
+    bool widgetRemovedFromStorage(false);
+    
+	
+    TRAP(err,
+        
+        iInstaller->InstallL(KWidget1PackageName);
+
+        QTest::qWait(3000);
+
+        widgetExistedInStorage =( iTestUtils->WidgetExistsInStorageL(
+                KAttrWidgetLibrary, KTestLibrary, iStorage ) != FALSE);
+
+        iInstaller->UninstallL(KWidget1ManifestName);
+        
+        QTest::qWait(3000);
+
+        widgetRemovedFromStorage = ((iTestUtils->WidgetExistsInStorageL(
+                KAttrWidgetLibrary, KTestLibrary, iStorage )) != FALSE);
+
+
+        );
+
+    QCOMPARE(err, KErrNone);
+    QVERIFY(widgetExistedInStorage);
+    QVERIFY(widgetRemovedFromStorage);
+    }
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void T_CaWidgetScanner::testSetMissingFlag()
+    {
+    _LIT( KWText, "TestWidget" );
+
+    TInt err(KErrNone);
+    TUint flags(0U);
+	
+    TRAP(err,
+
+        CCaWidgetStorageHandler* handler = CCaWidgetStorageHandler::NewL(
+                iStorage, *iScr, iFs);
+        iInstaller->InstallL(KWidget1PackageName);
+        QTest::qWait(3000);
+
+        CCaWidgetDescription* widget = iTestUtils->GetWidgetEntryL( KWText, iStorage);
+        handler->SetMissingFlagL( widget );
+        delete widget;
+
+        flags = iTestUtils->GetWidgetFlagsL(KWText, iStorage);
+        
+        delete handler;
+    );
+    
+    // clean after test
+    TRAP_IGNORE(iInstaller->UninstallL(KWidget1ManifestName));
+    QTest::qWait(3000);
+    QCOMPARE(err, KErrNone);
+    QVERIFY( flags & EMissing );
+    QVERIFY( ~(flags & EVisible) );
+   }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void T_CaWidgetScanner::testSetLocalizationsL()
+    {
+    CCaWidgetDescription* widget = CCaWidgetDescription::NewLC();
+    widget->SetUriL(KWidgetUri1());
+    widget->SetTranslationFileNameL(KTranslationFileNameAsInManifest());
+    widget->SetTitleL( _L("txt_applib_subtitle_downloads") );
+    
+    widget->LocalizeTextsL();
+    
+    QVERIFY(!widget->GetStringIdTitle().Compare(_L("txt_applib_subtitle_downloads")));
+    QVERIFY(!widget->GetStringIdDescription().Compare( KNullDesC ));
+    
+    RPointerArray<CCaLocalizationEntry> resultContainer;
+    CleanupResetAndDestroyPushL( resultContainer );
+    iStorage->GetLocalizationsL( resultContainer );
+    int a = resultContainer.Count();
+    resultContainer.Reset();
+    
+    CCaWidgetStorageHandler* handler = CCaWidgetStorageHandler::NewL(
+            iStorage, *iScr, iFs );
+    
+    widget->SetStringidTitleL( _L("titleId") );    
+    handler->SetLocalizationsL( widget, 2000 );
+    
+    iStorage->GetLocalizationsL( resultContainer );
+    int b = resultContainer.Count();
+    
+    QCOMPARE( a+1, b );
+    
+    delete handler;    
+    CleanupStack::PopAndDestroy( &resultContainer );
+    CleanupStack::PopAndDestroy( widget );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void T_CaWidgetScanner::testUtils()
+    {
+    RBuf mmcId;
+    mmcId.CleanupClosePushL();
+    mmcId.CreateL(KMassStorageIdLength);
+    WidgetScannerUtils::CurrentMmcId(iFs, mmcId);
+    TInt mmcDrive;
+    if( DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRemovableMassStorage,
+            mmcDrive ) == KErrNone )
+        {
+        QVERIFY(mmcId.Length() > 0);
+        }
+    
+    CleanupStack::PopAndDestroy( &mmcId );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void T_CaWidgetScanner::testParsePreviewImageName()
+{
+    TInt err(KErrNone);
+    TChar drive = 'c';
+
+    RBuf expectedPreviewFileName;
+    RBufGuard expectedPreviewFileNameGuard(&expectedPreviewFileName);
+    
+    QScopedPointer < CCaWidgetScannerParser > parser;
+    QScopedPointer < CCaWidgetDescription > widgetDescriptor;
+    QT_TRAP_THROWING(parser.reset(CCaWidgetScannerParser::NewL(iFs)));
+    QT_TRAP_THROWING(widgetDescriptor.reset( CCaWidgetDescription::NewL()) );
+    
+    _LIT8( KPreviewFileName8, "preview.png" );
+    _LIT( KPreviewFileName, "preview.png" );
+    _LIT( KWidgetPackageId, "12345678" );
+    
+    TXmlEngElement element;
+
+    TRAP(err,
+        RXmlEngDOMImplementation domImpl;
+        CleanupClosePushL(domImpl);
+        domImpl.OpenL();
+        RXmlEngDocument doc;
+        CleanupClosePushL(doc);
+        doc.OpenL(domImpl);
+        TXmlEngElement element = 
+            doc.CreateDocumentElementL(KPreviewImageElementName());
+        element.AddTextL(KPreviewFileName8());
+        parser->ParsePreviewImageNameL( element, KWidgetPackageId(),
+                widgetDescriptor.data(), drive);
+        CleanupStack::PopAndDestroy(&doc);
+        CleanupStack::PopAndDestroy(&domImpl);
+        );
+        
+
+    QCOMPARE(err, KErrNone);
+
+    TRAP(err,
+        HBufC *manifestPath = parser->GetManifestDirectoryPathLC(
+                KWidgetPackageId(), drive );
+        expectedPreviewFileName.CreateL(manifestPath->Length() +
+                KPreviewFileName().Length());
+        expectedPreviewFileName.Append(*manifestPath);
+        expectedPreviewFileName.Append(KPreviewFileName());
+        CleanupStack::PopAndDestroy( manifestPath );
+    );
+    QCOMPARE(err, KErrNone);
+    {
+        const QString exp = XQConversions::s60DescToQString(expectedPreviewFileName);
+        const QString act = 
+            XQConversions::s60DescToQString(
+                widgetDescriptor->GetPreviewImageName());
+        QCOMPARE(exp, act);    
+    }
+    
+    RBuf expectedPreviewSkinId;
+    RBufGuard expectedPreviewSkinIdGuard(&expectedPreviewSkinId);
+
+    _LIT8( KPreviewSkinId, "skin_id" );
+    
+    TRAP(err,
+        RXmlEngDOMImplementation domImpl;
+        CleanupClosePushL(domImpl);
+        domImpl.OpenL();
+        RXmlEngDocument doc;
+        CleanupClosePushL(doc);
+        doc.OpenL(domImpl);
+        
+        TXmlEngElement element = 
+            doc.CreateDocumentElementL(KPreviewImageElementName());
+        element.AddTextL(KPreviewSkinId());
+        parser->ParsePreviewImageNameL( element, KWidgetPackageId(),
+                widgetDescriptor.data(), drive);
+        CleanupStack::PopAndDestroy(&doc);
+        CleanupStack::PopAndDestroy(&domImpl);
+        );
+    
+    QCOMPARE(err, KErrNone);
+
+    TRAP(err,
+        expectedPreviewSkinId.Assign(
+            CnvUtfConverter::ConvertToUnicodeFromUtf8L(KPreviewSkinId()));
+    );
+    QCOMPARE(err, KErrNone);
+    {
+        const QString exp = XQConversions::s60DescToQString(expectedPreviewSkinId);
+        const QString act = 
+            XQConversions::s60DescToQString(
+                widgetDescriptor->GetPreviewImageName());
+        
+        QCOMPARE(exp, act);    
+    }
+    
+    RBuf8 attributeValueTooLong;
+    RBuf8Guard attributeValueTooLongGuard(&attributeValueTooLong);
+    attributeValueTooLong.CreateL(KCaMaxAttrValueLen + 1);
+    
+    for (int i = KCaMaxAttrValueLen; i >= 0 ; --i)
+    {
+        attributeValueTooLong.Append(_L8("a"));
+    }
+    
+    TRAP(err,
+        RXmlEngDOMImplementation domImpl;
+        CleanupClosePushL(domImpl);
+        domImpl.OpenL();
+        RXmlEngDocument doc;
+        CleanupClosePushL(doc);
+        doc.OpenL(domImpl);
+        
+        TXmlEngElement element = 
+            doc.CreateDocumentElementL(KPreviewImageElementName());
+        element.AddTextL(attributeValueTooLong);
+
+        parser->ParsePreviewImageNameL( element, KWidgetPackageId(),
+            widgetDescriptor.data(), drive);
+        CleanupStack::PopAndDestroy(&doc);
+        CleanupStack::PopAndDestroy(&domImpl);
+        );
+    
+    QCOMPARE(err, KErrNone);
+    {
+        QCOMPARE(widgetDescriptor->GetPreviewImageName().Length(), 
+            KCaMaxAttrValueLen + 1);    
+    }
+    
+    TRAP(err,
+        RXmlEngDOMImplementation domImpl;
+        CleanupClosePushL(domImpl);
+        domImpl.OpenL();
+        RXmlEngDocument doc;
+        CleanupClosePushL(doc);
+        doc.OpenL(domImpl);
+        
+        TXmlEngElement element = 
+            doc.CreateDocumentElementL(KPreviewImageElementName());
+        element.AddTextL(KNullDesC8);
+
+        parser->ParsePreviewImageNameL( element, KWidgetPackageId(),
+            widgetDescriptor.data(), drive);
+        CleanupStack::PopAndDestroy(&doc);
+        CleanupStack::PopAndDestroy(&domImpl);
+        );
+    
+    QCOMPARE(err, KErrNone);
+    {
+        const QString exp = XQConversions::s60DescToQString(KNullDesC);;
+        const QString act = XQConversions::s60DescToQString(
+            widgetDescriptor->GetPreviewImageName());
+        QCOMPARE(exp, act);    
+    }
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void T_CaWidgetScanner::testParseIconName()
+{
+    TInt err(KErrNone);
+
+    TChar drive = 'c';
+    
+    RBuf expectedIconFileName;
+    RBufGuard expectedIconFileNameGuard(&expectedIconFileName);
+    
+    QScopedPointer < CCaWidgetScannerParser > parser;
+    QScopedPointer < CCaWidgetDescription > widgetDescriptor;
+    QT_TRAP_THROWING(parser.reset(CCaWidgetScannerParser::NewL(iFs)));
+    QT_TRAP_THROWING(widgetDescriptor.reset( CCaWidgetDescription::NewL()) );
+    
+    _LIT8( KIconName8, "preview.png" );
+    _LIT( KIconName, "preview.png" );
+    _LIT( KWidgetPackageId, "12345678" );
+    TXmlEngElement element;
+
+    TRAP(err,
+        RXmlEngDOMImplementation domImpl;
+        CleanupClosePushL(domImpl);
+        domImpl.OpenL();
+        RXmlEngDocument doc;
+        CleanupClosePushL(doc);
+        doc.OpenL(domImpl);
+        TXmlEngElement element = 
+            doc.CreateDocumentElementL(KIcon());
+        element.AddTextL(KIconName8());
+        parser->ParseIconL( element, KWidgetPackageId(), widgetDescriptor.data(), drive );
+        CleanupStack::PopAndDestroy(&doc);
+        CleanupStack::PopAndDestroy(&domImpl);
+        );
+        
+
+    QCOMPARE(err, KErrNone);
+
+    TRAP(err,
+        HBufC *manifestPath = parser->GetManifestDirectoryPathLC( KWidgetPackageId(), drive );
+        expectedIconFileName.CreateL(manifestPath->Length() + KIconName().Length());
+        expectedIconFileName.Append(*manifestPath);
+        expectedIconFileName.Append(KIconName());
+        CleanupStack::PopAndDestroy(manifestPath);
+    );
+    QCOMPARE(err, KErrNone);
+    {
+        const QString exp = XQConversions::s60DescToQString(expectedIconFileName);
+        const QString act = 
+            XQConversions::s60DescToQString(
+                widgetDescriptor->GetIconUri());
+        QCOMPARE(exp, act);    
+    }
+    
+    RBuf expectedIconSkinId;
+    RBufGuard expectedIconSkinIdGuard(&expectedIconSkinId);
+
+    _LIT8( KIconSkinId, "skin_id" );
+    
+    TRAP(err,
+        RXmlEngDOMImplementation domImpl;
+        CleanupClosePushL(domImpl);
+        domImpl.OpenL();
+        RXmlEngDocument doc;
+        CleanupClosePushL(doc);
+        doc.OpenL(domImpl);
+        
+        TXmlEngElement element = 
+            doc.CreateDocumentElementL(KIcon());
+        element.AddTextL(KIconSkinId());
+
+        parser->ParseIconL(element, KWidgetPackageId(),  widgetDescriptor.data(), drive);
+        CleanupStack::PopAndDestroy(&doc);
+        CleanupStack::PopAndDestroy(&domImpl);
+        );
+    
+    QCOMPARE(err, KErrNone);
+
+    TRAP(err,
+        expectedIconSkinId.Assign(
+            CnvUtfConverter::ConvertToUnicodeFromUtf8L(KIconSkinId()));
+    );
+    QCOMPARE(err, KErrNone);
+    {
+        const QString exp = XQConversions::s60DescToQString(expectedIconSkinId);
+        const QString act = 
+            XQConversions::s60DescToQString(
+                widgetDescriptor->GetIconUri());
+        
+        QCOMPARE(exp, act);    
+    }
+    
+    RBuf8 veryLongAttributeValue;
+    RBuf8Guard veryLongAttributeValueGuard(&veryLongAttributeValue);
+    veryLongAttributeValue.CreateL(KCaMaxAttrValueLen + 1);
+    
+    for (int i = KCaMaxAttrValueLen; i >= 0 ; --i)
+    {
+        veryLongAttributeValue.Append(_L8("a"));
+    }
+    
+    TRAP(err,
+        RXmlEngDOMImplementation domImpl;
+        CleanupClosePushL(domImpl);
+        domImpl.OpenL();
+        RXmlEngDocument doc;
+        CleanupClosePushL(doc);
+        doc.OpenL(domImpl);
+        
+        TXmlEngElement element = 
+            doc.CreateDocumentElementL(KIcon());
+        element.AddTextL(veryLongAttributeValue);
+
+        parser->ParseIconL(element, KWidgetPackageId(),  widgetDescriptor.data(), drive );
+        CleanupStack::PopAndDestroy(&doc);
+        CleanupStack::PopAndDestroy(&domImpl);
+        );
+    
+    QCOMPARE(err, KErrNone);
+
+    {
+        QCOMPARE(widgetDescriptor->GetIconUri().Length(), 
+            KCaMaxAttrValueLen + 1);    
+    }
+    
+    TRAP(err,
+        RXmlEngDOMImplementation domImpl;
+        CleanupClosePushL(domImpl);
+        domImpl.OpenL();
+        RXmlEngDocument doc;
+        CleanupClosePushL(doc);
+        doc.OpenL(domImpl);
+        
+        TXmlEngElement element = 
+            doc.CreateDocumentElementL(KIcon());
+        element.AddTextL(KNullDesC8);
+
+        parser->ParseIconL(element, KWidgetPackageId(),  widgetDescriptor.data(), drive );
+        CleanupStack::PopAndDestroy(&doc);
+        CleanupStack::PopAndDestroy(&domImpl);
+        );
+    
+    QCOMPARE(err, KErrNone);
+    {
+        const QString exp = XQConversions::s60DescToQString(KNullDesC);;
+        const QString act = XQConversions::s60DescToQString(
+            widgetDescriptor->GetIconUri());
+        QCOMPARE(exp, act);    
+    }
+}
+
+void T_CaWidgetScanner::testCloneWidgetDescriptionL() 
+{
+    QScopedPointer<CCaWidgetDescription> descriptionA;
+    QT_TRAP_THROWING(descriptionA.reset(CCaWidgetDescription::NewL()));
+    QScopedPointer<CCaWidgetDescription> descriptionB(
+        descriptionA->CloneL());
+    
+    QVERIFY(descriptionA->Compare(*descriptionB) 
+        != static_cast<TInt>(EFalse));
+    
+    _LIT( KTestDescription, "GetDescription()" );
+    
+    QT_TRAP_THROWING(
+        descriptionA->SetDescriptionL( KTestDescription )
+    )
+    
+    QVERIFY(descriptionA->Compare(*descriptionB) 
+        == static_cast<TInt>(EFalse));
+    
+    QScopedPointer<CCaWidgetDescription> descriptionC(
+        descriptionA->CloneL());
+    
+    QVERIFY(descriptionA->Compare(*descriptionC) 
+        != static_cast<TInt>(EFalse));
+    
+    QVERIFY(descriptionA->GetDescription().Compare( KTestDescription ) == 0);
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TInt T_CaWidgetScanner::AppendMmcIdL(const TDesC& aText)
+    {
+    //get mmc id
+    RBuf mmcId;
+    mmcId.CleanupClosePushL();
+    mmcId.CreateL(_L("mass_storage"));
+
+    //append mmc id to the entry
+    CCaInnerQuery* query = CCaInnerQuery::NewLC();
+    CDesC16ArrayFlat* widgetType = new ( ELeave ) CDesC16ArrayFlat(
+             KGranularityOne );
+    CleanupStack::PushL( widgetType );
+    widgetType->AppendL( KCaTypeWidget );
+    query->SetEntryTypeNames( widgetType );//transfers ownership to query
+    CleanupStack::Pop( widgetType );
+
+    RPointerArray<CCaInnerEntry> entries;
+    CleanupResetAndDestroyPushL( entries );
+    iStorage->GetEntriesL( query, entries );
+    TInt id(0);
+    for( TInt i = 0; i < entries.Count(); i++ )
+        {
+        if(entries[i]->GetText().Compare(aText)==0)
+            {
+            entries[i]->AddAttributeL(KCaAttrMmcId, mmcId);
+            id = entries[i]->GetId();
+            iStorage->AddL(entries[i]);
+            break;
+            }
+        }
+    CleanupStack::PopAndDestroy( &entries );
+    CleanupStack::PopAndDestroy( query );
+    CleanupStack::PopAndDestroy( &mmcId );
+    return id;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool T_CaWidgetScanner::MmcAttributeSetL(TInt aId)
+    {
+    TBool result(EFalse);
+    CCaInnerQuery* query = CCaInnerQuery::NewLC();
+    RArray<TInt> ids;
+    CleanupClosePushL(ids);
+    ids.AppendL(aId);
+    query->SetIdsL(ids);
+    CleanupStack::PopAndDestroy(&ids);
+    RPointerArray<CCaInnerEntry> entries;
+    CleanupResetAndDestroyPushL( entries );
+    iStorage->GetEntriesL( query, entries );
+    if (entries.Count() == 1)
+        {
+        TPtrC temp(KNullDesC);
+        result = entries[0]->FindAttribute(KCaAttrMmcId, temp);
+        }
+    CleanupStack::PopAndDestroy( &entries );
+    CleanupStack::PopAndDestroy( query );
+    
+    return result;
+    }
+
+
+
+
+
+QTEST_MAIN(T_CaWidgetScanner);