cmmanager/connection_settings_shim/tsrc/ut/testcmmgrshim.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 27 May 2010 13:17:01 +0300
changeset 27 489cf6208544
parent 23 7ec726f93df1
child 40 c5b848e6c7d1
permissions -rw-r--r--
Revision: 201019 Kit: 2010121

/*
* Copyright (c) 2010 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:
* CM Application Settings UI unit testing.
*/

#include <QList>
#include <QString>

#include <HbApplication>
#include <HbMainWindow>
#include <HbView>
#include <HbLabel>

#include <QtTest/QtTest>

#include "cmdestination_shim.h"
#include "cmconnectionmethod_shim.h"

#include "testcmmgrshim.h"

// -----------------------------------------------------------------------------
// STATIC TEST DATA
// -----------------------------------------------------------------------------

// -----------------------------------------------------------------------------
// TEST MACROES
// -----------------------------------------------------------------------------

// Test macro for verifying an exception throwing code block
#define TEST_CATCH_AND_VERIFY(code, error) \
    { \
    int error_code; \
    QT_TRYCATCH_ERROR(error_code, code); \
    QCOMPARE(error_code, error); \
    }

// -----------------------------------------------------------------------------
// FRAMEWORK FUNCTIONS
// -----------------------------------------------------------------------------

/**
 * Test main function. Runs all test cases.
 */
int main(int argc, char *argv[])
{
    Q_UNUSED(argc);
    
    char *pass[3];  
    pass[0] = argv[0];
    pass[1] = "-o"; 
    pass[2] = "c:\\data\\TestCmMgrShim.txt";
 
    TestCmMgrShim tc;
    int res = QTest::qExec(&tc, 3, pass);
 
    return res;
}

/**
 * This function is be called before the first test case is executed.
 */
void TestCmMgrShim::initTestCase()
{
}

/**
 * This function is be called after the last test case was executed.
 */
void TestCmMgrShim::cleanupTestCase()
{
}

/**
 * This function is be called before each test case is executed.
 */
void TestCmMgrShim::init()
{
    // Initialize the CmManagerShim object
    mCmManagerShim = new CmManagerShim;
}

/**
 * This function is be called after each test case is executed.
 */
void TestCmMgrShim::cleanup()
{
    // There should be no destinations
    QList<uint> destinations;
    mCmManagerShim->allDestinations(destinations);
    int destinationCount = destinations.count(); 
    
    // Delete the destinations if there were any
    deleteDestinations();

    // There should be no connection methods
    QList<uint> connMethods;
    mCmManagerShim->connectionMethod(connMethods, false);
    int connMethodCount = connMethods.count(); 
    
    // Delete the connection methods if there were any
    deleteConnectionMethods();

    // Validate after the deletions are done
    QCOMPARE(destinationCount, 0);
    QCOMPARE(connMethodCount, 0);

    delete mCmManagerShim;
}

// -----------------------------------------------------------------------------
// TEST CASES
// -----------------------------------------------------------------------------

/**
 * Test case for testing initial state.
 * -Reads AND DELETES all destinations and connection methods.
 * -Verifies that there are no destinations and connection methods.
 */
void TestCmMgrShim::tcResetSettings()
{
    // Read all destinations
    QList<uint> destinations;
    mCmManagerShim->allDestinations(destinations);
    
    // Delete the destinations
    for (int i=0; i < destinations.count(); i++) {
        CmDestinationShim *dest = mCmManagerShim->destination(destinations[i]);
        dest->deleteDestination();
        
        // Update should leave
        TEST_CATCH_AND_VERIFY(
            dest->update(),
            KErrBadHandle);
        
        delete dest;
    }
    
    // Check that there no longer are any destinations
    mCmManagerShim->allDestinations(destinations);
    QCOMPARE(destinations.count(), 0);
    
    // Read all connection methods
    QList<uint> connMethods;
    mCmManagerShim->connectionMethod(connMethods, false);
    
    // Remove possible uncategorized connection methods
    for (int i=0; i < connMethods.count(); i++){
        CmConnectionMethodShim *cm = 
            mCmManagerShim->connectionMethod(connMethods[i]);
        QVERIFY(cm != NULL);
        bool ok = cm->deleteConnectionMethod();
        QVERIFY(ok == true);
        cm->update();
        delete cm;
    }
    
    // Check that tere is no longer any connection methods
    mCmManagerShim->connectionMethod(connMethods, false);
    QCOMPARE(connMethods.count(), 0);
    
    // Try reading a Connection Method with an erroneous ID
    TEST_CATCH_AND_VERIFY(
        mCmManagerShim->connectionMethod(0),
        KErrArgument);
    
    // Try reading a non-existent Connection Method
    TEST_CATCH_AND_VERIFY(
        mCmManagerShim->connectionMethod(1),
        KErrNotFound);
}

