summaryrefslogtreecommitdiff
path: root/testautomation/extensions/optional/includes/extensions.inc
blob: 794e1bf445965c5bbe2d007d5c6661790066ffe0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
'encoding UTF-8  Do not remove or change this line!
'**************************************************************************
'* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
'*
'* Copyright 2008 by Sun Microsystems, Inc.
'*
'* OpenOffice.org - a multi-platform office productivity suite
'*
'* $RCSfile: extensions.inc,v $
'*
'* $Revision: 1.3 $
'*
'* last change: $Author: rt $ $Date: 2008-09-04 09:15:21 $
'*
'* This file is part of OpenOffice.org.
'*
'* OpenOffice.org is free software: you can redistribute it and/or modify
'* it under the terms of the GNU Lesser General Public License version 3
'* only, as published by the Free Software Foundation.
'*
'* OpenOffice.org is distributed in the hope that it will be useful,
'* but WITHOUT ANY WARRANTY; without even the implied warranty of
'* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
'* GNU Lesser General Public License version 3 for more details
'* (a copy is included in the LICENSE file that accompanied this code).
'*
'* You should have received a copy of the GNU Lesser General Public License
'* version 3 along with OpenOffice.org.  If not, see
'* <http://www.openoffice.org/license.html>
'* for a copy of the LGPLv3 License.
'*
'/************************************************************************
'*
'* owner : thorsten.bosbach@sun.com
'*
'* 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 <description>. ///'
    '/// - 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("<home>")
        ii = 1
        while (ii < BrowsePackages.getItemCount+1 )
            kontext "PackageManager"
            'BrowsePackages.typeKeys("+")
            'BrowsePackages.typeKeys("<down>")
            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("<up>")
                            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("<home>")
            'sTemp = BrowsePackages.getSelText
            'sTemp2 = ""
            'while (Not Add.isEnabled AND (sTemp <> sTemp2))
            '    BrowsePackages.typeKeys("+")
            '    BrowsePackages.typeKeys("<down>")
            '    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 ("<mod1 a>",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("<home>")
            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("<home>")
        ii = 1
        while (ii < BrowsePackages.getItemCount +1)
            kontext "PackageManager"
            'BrowsePackages.typeKeys("+")
            'BrowsePackages.typeKeys("<down>")
            sTemp2 = sTemp
            BrowsePackages.select ii
            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("<up>")
                            x = 100
                        else
                            warnlog "Package can't get removed: '" + sTemp + "'"
                            ii=ii+1
                        endif
                    endif
                next x
            endif
            ii = ii+1
        wend
        kontext "PackageManager"
        PackageManager.close
    else
        qaErrorLog "disabling installed extensions failed;"
    endif
    WaitSlot()
    hFileCloseAll()
endcase