RDI 0.1.0.20091020

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. data/AUTHORS +3 -0
  2. data/ChangeLog +46 -0
  3. data/Credits +21 -0
  4. data/LICENSE +31 -0
  5. data/README +18 -0
  6. data/TODO +17 -0
  7. data/lib/rdi/Installer.rb +678 -0
  8. data/lib/rdi/Model/ContextModifier.rb +20 -0
  9. data/lib/rdi/Model/DependencyDescription.rb +154 -0
  10. data/lib/rdi/Model/DependencyUserChoice.rb +202 -0
  11. data/lib/rdi/Model/Installer.rb +24 -0
  12. data/lib/rdi/Model/LocationSelector.rb +16 -0
  13. data/lib/rdi/Model/ProgressView.rb +16 -0
  14. data/lib/rdi/Model/Tester.rb +20 -0
  15. data/lib/rdi/Model/View.rb +16 -0
  16. data/lib/rdi/Plugins/ContextModifiers/GemPath.desc.rb +13 -0
  17. data/lib/rdi/Plugins/ContextModifiers/GemPath.rb +106 -0
  18. data/lib/rdi/Plugins/ContextModifiers/LibraryPath.rb +74 -0
  19. data/lib/rdi/Plugins/ContextModifiers/RubyLoadPath.rb +76 -0
  20. data/lib/rdi/Plugins/ContextModifiers/SystemPath.rb +74 -0
  21. data/lib/rdi/Plugins/GemCommon.rb +127 -0
  22. data/lib/rdi/Plugins/Installers/Download.rb +72 -0
  23. data/lib/rdi/Plugins/Installers/DownloadAndInstall.desc.rb +11 -0
  24. data/lib/rdi/Plugins/Installers/DownloadAndInstall.rb +54 -0
  25. data/lib/rdi/Plugins/Installers/Gem.desc.rb +13 -0
  26. data/lib/rdi/Plugins/Installers/Gem.rb +67 -0
  27. data/lib/rdi/Plugins/Installers/Icons/Download.png +0 -0
  28. data/lib/rdi/Plugins/Installers/Icons/DownloadAndInstall.png +0 -0
  29. data/lib/rdi/Plugins/Installers/Icons/Gem.png +0 -0
  30. data/lib/rdi/Plugins/Installers/Yum.rb +52 -0
  31. data/lib/rdi/Plugins/ProgressViews/SimpleWxGUI.desc.rb +13 -0
  32. data/lib/rdi/Plugins/ProgressViews/SimpleWxGUI.rb +58 -0
  33. data/lib/rdi/Plugins/ProgressViews/Text.rb +68 -0
  34. data/lib/rdi/Plugins/RubyGemsDepDesc.rb +41 -0
  35. data/lib/rdi/Plugins/Testers/Binaries.rb +56 -0
  36. data/lib/rdi/Plugins/Testers/DynamicLibraries.rb +56 -0
  37. data/lib/rdi/Plugins/Testers/RubyRequires.rb +76 -0
  38. data/lib/rdi/Plugins/Views/SimpleWxGUI/DependenciesLoaderDialog.rb +147 -0
  39. data/lib/rdi/Plugins/Views/SimpleWxGUI/DependencyPanel.rb +301 -0
  40. data/lib/rdi/Plugins/Views/SimpleWxGUI/Icons/Dependency.png +0 -0
  41. data/lib/rdi/Plugins/Views/SimpleWxGUI/Icons/Ignore.png +0 -0
  42. data/lib/rdi/Plugins/Views/SimpleWxGUI/Icons/ValidKO.png +0 -0
  43. data/lib/rdi/Plugins/Views/SimpleWxGUI/Icons/ValidOK.png +0 -0
  44. data/lib/rdi/Plugins/Views/SimpleWxGUI/LocationSelectors/Directory.desc.rb +13 -0
  45. data/lib/rdi/Plugins/Views/SimpleWxGUI/LocationSelectors/Directory.rb +45 -0
  46. data/lib/rdi/Plugins/Views/SimpleWxGUI.desc.rb +13 -0
  47. data/lib/rdi/Plugins/Views/SimpleWxGUI.rb +60 -0
  48. data/lib/rdi/Plugins/Views/Text/LocationSelectors/Directory.rb +44 -0
  49. data/lib/rdi/Plugins/Views/Text.rb +257 -0
  50. data/lib/rdi/Plugins/WxCommon.rb +69 -0
  51. data/lib/rdi/Plugins/WxRubyDepDesc.rb +36 -0
  52. data/lib/rdi/rdi.rb +8 -0
  53. data/test/Common.rb +796 -0
  54. data/test/Flows/BasicFlows.rb +114 -0
  55. data/test/Flows/UIFlows.rb +460 -0
  56. data/test/Plugins/ContextModifiers/GemPath.rb +44 -0
  57. data/test/Plugins/ContextModifiers/LibraryPath.rb +36 -0
  58. data/test/Plugins/ContextModifiers/RubyLoadPath.rb +36 -0
  59. data/test/Plugins/ContextModifiers/SystemPath.rb +36 -0
  60. data/test/Plugins/Installers/Download.rb +65 -0
  61. data/test/Plugins/Installers/DownloadAndInstall.rb +73 -0
  62. data/test/Plugins/Installers/Gem.rb +79 -0
  63. data/test/Plugins/LocationSelectors/Directory.rb +34 -0
  64. data/test/Plugins/Testers/Binaries.rb +46 -0
  65. data/test/Plugins/Testers/DynamicLibraries.rb +46 -0
  66. data/test/Plugins/Testers/RubyRequires.rb +48 -0
  67. data/test/Plugins/Views/SimpleWxGUI.rb +190 -0
  68. data/test/Plugins/Views/Text.rb +112 -0
  69. data/test/Plugins/WxEnv.rb +58 -0
  70. data/test/Plugins/WxEnvApp.rb +53 -0
  71. data/test/Repository/Binaries/DummyBinary +1 -0
  72. data/test/Repository/Libraries/DummyLibrary.so +1 -0
  73. data/test/Repository/RubyGems/DummyGem-0.0.1.20090828.gem +0 -0
  74. data/test/Repository/RubyGems/GemsSources/DummyGem/DummyGem.gemspec.rb +23 -0
  75. data/test/Repository/RubyGems/GemsSources/DummyGem/lib/DummyGemMain.rb +5 -0
  76. data/test/Repository/RubyLibraries/DummyRubyLib.rb +1 -0
  77. data/test/run.rb +23 -0
  78. metadata +145 -0