/**
 * Test case for testing basic legacy WLAN connection method handling.
 * -Creates a legacy WLAN connection method (i.e. does not belong to
 *  any destination).
 * -Deletes the connection method. 
 */
void TestCmMgrShim::tcLegacyConnMethodWlan()
{
    // Create the connection method
    CmConnectionMethodShim *cm = mCmManagerShim->createConnectionMethod(
        CMManagerShim::BearerTypeWlan);
    QVERIFY(cm != NULL);
    
    // Update to CommsDat
    cm->update();
    
    // Check bearer type
    int bearer = cm->getIntAttribute(CMManagerShim::CmBearerType);
    QCOMPARE(bearer, (int)CMManagerShim::BearerTypeWlan);
    
    // Check ID
    int id = cm->getIntAttribute(CMManagerShim::CmId);
    QCOMPARE(id, 1);
    
    // Delete the connection method reference
    delete cm;
    
    // Refetch the connection method
    cm = mCmManagerShim->connectionMethod(id);
    QVERIFY(cm != NULL);
    
    // Delete the connection method
    cm->deleteConnectionMethod();
    
    // Check that double deletion throws an exception
    TEST_CATCH_AND_VERIFY(
        cm->deleteConnectionMethod(),
        KErrBadHandle);
    
    delete cm;
}

/**
 * Test case for testing basic legacy GPRS connection method handling.
 * -Creates a legacy GPRS connection method (i.e. does not belong to
 *  any destination).
 * -Deletes the connection method. 
 */
void TestCmMgrShim::tcLegacyConnMethodGprs()
{
    // Create the connection method
    CmConnectionMethodShim *cm = mCmManagerShim->createConnectionMethod(
        CMManagerShim::BearerTypePacketData);
    QVERIFY(cm != NULL);
    
    // Update to CommsDat
    cm->update();
    
    // Check ID
    int id = cm->getIntAttribute(CMManagerShim::CmId);
    QCOMPARE(id, 1);
    
    // Check bearer type
    int bearer = cm->getIntAttribute(CMManagerShim::CmBearerType);
    QCOMPARE(bearer, (int)CMManagerShim::BearerTypePacketData);
    
    // Delete the connection method reference
    delete cm;
    
    // Refetch the connection method
    cm = mCmManagerShim->connectionMethod(id);
    QVERIFY(cm != NULL);
    
    // Delete the connection method
    cm->deleteConnectionMethod();
    delete cm;
}

/**
 * Basic error case testing for CmManagerShim.
 * All test call should throw an exception since they are invalid.
 */
void TestCmMgrShim::tcCmManagerBasicFails()
{
    // Try creating a destination with an invalid name
    CmDestinationShim *dest = 0;
    TEST_CATCH_AND_VERIFY(
        dest = mCmManagerShim->createDestination(QString("")),
        KErrArgument);
    QVERIFY(dest == NULL);
    
    // Try creating a connection method with an invalid bearer type
    CmConnectionMethodShim *cm = 0;
    TEST_CATCH_AND_VERIFY(
        cm = mCmManagerShim->createConnectionMethod(0),
        KErrArgument);
    QVERIFY(cm == NULL);
    
    // Try fetching a connection method with an invalid ID
    cm = 0;
    TEST_CATCH_AND_VERIFY(
        cm = mCmManagerShim->connectionMethod(42),
        KErrNotFound);
    QVERIFY(cm == NULL);
    
    // Try fetching a destination with an invalid ID
    dest = 0;
    TEST_CATCH_AND_VERIFY(
        dest = mCmManagerShim->destination(42),
        KErrArgument);
    QVERIFY(dest == NULL);
}

