'encoding UTF-8 Do not remove or change this line! '************************************************************************* ' ' Licensed to the Apache Software Foundation (ASF) under one ' or more contributor license agreements. See the NOTICE file ' distributed with this work for additional information ' regarding copyright ownership. The ASF licenses this file ' to you under the Apache License, Version 2.0 (the ' "License"); you may not use this file except in compliance ' with the License. You may obtain a copy of the License at ' ' http://www.apache.org/licenses/LICENSE-2.0 ' ' Unless required by applicable law or agreed to in writing, ' software distributed under the License is distributed on an ' "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY ' KIND, either express or implied. See the License for the ' specific language governing permissions and limitations ' under the License. ' '************************************************************************* '* '* short description : Function test of extension manager '* '\************************************************************************ testcase tExtensionsFunction ' written for CWS jsc7, in master since SRC680m176 ' additions for CWS sb63 - Dependency checking with versioning - documents 24-30 ' features: - http://specs.openoffice.org/appwide/packagemanager/simple_extension_license.odt ' - http://specs.openoffice.org/appwide/packagemanager/extensiondependencies1.odt '/// The test documents are available at http://qa.openoffice.org/source/browse/qa/qatesttool/framework/basic/input/extensions/ ///' '/// Textdocuments used in this test and expected messages: ///' '/// (1/31): simpleLicense\BadDesc.oxt ///' '/// - BadDesc.oxt/description.xml contains data which cannot be parsed. ///' '/// - will not install ///' '/// (2/31): simpleLicense\BadNamespace.oxt ///' '/// - BadNamespace.oxt/description.xml contains a root element with an unsupported namespace. ///' '/// - will not install ///' '/// (3/31): simpleLicense\BadRoot.oxt ///' '/// - BadRoot.oxt/description.xml does not contain the root element . ///' '/// - will not install ///' '/// (4/31): simpleLicense\IncompAttr1.oxt ///' '/// - ExtensionSoftwareLicenseAgreement dialog exists ///' '/// - installs and is enabled ///' '/// (5/31): simpleLicense\IncompAttr2.oxt ///' '/// - Cannot find a localized license text or a default license text. ///' '/// - will not install ///' '/// (6/31): simpleLicense\LongLic.oxt ///' '/// - ExtensionSoftwareLicenseAgreement dialog exists ///' '/// - It is a Long License ///' '/// - installs and is enabled ///' '/// (7/31): simpleLicense\MissingLic.oxt ///' '/// - MissingLic.oxt\registration\license_en_US.txt does not exist. ///' '/// - will not install ///' '/// (8/31): simpleLicense\MissingLicRef.oxt ///' '/// - Cannot find a localized license text or a default license text. ///' '/// - will not install ///' '/// (9/31): simpleLicense\NoDesc.oxt ///' '/// - installs and is enabled ///' '/// (10/31): simpleLicense\NoLangNoDefault.oxt ///' '/// - Cannot find a localized license text or a default license text. ///' '/// - will not install ///' '/// (11/31): simpleLicense\OnlyDefault.oxt ///' '/// - Cannot find a localized license text or a default license text. ///' '/// - will not install ///' '/// (12/31): simpleLicense\ShortLicense.oxt ///' '/// - ExtensionSoftwareLicenseAgreement dialog exists ///' '/// - installs and is enabled ///' '/// (13/31): ///' '/// - will not install ///' '/// (14/31): simpleLicense\ShortLicenseShared.oxt ///' '/// - ExtensionSoftwareLicenseAgreement dialog exists ///' '/// - installs and is enabled ///' '/// (15/31): dependencies\broken-dependency.oxt ///' '/// - broken-dependency.oxt/description.xml contains data which cannot be parsed. ///' '/// - will not install ///' '/// (16/31): dependencies\double-dependencies.oxt ///' '/// - UnsatisfiedDependencies dialog exists ///' '/// (1/2): Dependency 1 ///' '/// (2/2): Dependency 2 ///' '/// - will not install ///' '/// (17/31): dependencies\empty-dependencies.oxt ///' '/// - installs and is enabled ///' '/// (18/31): dependencies\funny-dependency.oxt ///' '/// - UnsatisfiedDependencies dialog exists ///' '/// (1/1): & < > ' " > ' tab . crlf ///' '/// . em-dash�;. line-separator?. paragraph-separator?. xxxxxxxxxxx... ///' '/// - will not install ///' '/// (19/31): dependencies\license-dependency.oxt ///' '/// - UnsatisfiedDependencies dialog exists ///' '/// (1/1): Dependency ///' '/// - will not install ///' '/// (20/31): dependencies\many-dependencies.oxt ///' '/// - UnsatisfiedDependencies dialog exists ///' '/// (1/20): Dependency 1 ///' '/// (2/20): Dependency 2 ///' '/// (3/20): Dependency 3 ///' '/// (4/20): Dependency 4 ///' '/// (5/20): Dependency 5 ///' '/// (6/20): Dependency 6 ///' '/// (7/20): Dependency 7 ///' '/// (8/20): Dependency 8 ///' '/// (9/20): Dependency 9 ///' '/// (10/20): Dependency 10 ///' '/// (11/20): Dependency 11 ///' '/// (12/20): Dependency 12 ///' '/// (13/20): Dependency 13 ///' '/// (14/20): Dependency 14 ///' '/// (15/20): Dependency 15 ///' '/// (16/20): Dependency 16 ///' '/// (17/20): Dependency 17 ///' '/// (18/20): Dependency 18 ///' '/// (19/20): Dependency 19 ///' '/// (20/20): Dependency 20 ///' '/// - will not install ///' '/// (21/31): dependencies\no-dependencies.oxt ///' '/// - installs and is enabled ///' '/// (22/31): dependencies\no-description.oxt ///' '/// - installs and is enabled ///' '/// (23/31): dependencies\unknown-dependency.oxt ///' '/// - UnsatisfiedDependencies dialog exists ///' '/// (1/1): Unknown ///' '/// - will not install ///' '/// (24/31): dependencies\version21.oxt ///' '/// - installs and is enabled ///' '/// (25/31): dependencies\version10000.oxt ///' '/// - UnsatisfiedDependencies dialog exists ///' '/// (1/1): Unknown ///' '/// - will not install ///' '/// (26/31): dependencies\version21ns.oxt ///' '/// - installs and is enabled ///' '/// (27/31): dependencies\version21other.oxt ///' '/// - UnsatisfiedDependencies dialog exists ///' '/// (1/1): Unknown ///' '/// - will not install ///' '/// (25/31): dependencies\version25.oxt ///' '/// - installs and is enabled ///' '/// (25/31): dependencies\version30.oxt ///' '/// - installs and is enabled ///' '/// (25/31): dependencies\version31.oxt ///' '/// - UnsatisfiedDependencies dialog exists ///' '/// (1/1): Unknown ///' '/// - will not install ///' '/// (27/31): dependencies\version21other.oxt ///' '/// - UnsatisfiedDependencies dialog exists ///' '/// (1/1): Unknown ///' '/// (30/31): dependencies\versionempty.oxt ///' '/// - installs and is enabled ///' '/// (31/31): dependencies\versionnone.oxt ///' '/// - installs and is enabled ///' '/// (32/41): versions/plain.oxt '/// - installs and is enabled ///' '/// (33/41): versions/plain.oxt '/// - You are about to install version 1.02.4.7.0 of the extension org.openoffice.legacy.plain.oxt. That version is already installed. '/// - installs and is enabled ///' '/// (34/41): versions/version_none/plain.oxt '/// - You are about to install version 0 of the extension org.openoffice.legacy.plain.oxt. The newer version 1.02.4.7.0 is already installed. '/// - installs and is enabled ///' '/// (35/41): versions/version_1.2.3/plain.oxt '/// - You are about to install version 1.2.3 of the extension org.openoffice.legacy.plain.oxt. The older version 0 is already installed. '/// - installs and is enabled ///' '/// (36/41): versions/version_1.2.3/plain.oxt '/// - You are about to install version 1.2.3 of the extension org.openoffice.legacy.plain.oxt. That version is already installed. '/// - installs and is enabled ///' '/// (37/41): versions/version_0.0/plain.oxt '/// - You are about to install version 0.0 of the extension org.openoffice.legacy.plain.oxt. The newer version 1.2.3 is already installed. '/// - installs and is enabled ///' '/// (38/41): versions/version_1.2.4.7/plain.oxt '/// - You are about to install version 1.2.4.7 of the extension org.openoffice.legacy.plain.oxt. The older version 0.0 is already installed. '/// - installs and is enabled ///' '/// (39/41): versions/version_1.02.4.7.0/plain.oxt '/// - You are about to install version 1.02.4.7.0 of the extension org.openoffice.legacy.plain.oxt. That version is already installed. '/// - installs and is enabled ///' '/// (40/41): versions/version_1.2.3/plain.oxt '/// - You are about to install version 1.2.3 of the extension org.openoffice.legacy.plain.oxt. The newer version 1.02.4.7.0 is already installed. '/// - installs and is enabled ///' '/// (41/41): versions/version_1.2.15.3/plain.oxt '/// - You are about to install version 1.2.15.3 of the extension org.openoffice.legacy.plain.oxt. The older version 1.2.3 is already installed. dim j,b,i,a,x,y as integer dim sPath as string dim aFiles(50) as string dim aFeatures(50) as string dim aFileList(50) as string dim sTemp as string dim sTemp2 as string dim sTemp3 as string dim sTemp4 as string dim aTemp dim aTemp2 dim sFirstStatus as string dim bFound as boolean dim aRemovePackages(50) as string dim bFoundNumber as boolean dim sLastVersion as string sLastVersion = "" ' want to start and work with just one document window b = getDocumentCount hFileCloseAll() hNewDocument() ' load about twenty one extension files, to test the features ' the list tells the filename and in encoded numbers the features ' a line looks like: ' simpleLicense\LongLic.oxt;0,2,1,0 ' - the filename and the features are seperated by a semicolon ' - the numbes for the features are seperated by colons ' 1st number: Unsatisfied dependencies; if there are any, the number counts them; if there are none it is zero and the dialog won't come up ' 2nd number: License; if there is one the value is 1; it it a long one, where the scroll button needs to be used it is 2; 3 if the license should not be accepted for testing purposes, if there is no license the value is zero ' 3rd number: If the extension should successfully install the value is one, else zero. ' 4th number: If an active is expected after selecting a file for installation the value is one, else zero. ' 5th number: If active is expected the expected version information after selecting a file for installation the value is one, else zero and if an upgrade/downgrade is expected, the number is 2. ' Base path for test files sPath = convertPath(gTestToolPath+"extensions/optional/input/") ' read filelist and expected features ListRead(aFileList(), sPath+"files.txt") a = listCount(aFileList()) printlog a for i = 1 to a aTemp = split (aFileList(i),";") if uBound(aTemp()) >0 then listAppend(aFiles(),aTemp(0)) listAppend(aFeatures(),aTemp(1)) endif next i ' there are some dependencys to languages... if iSprache = 49 then sTemp = aFeatures(4) aFeatures(4) = aFeatures(5) aFeatures(5) = sTemp else if iSprache <> 01 then aFeatures(4) = aFeatures(5) aFeatures(6) = aFeatures(5) aFeatures(12) = aFeatures(5) aFeatures(13) = aFeatures(5) aFeatures(14) = aFeatures(5) endif endif ' cleanup before starting; check that no extension from the list is installed right now; if remove it. '/// Before starting, look into extension manager, if already a file is installed, that will be used in this test ///' '/// Remove it. ///' a = listCount(aFiles()) dim ii as integer ToolsPackageManager kontext "PackageManager" If PackageManager.exists(10) then BrowsePackages.typeKeys("") ii = 1 while (ii < BrowsePackages.getItemCount+1 ) kontext "PackageManager" 'BrowsePackages.typeKeys("+") 'BrowsePackages.typeKeys("") BrowsePackages.select ii sTemp = BrowsePackages.getItemText (ii,1) if right(sTemp,3) = "oxt" then for x = 1 to a sTemp3 = aFiles(x) aTemp = split(sTemp3,"\") if uBound(aTemp) < 1 then aTemp = split(sTemp3,"/") endif sTemp3 = aTemp(uBound(aTemp)) if sTemp = sTemp3 then qaErrorLog "Package is already installed, trying to remove it: '" + sTemp + "'" if remove.isEnabled then remove.click kontext "Active" if ( Active.exists( 2 ) ) then Active.ok() else warnlog( "No confirmation dialog for Extension removal" ) endif Kontext "AddingPackages" y=0 while AddingPackages.exists(1) AND (y<30) printlog "RemovingPackages..." sleep 1 y=y+1 wend kontext "PackageManager" BrowsePackages.typeKeys("") x = 100 else warnlog "Package is already installed and can't get removed: '" + sTemp + "'" ii=ii+1 x = 101 endif endif next x if x < 100 then ii=ii+1 endif else ii=ii+1 endif wend kontext "PackageManager" PackageManager.close WaitSlot( 5000 ) endif ' for every test file do... a = listCount(aFiles()) for i = 1 to a printlog "********** Test file ("+i+"/"+a+"): "+aFiles(i) aTemp = split (aFeatures(i),",") '/// call Tools - Package/Extension manager ///' ToolsPackageManager kontext "PackageManager" If PackageManager.exists(10) then '/// going to top of package list and explode every line, until the button 'Add' is enabled ///' '/// should be 'My Packages' ///' 'BrowsePackages.typeKeys("") 'sTemp = BrowsePackages.getSelText 'sTemp2 = "" 'while (Not Add.isEnabled AND (sTemp <> sTemp2)) ' BrowsePackages.typeKeys("+") ' BrowsePackages.typeKeys("") ' sTemp2 = sTemp ' sTemp = BrowsePackages.getSelText 'wend 'if sTemp = sTemp2 then ' warnlog "Couldn't find a way to enable the Add button - aborting" ' goto endsub 'endif 'printlog BrowsePackages.getSelText '/// click button 'Add' ///' try Add.click catch warnlog "#i90870# extension manager deadlock/C++ runtimes" exitrestarttheoffice ToolsPackageManager kontext "PackageManager" Add.click endcatch '/// Add Package(s)... dialg comes up ///' Kontext "OeffnenDlg" if OeffnenDlg.exists(5) then '/// put filename into field ///' Dateiname.setText convertPath(sPath + aFiles(i)) printlog DateiTyp.getSelText '/// press button 'Open' ///' Oeffnen.click else warnlog "Add Package(s)... dialog didn't came up" endif 'Asking for whom to install; All: YES, Me: NO, nobody: Cancel kontext if active.exists(5) then sTemp = active.getText printlog "Messagebox: " + sTemp ' We only want to handle the installation target here which only ' pops up if we have the choice (rights to write to shared layer) if active.getButtonCount = 3 then try active.yes catch warnlog( "Try...catch: Failed to click Yes-button" ) endcatch else printlog "No installation target message (this is probably a root-installation)" endif endif '/// Progress dialog comes up ///' Kontext "AddingPackages" if AddingPackages.exists(1) then printlog " - AddingPackages dialog exists" 'DialogTest(AddingPackages) endif '/// If any error happens, an active comes up, telling what is wrong ///' ' error is just a dialog with one button ' version infos have two buttons Kontext if active.exists(5) then sTemp = active.getText select case active.getbuttoncount case 1: y = instr(sTemp, " ") if cBool(aTemp(3)) then printlog sTemp else warnlog sTemp endif case 2: x = 0 if cBool(aTemp(4)) then printlog "Version info message available." else warnlog "Version info message available, but not expected" endif printlog sTemp bFoundNumber = false aTemp2 = split(sTemp," ") y = uBound(aTemp2) while ((NOT bFoundNumber) AND (x < y)) stemp2 = left(aTemp2(x),1) if isNumeric(stemp2) then bFoundNumber = TRUE printlog "Try to install version: " + aTemp2(x) endif x=x+1 wend if NOT bFoundNumber then warnlog "No version was mentioned in the version message!" endif bFoundNumber = false while (NOT bFoundNumber AND x < y) stemp2 = left(aTemp2(x),1) if isNumeric(stemp2) then bFoundNumber = TRUE endif x=x+1 wend if aTemp(4) = "2" AND bFoundNumber then printlog "Old version is: " + aTemp2(x-1) elseif bFoundNumber then warnlog "No old version expected: " + aTemp2(x-1) elseif aTemp(4) = "2" then warnlog "Old version expected, but not mentioned." endif end select active.ok else if cBool(aTemp(3)) then if i = 3 then qaErrorLog "#i73367# " else warnlog "errormessage expected, but none came up." endif endif endif '/// If there are any unsatisfied dependencies, they are shown now ///' Kontext "UnsatisfiedDependencies" if UnsatisfiedDependencies.exists(10) then if cBool(aTemp(0)) then printlog " - UnsatisfiedDependencies dialog exists" else warnLog "UnsatisfiedDependencies are not expected but available" endif DialogTest(UnsatisfiedDependencies) y = UnsatisfiedDependencyList.getItemCount if cInt(aTemp(0)) <> y then warnlog "Difference in dependencies; expected: " + aTemp(0) + "; found: " +y endif for x = 1 to y printlog " ("+x+"/"+y+"): "+UnsatisfiedDependencyList.getItemText(x) next x '/// close dialog if available, extension will not be installed ///' UnsatisfiedDependencies.close else if cBool(aTemp(0)) then warnLog "UnsatisfiedDependencies expected but none shown." endif endif '/// If there is a license, it is shown now ///' Kontext "ExtensionSoftwareLicenseAgreement" if ExtensionSoftwareLicenseAgreement.exists(10) then if cBool(aTemp(1)) then printlog " - ExtensionSoftwareLicenseAgreement dialog exists" else warnlog "ExtensionSoftwareLicenseAgreement are not expected but shown" endif if NOT Accept.isEnabled then if cInt(aTemp(1)) = 2 then printlog " Long License" else errorlog "Long License" endif else if NOT cInt(aTemp(1)) = 2 then printlog "Long License" else errorlog "Long License" endif endif '/// scroll down until accept button is enabled, click accept button ///' LicenseText.typeKeys ("",true) if Accept.isEnabled then '/// for testing purposes click cancel one time - the extension should not get installed ///' if cInt(aTemp(1)) = 3 then ExtensionSoftwareLicenseAgreement.CANCEL else Accept.click endif else qaErrorLog "Accept not enabled.yet" while NOT Accept.isEnabled ScrollDown.click printlog "Scrolling..." sleep 1 wend '/// for testing purposes click cancel one time - the extension should not get installed ///' if cInt(aTemp(1)) = 3 then ExtensionSoftwareLicenseAgreement.CANCEL else Accept.click endif endif else if cBool(aTemp(1)) then errorlog "ExtensionSoftwareLicenseAgreement dialog expected but not shown." endif endif '/// There may come up another active right now, which would be an error ///' Kontext if active.exists(5) then sTemp = active.getText if i = 7 then qaerrorlog "#i67452# " + sTemp else if i = 13 then qaerrorlog "#i73307#" + stemp else warnlog sTemp endif endif active.ok endif '/// the progress dialog is now available again ///' Kontext "AddingPackages" x=0 while AddingPackages.exists(1) AND (x<30) printlog "AddingPackages..." sleep 1 x=x+1 wend '/// There may come up another active right now, which would be an error ///' Kontext if active.exists(5) then sTemp = active.getText warnlog sTemp active.ok endif ' find out, if the extension got installed kontext "PackageManager" BrowsePackages.typeKeys("") BrowsePackages.typeKeys("+") y = BrowsePackages.getItemCount sTemp = aFiles(i) aTemp2 = split(sTemp,"\") if uBound(aTemp2) < 1 then aTemp2 = split(sTemp,"/") endif sTemp = aTemp2(uBound(aTemp2)) printlog stemp bFound = FALSE for x = 1 to y sTemp2 = BrowsePackages.getItemText(x,1) printlog "("+x+"/"+y+"): "+sTemp2 ' Mechanism to detect a status change; report it only one time sTemp3 = BrowsePackages.getItemText(x,3) ' enabled? sTemp4 = BrowsePackages.getItemText(x,2) ' version if sTemp3 <> "" AND sFirstStatus = "" then sFirstStatus = sTemp3 else if (sFirstStatus <> sTemp3) AND (sTemp3 <> "") AND (sFirstStatus <> "alreadyshown") then qaErrorlog "#i67450# " + sFirstStatus + " <> " + sTemp3 sFirstStatus= "alreadyshown" endif endif if sTemp3 <> "" then printlog " +++ " + sTemp3 endif if sTemp4 <> "" then sLastVersion = sTemp4 printlog " Version:" + sTemp4 endif if sTemp = sTemp2 then listAppend(aRemovePackages(), sTemp) if cBool(aTemp(2)) then printlog "-------------------------------- Extension got installed" bFound = TRUE else if i = 3 then qaerrorLog "#i73367# " else warnLog "-------------------------------- Extension got installed, but shouldn't do that" endif endif endif next x if NOT cBool(aTemp(2)) and bFound then warnlog "not found" endif '/// Close extension manager ///' PackageManager.OK 'OK / Close else warnlog "Couldn't call Tools -> Package manager - aborting test at " + i goto endsub endif next i '/// after installing all extensions, remove them ///' ' uninstall all components, that were installed a = listCount(aRemovePackages()) ToolsPackageManager kontext "PackageManager" If PackageManager.exists(10) then BrowsePackages.typeKeys("") waitslot() ii = 1 while (ii < BrowsePackages.getItemCount +1) wait( 2000 ) ' Required, Extension Manager needs time to populate kontext "PackageManager" 'BrowsePackages.typeKeys("+") 'BrowsePackages.typeKeys("") sTemp2 = sTemp BrowsePackages.select ii waitslot() sTemp = BrowsePackages.getItemText (ii,1) if right(sTemp,3) = "oxt" then for x = 1 to a if sTemp = aRemovePackages(x) then printlog "Package is installed, trying to remove it: '" + sTemp + "'" if remove.isEnabled then remove.click kontext "Active" if ( Active.exists( 2 ) ) then Active.ok() else warnlog( "No confirmation for extension removal" ) endif Kontext "AddingPackages" y=0 while AddingPackages.exists(1) AND (y<30) printlog "RemovingPackages..." sleep 1 y=y+1 wend kontext "PackageManager" BrowsePackages.typeKeys("") x = 100 else warnlog "Package can't get removed: '" + sTemp + "'" ii=ii+1 endif endif next x endif ii = ii+1 wend kontext "PackageManager" hCloseDialog( PackageManager, "close" ) else qaErrorLog "disabling installed extensions failed;" endif WaitSlot() hFileCloseAll() endcase