vagrant 0.5.4 → 0.6.0

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 (234) hide show
  1. data/.gitignore +1 -0
  2. data/.yardopts +1 -0
  3. data/CHANGELOG.md +56 -0
  4. data/Gemfile +14 -3
  5. data/Gemfile.lock +38 -11
  6. data/README.md +1 -1
  7. data/bin/vagrant +20 -5
  8. data/config/default.rb +6 -8
  9. data/lib/vagrant.rb +40 -13
  10. data/lib/vagrant/action.rb +56 -16
  11. data/lib/vagrant/action/box/destroy.rb +3 -1
  12. data/lib/vagrant/action/box/download.rb +8 -13
  13. data/lib/vagrant/action/box/unpackage.rb +8 -11
  14. data/lib/vagrant/action/box/verify.rb +3 -3
  15. data/lib/vagrant/action/builder.rb +3 -30
  16. data/lib/vagrant/action/builtin.rb +6 -1
  17. data/lib/vagrant/action/environment.rb +14 -62
  18. data/lib/vagrant/action/general/package.rb +29 -22
  19. data/lib/vagrant/action/vm/boot.rb +5 -12
  20. data/lib/vagrant/action/vm/check_box.rb +4 -4
  21. data/lib/vagrant/action/vm/check_guest_additions.rb +4 -6
  22. data/lib/vagrant/action/vm/clear_forwarded_ports.rb +2 -2
  23. data/lib/vagrant/action/vm/clear_nfs_exports.rb +1 -1
  24. data/lib/vagrant/action/vm/clear_shared_folders.rb +1 -1
  25. data/lib/vagrant/action/vm/customize.rb +1 -1
  26. data/lib/vagrant/action/vm/destroy.rb +1 -2
  27. data/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb +1 -1
  28. data/lib/vagrant/action/vm/disable_networks.rb +11 -9
  29. data/lib/vagrant/action/vm/discard_state.rb +2 -2
  30. data/lib/vagrant/action/vm/export.rb +10 -11
  31. data/lib/vagrant/action/vm/forward_ports.rb +21 -9
  32. data/lib/vagrant/action/vm/halt.rb +3 -8
  33. data/lib/vagrant/action/vm/import.rb +16 -14
  34. data/lib/vagrant/action/vm/match_mac_address.rb +1 -1
  35. data/lib/vagrant/action/vm/network.rb +9 -16
  36. data/lib/vagrant/action/vm/nfs.rb +14 -18
  37. data/lib/vagrant/action/vm/provision.rb +5 -5
  38. data/lib/vagrant/action/vm/resume.rb +1 -1
  39. data/lib/vagrant/action/vm/share_folders.rb +6 -44
  40. data/lib/vagrant/action/vm/suspend.rb +1 -1
  41. data/lib/vagrant/action/warden.rb +74 -0
  42. data/lib/vagrant/box.rb +18 -82
  43. data/lib/vagrant/box_collection.rb +47 -0
  44. data/lib/vagrant/cli.rb +55 -0
  45. data/lib/vagrant/command/base.rb +106 -0
  46. data/lib/vagrant/command/box.rb +33 -0
  47. data/lib/vagrant/command/destroy.rb +17 -0
  48. data/lib/vagrant/command/group_base.rb +99 -0
  49. data/lib/vagrant/command/halt.rb +18 -0
  50. data/lib/vagrant/command/helpers.rb +33 -0
  51. data/lib/vagrant/command/init.rb +14 -0
  52. data/lib/vagrant/command/named_base.rb +14 -0
  53. data/lib/vagrant/command/package.rb +41 -0
  54. data/lib/vagrant/command/provision.rb +17 -0
  55. data/lib/vagrant/command/reload.rb +17 -0
  56. data/lib/vagrant/command/resume.rb +17 -0
  57. data/lib/vagrant/command/ssh.rb +41 -0
  58. data/lib/vagrant/command/ssh_config.rb +21 -0
  59. data/lib/vagrant/command/status.rb +23 -0
  60. data/lib/vagrant/command/suspend.rb +17 -0
  61. data/lib/vagrant/command/up.rb +20 -0
  62. data/lib/vagrant/command/upgrade_to_060.rb +45 -0
  63. data/lib/vagrant/command/version.rb +13 -0
  64. data/lib/vagrant/config.rb +107 -189
  65. data/lib/vagrant/config/base.rb +67 -0
  66. data/lib/vagrant/config/error_recorder.rb +19 -0
  67. data/lib/vagrant/config/nfs.rb +10 -0
  68. data/lib/vagrant/config/package.rb +9 -0
  69. data/lib/vagrant/config/ssh.rb +28 -0
  70. data/lib/vagrant/config/vagrant.rb +21 -0
  71. data/lib/vagrant/config/vm.rb +111 -0
  72. data/lib/vagrant/data_store.rb +68 -0
  73. data/lib/vagrant/downloaders/file.rb +3 -3
  74. data/lib/vagrant/downloaders/http.rb +5 -5
  75. data/lib/vagrant/environment.rb +246 -243
  76. data/lib/vagrant/errors.rb +306 -0
  77. data/lib/vagrant/hosts/base.rb +1 -1
  78. data/lib/vagrant/hosts/bsd.rb +3 -9
  79. data/lib/vagrant/hosts/linux.rb +3 -9
  80. data/lib/vagrant/plugin.rb +50 -0
  81. data/lib/vagrant/provisioners/base.rb +0 -6
  82. data/lib/vagrant/provisioners/chef.rb +63 -58
  83. data/lib/vagrant/provisioners/chef_server.rb +9 -11
  84. data/lib/vagrant/provisioners/chef_solo.rb +2 -2
  85. data/lib/vagrant/ssh.rb +34 -37
  86. data/lib/vagrant/systems/base.rb +0 -13
  87. data/lib/vagrant/systems/linux.rb +10 -33
  88. data/lib/vagrant/systems/solaris.rb +59 -0
  89. data/lib/vagrant/test_helpers.rb +109 -0
  90. data/lib/vagrant/ui.rb +65 -0
  91. data/lib/vagrant/util.rb +9 -19
  92. data/lib/vagrant/util/glob_loader.rb +19 -17
  93. data/lib/vagrant/util/hash_with_indifferent_access.rb +63 -0
  94. data/lib/vagrant/util/plain_logger.rb +2 -0
  95. data/lib/vagrant/util/platform.rb +2 -0
  96. data/lib/vagrant/util/resource_logger.rb +5 -70
  97. data/lib/vagrant/util/retryable.rb +25 -0
  98. data/lib/vagrant/util/template_renderer.rb +1 -1
  99. data/lib/vagrant/version.rb +1 -1
  100. data/lib/vagrant/vm.rb +27 -13
  101. data/templates/commands/init/Vagrantfile.erb +13 -0
  102. data/templates/config/validation_failed.erb +7 -0
  103. data/templates/locales/en.yml +402 -0
  104. data/templates/package_Vagrantfile.erb +1 -1
  105. data/test/locales/en.yml +8 -0
  106. data/test/test_helper.rb +19 -103
  107. data/test/vagrant/action/box/destroy_test.rb +7 -19
  108. data/test/vagrant/action/box/download_test.rb +9 -25
  109. data/test/vagrant/action/box/package_test.rb +2 -2
  110. data/test/vagrant/action/box/unpackage_test.rb +8 -34
  111. data/test/vagrant/action/box/verify_test.rb +10 -19
  112. data/test/vagrant/action/builder_test.rb +0 -15
  113. data/test/vagrant/action/env/set_test.rb +1 -1
  114. data/test/vagrant/action/environment_test.rb +8 -26
  115. data/test/vagrant/action/general/package_test.rb +53 -53
  116. data/test/vagrant/action/vm/boot_test.rb +5 -22
  117. data/test/vagrant/action/vm/check_box_test.rb +35 -25
  118. data/test/vagrant/action/vm/clean_machine_folder_test.rb +1 -1
  119. data/test/vagrant/action/vm/clear_forwarded_ports_test.rb +1 -1
  120. data/test/vagrant/action/vm/clear_nfs_exports_test.rb +1 -1
  121. data/test/vagrant/action/vm/clear_shared_folders_test.rb +1 -1
  122. data/test/vagrant/action/vm/customize_test.rb +2 -1
  123. data/test/vagrant/action/vm/destroy_test.rb +1 -2
  124. data/test/vagrant/action/vm/destroy_unused_network_interfaces_test.rb +1 -1
  125. data/test/vagrant/action/vm/disable_networks_test.rb +10 -1
  126. data/test/vagrant/action/vm/discard_state_test.rb +10 -1
  127. data/test/vagrant/action/vm/export_test.rb +9 -37
  128. data/test/vagrant/action/vm/forward_ports_helpers_test.rb +2 -2
  129. data/test/vagrant/action/vm/forward_ports_test.rb +19 -16
  130. data/test/vagrant/action/vm/halt_test.rb +11 -1
  131. data/test/vagrant/action/vm/import_test.rb +37 -21
  132. data/test/vagrant/action/vm/match_mac_address_test.rb +1 -1
  133. data/test/vagrant/action/vm/network_test.rb +8 -7
  134. data/test/vagrant/action/vm/nfs_helpers_test.rb +6 -3
  135. data/test/vagrant/action/vm/nfs_test.rb +20 -45
  136. data/test/vagrant/action/vm/package_test.rb +1 -1
  137. data/test/vagrant/action/vm/package_vagrantfile_test.rb +1 -1
  138. data/test/vagrant/action/vm/provision_test.rb +10 -17
  139. data/test/vagrant/action/vm/resume_test.rb +1 -1
  140. data/test/vagrant/action/vm/share_folders_test.rb +25 -106
  141. data/test/vagrant/action/vm/suspend_test.rb +1 -1
  142. data/test/vagrant/action/warden_test.rb +105 -0
  143. data/test/vagrant/action_test.rb +5 -27
  144. data/test/vagrant/box_collection_test.rb +44 -0
  145. data/test/vagrant/box_test.rb +5 -105
  146. data/test/vagrant/cli_test.rb +35 -0
  147. data/test/vagrant/command/base_test.rb +23 -0
  148. data/test/vagrant/command/group_base_test.rb +15 -0
  149. data/test/vagrant/command/helpers_test.rb +88 -0
  150. data/test/vagrant/config/base_test.rb +52 -0
  151. data/test/vagrant/config/error_recorder_test.rb +18 -0
  152. data/test/vagrant/config/ssh_test.rb +12 -0
  153. data/test/vagrant/config/vagrant_test.rb +11 -0
  154. data/test/vagrant/config/vm_test.rb +70 -0
  155. data/test/vagrant/config_test.rb +113 -206
  156. data/test/vagrant/data_store_test.rb +68 -0
  157. data/test/vagrant/downloaders/base_test.rb +1 -1
  158. data/test/vagrant/downloaders/file_test.rb +4 -3
  159. data/test/vagrant/downloaders/http_test.rb +14 -4
  160. data/test/vagrant/environment_test.rb +290 -590
  161. data/test/vagrant/errors_test.rb +42 -0
  162. data/test/vagrant/hosts/base_test.rb +1 -1
  163. data/test/vagrant/hosts/bsd_test.rb +3 -6
  164. data/test/vagrant/hosts/linux_test.rb +3 -5
  165. data/test/vagrant/plugin_test.rb +9 -0
  166. data/test/vagrant/provisioners/base_test.rb +1 -1
  167. data/test/vagrant/provisioners/chef_server_test.rb +31 -35
  168. data/test/vagrant/provisioners/chef_solo_test.rb +1 -1
  169. data/test/vagrant/provisioners/chef_test.rb +7 -7
  170. data/test/vagrant/ssh_session_test.rb +3 -10
  171. data/test/vagrant/ssh_test.rb +25 -33
  172. data/test/vagrant/systems/linux_test.rb +6 -71
  173. data/test/vagrant/ui_test.rb +29 -0
  174. data/test/vagrant/util/hash_with_indifferent_access_test.rb +39 -0
  175. data/test/vagrant/util/resource_logger_test.rb +14 -81
  176. data/test/vagrant/util/retryable_test.rb +38 -0
  177. data/test/vagrant/util/template_renderer_test.rb +4 -4
  178. data/test/vagrant/vm_test.rb +47 -26
  179. data/vagrant.gemspec +14 -12
  180. metadata +142 -108
  181. data/bin/.gitignore +0 -0
  182. data/lib/vagrant/action/action_exception.rb +0 -16
  183. data/lib/vagrant/action/env/error_halt.rb +0 -16
  184. data/lib/vagrant/action/exception_catcher.rb +0 -14
  185. data/lib/vagrant/action/vm/persist.rb +0 -22
  186. data/lib/vagrant/active_list.rb +0 -83
  187. data/lib/vagrant/command.rb +0 -27
  188. data/lib/vagrant/commands/base.rb +0 -181
  189. data/lib/vagrant/commands/box.rb +0 -16
  190. data/lib/vagrant/commands/box/add.rb +0 -30
  191. data/lib/vagrant/commands/box/list.rb +0 -30
  192. data/lib/vagrant/commands/box/remove.rb +0 -30
  193. data/lib/vagrant/commands/box/repackage.rb +0 -35
  194. data/lib/vagrant/commands/destroy.rb +0 -37
  195. data/lib/vagrant/commands/halt.rb +0 -43
  196. data/lib/vagrant/commands/init.rb +0 -36
  197. data/lib/vagrant/commands/package.rb +0 -81
  198. data/lib/vagrant/commands/provision.rb +0 -31
  199. data/lib/vagrant/commands/reload.rb +0 -36
  200. data/lib/vagrant/commands/resume.rb +0 -35
  201. data/lib/vagrant/commands/ssh.rb +0 -78
  202. data/lib/vagrant/commands/ssh_config.rb +0 -45
  203. data/lib/vagrant/commands/status.rb +0 -125
  204. data/lib/vagrant/commands/suspend.rb +0 -36
  205. data/lib/vagrant/commands/up.rb +0 -44
  206. data/lib/vagrant/exceptions/uncallable_action.rb +0 -17
  207. data/lib/vagrant/util/translator.rb +0 -35
  208. data/templates/strings.yml +0 -341
  209. data/templates/unison/crontab_entry.erb +0 -1
  210. data/templates/unison/script.erb +0 -71
  211. data/test/vagrant/action/env/error_halt_test.rb +0 -21
  212. data/test/vagrant/action/exception_catcher_test.rb +0 -30
  213. data/test/vagrant/action/vm/persist_test.rb +0 -50
  214. data/test/vagrant/active_list_test.rb +0 -173
  215. data/test/vagrant/command_test.rb +0 -53
  216. data/test/vagrant/commands/base_test.rb +0 -139
  217. data/test/vagrant/commands/box/add_test.rb +0 -34
  218. data/test/vagrant/commands/box/list_test.rb +0 -32
  219. data/test/vagrant/commands/box/remove_test.rb +0 -41
  220. data/test/vagrant/commands/box/repackage_test.rb +0 -52
  221. data/test/vagrant/commands/destroy_test.rb +0 -44
  222. data/test/vagrant/commands/halt_test.rb +0 -50
  223. data/test/vagrant/commands/init_test.rb +0 -71
  224. data/test/vagrant/commands/package_test.rb +0 -97
  225. data/test/vagrant/commands/provision_test.rb +0 -60
  226. data/test/vagrant/commands/reload_test.rb +0 -47
  227. data/test/vagrant/commands/resume_test.rb +0 -44
  228. data/test/vagrant/commands/ssh_config_test.rb +0 -77
  229. data/test/vagrant/commands/ssh_test.rb +0 -129
  230. data/test/vagrant/commands/status_test.rb +0 -40
  231. data/test/vagrant/commands/suspend_test.rb +0 -44
  232. data/test/vagrant/commands/up_test.rb +0 -49
  233. data/test/vagrant/util/translator_test.rb +0 -61
  234. data/test/vagrant/util_test.rb +0 -27