/**
 * Test case for testing basic destination handling
 * -Create a destination
 * -Validate the default destination content
 * -Delete the destination
 */
void TestCmMgrShim::tcBasicDestination()
{
    // Create a new destination
    CmDestinationShim *dest;
    dest = mCmManagerShim->createDestination("TestDestination");
    QVERIFY(dest != NULL);
    
    // Update to CommsDat
    dest->update();
    
    // Check the name
    QString name(dest->name());
    QCOMPARE(name, QString("TestDestination"));

    // Check ID
    uint destinationId = dest->id();
    QVERIFY(destinationId >= 4000);
    
    // Check protection level default value
    CMManagerShim::CmmProtectionLevel prot = dest->protectionLevel();
    QCOMPARE(prot, CMManagerShim::ProtLevel0);
    
    // Check hidden flag default value
    bool isHidden = dest->isHidden(); 
    QCOMPARE(isHidden, false);
    
    // Check destination content
    int connMethodCount = dest->connectionMethodCount();
    QCOMPARE(connMethodCount, 0);
    
    // Delete the destination
    dest->deleteDestination();

    // Check that double deletion throws an exception
    TEST_CATCH_AND_VERIFY(
        dest->deleteDestination(),
        KErrBadHandle);

    delete dest;
}

/**
 * Test case for testing basic modifications for a destination.
 * -Create a destination
 * -Add a GPRS connection method to it.
 * -Add a WLAN connection method to it.
 * -Delete the GPRS connection method.
 * -Delete the Destination (and thus also the WLAN connection method).
 */
void TestCmMgrShim::tcDestinationModify()
{
    // Create a new destination
    CmDestinationShim *dest;
    dest = mCmManagerShim->createDestination("TestDestination");
    QVERIFY(dest != NULL);
    uint destId = dest->id();
    QVERIFY(destId >= 4000);
    
    // Check destination initial content
    int connMethodCount = dest->connectionMethodCount();
    QCOMPARE(connMethodCount, 0);
    
    // Create a GPRS connection method
    CmConnectionMethodShim *cm = mCmManagerShim->createConnectionMethod(
        CMManagerShim::BearerTypePacketData);
    QVERIFY(cm != NULL);

    // Update to CommsDat
    cm->update();
    
    // Add the connection method to the destination
    int index = dest->addConnectionMethod(cm);
    QCOMPARE(index, 0);

    // Update to CommsDat
    dest->update();
    
    // Create a WLAN connection method
    CmConnectionMethodShim *cmWlan = mCmManagerShim->createConnectionMethod(
        CMManagerShim::BearerTypeWlan);
    QVERIFY(cmWlan != NULL);

    // Update to CommsDat
    cmWlan->update();

    // Add the connection method to the destination
    index = dest->addConnectionMethod(cmWlan);
    QCOMPARE(index, 0);

    // Update to CommsDat
    dest->update();
    
    // Delete the WLAN connection method reference
    delete cmWlan;
    cmWlan = 0;
    
    // Delete the GPRS connection method
    dest->deleteConnectionMethod(cm);
    delete cm;
    cm = 0;
    
    // Update to CommsDat
    dest->update();
    
    // Verify the delete
    connMethodCount = dest->connectionMethodCount();
    QCOMPARE(connMethodCount, 1);
    
    // Delete the whole destination including the remaining WLAN conn method.
    dest->deleteDestination();
    delete dest;
    
    // Check that the destination is gone
    dest = NULL;
    TEST_CATCH_AND_VERIFY(
        dest = mCmManagerShim->destination(destId),
        KErrNotFound);
    QCOMPARE(dest, (CmDestinationShim *)0);
}

/**
 * Test case for adding and reading boolean attribute for a connection method.
 * -Creates a legacy WLAN connection method (i.e. does not belong to
 *  any destination).
 * -Sets a boolean attribute.
 * -Gets the boolean attribute.
 * -Deletes the connection method. 
 */
