sl@0: // Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // Puts some test feature registry configuration files - some corrupt, others legal - sl@0: // in the C: private data cage of the setup executable. Sets up test RProperties. sl@0: // sl@0: // sl@0: sl@0: /** sl@0: @file sl@0: @internalComponent sl@0: @test sl@0: */ sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include "featregcmn.h" sl@0: #include "maketestconfig.h" sl@0: sl@0: // names of test configurations that can be set up by this exe, specified as sl@0: // command-line option: sl@0: _LIT(KFeatRegTestConfig_force_setup, "force_setup"); sl@0: _LIT(KFeatRegTestConfig_reset, "reset"); sl@0: _LIT(KFeatRegTestConfig_corrupt_missing, "corrupt_missing"); sl@0: _LIT(KFeatRegTestConfig_corrupt_noheader, "corrupt_noheader"); sl@0: _LIT(KFeatRegTestConfig_corrupt_incompleteheader, "corrupt_incompleteheader"); sl@0: _LIT(KFeatRegTestConfig_corrupt_invalidtypeprefix, "corrupt_invalidtypeprefix"); sl@0: _LIT(KFeatRegTestConfig_corrupt_badversionnumber, "corrupt_badversionnumber"); sl@0: _LIT(KFeatRegTestConfig_corrupt_toomuchdata, "corrupt_toomuchdata"); sl@0: _LIT(KFeatRegTestConfig_corrupt_toolittledata, "corrupt_toolittledata"); sl@0: _LIT(KFeatRegTestConfig_corrupt_entryoutoforder, "corrupt_entryoutoforder"); sl@0: _LIT(KFeatRegTestConfig_corrupt_entryrepeated, "corrupt_entryrepeated"); sl@0: _LIT(KFeatRegTestConfig_corrupt_badrange, "corrupt_badrange"); sl@0: _LIT(KFeatRegTestConfig_valid_nofeatures, "valid_nofeatures"); sl@0: _LIT(KFeatRegTestConfig_valid_small, "valid_small"); sl@0: _LIT(KFeatRegTestConfig_valid_large, "valid_large"); sl@0: _LIT(KFeatRegTestConfig_valid_perf, "valid_perf_"); sl@0: sl@0: sl@0: TConfigFileName ConfigFileName; sl@0: sl@0: sl@0: static TInt DefineTestFlagProperty() sl@0: { sl@0: RProcess thisProcess; sl@0: // sanity check that feature property category in common header equals SID of this process sl@0: ASSERT(KFeaturePropCat == thisProcess.SecureId()); sl@0: TSecurityPolicy readPolicy(TSecurityPolicy::EAlwaysPass); sl@0: TSecurityPolicy writePolicy(thisProcess.SecureId()); sl@0: TInt result = RProperty::Define(KFeatRegConfigTestKey, RProperty::EInt, readPolicy, writePolicy); sl@0: if (result == KErrAlreadyExists) sl@0: { sl@0: result = KErrNone; sl@0: } sl@0: return result; sl@0: } sl@0: sl@0: static TInt WriteTestConfigFile(TUint32* aData, TInt aSize) sl@0: { sl@0: RFs fs; sl@0: TInt result = fs.Connect(); sl@0: if (result == KErrNone) sl@0: { sl@0: result = fs.MkDirAll(ConfigFileName); sl@0: if ((result == KErrNone) || (result == KErrAlreadyExists)) sl@0: { sl@0: RFile cfgFile; sl@0: result = cfgFile.Replace(fs, ConfigFileName, EFileWrite|EFileStream); sl@0: if (result == KErrNone) sl@0: { sl@0: result = cfgFile.Write(TPtrC8(reinterpret_cast(aData), aSize)); sl@0: cfgFile.Close(); sl@0: } sl@0: } sl@0: fs.Close(); sl@0: } sl@0: if (result == KErrNone) sl@0: { sl@0: result = DefineTestFlagProperty(); sl@0: } sl@0: return result; sl@0: } sl@0: sl@0: TInt E32Main() sl@0: { sl@0: __UHEAP_MARK; sl@0: sl@0: TFileName configName; sl@0: User::CommandLine(configName); sl@0: sl@0: // construct config filename sl@0: GetSystemDrivePath(ConfigFileName); sl@0: sl@0: // always delete feature property so featreg.dll re-loads it (note this sl@0: // executable has same UID3 as featreg setup: sl@0: TInt result = RProperty::Delete(KFeaturePropKey); sl@0: if (result == KErrNotFound) sl@0: { sl@0: result = KErrNone; sl@0: } sl@0: if (result != KErrNone) sl@0: { sl@0: goto cleanupReturn; sl@0: } sl@0: sl@0: //-------------------- sl@0: if (configName.Find(KFeatRegTestConfig_force_setup) >= 0) sl@0: { sl@0: // force setup sl@0: // nothing to do; just ensures feature property is deleted so setup is run sl@0: } sl@0: //-------------------- sl@0: else if (configName.Find(KFeatRegTestConfig_reset) >= 0) sl@0: { sl@0: // reset sl@0: // delete "test-flag" property so setup looks at true config info sl@0: result = RProperty::Delete(KFeatRegConfigTestKey); sl@0: if (result == KErrNotFound) sl@0: { sl@0: result = KErrNone; sl@0: } sl@0: } sl@0: //-------------------- sl@0: else if (configName.Find(KFeatRegTestConfig_corrupt_missing) >= 0) sl@0: { sl@0: // no header sl@0: RFs fs; sl@0: result = fs.Connect(); sl@0: if (result == KErrNone) sl@0: { sl@0: result = fs.Delete(ConfigFileName); sl@0: if ((result == KErrNotFound) || (result == KErrPathNotFound)) sl@0: { sl@0: result = KErrNone; sl@0: } sl@0: fs.Close(); sl@0: } sl@0: if (result == KErrNone) sl@0: { sl@0: result = DefineTestFlagProperty(); sl@0: } sl@0: } sl@0: //-------------------- sl@0: else if (configName.Find(KFeatRegTestConfig_corrupt_noheader) >= 0) sl@0: { sl@0: // no header sl@0: result = WriteTestConfigFile(NULL, 0); sl@0: } sl@0: //-------------------- sl@0: else if (configName.Find(KFeatRegTestConfig_corrupt_incompleteheader) >= 0) sl@0: { sl@0: // header is not complete sl@0: TUint32 fileData1[] = sl@0: { sl@0: validTypePrefix, sl@0: 0, // version number, must be zero sl@0: 0 // entry count sl@0: // range count: missing sl@0: }; sl@0: result = WriteTestConfigFile(fileData1, sizeof(fileData1)); sl@0: } sl@0: //-------------------- sl@0: else if (configName.Find(KFeatRegTestConfig_corrupt_invalidtypeprefix) >= 0) sl@0: { sl@0: // invalid type prefix sl@0: TUint32 fileData1[] = sl@0: { sl@0: invalidTypePrefix, // should be validTypePrefix sl@0: 0, // version number sl@0: 0, // entry count sl@0: 0 // range count sl@0: }; sl@0: result = WriteTestConfigFile(fileData1, sizeof(fileData1)); sl@0: } sl@0: sl@0: //-------------------- sl@0: else if (configName.Find(KFeatRegTestConfig_corrupt_badversionnumber) >= 0) sl@0: { sl@0: // bad file version header sl@0: TUint32 fileData1[] = sl@0: { sl@0: validTypePrefix, sl@0: 1, // version number: not zero sl@0: 0, // entry count sl@0: 0 // range count sl@0: }; sl@0: result = WriteTestConfigFile(fileData1, sizeof(fileData1)); sl@0: } sl@0: //-------------------- sl@0: else if (configName.Find(KFeatRegTestConfig_corrupt_toomuchdata) >= 0) sl@0: { sl@0: // corrupt: config file contains more data than required by header sl@0: TUint32 fileData2[] = sl@0: { sl@0: validTypePrefix, sl@0: 0, // version number, must be zero sl@0: 0, // entry count sl@0: 0, // range count sl@0: 0, // unexpected extra data sl@0: }; sl@0: result = WriteTestConfigFile(fileData2, sizeof(fileData2)); sl@0: } sl@0: //-------------------- sl@0: else if (configName.Find(KFeatRegTestConfig_corrupt_toolittledata) >= 0) sl@0: { sl@0: // corrupt: config file contains less data than required by header sl@0: TUint32 fileData3[] = sl@0: { sl@0: validTypePrefix, sl@0: 0, // version number, must be zero sl@0: 2, // entry count sl@0: 1 // range count sl@0: // should be 2 entries (2 words each) and 1 default range (2 words each) sl@0: }; sl@0: result = WriteTestConfigFile(fileData3, sizeof(fileData3)); sl@0: } sl@0: //-------------------- sl@0: else if (configName.Find(KFeatRegTestConfig_corrupt_entryoutoforder) >= 0) sl@0: { sl@0: // corrupt: feature entries not ordered from lowest to highest UID sl@0: TUint32 fileData4[] = sl@0: { sl@0: validTypePrefix, sl@0: 0, // version number, must be zero sl@0: 3, // entry count sl@0: 0, // range count sl@0: 2, // Feature UID = 2 sl@0: 1, // status low-bit set -> present sl@0: 5, // Feature UID = 5 sl@0: 1, // status low-bit set -> present sl@0: 3, // Feature UID = 3: Feature UIDs not in strictly increasing order sl@0: 1 // status low-bit set -> present sl@0: }; sl@0: result = WriteTestConfigFile(fileData4, sizeof(fileData4)); sl@0: } sl@0: //-------------------- sl@0: else if (configName.Find(KFeatRegTestConfig_corrupt_entryrepeated) >= 0) sl@0: { sl@0: // corrupt: repeated feature UID sl@0: TUint32 fileData5[] = sl@0: { sl@0: validTypePrefix, sl@0: 0, // version number, must be zero sl@0: 3, // entry count sl@0: 0, // range count sl@0: 2, // Feature UID = 2 sl@0: 1, // status low-bit set -> present sl@0: 5, // Feature UID = 5 sl@0: 1, // status low-bit set -> present sl@0: 5, // Feature UID = 5: Feature UID repeated sl@0: 1, // status low-bit set -> present sl@0: }; sl@0: result = WriteTestConfigFile(fileData5, sizeof(fileData5)); sl@0: } sl@0: //-------------------- sl@0: else if (configName.Find(KFeatRegTestConfig_corrupt_badrange) >= 0) sl@0: { sl@0: // corrupt: default-supported range not listed in order lowUid-highUid sl@0: TUint32 fileData6[] = sl@0: { sl@0: validTypePrefix, sl@0: 0, // version number, must be zero sl@0: 1, // entry count sl@0: 2, // range count sl@0: 2, // Feature UID = 2 sl@0: 1, // status low-bit set -> present sl@0: 5, // Range 1 low UID sl@0: 9, // high UID sl@0: 88, // Range 2 low UID sl@0: 76 // high UID: not >= lowUID sl@0: }; sl@0: result = WriteTestConfigFile(fileData6, sizeof(fileData6)); sl@0: } sl@0: //-------------------- sl@0: else if (configName.Find(KFeatRegTestConfig_valid_nofeatures) >= 0) sl@0: { sl@0: #ifndef SYMBIAN_FEATURE_MANAGER sl@0: // valid: no features sl@0: TUint32 fileData7[] = sl@0: { sl@0: validTypePrefix, sl@0: 0, // version number, must be zero sl@0: 0, // entry count sl@0: 0 // range count sl@0: }; sl@0: #else sl@0: // valid: no features sl@0: TUint32 fileData7[] = sl@0: { sl@0: validTypePrefix, sl@0: 0, // version number, must be zero sl@0: 0, // entry count sl@0: 1, // range count: we have to provide at least one range, otherwise the file will be corrupt from the FeatMgr perspective sl@0: KFeatRegTest_DummyRangeId, sl@0: KFeatRegTest_DummyRangeId sl@0: }; sl@0: #endif sl@0: result = WriteTestConfigFile(fileData7, sizeof(fileData7)); sl@0: } sl@0: //-------------------- sl@0: else if (configName.Find(KFeatRegTestConfig_valid_small) >= 0) sl@0: { sl@0: // valid: few features, one default=supported range sl@0: TUint32 fileData8[] = sl@0: { sl@0: validTypePrefix, sl@0: 0, // version number, must be zero sl@0: 2, // entry count sl@0: 1, // range count sl@0: KFeatRegTest1_02_SNFeatId, // 1. feature UID sl@0: KFeatRegTest1_02_SNFeatSt, // status word; low bit set = supported sl@0: KFeatRegTest1_05_URFeatId, // 2. feature UID sl@0: KFeatRegTest1_05_URFeatSt, // status word; low-bit not set = not supported sl@0: KFeatRegTest1_03_LoFeatId, // low-feature-UID of default=supported range sl@0: KFeatRegTest1_04_HiFeatId // high-feature-UID of default=supported range sl@0: }; sl@0: result = WriteTestConfigFile(fileData8, sizeof(fileData8)); sl@0: } sl@0: //-------------------- sl@0: else if (configName.Find(KFeatRegTestConfig_valid_large) >= 0) sl@0: { sl@0: // valid: many features, several default=supported ranges sl@0: TUint32 fileData9[2 + 2*KFeatRegTest2_04_numTestFeatures + 2*KFeatRegTest2_07_rangeCount]; sl@0: TInt j = sizeof(TFeatureHeader) / sizeof(TUint32); sl@0: TInt entryCount = 0; sl@0: TUint32 id = KFeatRegTest2_01_FirstId; sl@0: // feature entries sl@0: for (TInt e = KFeatRegTest2_04_numTestFeatures; e > 0; e--) sl@0: { sl@0: TBool featureSupported = !(id & KFeatRegTest2_05_NotSupportedBit); sl@0: TBool inDefaultSupportedRange = id & KFeatRegTest2_06_DefSupportedBit; sl@0: // only need to list feature if support differs from default ranges sl@0: if (featureSupported && (!inDefaultSupportedRange)) sl@0: { sl@0: fileData9[j++] = id; sl@0: fileData9[j++] = RFeatureRegistry::EStatusSupportBit; sl@0: entryCount++; sl@0: } sl@0: else if ((!featureSupported) && inDefaultSupportedRange) sl@0: { sl@0: fileData9[j++] = id; sl@0: fileData9[j++] = 0; // specifically listed as not supported sl@0: entryCount++; sl@0: } sl@0: id += KFeatRegTest2_03_IncrId; sl@0: } sl@0: // default=supported ranges sl@0: TUint32 lowId = KFeatRegTest2_06_DefSupportedBit; sl@0: for (TUint r = 0; r < KFeatRegTest2_07_rangeCount; r++) sl@0: { sl@0: fileData9[j++] = lowId; sl@0: fileData9[j++] = lowId + KFeatRegTest2_06_DefSupportedBit - 1; sl@0: lowId += 2*KFeatRegTest2_06_DefSupportedBit; sl@0: } sl@0: // header sl@0: fileData9[0] = validTypePrefix, sl@0: fileData9[1] = 0; // version number, must be zero sl@0: fileData9[2] = entryCount; sl@0: fileData9[3] = KFeatRegTest2_07_rangeCount; sl@0: result = WriteTestConfigFile(fileData9, j*sizeof(TUint32)); sl@0: } sl@0: else if (configName.Find(KFeatRegTestConfig_valid_perf) >= 0) sl@0: { sl@0: // extract the number of features to put into the file from the sl@0: // arguments supplied to the process from the script sl@0: TInt digitchar = 0; sl@0: TChar charItem(configName[digitchar]); sl@0: while (charItem.IsDigit() == EFalse) sl@0: charItem = configName[++digitchar]; sl@0: if (digitchar >= configName.Length()) sl@0: { sl@0: result = KErrArgument; sl@0: goto cleanupReturn; sl@0: } sl@0: sl@0: TPtrC16 counter = configName.Mid(digitchar); sl@0: TLex lex1(counter); sl@0: TInt count = 0; sl@0: lex1.Val(count); sl@0: // valid: allocate space for maximum number of features we would expect sl@0: TInt j = sizeof(TFeatureHeader) / sizeof(TUint32); sl@0: TUint32 fileData9[4 + 2*8001]; // j must == 4 sl@0: TInt entryCount = 0; sl@0: TUint32 id = KFeatRegTest2_01_FirstId; sl@0: // create 'count' number of feature entries sl@0: for (TInt e = count; e > 0; e--) sl@0: { sl@0: fileData9[j++] = id; sl@0: fileData9[j++] = (e&0x01) ? RFeatureRegistry::EStatusSupportBit : 0; sl@0: entryCount++; sl@0: id += KFeatRegTest2_03_IncrId; sl@0: } sl@0: #ifndef SYMBIAN_FEATURE_MANAGER sl@0: // header sl@0: fileData9[0] = validTypePrefix, sl@0: fileData9[1] = 0; // version number, must be zero sl@0: fileData9[2] = entryCount; sl@0: fileData9[3] = 0; sl@0: #else sl@0: //we have to provide at least one range, otherwise the file will be corrupt from the FeatMgr perspective sl@0: fileData9[j++] = KFeatRegTest_DummyRangeId; sl@0: fileData9[j++] = KFeatRegTest_DummyRangeId; sl@0: // header sl@0: fileData9[0] = validTypePrefix, sl@0: fileData9[1] = 0; // version number, must be zero sl@0: fileData9[2] = entryCount; sl@0: fileData9[3] = 1; sl@0: #endif sl@0: result = WriteTestConfigFile(fileData9, j*sizeof(TUint32)); sl@0: } sl@0: else sl@0: { sl@0: result = KErrArgument; sl@0: } sl@0: sl@0: cleanupReturn: sl@0: __UHEAP_MARKEND; sl@0: sl@0: return result; sl@0: } sl@0: