diff -r f5050f1da672 -r 04becd199f91 javamanager/javaregistry/tsrc/src/testregistryentry.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javamanager/javaregistry/tsrc/src/testregistryentry.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,1387 @@ +/* +* 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 +#include +#include +#include + +#include "TestHarness.h" + +#include "javastorage.h" +#include "javastorageexception.h" +#include "javastoragenames.h" +#include "javauid.h" +#include "javaprocessconstants.h" +#include "javasymbianoslayer.h" +#include "javaregistry.h" +#include "javaregistryentry.h" +#include "logger.h" +#include "mjavaattribute.h" +#include "storagetestutils.h" + +#include "javacommonutils.h" + +using namespace std; +using namespace Java; +using namespace java::storage; +using namespace java::util; + +const JavaStorageApplicationEntry_t createEntry(const wstring& aUid, + const wstring& aName, + const wstring& aValue); + +const JavaStorageApplicationEntry_t createValidCertsEntry( + const wstring& aUid, + const wstring& aCerts); + +TEST_GROUP(TestRegistryEntry) +{ + JavaStorage* js; + JavaStorageTestUtils* jtu; + CActiveScheduler* newScheduler; + + TEST_SETUP() + { + newScheduler = new CActiveScheduler(); + CActiveScheduler::Install(newScheduler); + + js = JavaStorage::createInstance(); + jtu = new JavaStorageTestUtils(); + } + TEST_TEARDOWN() + { + try + { + js->rollbackTransaction(); + js->close(); + delete js; + js = NULL; + } + catch (...) + { + // No can do + } + + delete js; + js = 0; + delete jtu; + jtu = 0; + + delete newScheduler; + newScheduler = NULL; + } +}; + +/** + * Test CJavaRegistryEntry::Uid() method. + * 1. Application uid. + * 2. Application suite uid. + * NOTE: Invalid Uid cannot be tested as it cannot be queried. + */ +TEST(TestRegistryEntry, TestUid) +{ + LOG(EJavaStorage, EInfo, "+TestUid"); + + JavaStorageApplicationEntry_t midlet1; + JavaStorageEntry attr; + + Uid suite1Uid(L"[e22a4577]"); + + attr.setEntry(PACKAGE_ID, suite1Uid.toString()); + midlet1.insert(attr); + + Uid midlet1Uid(L"[e22a4588]"); + + attr.setEntry(ID, midlet1Uid.toString()); + midlet1.insert(attr); + + js->open(); + js->startTransaction(); + + CHECK(jtu->populate(*js, APPLICATION_TABLE, midlet1)); + + JavaStorageApplicationEntry_t suite1; + attr.setEntry(PACKAGE_NAME, L"MySuite"); + suite1.insert(attr); + + attr.setEntry(ID, suite1Uid.toString()); + suite1.insert(attr); + + attr.setEntry(MEDIA_ID, L"-124614446"); + suite1.insert(attr); + + CHECK(jtu->populate(*js, APPLICATION_PACKAGE_TABLE, suite1)); + + // Session must be committed before next use of Registry otherwise + // it is locked. + js->commitTransaction(); + + auto_ptr registry(CJavaRegistry::NewL()); + + // 1. Application uid. + TUid midletUid; + uidToTUid(midlet1Uid, midletUid); + + CJavaRegistryEntry* entry = registry->RegistryEntryL(midletUid); + CHECK(entry != NULL); + CHECK(entry->Uid().iUid == midletUid.iUid); + + delete entry; + entry = NULL; + + // 2. Application suite uid. + TUid suiteUid; + uidToTUid(suite1Uid, suiteUid); + + entry = registry->RegistryEntryL(suiteUid); + CHECK(entry != NULL); + CHECK(entry->Uid().iUid == suiteUid.iUid); + + delete entry; + entry = NULL; + + // Clean + js->startTransaction(); + CHECK(jtu->remove(*js, APPLICATION_TABLE, midlet1)); + CHECK(jtu->remove(*js, APPLICATION_PACKAGE_TABLE, suite1)); + js->commitTransaction(); + js->close(); + LOG(EJavaStorage, EInfo, "-TestUid"); +} + +/** + * Test CJavaRegistryEntry::Name() method. + * 1. Application no name defined + * 2. Application suite no name defined + * 3. Application name. + * 4. Application suite name. + */ +TEST(TestRegistryEntry, TestName) +{ + LOG(EJavaStorage, EInfo, "+TestName"); + JavaStorageApplicationEntry_t midlet1; + JavaStorageEntry attr; + + Uid suite1Uid(L"[e2234577]"); + + attr.setEntry(PACKAGE_ID, suite1Uid.toString()); + midlet1.insert(attr); + + Uid midlet1Uid(L"[e2234588]"); + + attr.setEntry(ID, midlet1Uid.toString()); + midlet1.insert(attr); + + js->open(); + js->startTransaction(); + CHECK(jtu->populate(*js, APPLICATION_TABLE, midlet1)); + + JavaStorageApplicationEntry_t suite1; + attr.setEntry(ID, suite1Uid.toString()); + suite1.insert(attr); + + attr.setEntry(MEDIA_ID, L"-124614446"); + suite1.insert(attr); + + CHECK(jtu->populate(*js, APPLICATION_PACKAGE_TABLE, suite1)); + js->commitTransaction(); + + auto_ptr registry(CJavaRegistry::NewL()); + + // 1. Application uid. + TUid midletUid; + uidToTUid(midlet1Uid, midletUid); + + CJavaRegistryEntry* entry = registry->RegistryEntryL(midletUid); + CHECK(entry != NULL); + + // 1. Application no name defined + CHECK(entry->Name() == KNullDesC); + + // 2. Application suite no name defined + TUid suiteUid; + uidToTUid(suite1Uid, suiteUid); + + delete entry; + entry = NULL; + + entry = registry->RegistryEntryL(suiteUid); + CHECK(entry != NULL); + CHECK(entry->Name() == KNullDesC); + + delete entry; + entry = NULL; + + JavaStorageApplicationEntry_t midlet2; + + Uid suite2Uid(L"[e2224577]"); + + attr.setEntry(PACKAGE_ID, suite2Uid.toString()); + midlet2.insert(attr); + + Uid midlet2Uid(L"[e2224588]"); + + attr.setEntry(ID, midlet2Uid.toString()); + midlet2.insert(attr); + + wstring midlet2Name = L"MIDlet2"; + attr.setEntry(NAME, midlet2Name); + midlet2.insert(attr); + + js->open(); + js->startTransaction(); + + CHECK(jtu->populate(*js, APPLICATION_TABLE, midlet2)); + + wstring suite2Name = L"MySuite2"; + JavaStorageApplicationEntry_t suite2; + attr.setEntry(PACKAGE_NAME, suite2Name); + suite2.insert(attr); + + attr.setEntry(ID, suite2Uid.toString()); + suite2.insert(attr); + + attr.setEntry(MEDIA_ID, L"-124614446"); + suite2.insert(attr); + + CHECK(jtu->populate(*js, APPLICATION_PACKAGE_TABLE, suite2)); + + // Session must be committed before next use of Registry otherwise + // it is locked. + js->commitTransaction(); + + // 3. Application name. + uidToTUid(midlet2Uid, midletUid); + + entry = registry->RegistryEntryL(midletUid); + CHECK(entry != NULL); + + const TDesC16& name = entry->Name(); + HBufC16* refName = wstringToBuf(midlet2Name); + CHECK(name.Compare(refName->Des()) == 0); + + delete refName; + refName = NULL; + delete entry; + entry = NULL; + + // 4. Application suite name. + uidToTUid(suite2Uid, suiteUid); + + entry = registry->RegistryEntryL(suiteUid); + CHECK(entry != NULL); + + const TDesC16& name2 = entry->Name(); + refName = wstringToBuf(suite2Name); + CHECK(name2.Compare(refName->Des()) == 0); + + delete refName; + refName = NULL; + delete entry; + entry = NULL; + + registry.reset(0); + + js->startTransaction(); + CHECK(jtu->remove(*js, APPLICATION_TABLE, midlet1)); + CHECK(jtu->remove(*js, APPLICATION_PACKAGE_TABLE, suite1)); + CHECK(jtu->remove(*js, APPLICATION_TABLE, midlet2)); + CHECK(jtu->remove(*js, APPLICATION_PACKAGE_TABLE, suite2)); + js->commitTransaction(); + js->close(); + + LOG(EJavaStorage, EInfo, "-TestName"); +} + +/** + * Test CJavaRegistryEntry::Type() method. + * 1. Application type. + * 2. Application suite type. + */ +TEST(TestRegistryEntry, TestType) +{ + LOG(EJavaStorage, EInfo, "+TestType"); + JavaStorageApplicationEntry_t midlet1; + JavaStorageEntry attr; + + Uid suite1Uid(L"[ea234577]"); + + attr.setEntry(PACKAGE_ID, suite1Uid.toString()); + midlet1.insert(attr); + + Uid midlet1Uid(L"[ea234588]"); + + attr.setEntry(ID, midlet1Uid.toString()); + midlet1.insert(attr); + + js->open(); + js->startTransaction(); + + CHECK(jtu->populate(*js, APPLICATION_TABLE, midlet1)); + + JavaStorageApplicationEntry_t suite1; + attr.setEntry(ID, suite1Uid.toString()); + suite1.insert(attr); + attr.setEntry(MEDIA_ID, L"-124614446"); + suite1.insert(attr); + + CHECK(jtu->populate(*js, APPLICATION_PACKAGE_TABLE, suite1)); + + // Session must be committed before next use of Registry otherwise + // it is locked. + js->commitTransaction(); + + auto_ptr registry(CJavaRegistry::NewL()); + + // 1. Application uid. + TUid midletUid; + uidToTUid(midlet1Uid, midletUid); + + CJavaRegistryEntry* entry = registry->RegistryEntryL(midletUid); + CHECK(entry != NULL); + CHECK(entry->Type() == EMidp2Midlet); + + delete entry; + entry = NULL; + + TUid suiteUid; + uidToTUid(suite1Uid, suiteUid); + + entry = registry->RegistryEntryL(suiteUid); + CHECK(entry != NULL); + CHECK(entry->Type() == EMidp2MidletSuite); + + delete entry; + entry = NULL; + + js->startTransaction(); + CHECK(jtu->remove(*js, APPLICATION_TABLE, midlet1)); + CHECK(jtu->remove(*js, APPLICATION_PACKAGE_TABLE, suite1)); + js->commitTransaction(); + js->close(); + registry.reset(0); + + LOG(EJavaStorage, EInfo, "-TestType"); +} + +/** + * Test CJavaRegistryEntry::Drive() method. + * 1. Get application suite drive. + * 2. Get application drive. + */ +TEST(TestRegistryEntry, TestDrive) +{ + LOG(EJavaStorage, EInfo, "+TestDrive"); + JavaStorageApplicationEntry_t midlet1; + JavaStorageEntry attr; + + Uid suite1Uid(L"[e01a4577]"); + + attr.setEntry(PACKAGE_ID, suite1Uid.toString()); + midlet1.insert(attr); + + Uid midlet1Uid(L"[e01a4588]"); + + attr.setEntry(ID, midlet1Uid.toString()); + midlet1.insert(attr); + + js->open(); + js->startTransaction(); + + CHECK(jtu->populate(*js, APPLICATION_TABLE, midlet1)); + + JavaStorageApplicationEntry_t suite1; + attr.setEntry(ID, suite1Uid.toString()); + suite1.insert(attr); + + attr.setEntry(ROOT_PATH, L"e:\\private\\MIDlets\\[e01a4577]"); + suite1.insert(attr); + attr.setEntry(MEDIA_ID, L"-124614446"); + suite1.insert(attr); + + CHECK(jtu->populate(*js, APPLICATION_PACKAGE_TABLE, suite1)); + + // Session must be committed before next use of Registry otherwise + // it is locked. + js->commitTransaction(); + + auto_ptr registry(CJavaRegistry::NewL()); + + // 1. Application uid. + TUid midletUid; + uidToTUid(midlet1Uid, midletUid); + + CJavaRegistryEntry* entry = registry->RegistryEntryL(midletUid); + CHECK(entry != NULL); + CHECK(entry->Drive() == 4); // 4 represents e: + + delete entry; + entry = NULL; + + TUid suiteUid; + uidToTUid(suite1Uid, suiteUid); + + entry = registry->RegistryEntryL(suiteUid); + CHECK(entry != NULL); + CHECK(entry->Drive() == 4); // 4 represents c: + + delete entry; + entry = NULL; + + js->startTransaction(); + CHECK(jtu->remove(*js, APPLICATION_TABLE, midlet1)); + CHECK(jtu->remove(*js, APPLICATION_PACKAGE_TABLE, suite1)); + js->commitTransaction(); + js->close(); + registry.reset(0); + + LOG(EJavaStorage, EInfo, "-TestDrive"); +} + +/** + * Test CJavaRegistryEntry::AddributeL() method. + * 1. Test no attributes in DB. NULL is returned. + * 2. Test empty name. Leaves with KErrArgument. + * 3. Test non-existing attribute. NULL is returned. + * 4. Test existing application attribute. + * 5. Test existing application suite attribute. + * 6. Test trusted attribute. + * 7. Test attribute VALUE not set i.e. empty. + * NULL is returned. + */ +TEST(TestRegistryEntry, TestAttribute) +{ + LOG(EJavaStorage, EInfo, "+TestAttribute"); + JavaStorageApplicationEntry_t midlet1; + JavaStorageEntry attr; + + Uid suite1Uid(L"[ebbb4577]"); + + attr.setEntry(PACKAGE_ID, suite1Uid.toString()); + midlet1.insert(attr); + + Uid midlet1Uid(L"[ebbb4588]"); + + attr.setEntry(ID, midlet1Uid.toString()); + midlet1.insert(attr); + + js->open(); + js->startTransaction(); + CHECK(jtu->populate(*js, APPLICATION_TABLE, midlet1)); + + JavaStorageApplicationEntry_t suite1; + attr.setEntry(ID, suite1Uid.toString()); + suite1.insert(attr); + + attr.setEntry(ROOT_PATH, L"e:\\private\\MIDlets\\[ebbb4577]"); + suite1.insert(attr); + attr.setEntry(MEDIA_ID, L"-124614446"); + suite1.insert(attr); + + CHECK(jtu->populate(*js, APPLICATION_PACKAGE_TABLE, suite1)); + js->commitTransaction(); + + // 1. Test no attributes in DB. + TUid midletUid; + uidToTUid(midlet1Uid, midletUid); + + auto_ptr registry(CJavaRegistry::NewL()); + + CJavaRegistryEntry* entry = registry->RegistryEntryL(midletUid); + CHECK(entry != NULL); + + // 1. non-existing attribute + _LIT(KAttrName, "TestClass"); + const MJavaAttribute* regAttr = entry->AttributeL(KAttrName); + + CHECK(regAttr == NULL); + + delete entry; + entry = NULL; + + // Populate attributes + JavaStorageApplicationEntry_t suiteAttribute; + attr.setEntry(ID, suite1Uid.toString()); + suiteAttribute.insert(attr); + + attr.setEntry(NAME, L"MIDlet-1"); + suiteAttribute.insert(attr); + + attr.setEntry(VALUE, L""); + suiteAttribute.insert(attr); + + attr.setEntry(TRUSTED, L"0", JavaStorageEntry::INT); + suiteAttribute.insert(attr); + + js->startTransaction(); + CHECK(jtu->populate(*js, APPLICATION_PACKAGE_ATTRIBUTES_TABLE, suiteAttribute)); + suiteAttribute.clear(); + + attr.setEntry(ID, suite1Uid.toString()); + suiteAttribute.insert(attr); + + attr.setEntry(NAME, L"Jar-Size"); + suiteAttribute.insert(attr); + + attr.setEntry(VALUE, L"2342"); + suiteAttribute.insert(attr); + + attr.setEntry(TRUSTED, L"1", JavaStorageEntry::INT); + suiteAttribute.insert(attr); + + CHECK(jtu->populate(*js, APPLICATION_PACKAGE_ATTRIBUTES_TABLE, suiteAttribute)); + suiteAttribute.clear(); + + attr.setEntry(ID, suite1Uid.toString()); + suiteAttribute.insert(attr); + + attr.setEntry(NAME, L"TestClass"); + suiteAttribute.insert(attr); + + attr.setEntry(VALUE, L"com.platform.test.app"); + suiteAttribute.insert(attr); + + attr.setEntry(TRUSTED, L"0", JavaStorageEntry::INT); + suiteAttribute.insert(attr); + + CHECK(jtu->populate(*js, APPLICATION_PACKAGE_ATTRIBUTES_TABLE, suiteAttribute)); + suiteAttribute.clear(); + js->commitTransaction(); + + // 2. Test empty name. + uidToTUid(midlet1Uid, midletUid); + + entry = registry->RegistryEntryL(midletUid); + CHECK(entry != NULL); + + // 1. non-existing attribute + _LIT(KAttrName2, ""); + + TRAPD(err, regAttr = entry->AttributeL(KAttrName2)); + CHECK(KErrArgument == err); + + TRAP(err, regAttr = entry->AttributeL(KNullDesC)); + CHECK(KErrArgument == err); + + // 3. Test non-existing attribute. + _LIT(KAttrName3, "FOO_BAR"); + regAttr = entry->AttributeL(KAttrName3); + CHECK(regAttr == NULL); + + // 4. Test existing application attribute. + _LIT(KAttrName4, "TestClass"); + regAttr = entry->AttributeL(KAttrName4); + CHECK(regAttr != NULL); + + _LIT(KAttrValue, "com.platform.test.app"); + + CHECK(regAttr->Name() == KAttrName4); + CHECK(regAttr->Value() == KAttrValue); + CHECK(regAttr->Trusted() == EFalse); + + delete regAttr; + regAttr = NULL; + + delete entry; + entry = NULL; + + // 5. Test existing application suite attribute. + TUid suiteUid; + uidToTUid(suite1Uid, suiteUid); + + entry = registry->RegistryEntryL(suiteUid); + CHECK(entry != NULL); + + regAttr = entry->AttributeL(KAttrName4); + CHECK(regAttr != NULL); + + CHECK(regAttr->Name() == KAttrName4); + CHECK(regAttr->Value() == KAttrValue); + CHECK(regAttr->Trusted() == EFalse); + + delete regAttr; + regAttr = NULL; + + // 6. Test trusted attribute. + _LIT(KAttrName5, "Jar-Size"); + + regAttr = entry->AttributeL(KAttrName5); + CHECK(regAttr != NULL); + + _LIT(KAttrValue2, "2342"); + + CHECK(regAttr->Name() == KAttrName5); + CHECK(regAttr->Value() == KAttrValue2); + CHECK(regAttr->Trusted() == true); + + delete regAttr; + regAttr = NULL; + + // 7. Test attribute VALUE not set i.e. empty. + _LIT(KAttrName6, "MIDlet-1"); + + regAttr = entry->AttributeL(KAttrName6); + CHECK(regAttr == NULL); + + delete entry; + entry = NULL; + + js->startTransaction(); + CHECK(jtu->remove(*js, APPLICATION_TABLE, midlet1)); + CHECK(jtu->remove(*js, APPLICATION_PACKAGE_TABLE, suite1)); + + suiteAttribute.clear(); + attr.setEntry(ID, suite1Uid.toString()); + suiteAttribute.insert(attr); + CHECK(jtu->remove(*js, APPLICATION_PACKAGE_ATTRIBUTES_TABLE, suiteAttribute)); + + js->commitTransaction(); + js->close(); + registry.reset(0); + + LOG(EJavaStorage, EInfo, "-TestAttribute"); +} + +/** + * Test CJavaRegistryEntry::AddributesL() method. + * 1. Test no attributes in DB. Emtry array returned. + * 2. Test existing application attribute. + * 3. Test existing application suite attribute. + * 4. Test query twice i.e. Caching. + */ +TEST(TestRegistryEntry, TestAttributes) +{ + LOG(EJavaStorage, EInfo, "+TestAttributes"); + JavaStorageApplicationEntry_t midlet1; + JavaStorageEntry attr; + + Uid suite1Uid(L"[eaaaa577]"); + + attr.setEntry(PACKAGE_ID, suite1Uid.toString()); + midlet1.insert(attr); + + Uid midlet1Uid(L"[eaaaa588]"); + + attr.setEntry(ID, midlet1Uid.toString()); + midlet1.insert(attr); + + js->open(); + js->startTransaction(); + + CHECK(jtu->populate(*js, APPLICATION_TABLE, midlet1)); + + JavaStorageApplicationEntry_t suite1; + attr.setEntry(ID, suite1Uid.toString()); + suite1.insert(attr); + + attr.setEntry(ROOT_PATH, L"e:\\private\\MIDlets\\[eaaaa577]"); + suite1.insert(attr); + attr.setEntry(MEDIA_ID, L"-124614446"); + suite1.insert(attr); + + CHECK(jtu->populate(*js, APPLICATION_PACKAGE_TABLE, suite1)); + + // Session must be committed before next use of Registry otherwise + // it is locked. + js->commitTransaction(); + + TUid midletUid; + uidToTUid(midlet1Uid, midletUid); + + auto_ptr registry(CJavaRegistry::NewL()); + CJavaRegistryEntry* entry = registry->RegistryEntryL(midletUid); + CHECK(entry != NULL); + + // 1. Test no attributes in DB. + const RPointerArray& attrs = entry->AttributesL(); + CHECK(attrs.Count() == 0); + + delete entry; + entry = NULL; + + // Populate attributes + JavaStorageApplicationEntry_t suiteAttribute; + attr.setEntry(ID, suite1Uid.toString()); + suiteAttribute.insert(attr); + + attr.setEntry(NAME, L"MIDlet-1"); + suiteAttribute.insert(attr); + + attr.setEntry(VALUE, L"Greaat MIDlet"); + suiteAttribute.insert(attr); + + attr.setEntry(TRUSTED, L"0", JavaStorageEntry::INT); + suiteAttribute.insert(attr); + + js->startTransaction(); + CHECK(jtu->populate(*js, APPLICATION_PACKAGE_ATTRIBUTES_TABLE, suiteAttribute)); + suiteAttribute.clear(); + + attr.setEntry(ID, suite1Uid.toString()); + suiteAttribute.insert(attr); + + attr.setEntry(NAME, L"Jar-Size"); + suiteAttribute.insert(attr); + + attr.setEntry(VALUE, L"2342"); + suiteAttribute.insert(attr); + + attr.setEntry(TRUSTED, L"1", JavaStorageEntry::INT); + suiteAttribute.insert(attr); + + CHECK(jtu->populate(*js, APPLICATION_PACKAGE_ATTRIBUTES_TABLE, suiteAttribute)); + suiteAttribute.clear(); + + attr.setEntry(ID, suite1Uid.toString()); + suiteAttribute.insert(attr); + + attr.setEntry(NAME, L"TestClass"); + suiteAttribute.insert(attr); + + attr.setEntry(VALUE, L"com.platform.test.app"); + suiteAttribute.insert(attr); + + attr.setEntry(TRUSTED, L"0", JavaStorageEntry::INT); + suiteAttribute.insert(attr); + + CHECK(jtu->populate(*js, APPLICATION_PACKAGE_ATTRIBUTES_TABLE, suiteAttribute)); + suiteAttribute.clear(); + + // Session must be committed before next use of Registry otherwise + // it is locked. + js->commitTransaction(); + + // 2. Test existing application attributes. + entry = registry->RegistryEntryL(midletUid); + CHECK(entry != NULL); + + const RPointerArray& attrs2 = entry->AttributesL(); + CHECK(attrs2.Count() == 3); + + // Cannot quarantee order so size check should be OK. + + delete entry; + entry = NULL; + + // 3. Test existing application suite attribute. + TUid suiteUid; + uidToTUid(suite1Uid, suiteUid); + + entry = registry->RegistryEntryL(suiteUid); + CHECK(entry != NULL); + + const RPointerArray& attrs3 = entry->AttributesL(); + CHECK(attrs3.Count() == 3); + + // Cannot quarantee order so size check should be OK. + + // 4. Test query twice i.e. Caching. + const RPointerArray& attrs4 = entry->AttributesL(); + CHECK(attrs4.Count() == 3); + + delete entry; + entry = NULL; + + js->startTransaction(); + CHECK(jtu->remove(*js, APPLICATION_TABLE, midlet1)); + CHECK(jtu->remove(*js, APPLICATION_PACKAGE_TABLE, suite1)); + + suiteAttribute.clear(); + attr.setEntry(ID, suite1Uid.toString()); + suiteAttribute.insert(attr); + CHECK(jtu->remove(*js, APPLICATION_PACKAGE_ATTRIBUTES_TABLE, suiteAttribute)); + + js->commitTransaction(); + js->close(); + registry.reset(0); + LOG(EJavaStorage, EInfo, "-TestAttributes"); +} + +/** + * Test CJavaRegistryEntry::NumberOfCertificateChains() method. + * 1. Test when suite no cert chains. Size is 0. + * 2. Test when suite one cert chains. Size is 1. + * 3. Test when suite three cert chains. size is 3. + */ +TEST(TestRegistryEntry, TestNumberOfCertificateChains) +{ + LOG(EJavaStorage, EInfo, "+TestNumberOfCertificateChains"); + + JavaStorageApplicationEntry_t midlet1; + JavaStorageEntry attr; + + Uid suite1Uid(L"[e22bf577]"); + + attr.setEntry(PACKAGE_ID, suite1Uid.toString()); + midlet1.insert(attr); + + Uid midlet1Uid(L"[e22bf588]"); + + attr.setEntry(ID, midlet1Uid.toString()); + midlet1.insert(attr); + + js->open(); + js->startTransaction(); + CHECK(jtu->populate(*js, APPLICATION_TABLE, midlet1)); + + JavaStorageApplicationEntry_t suite1; + attr.setEntry(PACKAGE_NAME, L"TestCertChains"); + suite1.insert(attr); + + attr.setEntry(ID, suite1Uid.toString()); + suite1.insert(attr); + attr.setEntry(MEDIA_ID, L"-124614446"); + suite1.insert(attr); + + CHECK(jtu->populate(*js, APPLICATION_PACKAGE_TABLE, suite1)); + js->commitTransaction(); + js->close(); + auto_ptr registry(CJavaRegistry::NewL()); + + TUid suiteUid; + uidToTUid(suite1Uid, suiteUid); + + // 1. Test when no cert chains. Size is 0. + CJavaRegistryEntry* entry = registry->RegistryEntryL(suiteUid); + CHECK(entry != NULL); + CHECK(entry->NumberOfCertificateChains() == 0); + + delete entry; + entry = NULL; + + TUid midletUid; + uidToTUid(midlet1Uid, midletUid); + + // 1.2 Test no certs via app. + entry = registry->RegistryEntryL(midletUid); + CHECK(entry != NULL); + CHECK(entry->NumberOfCertificateChains() == 0); + + delete entry; + entry = NULL; + + // 2. Test when one cert chains. Size is 1. + + JavaStorageApplicationEntry_t certEntry; + JavaStorageApplicationEntry_t validcertsEntry; + + js->open(); + validcertsEntry = createValidCertsEntry(suite1Uid.toString(), L"1"); + js->write(MIDP_PACKAGE_TABLE, validcertsEntry); + + certEntry = createEntry(suite1Uid.toString(), + L"MIDlet-Certificate-1-1", + L"abc123"); + + js->write(APPLICATION_PACKAGE_ATTRIBUTES_TABLE, certEntry); + js->close(); + + entry = registry->RegistryEntryL(suiteUid); + CHECK(entry != NULL); + CHECK(entry->NumberOfCertificateChains() == 1); + + delete entry; + entry = NULL; + + // 2.2 Test no certs via app. + entry = registry->RegistryEntryL(midletUid); + CHECK(entry != NULL); + CHECK(entry->NumberOfCertificateChains() == 1); + + delete entry; + entry = NULL; + + js->open(); + js->startTransaction(); + CHECK(jtu->remove(*js, APPLICATION_PACKAGE_ATTRIBUTES_TABLE, certEntry)); + CHECK(jtu->remove(*js, MIDP_PACKAGE_TABLE, validcertsEntry)); + js->commitTransaction(); + js->close(); + + + // 3. Test when three cert chains. size is 3. + certEntry.clear(); + validcertsEntry.clear(); + + validcertsEntry = createValidCertsEntry(suite1Uid.toString(), L"1,2,3"); + + js->open(); + js->write(MIDP_PACKAGE_TABLE, validcertsEntry); + + certEntry = createEntry(suite1Uid.toString(), + L"MIDlet-Certificate-1-1", + L"abc123"); + + js->write(APPLICATION_PACKAGE_ATTRIBUTES_TABLE, certEntry); + + JavaStorageApplicationEntry_t certEntry2; + certEntry2 = createEntry(suite1Uid.toString(), + L"MIDlet-Certificate-2-1", + L"def456"); + + js->write(APPLICATION_PACKAGE_ATTRIBUTES_TABLE, certEntry2); + + JavaStorageApplicationEntry_t certEntry3; + certEntry3 = createEntry(suite1Uid.toString(), + L"MIDlet-Certificate-3-1", + L"fooBar"); + + js->write(APPLICATION_PACKAGE_ATTRIBUTES_TABLE, certEntry3); + js->close(); + + entry = registry->RegistryEntryL(suiteUid); + CHECK(entry != NULL); + CHECK(entry->NumberOfCertificateChains() == 3); + + delete entry; + entry = NULL; + + // 2.2 Test no certs via app. + entry = registry->RegistryEntryL(midletUid); + CHECK(entry != NULL); + CHECK(entry->NumberOfCertificateChains() == 3); + + delete entry; + entry = NULL; + + js->open(); + js->startTransaction(); + CHECK(jtu->remove(*js, APPLICATION_PACKAGE_ATTRIBUTES_TABLE, certEntry)); + CHECK(jtu->remove(*js, APPLICATION_PACKAGE_ATTRIBUTES_TABLE, certEntry2)); + CHECK(jtu->remove(*js, APPLICATION_PACKAGE_ATTRIBUTES_TABLE, certEntry3)); + CHECK(jtu->remove(*js, MIDP_PACKAGE_TABLE, validcertsEntry)); + CHECK(jtu->remove(*js, APPLICATION_TABLE, midlet1)); + CHECK(jtu->remove(*js, APPLICATION_PACKAGE_TABLE, suite1)); + js->commitTransaction(); + js->close(); + LOG(EJavaStorage, EInfo, "-TestNumberOfCertificateChains"); +} + +/** + * Test CJavaRegistryEntry::CertificateChain() method. + * 1. Test when suite no cert chains. + * 2. Test when suite one cert chains. + * 3. Test when suite three cert chains. + * 4. Test index greater than. + * 5. Test index less than i.e. -1. + * 6. Test install application suite and do CX509CertChain::DecodeCertsL(). + */ +TEST(TestRegistryEntry, TestCertificateChain) +{ + LOG(EJavaStorage, EInfo, "+TestCertificateChain"); + + JavaStorageApplicationEntry_t midlet1; + JavaStorageEntry attr; + + Uid suite1Uid(L"[e22bf577]"); + + attr.setEntry(PACKAGE_ID, suite1Uid.toString()); + midlet1.insert(attr); + + Uid midlet1Uid(L"[e22bf588]"); + + attr.setEntry(ID, midlet1Uid.toString()); + midlet1.insert(attr); + + js->open(); + js->startTransaction(); + CHECK(jtu->populate(*js, APPLICATION_TABLE, midlet1)); + + JavaStorageApplicationEntry_t suite1; + attr.setEntry(PACKAGE_NAME, L"TestCertChains"); + suite1.insert(attr); + + attr.setEntry(ID, suite1Uid.toString()); + suite1.insert(attr); + attr.setEntry(MEDIA_ID, L"-124614446"); + suite1.insert(attr); + + CHECK(jtu->populate(*js, APPLICATION_PACKAGE_TABLE, suite1)); + js->commitTransaction(); + js->close(); + auto_ptr registry(CJavaRegistry::NewL()); + + TUid suiteUid; + uidToTUid(suite1Uid, suiteUid); + + // 1. Test when no cert chains. Size is 0. + CJavaRegistryEntry* entry = registry->RegistryEntryL(suiteUid); + CHECK(entry != NULL); + CHECK(entry->NumberOfCertificateChains() == 0); + CHECK(entry->CertificateChain(0) == KNullDesC8); + + delete entry; + entry = NULL; + + TUid midletUid; + uidToTUid(midlet1Uid, midletUid); + + // 1.2 Test no certs via app. + entry = registry->RegistryEntryL(midletUid); + CHECK(entry != NULL); + CHECK(entry->NumberOfCertificateChains() == 0); + CHECK(entry->CertificateChain(0) == KNullDesC8); + + delete entry; + entry = NULL; + + // 2. Test when one cert chains. Size is 1. + JavaStorageApplicationEntry_t certEntry; + JavaStorageApplicationEntry_t validcertsEntry; + + js->open(); + validcertsEntry = createValidCertsEntry(suite1Uid.toString(), L"1"); + js->write(MIDP_PACKAGE_TABLE, validcertsEntry); + + certEntry = createEntry(suite1Uid.toString(), + L"MIDlet-Certificate-1-1", + L"YWJjMTIz"); // abc123 as base64 encoded. + + js->write(APPLICATION_PACKAGE_ATTRIBUTES_TABLE, certEntry); + js->close(); + + _LIT8(KCertChain1, "abc123"); + + entry = registry->RegistryEntryL(suiteUid); + CHECK(entry != NULL); + CHECK(entry->NumberOfCertificateChains() == 1); + CHECK(entry->CertificateChain(0).Compare(KCertChain1) == 0); + + delete entry; + entry = NULL; + + // 2.2 Test no certs via app. + entry = registry->RegistryEntryL(midletUid); + CHECK(entry != NULL); + CHECK(entry->NumberOfCertificateChains() == 1); + CHECK(entry->CertificateChain(0).Compare(KCertChain1) == 0); + + delete entry; + entry = NULL; + + js->open(); + js->startTransaction(); + CHECK(jtu->remove(*js, APPLICATION_PACKAGE_ATTRIBUTES_TABLE, certEntry)); + CHECK(jtu->remove(*js, MIDP_PACKAGE_TABLE, validcertsEntry)); + js->commitTransaction(); + js->close(); + + + // 3. Test when three cert chains. size is 3. + certEntry.clear(); + validcertsEntry.clear(); + + validcertsEntry = createValidCertsEntry(suite1Uid.toString(), L"1,2,3"); + + js->open(); + js->write(MIDP_PACKAGE_TABLE, validcertsEntry); + + certEntry = createEntry(suite1Uid.toString(), + L"MIDlet-Certificate-1-1", + L"YWJjMTIz"); // abc123 + + js->write(APPLICATION_PACKAGE_ATTRIBUTES_TABLE, certEntry); + + JavaStorageApplicationEntry_t certEntry2; + certEntry2 = createEntry(suite1Uid.toString(), + L"MIDlet-Certificate-2-1", + L"ZGVmNDU2"); // def456 as base 64 encoded. + + js->write(APPLICATION_PACKAGE_ATTRIBUTES_TABLE, certEntry2); + + JavaStorageApplicationEntry_t certEntry3; + certEntry3 = createEntry(suite1Uid.toString(), + L"MIDlet-Certificate-3-1", + L"Zm9vQmFy"); // fooBar + + js->write(APPLICATION_PACKAGE_ATTRIBUTES_TABLE, certEntry3); + js->close(); + + entry = registry->RegistryEntryL(suiteUid); + CHECK(entry != NULL); + CHECK(entry->NumberOfCertificateChains() == 3); + CHECK(entry->CertificateChain(0).Compare(KCertChain1) == 0); + _LIT8(KCertChain2, "def456"); + CHECK(entry->CertificateChain(1).Compare(KCertChain2) == 0); + _LIT8(KCertChain3, "fooBar"); + CHECK(entry->CertificateChain(2).Compare(KCertChain3) == 0); + + delete entry; + entry = NULL; + + // 2.2 Test no certs via app. + entry = registry->RegistryEntryL(midletUid); + CHECK(entry != NULL); + CHECK(entry->NumberOfCertificateChains() == 3); + CHECK(entry->CertificateChain(0).Compare(KCertChain1) == 0); + CHECK(entry->CertificateChain(1).Compare(KCertChain2) == 0); + CHECK(entry->CertificateChain(2).Compare(KCertChain3) == 0); + + // 4. Test index greater than. + CHECK(entry->CertificateChain(3) == KNullDesC8); + + // 5. Test index less than i.e. -1. + CHECK(entry->CertificateChain(-1) == KNullDesC8); + + delete entry; + entry = NULL; + + js->open(); + js->startTransaction(); + CHECK(jtu->remove(*js, APPLICATION_PACKAGE_ATTRIBUTES_TABLE, certEntry)); + CHECK(jtu->remove(*js, APPLICATION_PACKAGE_ATTRIBUTES_TABLE, certEntry2)); + CHECK(jtu->remove(*js, APPLICATION_PACKAGE_ATTRIBUTES_TABLE, certEntry3)); + CHECK(jtu->remove(*js, MIDP_PACKAGE_TABLE, validcertsEntry)); + CHECK(jtu->remove(*js, APPLICATION_TABLE, midlet1)); + CHECK(jtu->remove(*js, APPLICATION_PACKAGE_TABLE, suite1)); + js->commitTransaction(); + js->close(); + + // 6. Test install application suite and do CX509CertChain::DecodeCertsL() + RProcess rJavaInstaller; + TFileName fileName; + TBuf<400> commandLine; + + // Build command line used to pass all necessary info to Java Installer + std::auto_ptr installerStarterDll( + stringToDes(java::runtime::JAVA_INSTALLER_STARTER_DLL)); + commandLine = installerStarterDll->Des(); + commandLine.Append(_L(" install -jad=c:\\Signed.jad")); + commandLine.Append(_L(" -silent -upgrade=yes -ocsp=no")); + commandLine.Append(_L(" -download=no -upgrade_data=yes")); + + // start JavaInstaller + std::auto_ptr installerProcess( + stringToDes(java::runtime::JAVA_PROCESS)); + TInt err = rJavaInstaller.Create(installerProcess->Des(), commandLine); + + TRequestStatus status; + + if (KErrNone == err) + { + LOG(EJavaStorage, EInfo, "Calling Logon"); + // This call will wait until Java Installer exits (or panics) + rJavaInstaller.Logon(status); + + LOG(EJavaStorage, EInfo, "Calling Resume"); + rJavaInstaller.Resume(); + } + else + { + ELOG1(EJavaStorage, "Cannot start Installer, error %d", err); + User::Leave(err); + } + + LOG(EJavaStorage, EInfo, "Calling RProcess::Close"); + // free resources before returning + rJavaInstaller.Close(); + + // now wait until Java Installer exits + User::WaitForRequest(status); + + registry.reset(CJavaRegistry::NewL()); + RArray uids; + registry->GetRegistryEntryUidsL(EGeneralPackage, uids); + + CHECK(uids.Count() == 1); // One app installed + + CJavaRegistryEntry* regEntry = registry->RegistryEntryL(uids[0]); + CHECK(regEntry != NULL); + CHECK(regEntry->NumberOfCertificateChains() > 0); + + const TDesC8& chain = regEntry->CertificateChain(0); + + auto_ptr theChain(new(ELeave)CX509CertChain()); + + CArrayPtrFlat* certsArray = + theChain->DecodeCertsL(chain); + CHECK(certsArray->Count() > 0); // This verifies X509 decode succeeded. + + certsArray->ResetAndDestroy(); + delete regEntry; + regEntry = NULL; + registry.reset(0); + + // UNINSTALL + // Build command line used to pass all necessary info to Java Installer + commandLine = installerStarterDll->Des(); + commandLine.Append(_L(" uninstall -uid=")); + TUidName uidName = (uids[0]).Name(); + commandLine.Append(uidName); + uids.Reset(); + uids.Close(); + commandLine.Append(_L(" -silent")); + + // start JavaInstaller + err = rJavaInstaller.Create(installerProcess->Des(), commandLine); + + status = KRequestPending; + + if (KErrNone == err) + { + LOG(EJavaStorage, EInfo, "Calling Logon"); + // This call will wait until Java Installer exits (or panics) + rJavaInstaller.Logon(status); + + LOG(EJavaStorage, EInfo, "Calling Resume"); + rJavaInstaller.Resume(); + } + else + { + ELOG1(EJavaStorage, "Cannot start Installer, error %d", err); + User::Leave(err); + } + + LOG(EJavaStorage, EInfo, "Calling RProcess::Close"); + // free resources before returning + rJavaInstaller.Close(); + + // now wait until Java Installer exits + User::WaitForRequest(status); + + LOG(EJavaStorage, EInfo, "-TestCertificateChain"); +} + +/** + * Test CJavaRegistryEntry::DrmContentId() method. + * 1. Test DrmContentId no ContentId. + * 2. Test DrmContentId DRM protected file SuiteEntry. + * 3. Test DrmContentId DRM protected file AppEntry. + */ +TEST(TestRegistryEntry, TestDrmContentId) +{ + LOG(EJavaStorage, EInfo, "+TestDrmContentId"); + + JavaStorageApplicationEntry_t midlet1; + JavaStorageEntry attr; + + Uid suite1Uid(L"[e22ba577]"); + + attr.setEntry(PACKAGE_ID, suite1Uid.toString()); + midlet1.insert(attr); + + Uid midlet1Uid(L"[e22ba588]"); + + attr.setEntry(ID, midlet1Uid.toString()); + midlet1.insert(attr); + + js->open(); + js->startTransaction(); + CHECK(jtu->populate(*js, APPLICATION_TABLE, midlet1)); + + JavaStorageApplicationEntry_t suite1; + attr.setEntry(PACKAGE_NAME, L"MySuite"); + suite1.insert(attr); + + attr.setEntry(JAR_PATH, L"c:\\HelloWorld1.jar"); + + suite1.insert(attr); + + attr.setEntry(ID, suite1Uid.toString()); + suite1.insert(attr); + attr.setEntry(MEDIA_ID, L"-124614446"); + suite1.insert(attr); + + CHECK(jtu->populate(*js, APPLICATION_PACKAGE_TABLE, suite1)); + js->commitTransaction(); + + auto_ptr registry(CJavaRegistry::NewL()); + + // 1. Test DrmContentId no DRM protected file. + TUid suiteUid; + uidToTUid(suite1Uid, suiteUid); + + CJavaRegistryEntry* entry = registry->RegistryEntryL(suiteUid); + CHECK(entry != NULL); + CHECK(entry->DrmContentId() == KNullDesC); + + delete entry; + entry = NULL; + + JavaStorageApplicationEntry_t updateEntry; + attr.setEntry(JAR_PATH, L"c:\\HelloWorld2.jar"); + updateEntry.insert(attr); + attr.setEntry(CONTENT_ID, L"MyGreatContentId"); + updateEntry.insert(attr); + + // 2. Test DrmContentId DRM protected file SuiteEntry. + js->startTransaction(); + CHECK(jtu->update(*js, APPLICATION_PACKAGE_TABLE, updateEntry, suite1)); + js->commitTransaction(); + + entry = registry->RegistryEntryL(suiteUid); + CHECK(entry != NULL); + _LIT(KContentId, "MyGreatContentId"); + CHECK(entry->DrmContentId().Compare(KContentId) == 0); + + delete entry; + entry = NULL; + + // 3. Test DrmContentId DRM protected file AppEntry. + TUid midletUid; + uidToTUid(midlet1Uid, midletUid); + + entry = registry->RegistryEntryL(midletUid); + CHECK(entry != NULL); + CHECK(entry->DrmContentId().Compare(KContentId) == 0); + + delete entry; + entry = NULL; + + js->startTransaction(); + CHECK(jtu->remove(*js, APPLICATION_TABLE, midlet1)); + CHECK(jtu->remove(*js, APPLICATION_PACKAGE_TABLE, updateEntry)); + js->commitTransaction(); + js->close(); + LOG(EJavaStorage, EInfo, "-TestDrmContentId"); +} + +const JavaStorageApplicationEntry_t createEntry(const wstring& aUid, + const wstring& aName, + const wstring& aValue) +{ + JavaStorageApplicationEntry_t entry; + JavaStorageEntry attr; + + attr.setEntry(ID, aUid); + entry.insert(attr); + + attr.setEntry(NAME, aName); + entry.insert(attr); + + attr.setEntry(VALUE, aValue); + entry.insert(attr); + + return entry; +} + +const JavaStorageApplicationEntry_t createValidCertsEntry(const wstring& aUid, + const wstring& aCerts) +{ + JavaStorageApplicationEntry_t entry; + JavaStorageEntry attr; + + attr.setEntry(ID, aUid); + entry.insert(attr); + + attr.setEntry(VALID_CERTS, aCerts); + entry.insert(attr); + + return entry; +} +