@@ -0,0 +1,88 @@
1
+ require "test_helper"
2
+
3
+ class CommandHelpersTest < Test::Unit::TestCase
4
+ setup do
5
+ @module = Vagrant::Command::Helpers
6
+ @command = Class.new(Vagrant::Command::Base) do
7
+ argument :name, :optional => true, :type => :string
8
+ end
9
+ end
10
+
11
+ def command(args, env)
12
+ @command.new(args, {}, { :env => env })
13
+ end
14
+
15
+ context "initializing environment" do
16
+ should "raise an exception if no environment is given" do
17
+ assert_raises(Vagrant::Errors::CLIMissingEnvironment) { command([], nil) }
18
+ end
19
+ end
20
+
21
+ context "vms from args" do
22
+ setup do
23
+ @env = vagrant_env
24
+ end
25
+
26
+ should "raise an exception if no root path" do
27
+ @env.stubs(:root_path).returns(nil)
28
+
29
+ assert_raises(Vagrant::Errors::NoEnvironmentError) {
30
+ command([], @env).target_vms
31
+ }
32
+ end
33
+
34
+ should "only calculate the result once" do
35
+ instance = command([], @env)
36
+ result = instance.target_vms
37
+ assert instance.target_vms.equal?(result)
38
+ end
39
+
40
+ context "without multivm" do
41
+ setup do
42
+ @env.stubs(:vms).returns({ :one => 1 })
43
+ end
44
+
45
+ should "raise an exception if a name is specified" do
46
+ instance = command(["foo"], @env)
47
+ assert_raises(Vagrant::Errors::MultiVMEnvironmentRequired) {
48
+ instance.target_vms
49
+ }
50
+ end
51
+
52
+ should "return the VM if no name is specified" do
53
+ instance = command([], @env)
54
+ assert_nothing_raised {
55
+ assert_equal @env.vms.values, instance.target_vms
56
+ }
57
+ end
58
+ end
59
+
60
+ context "with multivm" do
61
+ setup do
62
+ @env.stubs(:vms).returns(:one => 1, :two => 2)
63
+ end
64
+
65
+ should "return all the VMs if no name is specified" do
66
+ instance = command([], @env)
67
+ assert_equal @env.vms.values, instance.target_vms
68
+ end
69
+
70
+ should "return only the specified VM if a name is given" do
71
+ instance = command(["one"], @env)
72
+ assert_equal @env.vms[:one], instance.target_vms.first
73
+ end
74
+
75
+ should "return only the specified VM if name is given in the arg" do
76
+ instance = command([], @env)
77
+ assert_equal @env.vms[:two], instance.target_vms("two").first
78
+ end
79
+
80
+ should "raise an exception if an invalid name is given" do
81
+ instance = command(["foo"], @env)
82
+ assert_raises(Vagrant::Errors::VMNotFoundError) {
83
+ instance.target_vms
84
+ }
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,52 @@
1
+ require "test_helper"
2
+
3
+ class ConfigBaseTest < Test::Unit::TestCase
4
+ setup do
5
+ @klass = Vagrant::Config::Base
6
+ end
7
+
8
+ context "class methods" do
9
+ should "enable configuration with proper accessor" do
10
+ klass = Class.new(@klass)
11
+ acc = :foo
12
+ Vagrant::Config::Top.expects(:configures).with(acc, klass)
13
+ klass.configures(acc)
14
+ end
15
+ end
16
+
17
+ context "instance methods" do
18
+ setup do
19
+ @base = @klass.new
20
+ end
21
+
22
+ should "return a hash of instance variables" do
23
+ data = { "foo" => "bar", "bar" => "baz" }
24
+
25
+ data.each do |iv, value|
26
+ @base.instance_variable_set("@#{iv}".to_sym, value)
27
+ end
28
+
29
+ result = @base.instance_variables_hash
30
+ assert_equal data.length, result.length
31
+
32
+ data.each do |iv, value|
33
+ assert_equal value, result[iv]
34
+ end
35
+ end
36
+
37
+ context "converting to JSON" do
38
+ should "include magic `json_class`" do
39
+ @iv_hash = { "foo" => "bar" }
40
+ @base.expects(:instance_variables_hash).returns(@iv_hash)
41
+ @json = { 'json_class' => @base.class.name }.merge(@iv_hash).to_json
42
+ assert_equal @json, @base.to_json
43
+ end
44
+
45
+ should "not include env in the JSON hash" do
46
+ @base.env = "FOO"
47
+ hash = @base.instance_variables_hash
48
+ assert !hash.has_key?(:env)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,18 @@
1
+ require "test_helper"
2
+
3
+ class ConfigErrorsTest < Test::Unit::TestCase
4
+ setup do
5
+ @klass = Vagrant::Config::ErrorRecorder
6
+ @instance = @klass.new
7
+ end
8
+
9
+ should "not have any errors to start" do
10
+ assert @instance.errors.empty?
11
+ end
12
+
13
+ should "add errors" do
14
+ key = "vagrant.test.errors.test_key"
15
+ @instance.add(key)
16
+ assert_equal key, @instance.errors.first
17
+ end
18
+ end
@@ -0,0 +1,12 @@
1
+ require "test_helper"
2
+
3
+ class ConfigSSHTest < Test::Unit::TestCase
4
+ setup do
5
+ @env = vagrant_env
6
+ end
7
+
8
+ should "expand any path when requesting the value" do
9
+ result = File.expand_path(@env.config.ssh.private_key_path, @env.root_path)
10
+ assert_equal result, @env.config.ssh.private_key_path
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ require "test_helper"
2
+
3
+ class ConfigVagrantTest < Test::Unit::TestCase
4
+ setup do
5
+ @config = Vagrant::Config::VagrantConfig.new
6
+ end
7
+
8
+ context "validation" do
9
+ # TODO
10
+ end
11
+ end
@@ -0,0 +1,70 @@
1
+ require "test_helper"
2
+
3
+ class ConfigVMTest < Test::Unit::TestCase
4
+ setup do
5
+ @username = "mitchellh"
6
+
7
+ @env = vagrant_env
8
+ @config = @env.config.vm
9
+ @env.config.ssh.username = @username
10
+ end
11
+
12
+ context "defining VMs" do
13
+ should "store the proc by name but not run it" do
14
+ foo = mock("proc")
15
+ foo.expects(:call).never
16
+
17
+ proc = Proc.new { foo.call }
18
+ @config.define(:name, &proc)
19
+ assert @config.defined_vms[:name].proc_stack.include?(proc)
20
+ end
21
+
22
+ should "store the options" do
23
+ @config.define(:name, :set => true)
24
+ assert @config.defined_vms[:name].options[:set]
25
+ end
26
+
27
+ should "not have multi-VMs by default" do
28
+ assert !@config.has_multi_vms?
29
+ end
30
+
31
+ should "have multi-VMs once one is specified" do
32
+ @config.define(:foo) {}
33
+ assert @config.has_multi_vms?
34
+ end
35
+ end
36
+
37
+ context "customizing" do
38
+ should "include the stacked proc runner module" do
39
+ assert @config.class.included_modules.include?(Vagrant::Util::StackedProcRunner)
40
+ end
41
+
42
+ should "add the customize proc to the proc stack" do
43
+ proc = Proc.new {}
44
+ @config.customize(&proc)
45
+ assert @config.proc_stack.include?(proc)
46
+ end
47
+ end
48
+
49
+ context "uid/gid" do
50
+ should "return the shared folder UID if set" do
51
+ @config.shared_folder_uid = "foo"
52
+ assert_equal "foo", @config.shared_folder_uid
53
+ end
54
+
55
+ should "return the SSH username if UID not set" do
56
+ @config.shared_folder_uid = nil
57
+ assert_equal @username, @config.shared_folder_uid
58
+ end
59
+
60
+ should "return the shared folder GID if set" do
61
+ @config.shared_folder_gid = "foo"
62
+ assert_equal "foo", @config.shared_folder_gid
63
+ end
64
+
65
+ should "return the SSH username if GID not set" do
66
+ @config.shared_folder_gid = nil
67
+ assert_equal @username, @config.shared_folder_gid
68
+ end
69
+ end
70
+ end
@@ -1,154 +1,156 @@
1
1
  require "test_helper"
