isolate 1.10.2 → 2.0.0.pre.0

Sign up to get free protection for your applications and to get access to all the features.
data/test/test_isolate.rb CHANGED
@@ -1,25 +1,13 @@
1
- require "minitest/autorun"
2
- require "rubygems/dependency_installer"
3
- require "rubygems/requirement"
1
+ require "isolate/test"
2
+
4
3
  require "isolate"
5
4
 
6
- class TestIsolate < MiniTest::Unit::TestCase
5
+ class TestIsolate < Isolate::Test
7
6
  WITH_HOE = "test/fixtures/with-hoe"
8
7
 
9
- def setup
10
- @isolate = Isolate.new "tmp/gems", :install => false, :verbose => false
11
- @env = ENV.to_hash
12
-
13
- Gem.loaded_specs.clear
14
- end
15
-
16
8
  def teardown
17
- @isolate.disable
18
- Isolate.instance.disable if Isolate.instance
19
- Gem::DependencyInstaller.reset_value
20
- Gem::Uninstaller.reset_value
21
- FileUtils.rm_rf "tmp/gems"
22
- ENV.replace @env
9
+ Isolate.sandbox.disable if Isolate.sandbox
10
+ super
23
11
  end
24
12
 
25
13
  def test_self_env
@@ -40,233 +28,15 @@ class TestIsolate < MiniTest::Unit::TestCase
40
28
  assert_equal "baz", Isolate.env
41
29
  end
42
30
 
43
- def test_self_gems
44
- assert_nil Isolate.instance
31
+ def test_self_now!
32
+ assert_nil Isolate.sandbox
45
33
 
46
- Isolate.gems WITH_HOE do
34
+ Isolate.now! :path => WITH_HOE, :multiruby => false, :system => false do
47
35
  gem "hoe"
48
36
  end
49
37
 
