rpm2 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. data/.github/CODEOWNERS +1 -0
  3. data/.github/workflows/ci.yaml +25 -0
  4. data/.gitignore +8 -0
  5. data/.rubocop.yml +1 -0
  6. data/.rubocop_todo.yml +111 -0
  7. data/.whitesource +3 -0
  8. data/CHANGELOG.md +66 -0
  9. data/Gemfile +9 -0
  10. data/MIT-LICENSE +23 -0
  11. data/README.md +374 -0
  12. data/Rakefile +58 -0
  13. data/_docker/Dockerfile.ubi8 +8 -0
  14. data/_docker/Dockerfile.ubi9 +8 -0
  15. data/lib/rpm/c/header.rb +36 -0
  16. data/lib/rpm/c/rpmcallback.rb +27 -0
  17. data/lib/rpm/c/rpmcli.rb +6 -0
  18. data/lib/rpm/c/rpmdb.rb +20 -0
  19. data/lib/rpm/c/rpmds.rb +43 -0
  20. data/lib/rpm/c/rpmfi.rb +31 -0
  21. data/lib/rpm/c/rpmio.rb +17 -0
  22. data/lib/rpm/c/rpmlib.rb +12 -0
  23. data/lib/rpm/c/rpmlog.rb +23 -0
  24. data/lib/rpm/c/rpmmacro.rb +33 -0
  25. data/lib/rpm/c/rpmprob.rb +53 -0
  26. data/lib/rpm/c/rpmps.rb +11 -0
  27. data/lib/rpm/c/rpmtag.rb +304 -0
  28. data/lib/rpm/c/rpmtd.rb +34 -0
  29. data/lib/rpm/c/rpmts.rb +69 -0
  30. data/lib/rpm/c/rpmtypes.rb +28 -0
  31. data/lib/rpm/c.rb +49 -0
  32. data/lib/rpm/compat.rb +40 -0
  33. data/lib/rpm/db.rb +117 -0
  34. data/lib/rpm/dependency.rb +120 -0
  35. data/lib/rpm/file.rb +134 -0
  36. data/lib/rpm/gem_version.rb +7 -0
  37. data/lib/rpm/match_iterator.rb +66 -0
  38. data/lib/rpm/package.rb +332 -0
  39. data/lib/rpm/problem.rb +65 -0
  40. data/lib/rpm/transaction.rb +268 -0
  41. data/lib/rpm/utils.rb +7 -0
  42. data/lib/rpm/version.rb +146 -0
  43. data/lib/rpm.rb +88 -0
  44. data/lib/rpm2.rb +1 -0
  45. data/rpm2.gemspec +29 -0
  46. data/test/data/a.spec +49 -0
  47. data/test/data/simple-1.0-0.i586.rpm +0 -0
  48. data/test/data/simple.spec +38 -0
  49. data/test/data/simple_with_deps-1.0-0.i586.rpm +0 -0
  50. data/test/data/simple_with_deps.spec +41 -0
  51. data/test/helper.rb +7 -0
  52. data/test/test_dependency.rb +28 -0
  53. data/test/test_file.rb +36 -0
  54. data/test/test_lib.rb +33 -0
  55. data/test/test_package.rb +76 -0
  56. data/test/test_problem.rb +18 -0
  57. data/test/test_rpm.rb +33 -0
  58. data/test/test_transaction.rb +156 -0
  59. data/test/test_version.rb +64 -0
  60. metadata +133 -0
