javatools/usersettingsconfigurator/tsrc/src/testusersettingsconfigurator.cpp
branchRCL_3
changeset 14 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/usersettingsconfigurator/tsrc/src/testusersettingsconfigurator.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,442 @@
+/*
+* 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:
+*
+*/
+
+#include <stdio.h>
+#include <string>
+#include <vector>
+#include <e32std.h>
+
+#include "TestHarness.h"
+#include "teststoragehandler.h"
+#include "j2me/midp2/security/MFunctionGroupBinding.h"
+#include "j2me/midp2/security/MExtendedProtectionDomain.h"
+#include "j2me/midp2/security/MFunctionGroup.h"
+#include "j2me/midp2/security/MPermission.h"
+#include "j2me/midp2/security/MSecurityPolicyV2.h"
+
+using namespace MIDP;
+
+const TInt KSecurityPolicyFlags = 0x0200;
+_LIT(KSecurityPolicy, "midp2_rp");
+extern MSecurityPolicyV2* GetSecurityPolicyL(TUint32 aFlags, const TDesC& aPolicyName);
+const TInt BLANKET        = 1;
+const TInt SESSION        = 2;
+const TInt ONESHOT        = 3;
+const TInt NO             = 4;
+const TInt UNKNOWN        = 5;
+const TInt INVALID        = 6;
+const TInt EMPTY          = 7;
+const TInt GAMEACTIONS    = 8;
+const TInt NAVIGATIONKEYS = 9;
+
+TEST_GROUP(TestUserSettingsConfigurator)
+{
+    MSecurityPolicyV2* iSecurityPolicy;
+    TEST_SETUP()
+    {
+        iSecurityPolicy = GetSecurityPolicyL(KSecurityPolicyFlags, KSecurityPolicy);
+    }
+
+    TEST_TEARDOWN()
+    {
+        delete iSecurityPolicy;
+    }
+};
+
+HBufC8* GetCustomAttributes(const TDesC& aValue)
+{
+    _LIT(KOnScreenKeyboardAttribute, "Nokia-MIDlet-On-Screen-Keypad");
+    _LIT8(KSpace, " ");
+
+    TInt countLength = 1;
+    TInt spaceLength = KSpace().Length();
+    TInt keyLength       = KOnScreenKeyboardAttribute().Length();
+    TInt keyByteLength   = keyLength + keyLength;
+    TInt valueLength     = 2 + aValue.Length();
+    TInt valueByteLength = valueLength + valueLength;
+    HBufC8* customAttributesValue = HBufC8::NewL(
+                                        4 /* count */
+                                        + 4 /* key length */
+                                        + keyByteLength /* key */
+                                        + 3 /* max padding */
+                                        + 4 /* value length */
+                                        + 4 /* flag */
+                                        + valueByteLength /* value */
+                                        + 3 /* max padding */);
+    TPtr8 ptr = customAttributesValue->Des();
+    ptr.Append(TPtrC8((const TUint8*)&countLength, 4));
+    ptr.Append(TPtrC8((const TUint8*)&keyLength, 4));
+    ptr.Append(TPtrC8((const TUint8*)KOnScreenKeyboardAttribute().Ptr(), keyByteLength));
+    switch (keyByteLength % 4)
+    {
+    case 1:
+        ptr.Append(KSpace);
+    case 2:
+        ptr.Append(KSpace);
+    case 3:
+        ptr.Append(KSpace);
+        break;
+    }
+    // flag
+    ptr.Append(TPtrC8((const TUint8*)&valueLength, 4));
+    ptr.Append(KSpace);
+    ptr.Append(KSpace);
+    ptr.Append(KSpace);
+    ptr.Append(KSpace);
+    ptr.Append(TPtrC8((const TUint8*)aValue.Ptr(), (2 * aValue.Length())));
+    switch (valueByteLength % 4)
+    {
+    case 1:
+        ptr.Append(KSpace);
+    case 2:
+        ptr.Append(KSpace);
+    case 3:
+        ptr.Append(KSpace);
+        break;
+    }
+    return customAttributesValue;
+}
+
+HBufC8* GetSecurityPreferences(const MSecurityPolicyV2& aSecurityPolicy, std::wstring aSecuritySettingsName, int aInteractionMode)
+{
+    int BITS_PER_BYTE = 8;
+    int BITS_PER_GROUP = 2;
+    int GROUPS_PER_BYTE = (BITS_PER_BYTE/BITS_PER_GROUP);
+    RPointerArray<const MFunctionGroupBinding>  bindings;
+    aSecurityPolicy.UntrustedProtectionDomainL().FunctionGroupBindingsL(bindings);
+    TInt count = bindings.Count();
+    std::string preferences = "";
+    std::string interactionMode;
+    HBufC8* prefs = HBufC8::NewMaxL((count + 3)/4);
+    TPtr8 ptr = prefs->Des();
+    TInt length = ptr.Length();
+    for (TInt i = 0; i < length; i++)
+    {
+        ptr[i] = 0;
+    }
+    for (TInt i = 0; i < count; i++)
+    {
+        const MFunctionGroupBinding& binding = *(bindings[i]);
+        HBufC* name = binding.FunctionGroup().Name().AllocLC();
+        std::wstring securitySettingsName = std::wstring((wchar_t*) name->Ptr(), name->Length());
+        CleanupStack::PopAndDestroy(name);
+        TInt    byteIndex = ((i) * BITS_PER_GROUP) / BITS_PER_BYTE;
+        TInt    bitIndex  = ((i) - (byteIndex * GROUPS_PER_BYTE)) * BITS_PER_GROUP;
+        TUint8  byte      = ptr[byteIndex];
+        if (securitySettingsName == aSecuritySettingsName)
+        {
+            switch (aInteractionMode)
+            {
+            case ONESHOT:
+                ptr[byteIndex] = (TText8)((byte & ~(3 << bitIndex)) | (2 << bitIndex));
+                break;
+            case SESSION:
+                ptr[byteIndex] = (TText8)((byte & ~(3 << bitIndex)) | (3 << bitIndex));
+                break;
+            case BLANKET:
+                ptr[byteIndex] = (TText8)((byte & ~(3 << bitIndex)) | (1 << bitIndex));
+                break;
+            case NO:
+                ptr[byteIndex] = (TText8)((byte & ~(3 << bitIndex)) | (0 << bitIndex));
+                break;
+            case UNKNOWN:
+                ptr[byteIndex] = (TText8)((byte & ~(3 << bitIndex)) | (4 << bitIndex));
+                break;
+            }
+        }
+        else
+        {
+            // get the default one from the legacy policy
+            switch (binding.DefaultInteractionMode())
+            {
+            case MPermission::EDenied:
+                ptr[byteIndex] = (TText8)((byte & ~(3 << bitIndex)) | (0 << bitIndex));
+                break;
+            case MPermission::EBlanket:
+                ptr[byteIndex] = (TText8)((byte & ~(3 << bitIndex)) | (1 << bitIndex));
+                break;
+            case MPermission::EOneshot:
+                ptr[byteIndex] = (TText8)((byte & ~(3 << bitIndex)) | (2 << bitIndex));
+                break;
+            case MPermission::ESession:
+                ptr[byteIndex] = (TText8)((byte & ~(3 << bitIndex)) | (3 << bitIndex));
+                break;
+            }
+        }
+    }
+    bindings.Close();
+    return prefs;
+}
+
+
+std::wstring GetDefaultInteractionModeFromPolicy(const MSecurityPolicyV2& aSecurityPolicy, std::wstring aSecuritySettingsName)
+{
+    RPointerArray<const MFunctionGroupBinding>  bindings;
+    aSecurityPolicy.UntrustedProtectionDomainL().FunctionGroupBindingsL(bindings);
+    TInt count = bindings.Count();
+    std::wstring interactionMode = L"";
+    for (TInt i = 0; i < count; i++)
+    {
+        const MFunctionGroupBinding& binding = *(bindings[i]);
+        HBufC* name = binding.FunctionGroup().Name().AllocLC();
+        std::wstring securitySettingsName = std::wstring((wchar_t*) name->Ptr(), name->Length());
+        CleanupStack::PopAndDestroy(name);
+        if (securitySettingsName == aSecuritySettingsName)
+        {
+            // get the default one from the legacy policy
+            switch (binding.DefaultInteractionMode())
+            {
+            case MPermission::EDenied:
+                interactionMode = L"4";
+                break;
+            case MPermission::EBlanket:
+                interactionMode = L"3";
+                break;
+            case MPermission::EOneshot:
+                interactionMode = L"1";
+                break;
+            case MPermission::ESession:
+                interactionMode = L"2";
+                break;
+            }
+            break;
+        }
+    }
+    bindings.Close();
+    return interactionMode;
+}
+
+void ExecuteConfigurator()
+{
+    _LIT(KJavaUsersettingsConfiguratorExe, "javausersettingsconfigurator.exe");
+    RProcess proc;
+    int rc = proc.Create(KJavaUsersettingsConfiguratorExe, KNullDesC());
+    if (rc == KErrNone)
+    {
+        proc.Resume();
+        TRequestStatus status;
+        proc.Logon(status);
+        User::WaitForRequest(status);
+    }
+    proc.Close();
+}
+
+TEST(TestUserSettingsConfigurator, TestUserSecuritySettingsL)
+{
+    // init
+    TInt err;
+    TestStorageHandler* storage = TestStorageHandler::NewL();
+    CleanupStack::PushL(storage);
+    std::vector<SecuritySettings*> securitySettings;
+    bool success = false;
+    // unknown unsigned suite
+    storage->cleanup(TUint32(0), L"appUid");
+    storage->populateLegacyStorageL(TUint32(0), _L("name"), _L("vendor"), _L("version"), _L8("prefs"));
+    storage->populateOmjStorageL(L"appUid", L"name1", L"vendor", L"version", L"settingsName", L"1");
+    ExecuteConfigurator();
+    securitySettings.clear();
+    storage->retrieveSecuritySettings(L"name", L"vendor", L"version", securitySettings);
+    storage->cleanup(TUint32(0), L"appUid");
+    success = (securitySettings.size() == 0);
+    for (int i=0; i<securitySettings.size(); i++)
+    {
+        delete securitySettings[i];
+    }
+    CHECK(success);
+    // OMJ "Net Access" settings: No for current interaction mode, Oneshot&Session for allowed interaction modes
+    // Legacy settings: unknown value for "Net Access"
+    // -> new OMJ settings: the default interaction mode taken from the legacy policy for "Net Access"
+    storage->cleanup(TUint32(0), L"appUid");
+    HBufC8* prefs = GetSecurityPreferences(*iSecurityPolicy, L"Local Connectivity", UNKNOWN);
+    storage->populateLegacyStorageL(TUint32(0), _L("name"), _L("vendor"), _L("version"), *prefs);
+    delete prefs;
+    storage->populateOmjStorageL(L"appUid", L"name", L"vendor", L"version", L"Net Access", L"4" , L"12");
+    ExecuteConfigurator();
+    securitySettings.clear();
+    storage->retrieveSecuritySettings(L"name", L"vendor", L"version", securitySettings);
+    storage->cleanup(TUint32(0), L"appUid");
+    success = (securitySettings.size() == 1 && securitySettings[0]->iCurrentInteractionMode == GetDefaultInteractionModeFromPolicy(*iSecurityPolicy, L"Net Access") && securitySettings[0]->iSettingsName == L"Net Access");
+    for (int i=0; i<securitySettings.size(); i++)
+    {
+        delete securitySettings[i];
+    }
+    CHECK(success);
+    // OMJ "Read User Data Access" settings: No for current interaction mode, Session for allowed interaction modes
+    // Legacy settings: unknown value for "Read User Data Access"
+    // -> new OMJ settings: unchanged settings (the default interaction mode taken from the legacy policy for Net Access is not found among the allowed interaction modes)
+    storage->cleanup(TUint32(0), L"appUid");
+    storage->populateLegacyStorageL(TUint32(0), _L("name"), _L("vendor"), _L("version"), _L8("prefs"));
+    storage->populateOmjStorageL(L"appUid", L"name", L"vendor", L"version", L"Read User Data Access", L"4" , L"4");
+    ExecuteConfigurator();
+    securitySettings.clear();
+    storage->retrieveSecuritySettings(L"name", L"vendor", L"version", securitySettings);
+    storage->cleanup(TUint32(0), L"appUid");
+    success = (securitySettings.size() == 1 && securitySettings[0]->iCurrentInteractionMode == L"4" && securitySettings[0]->iSettingsName == L"Read User Data Access");
+    for (int i=0; i<securitySettings.size(); i++)
+    {
+        delete securitySettings[i];
+    }
+    CHECK(success);
+    // OMJ "Write User Data Access" settings: No for current interaction mode, Oneshot&Session for allowed interaction modes
+    // Legacy settings: oneshot for "Write User Data Access"
+    // -> new OMJ settings: oneshot for "Write User Data Access"
+    storage->cleanup(TUint32(0), L"appUid");
+    prefs = GetSecurityPreferences(*iSecurityPolicy, L"Write User Data Access", ONESHOT);
+    storage->populateLegacyStorageL(TUint32(0), _L("name"), _L("vendor"), _L("version"), *prefs);
+    delete prefs;
+    storage->populateOmjStorageL(L"appUid", L"name", L"vendor", L"version", L"Write User Data Access", L"4" , L"12");
+    ExecuteConfigurator();
+    securitySettings.clear();
+    storage->retrieveSecuritySettings(L"name", L"vendor", L"version", securitySettings);
+    storage->cleanup(TUint32(0), L"appUid");
+    success = (securitySettings.size() == 1 && securitySettings[0]->iCurrentInteractionMode == L"1" && securitySettings[0]->iSettingsName == L"Write User Data Access");
+    for (int i=0; i<securitySettings.size(); i++)
+    {
+        delete securitySettings[i];
+    }
+    CHECK(success);
+    // OMJ "Local Connectivity" settings: Oneshot for current interaction mode, Oneshot&Session for allowed interaction modes
+    // Legacy settings: session for "Local Connectivity"
+    // -> new OMJ settings: session for "Local Connectivity"
+    storage->cleanup(TUint32(0), L"appUid");
+    prefs = GetSecurityPreferences(*iSecurityPolicy, L"Local Connectivity", SESSION);
+    storage->populateLegacyStorageL(TUint32(0), _L("name"), _L("vendor"), _L("version"), *prefs);
+    delete prefs;
+    storage->populateOmjStorageL(L"appUid", L"name", L"vendor", L"version", L"Local Connectivity", L"1" , L"12");
+    ExecuteConfigurator();
+    securitySettings.clear();
+    storage->retrieveSecuritySettings(L"name", L"vendor", L"version", securitySettings);
+    storage->cleanup(TUint32(0), L"appUid");
+    success = (securitySettings.size() == 1 && securitySettings[0]->iCurrentInteractionMode == L"2" && securitySettings[0]->iSettingsName == L"Local Connectivity");
+    for (int i=0; i<securitySettings.size(); i++)
+    {
+        delete securitySettings[i];
+    }
+    CHECK(success);
+    // OMJ "Messaging" settings: Oneshot for current interaction mode, Oneshot&Session&Blanket for allowed interaction modes
+    // Legacy settings: Blanket for "Messaging"
+    // -> new OMJ settings: Blanket for "Messaging"
+    storage->cleanup(TUint32(0), L"appUid");
+    prefs = GetSecurityPreferences(*iSecurityPolicy, L"Messaging", BLANKET);
+    storage->populateLegacyStorageL(TUint32(0), _L("name"), _L("vendor"), _L("version"), *prefs);
+    delete prefs;
+    storage->populateOmjStorageL(L"appUid", L"name", L"vendor", L"version", L"Messaging", L"1" , L"14");
+    ExecuteConfigurator();
+    securitySettings.clear();
+    storage->retrieveSecuritySettings(L"name", L"vendor", L"version", securitySettings);
+    storage->cleanup(TUint32(0), L"appUid");
+    success = (securitySettings.size() == 1 && securitySettings[0]->iCurrentInteractionMode == L"3" && securitySettings[0]->iSettingsName == L"Messaging");
+    for (int i=0; i<securitySettings.size(); i++)
+    {
+        delete securitySettings[i];
+    }
+    CHECK(success);
+    // OMJ "ApplicationAutoInvocation" settings: Oneshot for current interaction mode, Oneshot&No for allowed interaction modes
+    // Legacy settings: No for "ApplicationAutoInvocation"
+    // -> new OMJ settings: No for "ApplicationAutoInvocation"
+    storage->cleanup(TUint32(0), L"appUid");
+    prefs = GetSecurityPreferences(*iSecurityPolicy, L"Application Auto Invocation", NO);
+    storage->populateLegacyStorageL(TUint32(0), _L("name"), _L("vendor"), _L("version"), *prefs);
+    delete prefs;
+    storage->populateOmjStorageL(L"appUid", L"name", L"vendor", L"version", L"Application Auto Invocation", L"1" , L"9");
+    ExecuteConfigurator();
+    securitySettings.clear();
+    storage->retrieveSecuritySettings(L"name", L"vendor", L"version", securitySettings);
+    storage->cleanup(TUint32(0), L"appUid");
+    success = (securitySettings.size() == 1 && securitySettings[0]->iCurrentInteractionMode == L"4" && securitySettings[0]->iSettingsName == L"Application Auto Invocation");
+    for (int i=0; i<securitySettings.size(); i++)
+    {
+        delete securitySettings[i];
+    }
+    CHECK(success);
+    // cleanup
+    CleanupStack::PopAndDestroy(storage);
+}
+
+TEST(TestUserSettingsConfigurator, TestUserCustomAttributesSettingsL)
+{
+    // init
+    TInt err;
+    TestStorageHandler* storage = TestStorageHandler::NewL();
+    CleanupStack::PushL(storage);
+    bool success = false;
+    // "gameactions" value
+    HBufC8* customAttributes = GetCustomAttributes(_L("gameactions"));
+    storage->populateLegacyStorageL(TUint32(12345), *customAttributes);
+    delete customAttributes;
+    storage->populateOmjStorageL(L"[00003039]", L"0");
+    ExecuteConfigurator();
+    std::wstring onScreenKeypad;
+    storage->retrieveOnScreenKeypad(L"[00003039]", onScreenKeypad);
+    storage->cleanup(TUint32(0), L"[00003039]");
+    success = (onScreenKeypad == L"1");
+    CHECK(success);
+    // "navigationkeys" value
+    customAttributes = GetCustomAttributes(_L("navigationkeys"));
+    storage->populateLegacyStorageL(TUint32(12345), *customAttributes);
+    delete customAttributes;
+    storage->populateOmjStorageL(L"[00003039]", L"0");
+    ExecuteConfigurator();
+    onScreenKeypad = L"";
+    storage->retrieveOnScreenKeypad(L"[00003039]", onScreenKeypad);
+    storage->cleanup(TUint32(0), L"[00003039]");
+    success = (onScreenKeypad == L"2");
+    CHECK(success);
+    // "no" value
+    customAttributes = GetCustomAttributes(_L("no"));
+    storage->populateLegacyStorageL(TUint32(12345), *customAttributes);
+    delete customAttributes;
+    storage->populateOmjStorageL(L"[00003039]", L"2");
+    ExecuteConfigurator();
+    onScreenKeypad = L"";
+    storage->retrieveOnScreenKeypad(L"[00003039]", onScreenKeypad);
+    storage->cleanup(TUint32(0), L"[00003039]");
+    success = (onScreenKeypad == L"0");
+    CHECK(success);
+    // unknown value
+    customAttributes = GetCustomAttributes(_L("unknown"));
+    storage->populateLegacyStorageL(TUint32(12345), *customAttributes);
+    delete customAttributes;
+    storage->populateOmjStorageL(L"[00003039]", L"2");
+    ExecuteConfigurator();
+    onScreenKeypad = L"";
+    storage->retrieveOnScreenKeypad(L"[00003039]", onScreenKeypad);
+    storage->cleanup(TUint32(0), L"[00003039]");
+    success = (onScreenKeypad == L"2");
+    CHECK(success);
+    // no value at all
+    storage->populateOmjStorageL(L"[00003039]", L"1");
+    ExecuteConfigurator();
+    onScreenKeypad = L"";
+    storage->retrieveOnScreenKeypad(L"[00003039]", onScreenKeypad);
+    storage->cleanup(TUint32(0), L"[00003039]");
+    success = (onScreenKeypad == L"1");
+    CHECK(success);
+    // empty value
+    customAttributes = GetCustomAttributes(_L(""));
+    storage->populateLegacyStorageL(TUint32(12345), *customAttributes);
+    delete customAttributes;
+    storage->populateOmjStorageL(L"[00003039]", L"1");
+    ExecuteConfigurator();
+    onScreenKeypad = L"";
+    storage->retrieveOnScreenKeypad(L"[00003039]", onScreenKeypad);
+    storage->cleanup(TUint32(0), L"[00003039]");
+    success = (onScreenKeypad == L"1");
+    CHECK(success);
+    // cleanup
+    CleanupStack::PopAndDestroy(storage);
+}