2
2
 
3
3
  class ConfigTest < Test::Unit::TestCase
4
- context "the ssh config" do
4
+ setup do
5
+ @klass = Vagrant::Config
6
+ end
7
+
8
+ context "with an instance" do
5
9
  setup do
6
- @env = mock_environment
7
- @env.stubs(:root_path).returns("foo")
10
+ @env = vagrant_env
11
+ @instance = @klass.new(@env)
12
+
13
+ # Don't want validation to occur for these tests
14
+ @klass::Top.any_instance.stubs(:validate!)
8
15
  end
9
16
 
10
- should "expand any path when requesting the value" do
11
- result = File.expand_path(@env.config.ssh[:private_key_path], @env.root_path)
12
- assert_equal result, @env.config.ssh.private_key_path
17
+ should "initially have an empty queue" do
18
+ assert @instance.queue.empty?
13
19
  end
14
- end
15
20
 
16
- context "adding configures" do
17
- should "forward the method to the Top class" do
18
- key = mock("key")
19
- klass = mock("klass")
20
- Vagrant::Config::Top.expects(:configures).with(key, klass)
21
- Vagrant::Config.configures(key, klass)
21
+ should "reset the config class on load, then execute" do
22
+ seq = sequence("sequence")
23
+ @klass.expects(:reset!).with(@env).in_sequence(seq)
24
+ @klass.expects(:execute!).in_sequence(seq)
25
+ @instance.load!
26
+ end
27
+
28
+ should "run the queue in the order given" do
29
+ @instance.queue << Proc.new { |config| config.vm.box = "foo" }
30
+ @instance.queue << Proc.new { |config| config.vm.box = "bar" }
31
+ result = @instance.load!
32
+
33
+ assert_equal "bar", result.vm.box
34
+ end
35
+
36
+ should "allow nested arrays" do
37
+ queue = []
38
+ queue << Proc.new { |config| config.vm.box = "foo" }
39
+ queue << Proc.new { |config| config.vm.box = "bar" }
40
+ @instance.queue << queue
41
+ result = @instance.load!
42
+
43
+ assert_equal "bar", result.vm.box
44
+ end
45
+
46
+ should "load a file if it exists" do
47
+ filename = "foo"
48
+ File.expects(:exist?).with(filename).returns(true)
49
+ @instance.expects(:load).with(filename).once
50
+
51
+ @instance.queue << filename
52
+ @instance.load!
53
+ end
54
+
55
+ should "not load a file if it doesn't exist" do
56
+ filename = "foo"
57
+ File.expects(:exist?).with(filename).returns(false)
58
+ @instance.expects(:load).with(filename).never
59
+
60
+ @instance.queue << filename
61
+ @instance.load!
62
+ end
63
+
64
+ should "raise an exception if there is a syntax error in a file" do
65
+ @instance.queue << "foo"
66
+ File.expects(:exist?).with("foo").returns(true)
67
+ @instance.expects(:load).with("foo").raises(SyntaxError.new)
68
+
69
+ assert_raises(Vagrant::Errors::VagrantfileSyntaxError) {
70
+ @instance.load!
71
+ }
22
72
  end