data/test/Common.rb ADDED
@@ -0,0 +1,796 @@
1
+ #--
2
+ # Copyright (c) 2009 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
+ # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
+ #++
5
+
6
+ # This file is intended to be required by every test case.
7
+
8
+ require 'RUtilAnts/Logging'
9
+ RUtilAnts::Logging::initializeLogging("#{File.dirname(__FILE__)}/../lib", 'http://sourceforge.net/tracker/?group_id=274498&atid=1166448', true)
10
+ require 'RUtilAnts/URLAccess'
11
+ RUtilAnts::URLAccess::initializeURLAccess
12
+ require 'RUtilAnts/Platform'
13
+ RUtilAnts::Platform::initializePlatform
14
+
15
+ require 'tmpdir'
16
+ require 'test/unit'
17
+ require 'rdi/rdi'
18
+ require 'rdi/Model/View'
19
+ require 'rdi/Model/ProgressView'
20
+ require 'rdi/Model/LocationSelector'
21
+
22
+ module RDI
23
+
24
+ module Test
25
+
26
+ # Mute progress view
27
+ class MuteProgressView < RDI::Model::ProgressView
28
+
29
+ # Setup the progress and call the client code to execute inside
30
+ #
31
+ # Parameters:
32
+ # * _CodeBlock_: The code to execute during this progression:
33
+ # ** *ioProgressView* (_Object_): The progress view that will receive notifications of progression (can be nil if no progression view available)
34
+ def setupProgress
35
+ yield(nil)
36
+ end
37
+
38
+ end
39
+
40
+ class RDITestCase < ::Test::Unit::TestCase
41
+
42
+ # Get a simple description to use in these test cases
43
+ #
44
+ # Return:
45
+ # * <em>RDI::Model::DependencyDescription</em>: The description
46
+ def getSimpleDesc
47
+ return RDI::Model::DependencyDescription.new('DummyBinary').addDescription( {
48
+ :Testers => [
49
+ {
50
+ :Type => 'Binaries',
51
+ :Content => [ 'DummyBinary' ]
52
+ }
53
+ ],
54
+ :Installers => [
55
+ {
56
+ :Type => 'Download',
57
+ :Content => "#{@RepositoryDir}/Binaries/DummyBinary",
58
+ :ContextModifiers => [
59
+ {
60
+ :Type => 'SystemPath',
61
+ :Content => '%INSTALLDIR%'
62
+ }
63
+ ]
64
+ }
65
+ ]
66
+ } )
67
+ end
68
+
69
+ # Get another simple description to use in these test cases
70
+ #
71
+ # Return:
72
+ # * <em>RDI::Model::DependencyDescription</em>: The description
73
+ def getSimpleDesc2
74
+ return RDI::Model::DependencyDescription.new('DummyLibrary').addDescription( {
75
+ :Testers => [
76
+ {
77
+ :Type => 'DynamicLibraries',
78
+ :Content => [ 'DummyLibrary.so' ]
79
+ }
80
+ ],
81
+ :Installers => [
82
+ {
83
+ :Type => 'Download',
84
+ :Content => "#{@RepositoryDir}/Libraries/DummyLibrary.so",
85
+ :ContextModifiers => [
86
+ {
87
+ :Type => 'LibraryPath',
88
+ :Content => '%INSTALLDIR%'
89
+ }
90
+ ]
91
+ }
92
+ ]
93
+ } )
94
+ end
95
+
96
+ # Get a simple description using 2 Installers
97
+ #
98
+ # Return:
99
+ # * <em>RDI::Model::DependencyDescription</em>: The description
100
+ def get2InstallersDesc
101
+ return RDI::Model::DependencyDescription.new('DummyBinary2').addDescription( {
102
+ :Testers => [
103
+ {
104
+ :Type => 'Binaries',
105
+ :Content => [ 'DummyBinary' ]
106
+ }
107
+ ],
108
+ :Installers => [
109
+ {
110
+ :Type => 'Download',
111
+ :Content => "#{@RepositoryDir}/Binaries/DummyBinary",
112
+ :ContextModifiers => [
113
+ {
114
+ :Type => 'SystemPath',
115
+ :Content => '%INSTALLDIR%'
116
+ }
117
+ ]
118
+ },
119
+ {
120
+ :Type => 'Download',
121
+ :Content => "#{@RepositoryDir}/Binaries/../Binaries/DummyBinary",
122
+ :ContextModifiers => [
123
+ {
124
+ :Type => 'SystemPath',
125
+ :Content => '%INSTALLDIR%'
126
+ }
127
+ ]
128
+ }
129
+ ]
130
+ } )
131
+ end
132
+
133
+ # Constructor
134
+ def setup
135
+ @RepositoryDir = File.expand_path("#{File.dirname(__FILE__)}/Repository")
136
+ @Installer = nil
137
+ # Silent user interaction of logging
138
+ @MessagesStack = []
139
+ setLogMessagesStack(@MessagesStack)
140
+ @ErrorsStack = []
141
+ setLogErrorsStack(@ErrorsStack)
142
+ end
143
+
144
+ # Define a dummy test case to avoid errors during run of this class
145
+ # TODO: Remove this method
146
+ def testDummy_BaseClass
147
+ end
148
+
149
+ # Setup an applicative directory and an installer
150
+ #
151
+ # Parameters:
152
+ # * *CodeBlock*: The code called once the application is ready
153
+ def setupAppDir
154
+ # Get an image of the context, as we will put it back after the testing
155
+ lSystemPath = $rUtilAnts_Platform_Info.getSystemExePath.clone
156
+ lLibsPath = $rUtilAnts_Platform_Info.getSystemLibsPath.clone
157
+ lLoadPath = $LOAD_PATH.clone
158
+ lGemsPath = nil
159
+ if (defined?(Gem) != nil)
160
+ lGemsPath = Gem.path.clone
161
+ if (defined?(Gem.clearCache_RDI))
162
+ Gem.clearCache_RDI
163
+ end
164
+ end
165
+ # Create the application root directory for testing
166
+ lAppRootDir = "#{Dir.tmpdir}/RDITest/#{self.class.to_s.gsub(/:/,'_')}"
167
+ # If the application dir exists, clean it first
168
+ if (File.exists?(lAppRootDir))
169
+ FileUtils::rm_rf(lAppRootDir)
170
+ end
171
+ FileUtils::mkdir_p(lAppRootDir)
172
+ # Create the installer
173
+ @Installer = RDI::Installer.new(lAppRootDir)
174
+ # Register the mute progress view
175
+ @Installer.registerNewPlugin(
176
+ 'ProgressViews',
177
+ 'MuteProgressView',
178
+ nil,
179
+ nil,
180
+ RDI::Test::MuteProgressView,
181
+ nil
182
+ )
183
+ # And set it as the default progress view
184
+ @Installer.setDefaultOptions( {
185
+ :PreferredProgressViews => [ 'MuteProgressView' ]
186
+ } )
187
+
188
+ # Call the test code
189
+ yield
190
+ @Installer = nil
191
+ # Remove the temporary application root dir
192
+ FileUtils::rm_rf(lAppRootDir)
193
+ # Put back the context
194
+ $rUtilAnts_Platform_Info.setSystemExePath(lSystemPath)
195
+ $rUtilAnts_Platform_Info.setSystemLibsPath(lLibsPath)
196
+ $LOAD_PATH.replace(lLoadPath)
197
+ if (defined?(Gem) != nil)
198
+ Gem.clear_paths
199
+ lGemsPath.each do |iDir|
200
+ if (!Gem.path.include?(iDir))
201
+ Gem.path << iDir
202
+ end
203
+ end
204
+ end
205
+ end
206
+
207
+ # Setup a regresion UI before calling some code
208
+ #
209
+ # Parameters:
210
+ # * *iClassName* (_String_): Class name of the View to be used
211
+ # * *iLocationSelectorClassName* (_String_): Class name of the location selector [optional = nil]
212
+ def setupRegressionUI(iClassName, iLocationSelectorClassName = nil)
213
+ # Add a View plugin
214
+ @Installer.registerNewPlugin(
215
+ 'Views',
216
+ 'RegressionUI',
217
+ nil,
218
+ nil,
219
+ iClassName,
220
+ nil
221
+ )
222
+ # Add the location selector
223
+ if (iLocationSelectorClassName != nil)
224
+ @Installer.registerNewPlugin(
225
+ 'LocationSelectors_RegressionUI',
226
+ 'Directory',
227
+ nil,
228
+ nil,
229
+ iLocationSelectorClassName,
230
+ nil
231
+ )
232
+ end
233
+ yield
234
+ end
235
+
236
+ end
237
+
238
+ # Module defining methods that test a given Tester
239
+ # The setup of classes including this module should define
240
+ # @TesterPluginName
241
+ # getTestContent
242
+ # installTestContent
243
+ # uninstallTestContent
244
+ module RDITestCase_Testers
245
+
246
+ # Test that the API is correctly defined
247
+ def testAPI
248
+ setupAppDir do
249
+ @Installer.accessPlugin('Testers', @TesterPluginName) do |ioPlugin|
250
+ assert(ioPlugin.is_a?(RDI::Model::Tester))
251
+ assert(ioPlugin.respond_to?(:isContentResolved?))
252
+ assert(ioPlugin.respond_to?(:getAffectingContextModifiers))
253
+ # Test that returned Affecting Context Modifiers are valid.
254
+ lAvailableCMs = @Installer.getPluginNames('ContextModifiers')
255
+ ioPlugin.getAffectingContextModifiers.each do |iCMName|
256
+ assert_equal(true, lAvailableCMs.include?(iCMName))
257
+ end
258
+ end
259
+ end
260
+ end
261
+
262
+ # Test that the dependency does not exist in an empty project
263
+ def testMissingDep
264
+ setupAppDir do
265
+ @Installer.accessPlugin('Testers', @TesterPluginName) do |ioPlugin|
266
+ lContent = getTestContent
267
+ assert_equal(false, ioPlugin.isContentResolved?(lContent))
268
+ end
269
+ end
270
+ end
271
+
272
+ # Test that once installed, it detects the dependency as being present
273
+ def testExistingDep
274
+ setupAppDir do
275
+ @Installer.accessPlugin('Testers', @TesterPluginName) do |ioPlugin|
276
+ lContent = getTestContent
277
+ installTestContent
278
+ assert_equal(true, ioPlugin.isContentResolved?(lContent))
279
+ uninstallTestContent
280
+ end
281
+ end
282
+ end
283
+
284
+ end
285
+
286
+ # Module defining methods that test a given Installer
287
+ # The setup of classes including this module should define
288
+ # @InstallerPluginName
289
+ # getTestContent
290
+ # verifyInstalledContent
291
+ # uninstallTestContent
292
+ # getOtherLocation
293
+ module RDITestCase_Installers
294
+
295
+ # Test that the API is correctly defined
296
+ def testAPI
297
+ setupAppDir do
298
+ @Installer.accessPlugin('Installers', @InstallerPluginName) do |ioPlugin|
299
+ assert(ioPlugin.is_a?(RDI::Model::Installer))
300
+ assert(ioPlugin.respond_to?(:getPossibleDestinations))
301
+ assert(ioPlugin.respond_to?(:installDependency))
302
+ lDestinations = ioPlugin.getPossibleDestinations
303
+ assert(lDestinations.is_a?(Array))
304
+ assert(lDestinations.size > 0)
305
+ assert(lDestinations[0][0] != DEST_OTHER)
306
+ lDestinations.each do |iDestination|
307
+ assert(iDestination.is_a?(Array))
308
+ assert(iDestination.size == 2)
309
+ iFlavour, iLocation = iDestination
310
+ assert(iFlavour.is_a?(Fixnum))
311
+ if (iFlavour == DEST_OTHER)
312
+ # Check that this selector location name exists for every GUI we have
313
+ assert(iLocation.is_a?(String))
314
+ @Installer.getPluginNames('Views').each do |iViewName|
315
+ assert(@Installer.getPluginNames("LocationSelectors_#{iViewName}").include?(iLocation))
316
+ end
317
+ end
318
+ end
319
+ end
320
+ end
321
+ end
322
+
323
+ # Test that installing works correctly
324
+ def testInstallDep
325
+ setupAppDir do
326
+ @Installer.accessPlugin('Installers', @InstallerPluginName) do |ioPlugin|
327
+ lContent = getTestContent
328
+ # Test installation on every possible location
329
+ ioPlugin.getPossibleDestinations.each do |iDestination|
330
+ iFlavour, iLocation = iDestination
331
+ lLocation = iLocation
332
+ if (iFlavour == DEST_OTHER)
333
+ # Use a temporary location
334
+ lLocation = getOtherLocation
335
+ end
336
+ assert_equal(false, verifyInstalledContent(lLocation))
337
+ # Install the test content
338
+ ioPlugin.installDependency(lContent, lLocation)
339
+ # Verify
340
+ assert_equal(true, verifyInstalledContent(lLocation))
341
+ # Remove
342
+ uninstallTestContent(lLocation)
343
+ end
344
+ end
345
+ end
346
+ end
347
+
348
+ end
349
+
350
+ # Module defining methods that test a given ContextModifier
351
+ # The setup of classes including this module should define
352
+ # @ContextModifierPluginName
353
+ # getTestLocation
354
+ module RDITestCase_ContextModifiers
355
+
356
+ # Test that the API is correctly defined
357
+ def testAPI
358
+ setupAppDir do
359
+ @Installer.accessPlugin('ContextModifiers', @ContextModifierPluginName) do |ioPlugin|
360
+ assert(ioPlugin.is_a?(RDI::Model::ContextModifier))
361
+ assert(ioPlugin.respond_to?(:getLocationSelectorName))
362
+ assert(ioPlugin.respond_to?(:transformContentWithInstallEnv))
363
+ assert(ioPlugin.respond_to?(:isLocationInContext?))
364
+ assert(ioPlugin.respond_to?(:addLocationToContext))
365
+ assert(ioPlugin.respond_to?(:removeLocationFromContext))
366
+ # Check that the location selector name exists for every view we have.
367
+ lLocationSelectorName = ioPlugin.getLocationSelectorName
368
+ assert(lLocationSelectorName.is_a?(String))
369
+ @Installer.getPluginNames('Views').each do |iViewName|
370
+ assert(@Installer.getPluginNames("LocationSelectors_#{iViewName}").include?(lLocationSelectorName))
371
+ end
372
+ end
373
+ end
374
+ end
375
+
376
+ # Test missing location
377
+ def testMissingLocation
378
+ setupAppDir do
379
+ @Installer.accessPlugin('ContextModifiers', @ContextModifierPluginName) do |ioPlugin|
380
+ lLocation = getTestLocation
381
+ assert_equal(false, ioPlugin.isLocationInContext?(lLocation))
382
+ end
383
+ end
384
+ end
385
+
386
+ # Test that adding locations works correctly
387
+ def testAddLocation
388
+ setupAppDir do
389
+ @Installer.accessPlugin('ContextModifiers', @ContextModifierPluginName) do |ioPlugin|
390
+ lLocation = getTestLocation
391
+ assert_equal(false, ioPlugin.isLocationInContext?(lLocation))
392
+ ioPlugin.addLocationToContext(lLocation)
393
+ assert_equal(true, ioPlugin.isLocationInContext?(lLocation))
394
+ end
395
+ end
396
+ end
397
+
398
+ # Test that removing locations works correctly
399
+ def testRemoveLocation
400
+ setupAppDir do
401
+ @Installer.accessPlugin('ContextModifiers', @ContextModifierPluginName) do |ioPlugin|
402
+ lLocation = getTestLocation
403
+ assert_equal(false, ioPlugin.isLocationInContext?(lLocation))
404
+ ioPlugin.addLocationToContext(lLocation)
405
+ assert_equal(true, ioPlugin.isLocationInContext?(lLocation))
406
+ ioPlugin.removeLocationFromContext(lLocation)
407
+ assert_equal(false, ioPlugin.isLocationInContext?(lLocation))
408
+ end
409
+ end
410
+ end
411
+
412
+ end
413
+
414
+ # Module defining methods that test a given View
415
+ # The setup of classes including this module should define
416
+ # @ViewPluginName
417
+ module RDITestCase_Views
418
+
419
+ # Constants, along with the type of object following it
420
+ # Nothing
421
+ ACTION_LOCATE = 0
422
+ # Nothing
423
+ ACTION_IGNORE = 1
424
+ # Integer: Installer's index
425
+ # Integer: Destination's index
426
+ # Object: Install location (if needed - nil otherwise)
427
+ ACTION_INSTALL = 2
428
+ # Nothing
429
+ ACTION_APPLY = 3
430
+ # String: ContextModifier name
431
+ # Object: Location
432
+ ACTION_SELECT_AFFECTING_CONTEXTMODIFIER = 4
433
+
434
+ # An action is the triplet
435
+ # [ Integer, String, Object ]
436
+ # [ ActionID, DepID, Parameters ]
437
+
438
+ # Test that the API is correctly defined
439
+ def testAPI
440
+ setupAppDir do
441
+ @Installer.accessPlugin('Views', @ViewPluginName) do |ioPlugin|
442
+ assert(ioPlugin.is_a?(RDI::Model::View))
443
+ assert(ioPlugin.respond_to?(:execute))
444
+ end
445
+ end
446
+ end
447
+
448
+ # Default implementation for initScenario
449
+ # To be rewritten by each View plugin test suite
450
+ #
451
+ # Parameters:
452
+ # * *ioPlugin* (_Object_): The View plugin
453
+ # * *iScenario* (<em>list<[Integer,String,Object]></em>): The scenario
454
+ # * *iMissingDependencies* (<em>list<DependencyDescription></em>): The missing dependencies list
455
+ def initScenario(ioPlugin, iScenario, iMissingDependencies)
456
+ # Display it to the user for him to perform the actions
457
+ lActionsStr = []
458
+ lIdxAction = 1
459
+ iScenario.each do |iActionInfo|
460
+ iAction, iDepID, iParameters = iActionInfo
461
+ lStr = "[#{iDepID}] - "
462
+ case iAction
463
+ when ACTION_LOCATE
464
+ lStr += 'Choose Locate'
465
+ when ACTION_IGNORE
466
+ lStr += 'Choose Ignore'
467
+ when ACTION_INSTALL
468
+ if (iParameters[2] == nil)
469
+ lStr += "Choose Installer n.#{iParameters[0]}, Destination n.#{iParameters[1]}"
470
+ else
471
+ lStr += "Choose Installer n.#{iParameters[0]}, Destination n.#{iParameters[1]}, Location: #{iParameters[2]}"
472
+ end
473
+ when ACTION_APPLY
474
+ lStr = 'Apply'
475
+ when ACTION_SELECT_AFFECTING_CONTEXTMODIFIER
476
+ lStr += "Choose Locate ContextModifier #{iParameters[0]} using Location: #{iParameters[1]}"
477
+ else
478
+ logBug "Unknown Action: #{iAction}"
479
+ end
480
+ lActionsStr << "#{lIdxAction} - #{lStr}"
481
+ lIdxAction += 1
482
+ end
483
+ # Remove the logging silent mode before displaying
484
+ setLogMessagesStack(nil)
485
+ logMsg "Please perform the following:\n#{lActionsStr.join("\n")}"
486
+ end
487
+
488
+ # Default implementation for finalScenario
489
+ # To be rewritten by each View plugin test suite
490
+ #
491
+ # Parameters:
492
+ # * *ioPlugin* (_Object_): The View plugin
493
+ def finalScenario(ioPlugin)
494
+ # Nothing to do
495
+ end
496
+
497
+ # Default implementation for executeScenario
498
+ # To be rewritten by each View plugin test suite
499
+ #
500
+ # Parameters:
501
+ # * *ioPlugin* (_Object_): The View plugin
502
+ # * *ioInstaller* (_Installer_): The RDI installer
503
+ # * *iMissingDependencies* (<em>list<DependencyDescription></em>): The missing dependencies list
504
+ # Return:
505
+ # * <em>list<DependencyUserChoice></em>: The corresponding user choices
506
+ def executeScenario(ioPlugin, ioInstaller, iMissingDependencies)
507
+ return ioPlugin.execute(ioInstaller, iMissingDependencies)
508
+ end
509
+
510
+ # Setup a fake selector that always return a given value
511
+ #
512
+ # Parameters:
513
+ # * *iSelectorName* (_String_): Name of the selector to modify
514
+ # * *iLocation* (_Object_): Location to always give
515
+ # * _CodeBlock_: The code to be executed once the fake selector is in place
516
+ def setupFakeSelector(iSelectorName, iLocation)
517
+ @Installer.accessPlugin("LocationSelectors_#{@ViewPluginName}", iSelectorName) do |ioLSPlugin|
518
+ # Replace temporarily its getNewLocation method
519
+ ioLSPlugin.class.module_eval('alias :getNewLocation_ORG :getNewLocation')
520
+ # Define the new one
521
+ ioLSPlugin.class.module_eval('
522
+ def getNewLocation
523
+ return $RDI_Regression_Location
524
+ end
525
+ ')
526
+ $RDI_Regression_Location = iLocation
527
+ # Use it
528
+ yield
529
+ # Put back the old method
530
+ ioLSPlugin.class.module_eval('
531
+ remove_method :getNewLocation
532
+ alias :getNewLocation :getNewLocation_ORG
533
+ ')
534
+ end
535
+ end
536
+
537
+ # Get the dependency user choices from a scenario.
538
+ # This is used to then compare if View plugins behave correctly
539
+ #
540
+ # Parameters:
541
+ # * *iMissingDependencies* (<em>list<DependencyDescription></em>): The missing dependencies list
542
+ # * *iScenario* (<em>list<[Integer,String,Object]></em>): The scenario
543
+ # Return:
544
+ # * <em>list<DependencyUserChoice></em>: The corresponding user choices
545
+ def getUserChoicesFromScenario(iMissingDependencies, iScenario)
546
+ rDepsUserChoices = []
547
+
548
+ # First, initialize them
549
+ # Create also a map that makes retrieving user choices based on DepID easier
550
+ # map< String, DependencyUserChoice >
551
+ lDepsUserChoicesIndex = {}
552
+ iMissingDependencies.each do |iDepDesc|
553
+ lDepUserChoice = RDI::Model::DependencyUserChoice.new(@Installer, @ViewPluginName, iDepDesc)
554
+ rDepsUserChoices << lDepUserChoice
555
+ lDepsUserChoicesIndex[iDepDesc.ID] = lDepUserChoice
556
+ end
557
+ # Then modify them based on the scenario
558
+ iScenario.each do |iActionInfo|
559
+ iAction, iDepID, iParameters = iActionInfo
560
+ # First, find the correct dependency user choice
561
+ lDepUserChoice = nil
562
+ if (iDepID != nil)
563
+ lDepUserChoice = lDepsUserChoicesIndex[iDepID]
564
+ end
565
+ case iAction
566
+ when ACTION_LOCATE
567
+ lDepUserChoice.setLocate
568
+ when ACTION_IGNORE
569
+ lDepUserChoice.setIgnore
570
+ when ACTION_INSTALL
571
+ lDepUserChoice.setInstaller(iParameters[0], iParameters[1])
572
+ if (iParameters[2] != nil)
573
+ # Make sure the LocationSelector returns iParameters[2]
574
+ # Get the name of the selector
575
+ @Installer.accessPlugin('Installers', lDepUserChoice.DepDesc.Installers[iParameters[0]][0]) do |iInstallPlugin|
576
+ lSelectorName = iInstallPlugin.PossibleDestinations[iParameters[1]][1]
577
+ setupFakeSelector(lSelectorName, iParameters[2]) do
578
+ lDepUserChoice.selectOtherInstallLocation(lSelectorName)
579
+ end
580
+ end
581
+ end
582
+ when ACTION_APPLY
583
+ break
584
+ when ACTION_SELECT_AFFECTING_CONTEXTMODIFIER
585
+ # Make sure the LocationSelector returns iParameters[1]
586
+ @Installer.accessPlugin('ContextModifiers', iParameters[0]) do |ioCMPlugin|
587
+ # Get the name of LocationSelector class to use
588
+ lLocationSelectorName = ioCMPlugin.LocationSelectorName
589
+ setupFakeSelector(lLocationSelectorName, iParameters[1]) do
590
+ lDepUserChoice.affectContextModifier(iParameters[0])
591
+ end
592
+ end
593
+ else
594
+ logBug "Unknown Action: #{iAction}"
595
+ end
596
+ end
597
+
598
+ return rDepsUserChoices
599
+ end
600
+
601
+ # Launches a scenario test
602
+ #
603
+ # Parameters:
604
+ # * *iMissingDependencies* (<em>list<DependencyDescription></em>): The missing dependencies list
605
+ # * *iScenario* (<em>list<[Integer,String,Object]></em>): The scenario
606
+ def launchScenario(iMissingDependencies, iScenario)
607
+ setupAppDir do
608
+ lUserChoices = nil
609
+ @Installer.accessPlugin('Views', @ViewPluginName) do |ioPlugin|
610
+ # Create the scenario and prepare it to be run
611
+ initScenario(ioPlugin, iScenario, iMissingDependencies)
612
+ # Execute it
613
+ lUserChoices = executeScenario(ioPlugin, @Installer, iMissingDependencies )
614
+ # Finalize the scenario
615
+ finalScenario(ioPlugin)
616
+ # Check generic parameters from the scenario
617
+ assert_equal(lUserChoices, getUserChoicesFromScenario(iMissingDependencies, iScenario))
618
+ end
619
+ end
620
+ end
621
+
622
+ # Test installing everything by default
623
+ def testDefaultInstall
624
+ launchScenario( [ getSimpleDesc ], [
625
+ [ ACTION_APPLY, nil, nil ]
626
+ ] )
627
+ end
628
+
629
+ # Test installing everything by default for 2 dependencies
630
+ def testDefaultInstall2Deps
631
+ launchScenario( [ getSimpleDesc, getSimpleDesc2 ], [
632
+ [ ACTION_APPLY, nil, nil ]
633
+ ] )
634
+ end
635
+
636
+ # Test ignoring
637
+ def testIgnore
638
+ launchScenario( [ getSimpleDesc ], [
639
+ [ ACTION_IGNORE, 'DummyBinary', nil ],
640
+ [ ACTION_APPLY, nil, nil ]
641
+ ] )
642
+ end
643
+
644
+ # Test ignoring 1 of 2 deps
645
+ def testIgnore1Of2Deps
646
+ launchScenario( [ getSimpleDesc, getSimpleDesc2 ], [
647
+ [ ACTION_IGNORE, 'DummyLibrary', nil ],
648
+ [ ACTION_APPLY, nil, nil ]
649
+ ] )
650
+ end
651
+
652
+ # Test install to a different location
653
+ def testInstallDest
654
+ launchScenario( [ getSimpleDesc ], [
655
+ [ ACTION_INSTALL, 'DummyBinary', [ 0, 1, nil ] ],
656
+ [ ACTION_APPLY, nil, nil ]
657
+ ] )
658
+ end
659
+
660
+ # Test install to a different location 1 of 2 deps
661
+ def testInstallDest1Of2Deps
662
+ launchScenario( [ getSimpleDesc, getSimpleDesc2 ], [
663
+ [ ACTION_INSTALL, 'DummyLibrary', [ 0, 1, nil ] ],
664
+ [ ACTION_APPLY, nil, nil ]
665
+ ] )
666
+ end
667
+
668
+ # Test install to another location to be choosen
669
+ def testInstallOtherLocation
670
+ # Get the index of the DEST_OTHER destination
671
+ lIdxDest = 0
672
+ lDesc = getSimpleDesc
673
+ setupAppDir do
674
+ @Installer.accessPlugin('Installers', lDesc.Installers[0][0]) do |iPlugin|
675
+ iPlugin.PossibleDestinations.each do |iDestInfo|
676
+ iFlavour, iLocation = iDestInfo
677
+ if (iFlavour == DEST_OTHER)
678
+ # Found it
679
+ break
680
+ end
681
+ lIdxDest += 1
682
+ end
683
+ end
684
+ end
685
+ launchScenario( [ lDesc ], [
686
+ [ ACTION_INSTALL, 'DummyBinary', [ 0, lIdxDest, 'OtherLocation' ] ],
687
+ [ ACTION_APPLY, nil, nil ]
688
+ ] )
689
+ end
690
+
691
+ # Test install to another location to be choosen of 1 of 2 deps
692
+ def testInstallOtherLocation1Of2Deps
693
+ # Get the index of the DEST_OTHER destination
694
+ lIdxDest = 0
695
+ lDesc = getSimpleDesc2
696
+ setupAppDir do
697
+ @Installer.accessPlugin('Installers', lDesc.Installers[0][0]) do |iPlugin|
698
+ iPlugin.PossibleDestinations.each do |iDestInfo|
699
+ iFlavour, iLocation = iDestInfo
700
+ if (iFlavour == DEST_OTHER)
701
+ # Found it
702
+ break
703
+ end
704
+ lIdxDest += 1
705
+ end
706
+ end
707
+ end
708
+ launchScenario( [ getSimpleDesc, lDesc ], [
709
+ [ ACTION_INSTALL, 'DummyLibrary', [ 0, lIdxDest, 'OtherLocation' ] ],
710
+ [ ACTION_APPLY, nil, nil ]
711
+ ] )
712
+ end
713
+
714
+ # Test install using another installer
715
+ def testInstallOtherInstaller
716
+ launchScenario( [ get2InstallersDesc ], [
717
+ [ ACTION_INSTALL, 'DummyBinary2', [ 1, 0, nil ] ],
718
+ [ ACTION_APPLY, nil, nil ]
719
+ ] )
720
+ end
721
+
722
+ # Test install using another installer for 1 of 2 deps
723
+ def testInstallOtherInstaller1Of2Deps
724
+ launchScenario( [ getSimpleDesc, get2InstallersDesc ], [
725
+ [ ACTION_INSTALL, 'DummyBinary2', [ 1, 0, nil ] ],
726
+ [ ACTION_APPLY, nil, nil ]
727
+ ] )
728
+ end
729
+
730
+ # Test locate using a given ContextModifier
731
+ def testLocateWithCM
732
+ launchScenario( [ getSimpleDesc ], [
733
+ [ ACTION_LOCATE, 'DummyBinary', nil ],
734
+ [ ACTION_SELECT_AFFECTING_CONTEXTMODIFIER, 'DummyBinary', [ 'SystemPath', "#{@RepositoryDir}/Binaries" ] ],
735
+ [ ACTION_APPLY, nil, nil ]
736
+ ] )
737
+ end
738
+
739
+ # Test locate using a given ContextModifier for 1 of 2 deps
740
+ def testLocateWithCM1Of2Deps
741
+ launchScenario( [ getSimpleDesc, getSimpleDesc2 ], [
742
+ [ ACTION_LOCATE, 'DummyBinary', nil ],
743
+ [ ACTION_SELECT_AFFECTING_CONTEXTMODIFIER, 'DummyBinary', [ 'SystemPath', "#{@RepositoryDir}/Binaries" ] ],
744
+ [ ACTION_APPLY, nil, nil ]
745
+ ] )
746
+ end
747
+
748
+ # Test locate using a given ContextModifier with an invalid Location
749
+ def testLocateWithCMBadLocation
750
+ launchScenario( [ getSimpleDesc ], [
751
+ [ ACTION_LOCATE, 'DummyBinary', nil ],
752
+ [ ACTION_SELECT_AFFECTING_CONTEXTMODIFIER, 'DummyBinary', [ 'SystemPath', "#{@RepositoryDir}/BadBinaries" ] ],
753
+ [ ACTION_APPLY, nil, nil ]
754
+ ] )
755
+ end
756
+
757
+ # Test locate using a given ContextModifier with an invalid Location for 1 of 2 deps
758
+ def testLocateWithCMBadLocation1Of2Deps
759
+ launchScenario( [ getSimpleDesc, getSimpleDesc2 ], [
760
+ [ ACTION_LOCATE, 'DummyBinary', nil ],
761
+ [ ACTION_SELECT_AFFECTING_CONTEXTMODIFIER, 'DummyBinary', [ 'SystemPath', "#{@RepositoryDir}/BadBinaries" ] ],
762
+ [ ACTION_APPLY, nil, nil ]
763
+ ] )
764
+ end
765
+
766
+ end
767
+
768
+ # Module defining methods that test a given LocationSelector
769
+ # The setup of classes including this module should define
770
+ # @LocationSelectorPluginName
771
+ module RDITestCase_LocationSelectors
772
+
773
+ # Test that the API is correctly defined
774
+ def testAPI
775
+ setupAppDir do
776
+ # Check that each view defines it
777
+ # Get the list of views
778
+ @Installer.getPluginNames('Views').each do |iViewName|
779
+ # Install the dependencies automatically before calling the plugin (we don't want to ask the user about it)
780
+ lInstallMethod = "installDep_#{iViewName}".to_sym
781
+ if (respond_to?(lInstallMethod))
782
+ send(lInstallMethod)
783
+ end
784
+ @Installer.accessPlugin("LocationSelectors_#{iViewName}", @LocationSelectorPluginName) do |ioPlugin|
785
+ assert(ioPlugin.is_a?(RDI::Model::LocationSelector))
786
+ assert(ioPlugin.respond_to?(:getNewLocation))
787
+ end
788
+ end
789
+ end
790
+ end
791
+
792
+ end
793
+
794
+ end
795
+
796
+ end