@@ -0,0 +1,146 @@
1
+
2
+ module RPM
3
+ class Version
4
+ include Comparable
5
+
6
+ # Parses a "epoch:version-release" string
7
+ # @return [Array] tuple [epoch, version, release]
8
+ def self.parse_evr(evr)
9
+ raise ArgumentError, "version can't be nil" if evr.nil?
10
+ version = evr
11
+ epoch = nil
12
+ release = nil
13
+
14
+ idx = version.rindex('-')
15
+ if idx
16
+ release = version[idx + 1..-1]
17
+ version = version[0..idx - 1]
18
+ end
19
+
20
+ idx = version.index(/\D/)
21
+ if idx && version[idx] == ':'
22
+ epoch = version[0..idx - 1]
23
+ version = version[idx + 1..-1]
24
+ end
25
+ [epoch ? epoch.to_i : nil, version, release]
26
+ end
27
+
28
+ #
29
+ # @overload new(vr, e = nil)
30
+ # Creates a version object from a string representation
31
+ # @param [String] vr version and release in the form "v-r"
32
+ # @param [Number] e epoch
33
+ # @return [Version]
34
+ # @overload new(v, r, e = nil)
35
+ # Creates a version object from a string representation
36
+ # @param [String] v version
37
+ # @param [String] r release
38
+ # @param [Number] e epoch
39
+ # @return [Version]
40
+ # @example
41
+ # RPM:: Version.new "1.0.0-3"
42
+ # RPM:: Version.new "1.04"
43
+ # RPM:: Version.new "1.0.0-3k", 1
44
+ # RPM:: Version.new "2.0.3", "5k"
45
+ #
46
+ def initialize(*argv)
47
+ case argv.size
48
+ when 0
49
+ raise(ArgumentError('wrong number of arguments (0 for 1..3)'))
50
+ when 1
51
+ RPM::Utils.check_type(argv[0], String)
52
+ @e, @v, @r = RPM::Version.parse_evr(argv[0])
53
+ when 2
54
+ # (vr, e)
55
+ RPM::Utils.check_type(argv[0], String)
56
+ @e, @v, @r = RPM::Version.parse_evr(argv[0])
57
+ raise(TypeError, 'illegal argument value') unless e.nil?
58
+ @e = argv[1].to_i
59
+ when 3
60
+ RPM::Utils.check_type(argv[0], String)
61
+ RPM::Utils.check_type(argv[1], String)
62
+ @v = argv[0]
63
+ @r = argv[1]
64
+ @e = argv[2].to_i
65
+ else
66
+ raise(ArgumentError("too many arguments (#{args.size} for 1..3)"))
67
+ end
68
+ end
69
+
70
+ # @return [String] the version component
71
+ attr_reader :v
72
+
73
+ # @return [String] the release component
74
+ # or +nil+
75
+ attr_reader :r
76
+
77
+ # @return [String] the epoch component
78
+ # or +nil+
79
+ attr_reader :e
80
+
81
+ # Comparison between versions
82
+ # @param [Version] other
83
+ # @return [Number] -1 if +other+ is greater than, 0 if +other+ is equal to,
84
+ # and +1 if other is less than version.
85
+ #
86
+ # @example
87
+ # v1 = RPM::Version.new("3.0-0",1)
88
+ # v2 = RPM::Version.new("3.1-0",1)
89
+ # v1 <=> v2
90
+ # => -1
91
+ #
92
+ def <=>(other)
93
+ RPM::Utils.check_type(other, RPM::Version)
94
+ RPM::C.rpmvercmp(to_vre_epoch_zero, other.to_vre_epoch_zero)
95
+ end
96
+
97
+ # @param [Version] other Version to compare against
98
+ # @return [Boolean] true if the version is newer than +other+
99
+ def newer?(other)
100
+ self > other
101
+ end
102
+
103
+ # @param [Version] other Version to compare against
104
+ # @return [Boolean] true if the version is older than +other+
105
+ def older?(other)
106
+ self < other
107
+ end
108
+
109
+ # String representation in the form "v-r"
110
+ # @return [String]
111
+ # @note The epoch is not included
112
+ def to_vr
113
+ @r.nil? ? @v.to_s : "#{@v}-#{@r}"
114
+ end
115
+
116
+ # String representation in the form "e:v-r"
117
+ # @return [String]
118
+ # @note The epoch is included if present
119
+ def to_vre(_opts = {})
120
+ vr = to_vr
121
+ @e.nil? ? vr : "#{@e}:#{vr}"
122
+ end
123
+
124
+ # Alias for +to_vr+
125
+ # @see Version#to_vr
126
+ def to_s
127
+ to_vr
128
+ end
129
+
130
+ # Hash based on the version content
131
+ # @return [String]
132
+ def hash
133
+ h = @e.nil? ? 0 : @e
134
+ h = (h << 1) ^ @r.hash
135
+ h = (h << 1) ^ @v.hash
136
+ end
137
+
138
+ # String representation in the form "e:v-r"
139
+ # @return [String]
140
+ # @note The epoch is included always. As 0 if not present
141
+ def to_vre_epoch_zero
142
+ vr = to_vr
143
+ @e.nil? ? "0:#{vr}" : "#{@e}:#{vr}"
144
+ end
145
+ end
146
+ end
data/lib/rpm.rb ADDED
@@ -0,0 +1,88 @@
1
+
2
+ require 'rpm/c'
3
+ require 'rpm/package'
4
+ require 'rpm/file'
5
+ require 'rpm/db'
6
+ require 'rpm/problem'
7
+ require 'rpm/transaction'
8
+ require 'rpm/match_iterator'
9
+ require 'rpm/version'
10
+ require 'rpm/dependency'
11
+ require 'rpm/utils'
12
+
13
+ module RPM
14
+ TAG = RPM::C::Tag
15
+ LOG = RPM::C::Log
16
+ SENSE = RPM::C::Sense
17
+ FILE = RPM::C::FileAttrs
18
+ FILE_STATE = RPM::C::FileState
19
+ TRANS_FLAG = RPM::C::TransFlags
20
+ PROB_FILTER = RPM::C::ProbFilter
21
+ MIRE = RPM::C::RegexpMode
22
+
23
+ # Creates a new transaction and pass it
24
+ # to the given block
25
+ #
26
+ # @param [String] root dir, default '/'
27
+ #
28
+ # @example
29
+ # RPM.transaction do |ts|
30
+ # ...
31
+ # end
32
+ #
33
+ def self.transaction(root = '/')
34
+ ts = Transaction.new
35
+ ts.root_dir = root
36
+ yield ts
37
+ ensure
38
+ ts.ptr.free
39
+ end
40
+
41
+ # @param [String] name Name of the macro
42
+ # @return [String] value of macro +name+
43
+ def self.[](name)
44
+ if C::rpm_version_code >= ((4 << 16) + (14 << 8) + (0 << 0))
45
+ obuf = ::FFI::MemoryPointer.new(:pointer, 1)
46
+ sbuf = FFI::MemoryPointer.from_string("%{#{name}}")
47
+ ret = RPM::C.rpmExpandMacros(nil, sbuf, obuf, 0)
48
+ raise if ret < 0
49
+
50
+ val = obuf.read_pointer
51
+ val.nil? ? nil : val.read_string
52
+ else
53
+ buffer = ::FFI::MemoryPointer.new(:pointer, 1024)
54
+ buffer.write_string("%{#{name}}")
55
+ ret = RPM::C.expandMacros(nil, nil, buffer, 1024)
56
+ raise if ret < 0
57
+
58
+ buffer.read_string
59
+ end
60
+ end
61
+
62
+ # Setup a macro
63
+ # @param [String] name Name of the macro
64
+ # @param [String] value Value of the macro or +nil+ to delete it
65
+ def self.[]=(name, value)
66
+ if value.nil?
67
+ if C::rpm_version_code >= ((4 << 16) + (14 << 8) + (0 << 0))
68
+ RPM::C.rpmPopMacro(nil, name.to_s)
69
+ else
70
+ RPM::C.delMacro(nil, name.to_s)
71
+ end
72
+ else
73
+ if C::rpm_version_code >= ((4 << 16) + (14 << 8) + (0 << 0))
74
+ RPM::C.rpmPushMacro(nil, name.to_s, '', value.to_s, RPM::C::RMIL_DEFAULT)
75
+ else
76
+ RPM::C.addMacro(nil, name.to_s, '', value.to_s, RPM::C::RMIL_DEFAULT)
77
+ end
78
+ end
79
+ end
80
+ end
81
+
82
+ RPM::C.rpmReadConfigFiles(nil, nil)
83
+ RPM::C.rpmInitMacros(nil, RPM::C.MACROFILES)
84
+
85
+ # TODO
86
+ # set verbosity
87
+
88
+ require 'rpm/compat'
data/lib/rpm2.rb ADDED
@@ -0,0 +1 @@
1
+ require_relative "./rpm"
data/rpm2.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require_relative 'lib/rpm/gem_version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'rpm2'
7
+ s.version = RPM::GEM_VERSION
8
+ s.authors = ['Duncan Mac-Vicar P.', 'ManageIQ Authors']
9
+ s.email = ['dmacvicar@suse.de']
10
+ s.homepage = 'https://github.com/ManageIQ/ruby-rpm-ffi2'
11
+ s.licenses = ['MIT']
12
+ s.summary = 'Ruby bindings for rpm (package manager)'
13
+ s.description = 'Ruby bindings for rpm. Almost a drop-in replacement for ruby-rpm. Uses FFI.'
14
+
15
+ s.metadata['allowed_push_host'] = 'https://rubygems.org'
16
+ s.metadata['rubygems_mfa_required'] = 'true'
17
+ s.metadata['homepage_uri'] = s.homepage
18
+ s.metadata['source_code_uri'] = s.homepage
19
+ s.metadata['changelog_uri'] = "#{s.homepage}/blob/master/CHANGELOG.md"
20
+
21
+ s.files = `git ls-files`.split("\n")
22
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
23
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
24
+ s.require_paths = ['lib']
25
+
26
+ # specify any dependencies here; for example:
27
+ s.add_development_dependency 'rake'
28
+ s.add_runtime_dependency 'ffi'
29
+ end
data/test/data/a.spec ADDED
@@ -0,0 +1,49 @@
1
+ Name: a
2
+ Version: 1.0
3
+ Release: 0
4
+ License: GPLv2
5
+ Summary: Minimal package example
6
+ Url: http://www.a.com
7
+ Group: Development
8
+ Source: a-1.0.tar.gz
9
+ BuildRequires: c d
10
+ Provides: something
11
+ BuildRoot: %{_tmppath}/%{name}-%{version}-build
12
+
13
+ %description
14
+ Description
15
+
16
+ %package devel
17
+ Summary: Development part
18
+ %description devel
19
+ Development headers
20
+
21
+ %prep
22
+ %setup -q
23
+
24
+ %build
25
+ %configure
26
+ make %{?_smp_mflags}
27
+
28
+ %install
29
+ %make_install
30
+
31
+ %clean
32
+ %{?buildroot:%__rm -rf "%{buildroot}"}
33
+
34
+ %post
35
+
36
+ %postun
37
+
38
+ %files
39
+ %defattr(-,root,root)
40
+ %doc ChangeLog README COPYING
41
+ %{_datadir}/a/README
42
+
43
+ %files devel
44
+ %{_includedir}/a.h
45
+
46
+
47
+
48
+ %changelog
49
+
Binary file
@@ -0,0 +1,38 @@
1
+ Name: simple
2
+ Version: 1.0
3
+ Release: 0
4
+ License: GPL
5
+ Summary: Simple dummy package
6
+ Summary(es): Paquete simple de muestra
7
+ Url: http://www.dummmy.com
8
+ Group: Development
9
+ BuildRoot: %{_tmppath}/%{name}-%{version}-build
10
+
11
+ %description
12
+ Dummy package
13
+
14
+ %description -l es
15
+ Paquete de muestra
16
+
17
+ %prep
18
+
19
+ %build
20
+ mkdir -p %{buildroot}%{_datadir}/%{name}
21
+ echo "Hello" > %{buildroot}%{_datadir}/%{name}/README
22
+ echo "Hola" > %{buildroot}%{_datadir}/%{name}/README.es
23
+
24
+ %install
25
+
26
+ %clean
27
+ %{?buildroot:%__rm -rf "%{buildroot}"}
28
+
29
+ %files
30
+ %defattr(-,root,root)
31
+ %{_datadir}/%{name}/README
32
+ %{_datadir}/%{name}/README.es
33
+
34
+ %changelog
35
+ * Wed Nov 06 2011 Duncan Mac-Vicar P. <dmacvicar@suse.de>
36
+ - Fix something
37
+ * Tue Nov 05 2011 Duncan Mac-Vicar P. <dmacvicar@suse.de>
38
+ - Fix something else
@@ -0,0 +1,41 @@
1
+ Name: simple_with_deps
2
+ Version: 1.0
3
+ Release: 0
4
+ License: GPL
5
+ Summary: Simple dummy package
6
+ Url: http://www.dummmy.com
7
+ Group: Development
8
+ Requires: a
9
+ Requires: b > 1.0
10
+ Conflicts: c d
11
+ Obsoletes: f
12
+ BuildRoot: %{_tmppath}/%{name}-%{version}-build
13
+
14
+ %description
15
+ Dummy package
16
+
17
+ %description -l es
18
+ Paquete de muestra
19
+
20
+ %prep
21
+
22
+ %build
23
+ mkdir -p %{buildroot}%{_datadir}/%{name}
24
+ echo "Hello" > %{buildroot}%{_datadir}/%{name}/README
25
+ echo "Hola" > %{buildroot}%{_datadir}/%{name}/README.es
26
+
27
+ %install
28
+
29
+ %clean
30
+ %{?buildroot:%__rm -rf "%{buildroot}"}
31
+
32
+ %files
33
+ %defattr(-,root,root)
34
+ %{_datadir}/%{name}/README
35
+ %{_datadir}/%{name}/README.es
36
+
37
+ %changelog
38
+ * Wed Nov 06 2011 Duncan Mac-Vicar P. <dmacvicar@suse.de>
39
+ - Fix something
40
+ * Tue Nov 05 2011 Duncan Mac-Vicar P. <dmacvicar@suse.de>
41
+ - Fix something else
data/test/helper.rb ADDED
@@ -0,0 +1,7 @@
1
+ $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
2
+ require 'minitest/autorun'
3
+ require 'rpm'
4
+
5
+ def fixture(name)
6
+ File.expand_path(File.join(File.dirname(__FILE__), 'data', name))
7
+ end
@@ -0,0 +1,28 @@
1
+ require_relative('helper')
2
+ require 'rpm/compat'
3
+
4
+ class RPMDependencyTests < Minitest::Test
5
+ EQ = RPM::SENSE_EQUAL
6
+ LT = RPM::SENSE_LESS
7
+ GT = RPM::SENSE_GREATER
8
+
9
+ def test_satisfy
10
+ prv = provides('foo', '2', '1', 0, EQ)
11
+ req = requires('foo', '1', '1', 0, EQ | GT)
12
+ assert(req.satisfy?(prv))
13
+ assert(prv.satisfy?(req))
14
+
15
+ # Different names don't overlap
16
+ prv = provides('foo', '2', '1', 0, EQ)
17
+ req = requires('bar', '1', '1', 0, EQ | GT)
18
+ assert(!req.satisfy?(prv))
19
+ end
20
+
21
+ def provides(name, v, r, e, sense)
22
+ RPM::Provide.new(name, RPM::Version.new(v, r, e), sense, nil)
23
+ end
24
+
25
+ def requires(name, v, r, e, sense)
26
+ RPM::Require.new(name, RPM::Version.new(v, r, e), sense, nil)
27
+ end
28
+ end
data/test/test_file.rb ADDED
@@ -0,0 +1,36 @@
1
+ require File.join(File.dirname(__FILE__), 'helper')
2
+
3
+ class RPMFileTests < Minitest::Test
4
+ def test_link_to
5
+ f = RPM::File.new('path', 'md5sum', nil, 42, 1,
6
+ 'owner', 'group', 43, 0o777, 44, 45)
7
+ assert_nil(f.link_to)
8
+ f = RPM::File.new('path', 'md5sum', 'link_to', 42, 1,
9
+ 'owner', 'group', 43, 0o777, 44, 45)
10
+ assert_equal('link_to', f.link_to)
11
+ end
12
+
13
+ def test_flags
14
+ f = RPM::File.new('path', 'md5sum', nil, 42, 1,
15
+ 'owner', 'group', 43, 0o777, 44, 45)
16
+ f.config?
17
+ f.doc?
18
+ f.is_missingok?
19
+ f.is_noreplace?
20
+ f.is_specfile?
21
+ f.ghost?
22
+ f.license?
23
+ f.readme?
24
+ f.replaced?
25
+ f.notinstalled?
26
+ f.netshared?
27
+
28
+ assert_raises NotImplementedError do
29
+ f.exclude?
30
+ end
31
+
32
+ assert_raises NotImplementedError do
33
+ f.donotuse?
34
+ end
35
+ end
36
+ end
data/test/test_lib.rb ADDED
@@ -0,0 +1,33 @@
1
+ require File.join(File.dirname(__FILE__), 'helper')
2
+
3
+ class RPMLibTests < Minitest::Test
4
+ def test_lib_lib
5
+ assert_kind_of String, RPM::C.RPMVERSION
6
+ # "x.y.z"
7
+ assert(RPM::C.RPMVERSION.size >= 5)
8
+ assert_kind_of Integer, RPM::C.rpm_version_code
9
+ # >= 4.0.0
10
+ assert(RPM::C.rpm_version_code >= ((4 << 16) + (0 << 8) + (0 << 0)))
11
+ end
12
+
13
+ def test_lib_header
14
+ ptr = RPM::C.headerNew
15
+ RPM::C.headerFree(ptr)
16
+ end
17
+
18
+ def test_lib_ts
19
+ ts = RPM::C.rpmtsCreate
20
+ RPM::C.rpmtsSetRootDir(ts, '/')
21
+ it = RPM::C.rpmtsInitIterator(ts, 0, nil, 0)
22
+ hdrs = []
23
+ until (hdr = RPM::C.rpmdbNextIterator(it)).null?
24
+ hdrs << hdr
25
+ assert_kind_of String, RPM::C.headerGetAsString(hdr, :name)
26
+ end
27
+ RPM::C.rpmdbFreeIterator(it)
28
+ end
29
+
30
+ def test_lib_macros
31
+ assert_kind_of String, RPM::C.MACROFILES
32
+ end
33
+ end
@@ -0,0 +1,76 @@
1
+ require File.join(File.dirname(__FILE__), 'helper')
2
+
3
+ class RPMPackageTests < Minitest::Test
4
+ def test_create
5
+ pkg = RPM::Package.create('foo', RPM::Version.new('1.0'))
6
+ assert_equal 'foo', pkg.name
7
+ assert_equal '(none)', pkg.signature
8
+ end
9
+
10
+ def test_open
11
+ pkg = RPM::Package.open(fixture('simple-1.0-0.i586.rpm'))
12
+
13
+ req = RPM::Require.new('simple', RPM::Version.new('1.0', '0'), RPM::SENSE_GREATER | RPM::SENSE_EQUAL, nil)
14
+ assert req.satisfy?(pkg)
15
+
16
+ assert_equal 'simple-1.0-0-i586', pkg.to_s
17
+
18
+ assert_equal '3b5f9d468c877166532c662e29f43bc3', pkg.signature
19
+
20
+ assert_kind_of RPM::Package, pkg
21
+ assert_equal 'simple', pkg[:name]
22
+ assert_equal 'i586', pkg[:arch]
23
+ assert_kind_of RPM::Version, pkg.version
24
+ assert_equal '1.0-0', pkg.version.to_s
25
+
26
+ backup_lang = ENV['LC_ALL']
27
+
28
+ ENV['LC_ALL'] = 'C'
29
+ assert_equal 'Simple dummy package', pkg[:summary]
30
+ assert_equal 'Dummy package', pkg[:description]
31
+
32
+ ENV['LC_ALL'] = 'es_ES.UTF-8'
33
+ assert_equal 'Paquete simple de muestra', pkg[:summary]
34
+ assert_equal 'Paquete de muestra', pkg[:description]
35
+
36
+ ENV['LC_ALL'] = backup_lang
37
+
38
+ # Arrays
39
+ assert_equal %w[root root], pkg[:fileusername]
40
+ assert_equal [6, 5], pkg[:filesizes]
41
+
42
+ assert pkg.provides.map(&:name).include?('simple(x86-32)')
43
+ assert pkg.provides.map(&:name).include?('simple')
44
+
45
+ assert pkg.files.map(&:path).include?('/usr/share/simple/README')
46
+ assert pkg.files.map(&:path).include?('/usr/share/simple/README.es')
47
+
48
+ assert pkg.conflicts.empty?
49
+ assert pkg.requires.map(&:name).include?('rpmlib(PayloadIsLzma)')
50
+ assert pkg.obsoletes.empty?
51
+
52
+ file = pkg.files.select { |x| x.path == '/usr/share/simple/README' }.first
53
+ assert_nil file.link_to
54
+ assert !file.symlink?
55
+
56
+ assert_equal ['- Fix something', '- Fix something else'], pkg.changelog.map(&:text)
57
+ end
58
+
59
+ def test_dependencies
60
+ pkg = RPM::Package.open(fixture('simple_with_deps-1.0-0.i586.rpm'))
61
+ assert_equal 'simple_with_deps', pkg.name
62
+
63
+ assert pkg.provides.map(&:name).include?('simple_with_deps(x86-32)')
64
+ assert pkg.provides.map(&:name).include?('simple_with_deps')
65
+
66
+ assert pkg.requires.map(&:name).include?('a')
67
+ b = pkg.requires.find { |x| x.name == 'b' }
68
+ assert b
69
+ assert_equal '1.0', b.version.to_s
70
+
71
+ assert pkg.conflicts.map(&:name).include?('c')
72
+ assert pkg.conflicts.map(&:name).include?('d')
73
+
74
+ assert pkg.obsoletes.map(&:name).include?('f')
75
+ end
76
+ end
@@ -0,0 +1,18 @@
1
+ require File.join(File.dirname(__FILE__), 'helper')
2
+
3
+ class RPMProblemTests < Minitest::Test
4
+ def test_create
5
+ problem = RPM::Problem.create(:requires, 'foo-1.0-0', 'foo.rpm', 'bar-1.0-0', 'Hello', 1)
6
+ assert_equal 'foo.rpm', problem.key
7
+ assert_equal :requires, problem.type
8
+ assert_equal 'Hello', problem.str
9
+ assert_equal 'Hello is needed by (installed) bar-1.0-0', problem.to_s
10
+
11
+ # Create a RPM::Problem from an existing pointer
12
+ problem2 = RPM::Problem.new(problem.ptr)
13
+ assert_equal problem.key, problem2.key
14
+ assert_equal problem.type, problem2.type
15
+ assert_equal problem.str, problem2.str
16
+ assert_equal problem.to_s, problem2.to_s
17
+ end
18
+ end
data/test/test_rpm.rb ADDED
@@ -0,0 +1,33 @@
1
+ require File.join(File.dirname(__FILE__), 'helper')
2
+
3
+ class RPMRPMTests < Minitest::Test
4
+ def test_enum
5
+ assert RPM::TAG[:not_found]
6
+ end
7
+
8
+ def test_compat
9
+ # puts RPM::LOG_ALERT
10
+ # assert_raise(NameError) { RPM::LOG_ALERT }
11
+
12
+ # require 'rpm/compat'
13
+ assert_equal RPM::LOG_ALERT, RPM::LOG[:alert]
14
+ end
15
+
16
+ def test_iterator
17
+ RPM.transaction do |t|
18
+ assert_kind_of RPM::Transaction, t
19
+ # t.each do |pkg|
20
+ # puts pkg[:name]
21
+ # end
22
+ end
23
+ end
24
+
25
+ def test_macro_read
26
+ assert_equal '/usr', RPM['_usr']
27
+ end
28
+
29
+ def test_macro_write
30
+ RPM['hoge'] = 'hoge'
31
+ assert_equal(RPM['hoge'], 'hoge')
32
+ end
33
+ end # class RPM_RPM_Tests < Test::Unit::TestCase