23
73
  end
24
74
 
25
75
  context "resetting" do
26
76
  setup do
27
- Vagrant::Config.run { |config| }
28
- Vagrant::Config.execute!
77
+ @klass::Top.any_instance.stubs(:validate!)
78
+ @klass.run { |config| }
79
+ @klass.execute!
29
80
  end
30
81
 
31
82
  should "return the same config object typically" do
32
- config = Vagrant::Config.config
33
- assert config.equal?(Vagrant::Config.config)
83
+ config = @klass.config
84
+ assert config.equal?(@klass.config)
34
85
  end
35
86
 
36
87
  should "create a new object if cleared" do
37
- config = Vagrant::Config.config
38
- Vagrant::Config.reset!
39
- assert !config.equal?(Vagrant::Config.config)
88
+ config = @klass.config
89
+ @klass.reset!
90
+ assert !config.equal?(@klass.config)
40
91
  end
41
92
 
42
93
  should "empty the proc stack" do
43
- assert !Vagrant::Config.proc_stack.empty?
44
- Vagrant::Config.reset!
45
- assert Vagrant::Config.proc_stack.empty?
94
+ assert !@klass.proc_stack.empty?
95
+ @klass.reset!
96
+ assert @klass.proc_stack.empty?
46
97
  end
47
98
 