void TestCmMgrShim::tcConnMethodSetBoolAttribute()
{
    // Create the connection method
    CmConnectionMethodShim *cm = mCmManagerShim->createConnectionMethod(
        CMManagerShim::BearerTypeWlan);
    QVERIFY(cm != NULL);
    
    // Update to CommsDat
    cm->update();
    
    // Set bool attribute value
    cm->setBoolAttribute(CMManagerShim::CmProxyUsageEnabled, true);
        
    // Update to CommsDat
    cm->update();
     
    // Get bool attribute value
    bool testBool = false;
    testBool = cm->getBoolAttribute(CMManagerShim::CmProxyUsageEnabled);
    QCOMPARE(testBool, true);
        
    // Delete the connection method
    cm->deleteConnectionMethod();
    delete cm;
}

/**
 * Test case for adding and reading integer attribute for a connection method.
 * -Creates a legacy WLAN connection method (i.e. does not belong to
 *  any destination).
 * -Sets an int attribute.
 * -Gets the int attribute.
 * -Deletes the connection method. 
 */
void TestCmMgrShim::tcConnMethodSetIntAttribute()
{
    // Create the connection method
    CmConnectionMethodShim *cm = mCmManagerShim->createConnectionMethod(
        CMManagerShim::BearerTypeWlan);
    QVERIFY(cm != NULL);
    
    // Update to CommsDat
    cm->update();
    
    // Set int attribute value
    uint testInt = 99;
    cm->setIntAttribute(CMManagerShim::CmProxyPortNumber, testInt);
    
    // Update to CommsDat
    cm->update();
     
    // Get int attribute value
    uint resultInt = cm->getIntAttribute(CMManagerShim::CmProxyPortNumber);
    QCOMPARE(resultInt, testInt);    
    
    // Delete the connection method
    cm->deleteConnectionMethod();
    delete cm;
}

/**
 * Test case for adding and reading string attributes for a connection method.
 * -Creates a legacy WLAN connection method (i.e. does not belong to
 *  any destination).
 * -Sets a string attribute.
 * -Gets the string attribute.
 * -Deletes the connection method. 
 */
void TestCmMgrShim::tcConnMethodSetStringAttribute()
{
    // Create the connection method
    CmConnectionMethodShim *cm = mCmManagerShim->createConnectionMethod(
        CMManagerShim::BearerTypeWlan);
    QVERIFY(cm != NULL);
    
    // Update to CommsDat
    cm->update();

    // Set string attribute value
    QString testString("TestProxyServerName");
    cm->setStringAttribute(CMManagerShim::CmProxyServerName, testString);

    // Set string8 attribute value
    QString testString2("key12");
    cm->setString8Attribute(CMManagerShim::WlanWepKey1InAscii, testString2);
    
    // Update to CommsDat
    cm->update();
     
    // Check string attribute value
    QString resultString = cm->getStringAttribute(CMManagerShim::CmProxyServerName);
    QCOMPARE(resultString, testString);

    // Check string8 attribute value
    resultString = cm->getString8Attribute(CMManagerShim::WlanWepKey1InAscii);
    QCOMPARE(resultString, testString2);

    // Delete the connection method
    cm->deleteConnectionMethod();
    delete cm;
}

/**
 * Test case for testing attribute reads using a wrong attribute type.
 * All test reads in this case should fail to an exception.
 */
void TestCmMgrShim::tcConnMethodWrongTypeAttributeRead()
{
    // Create the connection method
    CmConnectionMethodShim *cm = mCmManagerShim->createConnectionMethod(
        CMManagerShim::BearerTypeWlan);
    QVERIFY(cm != NULL);
    
    // Update to CommsDat
    cm->update();

    // Try reading name erroneously as an int attribute
    uint intResult = 0;
    TEST_CATCH_AND_VERIFY(
        intResult = cm->getIntAttribute(CMManagerShim::CmName),
        KErrNotSupported);
    QCOMPARE(intResult, (uint)0);
    
    // Try reading name erroneously as a bool attribute
    bool boolResult = false;
    TEST_CATCH_AND_VERIFY(
        boolResult = cm->getBoolAttribute(CMManagerShim::CmName),
        KErrNotSupported);
    QCOMPARE(boolResult, false);
    
    // Try reading ID erroneously as a string attribute
    QString stringResult;
    TEST_CATCH_AND_VERIFY(
        stringResult = cm->getStringAttribute(CMManagerShim::CmId),
        KErrNotSupported);
    QCOMPARE(stringResult, QString(""));
    
    // Try reading ID erroneously as a string 8 attribute
    stringResult = "";
    TEST_CATCH_AND_VERIFY(
        stringResult = cm->getString8Attribute(CMManagerShim::CmId),
        KErrNotSupported);
    QCOMPARE(stringResult, QString(""));
    
    // Delete the connection method
    cm->deleteConnectionMethod();
    delete cm;
}

