summaryrefslogtreecommitdiff
path: root/test/rubygems/test_gem_request_set_lockfile_parser.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/rubygems/test_gem_request_set_lockfile_parser.rb')
-rw-r--r--test/rubygems/test_gem_request_set_lockfile_parser.rb543
1 files changed, 543 insertions, 0 deletions
diff --git a/test/rubygems/test_gem_request_set_lockfile_parser.rb b/test/rubygems/test_gem_request_set_lockfile_parser.rb
new file mode 100644
index 0000000000..c5b2b19c0e
--- /dev/null
+++ b/test/rubygems/test_gem_request_set_lockfile_parser.rb
@@ -0,0 +1,543 @@
+require 'rubygems/test_case'
+require 'rubygems/request_set'
+require 'rubygems/request_set/lockfile'
+require 'rubygems/request_set/lockfile/tokenizer'
+require 'rubygems/request_set/lockfile/parser'
+
+class TestGemRequestSetLockfileParser < Gem::TestCase
+ def setup
+ super
+ @gem_deps_file = 'gem.deps.rb'
+ @lock_file = File.expand_path "#{@gem_deps_file}.lock"
+ @set = Gem::RequestSet.new
+ end
+
+ def test_get
+ tokenizer = Gem::RequestSet::Lockfile::Tokenizer.new "\n"
+ parser = tokenizer.make_parser nil, nil
+
+ assert_equal :newline, parser.get.first
+ end
+
+ def test_get_type_mismatch
+ filename = File.expand_path("#{@gem_deps_file}.lock")
+ tokenizer = Gem::RequestSet::Lockfile::Tokenizer.new "foo", filename, 1, 0
+ parser = tokenizer.make_parser nil, nil
+
+ e = assert_raises Gem::RequestSet::Lockfile::ParseError do
+ parser.get :section
+ end
+
+ expected =
+ 'unexpected token [:text, "foo"], expected :section (at line 1 column 0)'
+
+ assert_equal expected, e.message
+
+ assert_equal 1, e.line
+ assert_equal 0, e.column
+ assert_equal filename, e.path
+ end
+
+ def test_get_type_multiple
+ filename = File.expand_path("#{@gem_deps_file}.lock")
+ tokenizer = Gem::RequestSet::Lockfile::Tokenizer.new "x", filename, 1
+ parser = tokenizer.make_parser nil, nil
+
+ assert parser.get [:text, :section]
+ end
+
+ def test_get_type_value_mismatch
+ filename = File.expand_path("#{@gem_deps_file}.lock")
+ tokenizer = Gem::RequestSet::Lockfile::Tokenizer.new "x", filename, 1
+ parser = tokenizer.make_parser nil, nil
+
+ e = assert_raises Gem::RequestSet::Lockfile::ParseError do
+ parser.get :text, 'y'
+ end
+
+ expected =
+ 'unexpected token [:text, "x"], expected [:text, "y"] (at line 1 column 0)'
+
+ assert_equal expected, e.message
+
+ assert_equal 1, e.line
+ assert_equal 0, e.column
+ assert_equal File.expand_path("#{@gem_deps_file}.lock"), e.path
+ end
+
+
+ def test_parse
+ write_lockfile <<-LOCKFILE.strip
+GEM
+ remote: #{@gem_repo}
+ specs:
+ a (2)
+
+PLATFORMS
+ #{Gem::Platform::RUBY}
+
+DEPENDENCIES
+ a
+ LOCKFILE
+
+ platforms = []
+ parse_lockfile @set, platforms
+
+ assert_equal [dep('a')], @set.dependencies
+
+ assert_equal [Gem::Platform::RUBY], platforms
+
+ lockfile_set = @set.sets.find do |set|
+ Gem::Resolver::LockSet === set
+ end
+
+ assert lockfile_set, 'could not find a LockSet'
+
+ assert_equal %w[a-2], lockfile_set.specs.map { |tuple| tuple.full_name }
+ end
+
+ def test_parse_dependencies
+ write_lockfile <<-LOCKFILE
+GEM
+ remote: #{@gem_repo}
+ specs:
+ a (2)
+
+PLATFORMS
+ #{Gem::Platform::RUBY}
+
+DEPENDENCIES
+ a (>= 1, <= 2)
+ LOCKFILE
+
+ platforms = []
+ parse_lockfile @set, platforms
+
+ assert_equal [dep('a', '>= 1', '<= 2')], @set.dependencies
+
+ assert_equal [Gem::Platform::RUBY], platforms
+
+ lockfile_set = @set.sets.find do |set|
+ Gem::Resolver::LockSet === set
+ end
+
+ assert lockfile_set, 'could not find a LockSet'
+
+ assert_equal %w[a-2], lockfile_set.specs.map { |tuple| tuple.full_name }
+ end
+
+ def test_parse_DEPENDENCIES_git
+ write_lockfile <<-LOCKFILE
+GIT
+ remote: git://git.example/josevalim/rails-footnotes.git
+ revision: 3a6ac1971e91d822f057650cc5916ebfcbd6ee37
+ specs:
+ rails-footnotes (3.7.9)
+ rails (>= 3.0.0)
+
+GIT
+ remote: git://git.example/svenfuchs/i18n-active_record.git
+ revision: 55507cf59f8f2173d38e07e18df0e90d25b1f0f6
+ specs:
+ i18n-active_record (0.0.2)
+ i18n (>= 0.5.0)
+
+GEM
+ remote: http://gems.example/
+ specs:
+ i18n (0.6.9)
+ rails (4.0.0)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ i18n-active_record!
+ rails-footnotes!
+ LOCKFILE
+
+ parse_lockfile @set, []
+
+ expected = [
+ dep('i18n-active_record', '= 0.0.2'),
+ dep('rails-footnotes', '= 3.7.9'),
+ ]
+
+ assert_equal expected, @set.dependencies
+ end
+
+ def test_parse_DEPENDENCIES_git_version
+ write_lockfile <<-LOCKFILE
+GIT
+ remote: git://github.com/progrium/ruby-jwt.git
+ revision: 8d74770c6cd92ea234b428b5d0c1f18306a4f41c
+ specs:
+ jwt (1.1)
+
+GEM
+ remote: http://gems.example/
+ specs:
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ jwt (= 1.1)!
+ LOCKFILE
+
+ parse_lockfile @set, []
+
+ expected = [
+ dep('jwt', '= 1.1'),
+ ]
+
+ assert_equal expected, @set.dependencies
+ end
+
+ def test_parse_GEM
+ write_lockfile <<-LOCKFILE
+GEM
+ specs:
+ a (2)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ a
+ LOCKFILE
+
+ parse_lockfile @set, []
+
+ assert_equal [dep('a', '>= 0')], @set.dependencies
+
+ lockfile_set = @set.sets.find do |set|
+ Gem::Resolver::LockSet === set
+ end
+
+ assert lockfile_set, 'found a LockSet'
+
+ assert_equal %w[a-2], lockfile_set.specs.map { |s| s.full_name }
+ end
+
+ def test_parse_GEM_remote_multiple
+ write_lockfile <<-LOCKFILE
+GEM
+ remote: https://gems.example/
+ remote: https://other.example/
+ specs:
+ a (2)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ a
+ LOCKFILE
+
+ parse_lockfile @set, []
+
+ assert_equal [dep('a', '>= 0')], @set.dependencies
+
+ lockfile_set = @set.sets.find do |set|
+ Gem::Resolver::LockSet === set
+ end
+
+ assert lockfile_set, 'found a LockSet'
+
+ assert_equal %w[a-2 a-2], lockfile_set.specs.map { |s| s.full_name }
+
+ assert_equal %w[https://gems.example/ https://other.example/],
+ lockfile_set.specs.map { |s| s.source.uri.to_s }
+ end
+
+ def test_parse_GIT
+ @set.instance_variable_set :@install_dir, 'install_dir'
+
+ write_lockfile <<-LOCKFILE
+GIT
+ remote: git://example/a.git
+ revision: master
+ specs:
+ a (2)
+ b (>= 3)
+ c
+
+DEPENDENCIES
+ a!
+ LOCKFILE
+
+ parse_lockfile @set, []
+
+ assert_equal [dep('a', '= 2')], @set.dependencies
+
+ lockfile_set = @set.sets.find do |set|
+ Gem::Resolver::LockSet === set
+ end
+
+ refute lockfile_set, 'fount a LockSet'
+
+ git_set = @set.sets.find do |set|
+ Gem::Resolver::GitSet === set
+ end
+
+ assert git_set, 'could not find a GitSet'
+
+ assert_equal %w[a-2], git_set.specs.values.map { |s| s.full_name }
+
+ assert_equal [dep('b', '>= 3'), dep('c')],
+ git_set.specs.values.first.dependencies
+
+ expected = {
+ 'a' => %w[git://example/a.git master],
+ }
+
+ assert_equal expected, git_set.repositories
+ assert_equal 'install_dir', git_set.root_dir
+ end
+
+ def test_parse_GIT_branch
+ write_lockfile <<-LOCKFILE
+GIT
+ remote: git://example/a.git
+ revision: 1234abc
+ branch: 0-9-12-stable
+ specs:
+ a (2)
+ b (>= 3)
+
+DEPENDENCIES
+ a!
+ LOCKFILE
+
+ parse_lockfile @set, []
+
+ assert_equal [dep('a', '= 2')], @set.dependencies
+
+ lockfile_set = @set.sets.find do |set|
+ Gem::Resolver::LockSet === set
+ end
+
+ refute lockfile_set, 'fount a LockSet'
+
+ git_set = @set.sets.find do |set|
+ Gem::Resolver::GitSet === set
+ end
+
+ assert git_set, 'could not find a GitSet'
+
+ expected = {
+ 'a' => %w[git://example/a.git 1234abc],
+ }
+
+ assert_equal expected, git_set.repositories
+ end
+
+ def test_parse_GIT_ref
+ write_lockfile <<-LOCKFILE
+GIT
+ remote: git://example/a.git
+ revision: 1234abc
+ ref: 1234abc
+ specs:
+ a (2)
+ b (>= 3)
+
+DEPENDENCIES
+ a!
+ LOCKFILE
+
+ parse_lockfile @set, []
+
+ assert_equal [dep('a', '= 2')], @set.dependencies
+
+ lockfile_set = @set.sets.find do |set|
+ Gem::Resolver::LockSet === set
+ end
+
+ refute lockfile_set, 'fount a LockSet'
+
+ git_set = @set.sets.find do |set|
+ Gem::Resolver::GitSet === set
+ end
+
+ assert git_set, 'could not find a GitSet'
+
+ expected = {
+ 'a' => %w[git://example/a.git 1234abc],
+ }
+
+ assert_equal expected, git_set.repositories
+ end
+
+ def test_parse_GIT_tag
+ write_lockfile <<-LOCKFILE
+GIT
+ remote: git://example/a.git
+ revision: 1234abc
+ tag: v0.9.12
+ specs:
+ a (2)
+ b (>= 3)
+
+DEPENDENCIES
+ a!
+ LOCKFILE
+
+ parse_lockfile @set, []
+
+ assert_equal [dep('a', '= 2')], @set.dependencies
+
+ lockfile_set = @set.sets.find do |set|
+ Gem::Resolver::LockSet === set
+ end
+
+ refute lockfile_set, 'fount a LockSet'
+
+ git_set = @set.sets.find do |set|
+ Gem::Resolver::GitSet === set
+ end
+
+ assert git_set, 'could not find a GitSet'
+
+ expected = {
+ 'a' => %w[git://example/a.git 1234abc],
+ }
+
+ assert_equal expected, git_set.repositories
+ end
+
+ def test_parse_PATH
+ _, _, directory = vendor_gem
+
+ write_lockfile <<-LOCKFILE
+PATH
+ remote: #{directory}
+ specs:
+ a (1)
+ b (2)
+
+DEPENDENCIES
+ a!
+ LOCKFILE
+
+ parse_lockfile @set, []
+
+ assert_equal [dep('a', '= 1')], @set.dependencies
+
+ lockfile_set = @set.sets.find do |set|
+ Gem::Resolver::LockSet === set
+ end
+
+ refute lockfile_set, 'found a LockSet'
+
+ vendor_set = @set.sets.find do |set|
+ Gem::Resolver::VendorSet === set
+ end
+
+ assert vendor_set, 'could not find a VendorSet'
+
+ assert_equal %w[a-1], vendor_set.specs.values.map { |s| s.full_name }
+
+ spec = vendor_set.load_spec 'a', nil, nil, nil
+
+ assert_equal [dep('b', '= 2')], spec.dependencies
+ end
+
+ def test_parse_dependency
+ write_lockfile ' 1)'
+
+ tokenizer = Gem::RequestSet::Lockfile::Tokenizer.from_file @lock_file
+ parser = tokenizer.make_parser nil, nil
+
+ parsed = parser.parse_dependency 'a', '='
+
+ assert_equal dep('a', '= 1'), parsed
+
+ write_lockfile ')'
+
+ tokenizer = Gem::RequestSet::Lockfile::Tokenizer.from_file @lock_file
+ parser = tokenizer.make_parser nil, nil
+
+ parsed = parser.parse_dependency 'a', '2'
+
+ assert_equal dep('a', '= 2'), parsed
+ end
+
+ def test_parse_gem_specs_dependency
+ write_lockfile <<-LOCKFILE
+GEM
+ remote: #{@gem_repo}
+ specs:
+ a (2)
+ b (= 3)
+ c (~> 4)
+ d
+ e (~> 5.0, >= 5.0.1)
+ b (3-x86_64-linux)
+
+PLATFORMS
+ #{Gem::Platform::RUBY}
+
+DEPENDENCIES
+ a
+ LOCKFILE
+
+ platforms = []
+ parse_lockfile @set, platforms
+
+ assert_equal [dep('a')], @set.dependencies
+
+ assert_equal [Gem::Platform::RUBY], platforms
+
+ lockfile_set = @set.sets.find do |set|
+ Gem::Resolver::LockSet === set
+ end
+
+ assert lockfile_set, 'could not find a LockSet'
+
+ assert_equal %w[a-2 b-3], lockfile_set.specs.map { |tuple| tuple.full_name }
+
+ expected = [
+ Gem::Platform::RUBY,
+ Gem::Platform.new('x86_64-linux'),
+ ]
+
+ assert_equal expected, lockfile_set.specs.map { |tuple| tuple.platform }
+
+ spec = lockfile_set.specs.first
+
+ expected = [
+ dep('b', '= 3'),
+ dep('c', '~> 4'),
+ dep('d'),
+ dep('e', '~> 5.0', '>= 5.0.1'),
+ ]
+
+ assert_equal expected, spec.dependencies
+ end
+
+ def test_parse_missing
+ assert_raises(Errno::ENOENT) do
+ parse_lockfile @set, []
+ end
+
+ lockfile_set = @set.sets.find do |set|
+ Gem::Resolver::LockSet === set
+ end
+
+ refute lockfile_set
+ end
+
+ def write_lockfile lockfile
+ open @lock_file, 'w' do |io|
+ io.write lockfile
+ end
+ end
+
+ def parse_lockfile set, platforms
+ tokenizer = Gem::RequestSet::Lockfile::Tokenizer.from_file @lock_file
+ parser = tokenizer.make_parser set, platforms
+ parser.parse
+ end
+end