48
99
  should "reload the config object based on the given environment" do
49
100
  env = mock("env")
50
- Vagrant::Config.expects(:config).with(env).once
51
- Vagrant::Config.reset!(env)
101
+ @klass.expects(:config).with(env).once
102
+ @klass.reset!(env)
52
103
  end
53
104
  end
54
105
 
55
106
  context "initializing" do
56
107
  setup do
57
- Vagrant::Config.reset!
108
+ @klass.reset!
109
+ @klass::Top.any_instance.stubs(:validate!)
58
110
  end
59
111
 
60
112
  should "add the given block to the proc stack" do
61
113
  proc = Proc.new {}
62
- Vagrant::Config.run(&proc)
63
- assert_equal [proc], Vagrant::Config.proc_stack
114
+ @klass.run(&proc)
115
+ assert_equal [proc], @klass.proc_stack
64
116
  end
65
117
 
66
118
  should "run the proc stack with the config when execute is called" do
67
- Vagrant::Config.expects(:run_procs!).with(Vagrant::Config.config).once
68
- Vagrant::Config.execute!
69
- end
70
-
71
- should "not be loaded, initially" do
72
- assert !Vagrant::Config.config.loaded?
73
- end
74
-
75
- should "be loaded after running" do
76
- Vagrant::Config.run {}
77
- Vagrant::Config.execute!
78
- assert Vagrant::Config.config.loaded?
119
+ seq = sequence('seq')
120
+ @klass.expects(:run_procs!).with(@klass.config).once.in_sequence(seq)
121
+ @klass.config.expects(:validate!).once.in_sequence(seq)
122
+ @klass.execute!
79
123
  end