/**
 * Test case for testing attribute reads using a wrong attribute type.
 * All test reads in this case should fail to an exception.
 */
void TestCmMgrShim::tcConnMethodWrongTypeAttributeWrite()
{
    // Create the connection method
    CmConnectionMethodShim *cm = mCmManagerShim->createConnectionMethod(
        CMManagerShim::BearerTypeWlan);
    QVERIFY(cm != NULL);
    
    // Update to CommsDat
    cm->update();

    // Try writing name erroneously as an int attribute
    TEST_CATCH_AND_VERIFY(
        cm->setIntAttribute(CMManagerShim::CmName, 0),
        KErrNotSupported);
    
    // Try writing name erroneously as a bool attribute
    TEST_CATCH_AND_VERIFY(
        cm->setBoolAttribute(CMManagerShim::CmName, false),
        KErrNotSupported);
    
    // Try writing ID erroneously as a string attribute
    TEST_CATCH_AND_VERIFY(
        cm->setStringAttribute(CMManagerShim::CmId, QString("dada")),
        KErrNotSupported);
    
    // Try reading ID erroneously as a string 8 attribute
    TEST_CATCH_AND_VERIFY(
        cm->setString8Attribute(CMManagerShim::CmId, QString("dada")),
        KErrNotSupported);
    
    // Delete the connection method
    cm->deleteConnectionMethod();
    delete cm;
}

/**
 * Test case for testing connection method refreshing.  
 * -Create a connection method
 * -Read the name of the connection method
 * -Change the name, but don't update CommsDat
 * -Refsesh connection method
 * -Check that the name is the original one
 * -Delete the connection method
 */
void TestCmMgrShim::tcConnectionMethodRefresh()
{
    // Create the connection method
    CmConnectionMethodShim *cm = mCmManagerShim->createConnectionMethod(
        CMManagerShim::BearerTypeWlan);
    QVERIFY(cm != NULL);
        
    // Update to CommsDat
    cm->update();

    // Check ID
    int id = cm->getIntAttribute(CMManagerShim::CmId);
    QCOMPARE(id, 1);
        
    // Check the default name
    QString name = cm->getStringAttribute(CMManagerShim::CmName);
    QVERIFY(name != QString(""));
        
    // Change name
    cm->setStringAttribute(CMManagerShim::CmName, "WlanBlaaBlaa");
    // Do not update CommsDat

    // Check the changed name
    QString newName = cm->getStringAttribute(CMManagerShim::CmName);
    QCOMPARE(newName, QString("WlanBlaaBlaa"));

    // Refresh connection method
    cm->refresh();

    // Delete the connection method reference
    delete cm;

    // Refetch the connection method
    cm = mCmManagerShim->connectionMethod(id);
    QVERIFY(cm != NULL);        

    // Check that the bearer name in database is the original one
    newName = cm->getStringAttribute(CMManagerShim::CmName);
    QCOMPARE(newName, name);
        
    // Delete the connection method
    cm->deleteConnectionMethod();
    delete cm;
}

/**
 * Test case for testing reading destination's connection methods.
 * -Create a destination
 * -Add a GPRS connection method to it.
 * -Add a WLAN connection method to it.
 * -Read number of connection methods.
 * -Read connection method by index.
 * -Read connection method by unknown index.
 * -Read connection method by id.
 * -Read connection method by unknown id.
 * -Delete the Destination (and connection methods).
 */