50
- refute_nil Isolate.instance
51
- assert_equal File.expand_path(WITH_HOE), Isolate.instance.path
52
- assert_equal "hoe", Isolate.instance.entries.first.name
53
- end
54
-
55
- def test_activate
56
- @isolate = Isolate.new WITH_HOE
57
-
58
- assert_nil Gem.loaded_specs["hoe"]
59
-
60
- @isolate.gem "hoe"
61
- @isolate.activate
62
-
63
- refute_nil Gem.loaded_specs["hoe"]
64
- end
65
-
66
- def test_activate_environment
67
- @isolate = Isolate.new WITH_HOE, :verbose => false
68
- @isolate.gem "rubyforge"
69
-
70
- @isolate.environment "borg" do
71
- gem "hoe"
72
- end
73
-
74
- @isolate.activate
75
- assert_nil Gem.loaded_specs["hoe"]
76
- refute_nil Gem.loaded_specs["rubyforge"]
77
- end
78
-
79
- def test_activate_environment_explicit
80
- @isolate = Isolate.new WITH_HOE
81
-
82
- @isolate.gem "rubyforge"
83
-
84
- @isolate.environment "borg" do
85
- gem "hoe"
86
- end
87
-
88
- @isolate.activate "borg"
89
- refute_nil Gem.loaded_specs["hoe"]
90
- refute_nil Gem.loaded_specs["rubyforge"]
91
- end
92
-
93
- def test_activate_install
94
- @isolate = Isolate.new "tmp/gems", :install => true, :verbose => false
95
-
96
- @isolate.gem "foo"
97
-
98
- # rescuing because activate, well, actually tries to activate
99
- begin; @isolate.activate; rescue Gem::LoadError; end
100
-
101
- assert_equal ["foo", Gem::Requirement.default],
102
- Gem::DependencyInstaller.value.shift
103
- end
104
-
105
- def test_activate_install_environment
106
- @isolate = Isolate.new "tmp/gems", :install => true
107
- @isolate.environment(:nope) { gem "foo" }
108
-
109
- @isolate.activate
110
- assert_empty Gem::DependencyInstaller.value
111
- end
112
-
113
- def test_activate_ret
114
- assert_equal @isolate, @isolate.activate
115
- end
116
-
117
- # TODO: cleanup with 2 versions of same gem, 1 activated
118
- # TODO: install with 1 older version, 1 new gem to be installed
119
-
120
- def test_cleanup
121
- @isolate = Isolate.new WITH_HOE, :verbose => false
122
- # no gems specified on purpose
123
- @isolate.activate
124
-
125
- expected = [["hoe", "2.3.3", WITH_HOE],
126
- ["rake", "0.8.7", WITH_HOE],
127
- ["rubyforge", "1.0.4", WITH_HOE]]
128
-
129
- assert_equal expected, Gem::Uninstaller.value
130
- end
131
-
132
- def test_disable
133
- home, path, bin = ENV.values_at "GEM_HOME", "GEM_PATH", "PATH"
134
- load_path = $LOAD_PATH.dup
135
-
136
- @isolate.enable
137
-
138
- refute_equal home, ENV["GEM_HOME"]
139
- refute_equal path, ENV["GEM_PATH"]
140
- refute_equal bin, ENV["PATH"]
141
-
142
- refute_equal load_path, $LOAD_PATH
143
-
144
- @isolate.disable
145
-
146
- assert_equal home, ENV["GEM_HOME"]
147
- assert_equal path, ENV["GEM_PATH"]
148
- assert_equal bin, ENV["PATH"]
149
- assert_equal load_path, $LOAD_PATH
150
- end
151
-
152
- def test_disable_ret
153
- assert_equal @isolate, @isolate.disable
154
- end
155
-
156
- def test_enable
157
- refute_empty Gem.find_files("minitest/unit.rb"),
158
- "There's a minitest/unit in the current env, since we're running it."
159
-
160
- @isolate.enable
161
-
162
- assert_equal @isolate.path, ENV["GEM_PATH"]
163
- assert_equal @isolate.path, ENV["GEM_HOME"]
164
- assert ENV["PATH"].include?(File.join(@isolate.path, "bin")), "in path"
165
-
166
- assert_equal [], Gem.find_files("minitest/unit.rb"),
167
- "Can't find minitest/unit now, 'cause we're activated!"
168
-
169
- assert_empty Gem.loaded_specs
170
- assert_equal [@isolate.path], Gem.path
171
- end
172
-
173
- def test_enable_ret
174
- assert_equal @isolate, @isolate.enable
175
- end
176
-
177
- def test_environment
178
- @isolate.gem "none"
179
-
180
- @isolate.environment "test", "ci" do
181
- gem "test-ci"
182
-
183
- environment "production" do
184
- gem "test-ci-production"
185
- end
186
- end
187
-
188
- none, test_ci, test_ci_production = @isolate.entries
189
-
190
- assert_equal [], none.environments
191
- assert_equal %w(test ci), test_ci.environments
192
- assert_equal %w(test ci production), test_ci_production.environments
193
- end
194
-
195
- def test_gem
196
- g = @isolate.gem "foo"
197
- assert_includes @isolate.entries, g
198
-
199
- assert_equal "foo", g.name
200
- assert_equal Gem::Requirement.create(">= 0"), g.requirement
201
- end
202
-
203
- def test_gem_multi_requirements
204
- g = @isolate.gem "foo", "= 1.0", "< 2.0"
205
- assert_equal Gem::Requirement.create(["= 1.0", "< 2.0"]), g.requirement
206
- end
207
-
208
- def test_gem_options
209
- g = @isolate.gem "foo", :source => "somewhere"
210
- assert_equal "somewhere", g.options[:source]
211
- end
212
-
213
- def test_initialize
214
- i = Isolate.new "foo/gems"
215
- assert_equal File.expand_path("foo/gems"), i.path
216
- end
217
-
218
- def test_initialize_block
219
- i = Isolate.new "foo/gems" do
220
- gem "hoe"
221
- end
222
-
223
- assert_equal "hoe", i.entries.first.name
224
- end
225
-
226
- def test_initialize_options
227
- i = Isolate.new "foo/gems"
228
- assert i.install?
229
- assert i.verbose?
230
- assert i.cleanup?
231
-
232
- i = Isolate.new "foo/gems",
233
- :cleanup => false, :install => false, :verbose => false
234
-
235
- refute i.cleanup?
236
- refute i.install?
237
- refute i.verbose?
238
-
239
- i = Isolate.new "foo/gems", :install => false
240
- refute i.cleanup?, "no install, no cleanup"
241
-
242
- i = Isolate.new "foo/gems", :file => "test/fixtures/isolate.rb"
243
- assert_equal "hoe", i.entries.first.name
244
- end
245
- end
246
-
247
- module BrutalStub
248
- @@value = []
249
- def value; @@value end
250
- def reset_value; value.clear end
251
- end
252
-
253
- class Gem::DependencyInstaller
254
- extend BrutalStub
255
-
256
- alias old_install install
257
- def install name, requirement
258
- self.class.value << [name, requirement]
259
- end
260
- end
261
-
262
- class Gem::Uninstaller
263
- extend BrutalStub
264
-
265
- attr_reader :gem, :version, :gem_home
266
- alias old_uninstall uninstall
267
- def uninstall
268
- self.class.value << [self.gem,
269
- self.version.to_s,
270
- self.gem_home.sub(Dir.pwd + "/", '')]
38
+ refute_nil Isolate.sandbox
39
+ assert_equal File.expand_path(WITH_HOE), Isolate.sandbox.path
40
+ assert_equal "hoe", Isolate.sandbox.entries.first.name
271
41
  end