80
124
 
81
125
  should "return the configuration on execute!" do
82
- Vagrant::Config.run {}
83
- result = Vagrant::Config.execute!
84
- assert result.is_a?(Vagrant::Config::Top)
126
+ @klass.run {}
127
+ result = @klass.execute!
128
+ assert result.is_a?(@klass::Top)
85
129
  end
86
130
 
87
131
  should "use given configuration object if given" do
88
132
  fake_env = mock("env")
89
- config = Vagrant::Config::Top.new(fake_env)
90
- result = Vagrant::Config.execute!(config)
133
+ config = @klass::Top.new(fake_env)
134
+ result = @klass.execute!(config)
91
135
  assert_equal config.env, result.env
92
136
  end
93
137
  end
94
138
 
95
- context "base class" do
96
- setup do
97
- @base = Vagrant::Config::Base.new
98
- end
99
-
100
- should "forward [] access to methods" do
101
- @base.expects(:foo).once
102
- @base[:foo]
103
- end
104
-
105
- should "return a hash of instance variables" do
106
- data = { :foo => "bar", :bar => "baz" }
107
-
108
- data.each do |iv, value|
109
- @base.instance_variable_set("@#{iv}".to_sym, value)
110
- end
111
-
112
- result = @base.instance_variables_hash
113
- assert_equal data.length, result.length
114
-
115
- data.each do |iv, value|
116
- assert_equal value, result[iv]
117
- end
118
- end
119
-
120
- context "converting to JSON" do
121
- should "convert instance variable hash to json" do
122
- @json = mock("json")
123
- @iv_hash = mock("iv_hash")
124
- @iv_hash.expects(:to_json).once.returns(@json)
125
- @base.expects(:instance_variables_hash).returns(@iv_hash)
126
- assert_equal @json, @base.to_json
127
- end
128
-
129
- should "not include env in the JSON hash" do
130
- @base.env = "FOO"
131
- hash = @base.instance_variables_hash
132
- assert !hash.has_key?(:env)
133
- end
134
- end
135
- end
136
-
137
139
  context "top config class" do