void TestCmMgrShim::tcDestinationReadConnectionMethods()
{
    // Create a new destination
    CmDestinationShim *dest;
    dest = mCmManagerShim->createDestination("TestDestination");
    QVERIFY(dest != NULL);
    uint destId = dest->id();
    QVERIFY(destId >= 4000);
    
    // Check destination initial content
    int connMethodCount = dest->connectionMethodCount();
    QCOMPARE(connMethodCount, 0);
    
    // Create a GPRS connection method
    CmConnectionMethodShim *cmGprs = mCmManagerShim->createConnectionMethod(
        CMManagerShim::BearerTypePacketData);
    QVERIFY(cmGprs != NULL);
    // Update to CommsDat
    cmGprs->update();
    
    // Add the connection method to the destination
    int index = dest->addConnectionMethod(cmGprs);
    QCOMPARE(index, 0);
    // Update to CommsDat
    dest->update();
    
    delete cmGprs;
    cmGprs = 0;
    
    // Create a WLAN connection method
    CmConnectionMethodShim *cmWlan = mCmManagerShim->createConnectionMethod(
        CMManagerShim::BearerTypeWlan);
    QVERIFY(cmWlan != NULL);
    // Update to CommsDat
    cmWlan->update();

    // Add the connection method to the destination
    index = dest->addConnectionMethod(cmWlan);
    QCOMPARE(index, 0);
    // Update to CommsDat
    dest->update();

    
    // Check number of destination's connection methods
    connMethodCount = dest->connectionMethodCount();
    QCOMPARE(connMethodCount, 2);

    // Read connection method by index.
    CmConnectionMethodShim *cm = dest->connectionMethod(1);
    QVERIFY(cm != NULL);
    
    // Try to read connection method by unknown index.
    TEST_CATCH_AND_VERIFY(
            dest->connectionMethod(2),
            KErrArgument);
    
    // Read connection method by id.
    uint id = cmWlan->getIntAttribute(CMManagerShim::CmId);
    cm = dest->connectionMethodByID(id);
    QVERIFY(cm != NULL);
    
    delete cmWlan;
    cmWlan = 0;
    
    delete cm;
    cm = 0;
    
    // Try to read connection method by unknown id.    
    TEST_CATCH_AND_VERIFY(
        dest->connectionMethodByID(100),
        KErrNotFound);
   
    // Delete the destination (and connection methods).
    dest->deleteDestination();
    delete dest;
}

/**
 * Test case for testing removing connection method from single destination.
 * -Create 2 destinations
 * -Add a WLAN connection method to both.
 * -Remove the WLAN connection method from the first destination.
 * -Remove the WLAN connection method from the other destination.
 * -Delete the Destinations.
 * -Delete connection method.
 */
void TestCmMgrShim::tcDestinationRemoveConnectionMethod()
{
    // Create a new destination
    CmDestinationShim *dest1;
    dest1 = mCmManagerShim->createDestination("TestDestination1");
    QVERIFY(dest1 != NULL);
    uint destId1 = dest1->id();
    QVERIFY(destId1 >= 4000);

    // Create another destination
    CmDestinationShim *dest2;
    dest2 = mCmManagerShim->createDestination("TestDestination2");
    QVERIFY(dest2 != NULL);
    uint destId2 = dest2->id();
    QVERIFY(destId2 >= 4000);
    
    // Check destinations initial content
    int connMethodCount = dest1->connectionMethodCount();
    QCOMPARE(connMethodCount, 0);
    connMethodCount = dest2->connectionMethodCount();
    QCOMPARE(connMethodCount, 0);
    
    // Create a WLAN connection method
    CmConnectionMethodShim *cmWlan = mCmManagerShim->createConnectionMethod(
        CMManagerShim::BearerTypeWlan);
    QVERIFY(cmWlan != NULL);
    // Update to CommsDat
    cmWlan->update();

    uint cmWlanId = cmWlan->getIntAttribute(CMManagerShim::CmId);
    QCOMPARE(cmWlanId, (uint)1);

    // Add the connection method to the destination 1
    int index = dest1->addConnectionMethod(cmWlan);
    QCOMPARE(index, 0);
    // Update to CommsDat
    dest1->update();

    // Add the connection method to the destination 2
    index = dest2->addConnectionMethod(cmWlan);
    QCOMPARE(index, 0);
    // Update to CommsDat
    dest2->update();
        
    // Remove the WLAN connection method from destination 1
    dest1->removeConnectionMethod(cmWlan);
    // Update to CommsDat
    dest1->update();
    
    // Verify the delete
    connMethodCount = dest1->connectionMethodCount();
    QCOMPARE(connMethodCount, 0);
    
    // Check that WLAN connection method still exists for destination 2
    connMethodCount = dest2->connectionMethodCount();
    QCOMPARE(connMethodCount, 1);

    // Remove the WLAN connection method from destination 2
    dest2->removeConnectionMethod(cmWlan);
    // Update to CommsDat
    dest2->update();
    
    // Verify the delete
    connMethodCount = dest2->connectionMethodCount();
    QCOMPARE(connMethodCount, 0);

    // Delete destinations
    dest1->deleteDestination();
    delete dest1;
    dest2->deleteDestination();
    delete dest2;
    
    // Check that WLAN connection method still exists
    delete cmWlan;
    cmWlan = mCmManagerShim->connectionMethod(cmWlanId);
    QVERIFY(cmWlan != NULL);
    
    // Remove WLAN connection method.
    cmWlan->deleteConnectionMethod();
    delete cmWlan;
}