272
42
  end
@@ -0,0 +1,86 @@
1
+ require "isolate/entry"
2
+ require "isolate/test"
3
+
4
+ class TestIsolateEntry < Isolate::Test
5
+ def setup
6
+ @sandbox = Object.new
7
+ def @sandbox.environments; @e ||= [] end
8
+ def @sandbox.path; "tmp/gems" end
9
+
10
+ super
11
+ end
12
+
13
+ def test_initialize
14
+ @sandbox.environments.concat %w(foo bar)
15
+
16
+ entry = e "baz", "> 1.0", "< 2.0", :quux => :corge
17
+
18
+ assert_equal %w(foo bar), entry.environments
19
+ assert_equal "baz", entry.name
20
+ assert_equal Gem::Requirement.new("> 1.0", "< 2.0"), entry.requirement
21
+ assert_equal :corge, entry.options[:quux]
22
+
23
+ entry = e "plugh"
24
+
25
+ assert_equal Gem::Requirement.default, entry.requirement
26
+ assert_equal({}, entry.options)
27
+ end
28
+
29
+ def test_install_file
30
+ file = "test/fixtures/blort-0.0.gem"
31
+ entry = e file
32
+ entry.install
33
+
34
+ assert_equal File.expand_path(file),
35
+ Gem::DependencyInstaller.value.first.first
36
+ end
37
+
38
+ def test_matches?
39
+ @sandbox.environments << "test"
40
+ entry = e "hi"
41
+
42
+ assert entry.matches?("test")
43
+ assert !entry.matches?("double secret production")
44
+
45
+ entry.environments.clear
46
+ assert entry.matches?("double secret production")
47
+ end
48
+
49
+ def test_matches_spec?
50
+ entry = e "hi", "1.1"
51
+
52
+ assert entry.matches_spec?(spec "hi", "1.1")
53
+ assert !entry.matches_spec?(spec "bye", "1.1")
54
+ assert !entry.matches_spec?(spec "hi", "1.2")
55
+ end
56
+
57
+ def test_update
58
+ entry = e "hi", "1.1"
59
+
60
+ assert_equal [], entry.environments
61
+
62
+ @sandbox.environments.concat %w(corge corge plugh)
63
+ entry.update
64
+
65
+ assert_equal %w(corge plugh), entry.environments
66
+
67
+ entry.update :foo => :bar
68
+ entry.update :bar => :baz
69
+
70
+ assert_equal({ :foo => :bar, :bar => :baz }, entry.options)
71
+
72
+ entry.update :args => "--first"
73
+ entry.update :args => "--second"
74
+ assert_equal "--second", entry.options[:args]
75
+ end
76
+
77
+ def e *args
78
+ Isolate::Entry.new @sandbox, *args
79
+ end
80
+
81
+ Spec = Struct.new :name, :version
82
+
83
+ def spec name, version
84
+ Spec.new name, Gem::Version.new(version)
85
+ end
86
+ end
@@ -0,0 +1,275 @@
1
+ require "isolate/test"
2
+
3
+ class TestIsolateSandbox < Isolate::Test
4
+ WITH_HOE = "test/fixtures/with-hoe"
5
+
6
+ def setup
7
+ @sandbox = sandbox
8
+ super
9
+ end
10
+
11
+ def test_activate
12
+ @sandbox = sandbox :path => WITH_HOE
13
+
14
+ refute_loaded_spec "hoe"
15
+ @sandbox.gem "hoe"
16
+
17
+ result = @sandbox.activate
18
+ assert_equal @sandbox, result
19
+ assert_loaded_spec "hoe"
20
+ end
21
+
22
+ def test_activate_environment_explicit
23
+ @sandbox = sandbox :path => WITH_HOE
24
+
25
+ @sandbox.gem "rubyforge"
26
+ @sandbox.environment(:borg) { gem "hoe" }
27
+ @sandbox.activate :borg
28
+
29
+ assert_loaded_spec "hoe"
30
+ assert_loaded_spec "rubyforge"
31
+ end
32
+
33
+ def test_activate_environment_implicit
34
+ s = sandbox :path => WITH_HOE
35
+
36
+ s.gem "rubyforge"
37
+ s.environment(:borg) { gem "hoe" }
38
+
39
+ s.activate
40
+ refute_loaded_spec "hoe"
41
+ assert_loaded_spec "rubyforge"
42
+ end
43
+
44
+ def test_activate_install
45
+ s = sandbox :path => WITH_HOE, :install => true
46
+ s.gem "foo"
47
+
48
+ # rescuing because activate, well, actually tries to activate
49
+ begin; s.activate; rescue Gem::LoadError; end
50
+
51
+ assert_equal ["foo", Gem::Requirement.default],
52
+ Gem::DependencyInstaller.value.shift
53
+ end
54
+
55
+ # TODO: cleanup with 2 versions of same gem, 1 activated
56
+ # TODO: install with 1 older version, 1 new gem to be installed
57
+
58
+ def test_cleanup
59
+ s = sandbox :path => WITH_HOE, :install => true, :cleanup => true
60
+ s.activate # no gems on purpose
61
+
62
+ expected = [["hoe", "2.3.3", WITH_HOE],
63
+ ["rake", "0.8.7", WITH_HOE],
64
+ ["rubyforge", "1.0.4", WITH_HOE]]
65
+
66
+ assert_equal expected, Gem::Uninstaller.value
67
+ end
68
+
69
+ def test_disable
70
+ home, path, bin = ENV.values_at "GEM_HOME", "GEM_PATH", "PATH"
71
+ load_path = $LOAD_PATH.dup
72
+
73
+ @sandbox.enable
74
+
75
+ refute_equal home, ENV["GEM_HOME"]
76
+ refute_equal path, ENV["GEM_PATH"]
77
+ refute_equal bin, ENV["PATH"]
78
+
79
+ refute_equal load_path, $LOAD_PATH
80
+
81
+ result = @sandbox.disable
82
+ assert_same @sandbox, result
83
+
84
+ assert_equal home, ENV["GEM_HOME"]
85
+ assert_equal path, ENV["GEM_PATH"]
86
+ assert_equal bin, ENV["PATH"]
87
+ assert_equal load_path, $LOAD_PATH
88
+ end
89
+
90
+ def test_enable
91
+ refute_empty Gem.find_files("hoe.rb"),
92
+ "There's a hoe.rb somewhere in the current env."
93
+
94
+ assert_same @sandbox, @sandbox.enable
95
+
96
+ assert_equal @sandbox.path, ENV["GEM_PATH"]
97
+ assert_equal @sandbox.path, ENV["GEM_HOME"]
98
+ assert ENV["PATH"].include?(File.join(@sandbox.path, "bin")), "in path"
99
+
100
+ assert_equal [], Gem.find_files("hoe.rb"),
101
+ "Can't find hoe.rb now, 'cause we're activated!"
102
+
103
+ assert_empty Gem.loaded_specs
104
+ assert_equal [@sandbox.path], Gem.path
105
+ end
106
+
107
+ def test_enable_idempotent_path_env
108
+ bin = File.join @sandbox.path, "bin"
109
+ path = ENV["PATH"] = [bin, ENV["PATH"]].join(File::PATH_SEPARATOR)
110
+
111
+ @sandbox.enable
112
+ assert_equal path, ENV["PATH"]
113
+ end
114
+
115
+ def test_idempotent_rubyopt_env
116
+ @sandbox.enable
117
+ rubyopt = ENV["RUBYOPT"]
118
+ @sandbox.disable
119
+
120
+ refute_equal rubyopt, ENV["RUBYOPT"]
121
+
122
+ ENV["RUBYOPT"] = rubyopt
123
+ @sandbox.enable
124
+ assert_equal rubyopt, ENV["RUBYOPT"]
125
+ end
126
+
127
+ def test_environment
128
+ @sandbox.gem "none"
129
+
130
+ @sandbox.environment "test", "ci" do
131
+ gem "test-ci"
132
+
133
+ environment "production" do
134
+ gem "test-ci-production"
135
+ end
136
+ end
137
+
138
+ none, test_ci, test_ci_production = @sandbox.entries
139
+
140
+ assert_equal [], none.environments
141
+ assert_equal %w(test ci), test_ci.environments
142
+ assert_equal %w(test ci production), test_ci_production.environments
143
+ end
144
+
145
+ def test_gem
146
+ g = @sandbox.gem "foo"
147
+ assert_includes @sandbox.entries, g
148
+
149
+ assert_equal "foo", g.name
150
+ assert_equal Gem::Requirement.create(">= 0"), g.requirement
151
+ end
152
+
153
+ def test_gem_multi_calls
154
+ g = @sandbox.gem "foo"
155
+ g2 = @sandbox.gem "foo", :foo => :bar
156
+
157
+ @sandbox.gem "foo", :bar => :baz
158
+
159
+ assert_same g, g2
160
+ assert_equal :bar, g.options[:foo]
161
+ assert_equal :baz, g.options[:bar]
162
+
163
+ @sandbox.gem "foo", "> 1.7"
164
+ assert_equal Gem::Requirement.new("> 1.7"), g.requirement
165
+
166
+ @sandbox.environment :corge do
167
+ gem "foo"
168
+ end
169
+
170
+ @sandbox.environment :plurgh do
171
+ gem "foo"
172
+ end
173
+
174
+ assert_equal %w(corge plurgh), g.environments
175
+ end
176
+
177
+ def test_gem_multi_requirements
178
+ g = @sandbox.gem "foo", "= 1.0", "< 2.0"
179
+ assert_equal Gem::Requirement.create(["= 1.0", "< 2.0"]), g.requirement
180
+ end
181
+
182
+ def test_gem_options
183
+ g = @sandbox.gem "foo", :source => "somewhere"
184
+ assert_equal "somewhere", g.options[:source]
185
+ end
186
+
187
+ def test_initialize_defaults
188
+ s = Isolate::Sandbox.new
189
+
190
+ assert_equal [], s.entries
191
+ assert_equal [], s.environments
192
+ assert_match(/tmp\/isolate/, s.path)
193
+
194
+ assert s.cleanup?
195
+ assert s.install?
196
+ assert s.system?
197
+ assert s.verbose?
198
+ assert s.multiruby?
199
+ end
200
+
201
+ def test_initialize_override_defaults
202
+ s = Isolate::Sandbox.new :path => "x", :cleanup => false,
203
+ :install => false, :system => false,
204
+ :verbose => false, :multiruby => false
205
+
206
+ assert_equal File.expand_path("x"), s.path
207
+
208
+ refute s.cleanup?
209
+ refute s.install?
210
+ refute s.system?
211
+ refute s.verbose?
212
+ refute s.multiruby?
213
+ end
214
+
215
+ # First the specifically requested file, then the block (if given),
216
+ # THEN the local override file (if it exists).
217
+
218
+ def test_initialize_file_and_block
219
+ s = sandbox :file => "test/fixtures/override.rb" do
220
+ environment :foo do
221
+ gem "monkey", "2.0", :args => "--panic"
222
+ end
223
+ end
224
+
225
+ monkey = s.entries.first
226
+
227
+ assert_equal %w(foo bar), monkey.environments
228
+ assert_equal "--asplode", monkey.options[:args]
229
+ assert_equal Gem::Requirement.new("2.0"), monkey.requirement
230
+ end
231
+
232
+ def test_options
233
+ @sandbox.options :hello => :monkey
234
+ assert_equal :monkey, @sandbox.options[:hello]
235
+ end
236
+
237
+ def test_path
238
+ s = sandbox :multiruby => false do
239
+ path "tmp/foo"
240
+ end
241
+
242
+ assert_equal File.expand_path("tmp/foo"), s.path
243
+
244
+ v = RbConfig::CONFIG.values_at("ruby_install_name", "ruby_version").join "-"
245
+ s = sandbox :multiruby => true
246
+ p = File.expand_path("tmp/isolate/#{v}")
247
+
248
+ assert_equal p, s.path
249
+
250
+ s = sandbox :path => "tmp/isolate/#{v}", :multiruby => false
251
+ assert_equal p, s.path
252
+ end
253
+
254
+ def assert_loaded_spec name
255
+ assert Gem.loaded_specs[name],
256
+ "#{name} is a loaded gemspec, and it shouldn't be!"
257
+ end
258
+
259
+ def refute_loaded_spec name
260
+ refute Gem.loaded_specs[name],
261
+ "#{name} is NOT a loaded gemspec, and it should be!"
262
+ end
263
+
264
+ def sandbox *args, &block
265
+ opts = {
266
+ :install => false,
267
+ :system => false,
268
+ :verbose => false,
269
+ :multiruby => false
270
+ }
271
+
272
+ opts.merge! args.pop if Hash === args.last
273
+ Isolate::Sandbox.new opts, &block
274
+ end
275
+ end