138
140
  setup do
139
141
  @configures_list = []
140
- Vagrant::Config::Top.stubs(:configures_list).returns(@configures_list)
142
+ @klass::Top.stubs(:configures_list).returns(@configures_list)
141
143
  end
142
144
 
143
145
  context "adding configure keys" do
144
146
  setup do
145
147
  @key = "top_config_foo"
146
- @klass = mock("klass")
148
+ @config_klass = mock("klass")
147
149
  end
148
150
 
149
151
  should "add key and klass to configures list" do
150
- @configures_list.expects(:<<).with([@key, @klass])
151
- Vagrant::Config::Top.configures(@key, @klass)
152
+ @configures_list.expects(:<<).with([@key, @config_klass])
153
+ @klass::Top.configures(@key, @config_klass)
152
154
  end
153
155
  end
154
156
 
@@ -169,7 +171,7 @@ class ConfigTest < Test::Unit::TestCase
169
171
  @configures_list << [key, klass]
170
172
  end
171
173
 
172
- Vagrant::Config::Top.new(env)
174
+ @klass::Top.new(env)
173
175
  end
174
176
 
175
177
  should "allow reading via methods" do
@@ -178,129 +180,34 @@ class ConfigTest < Test::Unit::TestCase
178
180
  instance = mock("instance")