/**
 * Test case for testing destination's cm priority reading and changing. 
 * -Create a destination
 * -Add a GPRS connection method to it.
 * -Add a WLAN connection method to it.
 * -Read priority values of the connection methods
 * -Change the priority values
 * -Read the changed priority values
 * -Try to change the priority value to unsupported value
 * -Delete the destination (and connection methods)
 */
void TestCmMgrShim::tcDestinationPriority()
{
    // Create a new destination
    CmDestinationShim *dest;
    dest = mCmManagerShim->createDestination("TestDestination");
    QVERIFY(dest != NULL);
    uint destId = dest->id();
    QVERIFY(destId >= 4000);
      
    // Create a GPRS connection method
    CmConnectionMethodShim *cmGprs = mCmManagerShim->createConnectionMethod(
        CMManagerShim::BearerTypePacketData);
    QVERIFY(cmGprs != NULL);
    // Update to CommsDat
    cmGprs->update();
    
    // Add the connection method to the destination
    int index = dest->addConnectionMethod(cmGprs);
    QCOMPARE(index, 0);
    // Update to CommsDat
    dest->update();
    
    // Create a WLAN connection method
    CmConnectionMethodShim *cmWlan = mCmManagerShim->createConnectionMethod(
        CMManagerShim::BearerTypeWlan);
    QVERIFY(cmWlan != NULL);
    // Update to CommsDat
    cmWlan->update();

    // Add the connection method to the destination
    index = dest->addConnectionMethod(cmWlan);
    QCOMPARE(index, 0);
    // Update to CommsDat
    dest->update();
        
    // Get the priority of connection methods
    int priority = dest->priority(cmWlan);
    QCOMPARE(priority, 1);
    priority = dest->priority(cmGprs);
    QCOMPARE(priority, 2);
    
    // Modify the priority of GPRS connection method
    dest->modifyPriority(cmGprs, 0);
    dest->modifyPriority(cmWlan, 1);
    // Update to CommsDat
    dest->update();
    
    // Check the priorities
    priority = dest->priority(cmGprs);
    QCOMPARE(priority, 1);
    priority = dest->priority(cmWlan);
    QCOMPARE(priority, 2);

    // Try to modify the priority to forbidden value  
    TEST_CATCH_AND_VERIFY(
        dest->modifyPriority(cmGprs, 2),
        KErrArgument);

    // Delete the whole destination including the remaining WLAN conn method.
    dest->deleteDestination();
    
    delete dest;
    delete cmGprs;
    delete cmWlan;
}

/**
 * Test case for testing miscellaneous methods for destination. 
 * -Create a destination
 * -Change the name of the destination
 * -Check if the destination is hidden
 * -Check if destination is "internet" with metadata.
 * -Delete the destination
 */
void TestCmMgrShim::tcDestinationMisc()
{
    // Create a new destination
    CmDestinationShim *dest;
    dest = mCmManagerShim->createDestination("TestDestination");
    QVERIFY(dest != NULL);
    uint destId = dest->id();
    QVERIFY(destId >= 4000);
          
    // Change the name of the destination
    dest->setName("NewName");
    // Update to CommsDat
    dest->update();
    
    // Check the name
    QString name(dest->name());
    QCOMPARE(name, QString("NewName"));

    // Check if destination is hidden
    bool hidden = dest->isHidden();
    QCOMPARE(hidden, false);
    
    // Check "internet" metadata field
    uint metadata = dest->metadata(CMManagerShim::SnapMetadataInternet);
    QCOMPARE(metadata, (uint)false);
    
    // Delete the destination
    dest->deleteDestination();
    delete dest;
}