179
181
  instance.stubs(:env=)
180
182
  klass.expects(:new).returns(instance)
181
- Vagrant::Config::Top.configures(key, klass)
183
+ @klass::Top.configures(key, klass)
182
184
 
183
- config = Vagrant::Config::Top.new
185
+ config = @klass::Top.new
184
186
  assert_equal instance, config.send(key)
185
187
  end
186
188
  end
187
189
 
188
- context "loaded status" do
189
- setup do
190
- @top= Vagrant::Config::Top.new
191
- end
192
-
193
- should "not be loaded by default" do
194
- assert !@top.loaded?
190
+ context "validation" do
191
+ should "do nothing if no errors are added" do
192
+ valid_class = Class.new(@klass::Base)
193
+ @klass::Top.configures(:subconfig, valid_class)
194
+ instance = @klass::Top.new
195
+ assert_nothing_raised { instance.validate! }
195
196
  end
196
197
 
197
- should "be loaded after calling loaded!" do
198
- @top.loaded!
199
- assert @top.loaded?
200
- end
201
- end
202
-
203
- context "deep cloning" do
204
- class DeepCloneConfig < Vagrant::Config::Base
205
- attr_accessor :attribute
206
- end
207
-
208
- setup do
209
- Vagrant::Config::Top.configures :deep, DeepCloneConfig
210
- @top = Vagrant::Config::Top.new
211
- @top.deep.attribute = [1,2,3]
212
- end
213
-
214
- should "deep clone the object" do
215
- copy = @top.deep_clone
216
- copy.deep.attribute << 4
217
- assert_not_equal @top.deep.attribute, copy.deep.attribute
218
- assert_equal 3, @top.deep.attribute.length
219
- assert_equal 4, copy.deep.attribute.length
220
- end
221
- end
222
- end
223
-
224
- context "vagrant configuration" do
225
- setup do
226
- @config = Vagrant::Config::VagrantConfig.new
227
- end
228
-
229
- should "return nil if home is nil" do
230
- File.expects(:expand_path).never
231
- assert @config.home.nil?
232
- end
233
-
234
- should "expand the path if home is not nil" do
235
- @config.home = "foo"
236
- File.expects(:expand_path).with("foo").once.returns("result")
237
- assert_equal "result", @config.home
238
- end
239
- end
240
-
241
- context "VM configuration" do
242
- setup do
243
- @env = mock_environment
244
- @config = @env.config.vm
245
- @env.config.ssh.username = @username
246
- end
247
-
248
- context "defining VMs" do
249
- should "store the proc by name but not run it" do
250
- foo = mock("proc")
251
- foo.expects(:call).never
252
-
253
- proc = Proc.new { foo.call }
254
- @config.define(:name, &proc)
255
- assert @config.defined_vms[:name].proc_stack.include?(proc)
256
- end
257
-
258
- should "store the options" do
259
- @config.define(:name, :set => true)
260
- assert @config.defined_vms[:name].options[:set]
261
- end
262
-
263
- should "not have multi-VMs by default" do
264
- assert !@config.has_multi_vms?
265
- end
266
-
267
- should "have multi-VMs once one is specified" do
268
- @config.define(:foo) {}
269
- assert @config.has_multi_vms?
270
- end
271
- end
272
-
273
- context "customizing" do
274
- should "include the stacked proc runner module" do
275
- assert @config.class.included_modules.include?(Vagrant::Util::StackedProcRunner)
276
- end
277
-
278
- should "add the customize proc to the proc stack" do
279
- proc = Proc.new {}
280
- @config.customize(&proc)
281
- assert_equal [proc], @config.proc_stack
282
- end
283
- end
284
-
285
- context "uid/gid" do
286
- should "return the shared folder UID if set" do
287
- @config.shared_folder_uid = "foo"
288
- assert_equal "foo", @config.shared_folder_uid
289
- end
290
-
291
- should "return the SSH username if UID not set" do
292
- @config.shared_folder_uid = nil
293
- assert_equal @username, @config.shared_folder_uid
294
- end
198
+ should "raise an exception if there are errors" do
199
+ invalid_class = Class.new(@klass::Base) do
200
+ def validate(errors)
201
+ errors.add("vagrant.test.errors.test_key")
202
+ end
203
+ end
295
204
 
296
- should "return the shared folder GID if set" do
297
- @config.shared_folder_gid = "foo"
298
- assert_equal "foo", @config.shared_folder_gid
299
- end
205
+ @klass::Top.configures(:subconfig, invalid_class)
206
+ instance = @klass::Top.new
300
207
 
301
- should "return the SSH username if GID not set" do
302
- @config.shared_folder_gid = nil
303
- assert_equal @username, @config.shared_folder_gid
208
+ assert_raises(Vagrant::Errors::ConfigValidationFailed) {
209
+ instance.validate!
210
+ }
304
211
  end
305
212
  end
306
213
  end