/**
 * Test case for testing destination refreshing method.  
 * -Create a destination
 * -Add a GPRS connection method, but don't update CommsDat
 * -Change the name of the destination, but don't update CommsDat
 * -Refresh destination
 * -Check that the changes are not valid anymore
 * -Delete the destination
 * -Delete the connection method
 */
void TestCmMgrShim::tcDestinationRefresh()
{
    // Create a new destination
    CmDestinationShim *dest;
    dest = mCmManagerShim->createDestination("TestDestination");
    QVERIFY(dest != NULL);
    uint destId = dest->id();
    QVERIFY(destId >= 4000);
    dest->update();

    // Create a GPRS connection method
    CmConnectionMethodShim *cmGprs = mCmManagerShim->createConnectionMethod(
        CMManagerShim::BearerTypePacketData);
    QVERIFY(cmGprs != NULL);
    // Update to CommsDat
    cmGprs->update();
    
    // Add the connection method to the destination
    int index = dest->addConnectionMethod(cmGprs);
    QCOMPARE(index, 0);
    // Don't update CommsDat
    
    // Change the name of the destination
    dest->setName("NewName");
    // Don't update to CommsDat

    // Refresh destination
    dest->refresh();
    
    // Delete the destination reference
    delete dest;
    
    // Refetch the destination
    dest = mCmManagerShim->destination(destId);
    QVERIFY(dest != NULL);
    
    // Check the name that it is the original one
    QString name(dest->name());
    QCOMPARE(name, QString("TestDestination"));

    // Check destination content
    int connMethodCount = dest->connectionMethodCount();
    QCOMPARE(connMethodCount, 0);
    
    // Delete the destination
    dest->deleteDestination();
    delete dest;

    // Delete connection method
    bool ok = cmGprs->deleteConnectionMethod();
    delete cmGprs;
    QCOMPARE(ok, true);
}

/**
 * Test case for testing data reads using a invalid input data.
 * All test reads in this case should fail to an exception.
 */
void TestCmMgrShim::tcDestinationInvalidParams()
{
    // Create a new destination
    CmDestinationShim *dest;
    dest = mCmManagerShim->createDestination("TestDestination");
    QVERIFY(dest != NULL);
    
    // Update to CommsDat
    dest->update();

    // Try reading with an invalid connection method index
    CmConnectionMethodShim *cm = 0;
    TEST_CATCH_AND_VERIFY(
        dest->connectionMethod(42),
        KErrArgument);
    QVERIFY(cm == 0);
    
    // Try reading with an invalid connection method ID
    cm = 0;
    TEST_CATCH_AND_VERIFY(
        dest->connectionMethodByID(42),
        KErrNotFound);
    QVERIFY(cm == 0);
    
    // Delete the destination
    dest->deleteDestination();
    delete dest;
}

// -----------------------------------------------------------------------------
// SUB TEST CASES
// -----------------------------------------------------------------------------

/**
 * Case for deleting all destinations.
 */
void TestCmMgrShim::deleteDestinations()
{
    // Read all destinations
    QList<uint> destinations;
    mCmManagerShim->allDestinations(destinations);
    
    // Delete the destinations
    for (int i=0; i < destinations.count(); i++) {
        CmDestinationShim *dest = mCmManagerShim->destination(destinations[i]);
        dest->deleteDestination();
        delete dest;
    }
}

/**
 * Case for deleting all connection methods.
 */
void TestCmMgrShim::deleteConnectionMethods()
{
    // Read all connection methods
    QList<uint> connMethods;
    mCmManagerShim->connectionMethod(connMethods, false);
    
    // Remove all connection methods
    for (int i=0; i < connMethods.count(); i++){
        CmConnectionMethodShim *cm = 
            mCmManagerShim->connectionMethod(connMethods[i]);
        QVERIFY(cm != NULL);
        bool ok = cm->deleteConnectionMethod();
        QVERIFY(ok == true);
        cm->update();
        delete cm;
    }
}