packaging 0.88.77

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 (123) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +17 -0
  3. data/README-Solaris.md +117 -0
  4. data/README.md +977 -0
  5. data/lib/packaging.rb +32 -0
  6. data/lib/packaging/archive.rb +126 -0
  7. data/lib/packaging/artifactory.rb +651 -0
  8. data/lib/packaging/artifactory/extensions.rb +94 -0
  9. data/lib/packaging/config.rb +492 -0
  10. data/lib/packaging/config/params.rb +387 -0
  11. data/lib/packaging/config/validations.rb +13 -0
  12. data/lib/packaging/deb.rb +28 -0
  13. data/lib/packaging/deb/repo.rb +264 -0
  14. data/lib/packaging/gem.rb +70 -0
  15. data/lib/packaging/metrics.rb +15 -0
  16. data/lib/packaging/nuget.rb +39 -0
  17. data/lib/packaging/paths.rb +376 -0
  18. data/lib/packaging/platforms.rb +507 -0
  19. data/lib/packaging/repo.rb +155 -0
  20. data/lib/packaging/retrieve.rb +75 -0
  21. data/lib/packaging/rpm.rb +5 -0
  22. data/lib/packaging/rpm/repo.rb +254 -0
  23. data/lib/packaging/sign.rb +8 -0
  24. data/lib/packaging/sign/deb.rb +9 -0
  25. data/lib/packaging/sign/dmg.rb +41 -0
  26. data/lib/packaging/sign/ips.rb +57 -0
  27. data/lib/packaging/sign/msi.rb +124 -0
  28. data/lib/packaging/sign/rpm.rb +115 -0
  29. data/lib/packaging/tar.rb +163 -0
  30. data/lib/packaging/util.rb +146 -0
  31. data/lib/packaging/util/date.rb +20 -0
  32. data/lib/packaging/util/execution.rb +85 -0
  33. data/lib/packaging/util/file.rb +125 -0
  34. data/lib/packaging/util/git.rb +174 -0
  35. data/lib/packaging/util/git_tags.rb +73 -0
  36. data/lib/packaging/util/gpg.rb +66 -0
  37. data/lib/packaging/util/jenkins.rb +95 -0
  38. data/lib/packaging/util/misc.rb +69 -0
  39. data/lib/packaging/util/net.rb +410 -0
  40. data/lib/packaging/util/os.rb +17 -0
  41. data/lib/packaging/util/platform.rb +40 -0
  42. data/lib/packaging/util/rake_utils.rb +112 -0
  43. data/lib/packaging/util/serialization.rb +19 -0
  44. data/lib/packaging/util/ship.rb +300 -0
  45. data/lib/packaging/util/tool.rb +41 -0
  46. data/lib/packaging/util/version.rb +334 -0
  47. data/spec/fixtures/config/ext/build_defaults.yaml +2 -0
  48. data/spec/fixtures/config/ext/project_data.yaml +2 -0
  49. data/spec/fixtures/configs/components/test_file.json +1 -0
  50. data/spec/fixtures/configs/components/test_file_2.json +0 -0
  51. data/spec/fixtures/configs/components/test_file_not_tagged.json +1 -0
  52. data/spec/fixtures/configs/components/test_file_wrong_ext.txt +0 -0
  53. data/spec/fixtures/configs/components/test_file_wrong_ext.wrong +0 -0
  54. data/spec/fixtures/util/pre_tasks.yaml +4 -0
  55. data/spec/lib/packaging/artifactory_spec.rb +221 -0
  56. data/spec/lib/packaging/config_spec.rb +576 -0
  57. data/spec/lib/packaging/deb/repo_spec.rb +157 -0
  58. data/spec/lib/packaging/deb_spec.rb +52 -0
  59. data/spec/lib/packaging/gem_spec.rb +86 -0
  60. data/spec/lib/packaging/paths_spec.rb +418 -0
  61. data/spec/lib/packaging/platforms_spec.rb +178 -0
  62. data/spec/lib/packaging/repo_spec.rb +135 -0
  63. data/spec/lib/packaging/retrieve_spec.rb +100 -0
  64. data/spec/lib/packaging/rpm/repo_spec.rb +133 -0
  65. data/spec/lib/packaging/sign_spec.rb +133 -0
  66. data/spec/lib/packaging/tar_spec.rb +116 -0
  67. data/spec/lib/packaging/util/execution_spec.rb +56 -0
  68. data/spec/lib/packaging/util/file_spec.rb +139 -0
  69. data/spec/lib/packaging/util/git_spec.rb +160 -0
  70. data/spec/lib/packaging/util/git_tag_spec.rb +36 -0
  71. data/spec/lib/packaging/util/gpg_spec.rb +64 -0
  72. data/spec/lib/packaging/util/jenkins_spec.rb +112 -0
  73. data/spec/lib/packaging/util/misc_spec.rb +31 -0
  74. data/spec/lib/packaging/util/net_spec.rb +259 -0
  75. data/spec/lib/packaging/util/os_spec.rb +31 -0
  76. data/spec/lib/packaging/util/rake_utils_spec.rb +70 -0
  77. data/spec/lib/packaging/util/ship_spec.rb +199 -0
  78. data/spec/lib/packaging/util/version_spec.rb +123 -0
  79. data/spec/lib/packaging_spec.rb +19 -0
  80. data/spec/spec_helper.rb +22 -0
  81. data/static_artifacts/PackageInfo.plist +3 -0
  82. data/tasks/00_utils.rake +214 -0
  83. data/tasks/30_metrics.rake +33 -0
  84. data/tasks/apple.rake +268 -0
  85. data/tasks/archive.rake +69 -0
  86. data/tasks/build.rake +12 -0
  87. data/tasks/clean.rake +5 -0
  88. data/tasks/config.rake +35 -0
  89. data/tasks/deb.rake +129 -0
  90. data/tasks/deb_repos.rake +28 -0
  91. data/tasks/deprecated.rake +130 -0
  92. data/tasks/doc.rake +20 -0
  93. data/tasks/education.rake +57 -0
  94. data/tasks/fetch.rake +60 -0
  95. data/tasks/gem.rake +159 -0
  96. data/tasks/jenkins.rake +538 -0
  97. data/tasks/jenkins_dynamic.rake +202 -0
  98. data/tasks/load_extras.rake +21 -0
  99. data/tasks/mock.rake +348 -0
  100. data/tasks/nightly_repos.rake +286 -0
  101. data/tasks/pe_deb.rake +12 -0
  102. data/tasks/pe_rpm.rake +13 -0
  103. data/tasks/pe_ship.rake +226 -0
  104. data/tasks/pe_sign.rake +13 -0
  105. data/tasks/pe_tar.rake +5 -0
  106. data/tasks/retrieve.rake +52 -0
  107. data/tasks/rpm.rake +66 -0
  108. data/tasks/rpm_repos.rake +29 -0
  109. data/tasks/ship.rake +692 -0
  110. data/tasks/sign.rake +154 -0
  111. data/tasks/tag.rake +8 -0
  112. data/tasks/tar.rake +28 -0
  113. data/tasks/update.rake +16 -0
  114. data/tasks/vanagon.rake +35 -0
  115. data/tasks/vendor_gems.rake +117 -0
  116. data/tasks/version.rake +33 -0
  117. data/tasks/z_data_dump.rake +65 -0
  118. data/templates/README +1 -0
  119. data/templates/downstream.xml.erb +47 -0
  120. data/templates/msi.xml.erb +197 -0
  121. data/templates/packaging.xml.erb +346 -0
  122. data/templates/repo.xml.erb +117 -0
  123. metadata +287 -0
@@ -0,0 +1,157 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Pkg::Deb::Repo" do
4
+ let(:wget) { "/opt/tools/bin/wget" }
5
+ let(:builds_server) { "saturn.puppetlabs.net" }
6
+ let(:project) { "deb_repos" }
7
+ let(:ref) { "1234abcd" }
8
+ let(:base_url) { "http://#{builds_server}/#{project}/#{ref}" }
9
+ let(:cows) { ["xenial", "jessie", "trusty", "stretch", ""] }
10
+ let(:wget_results) { cows.map {|cow| "#{base_url}/repos/apt/#{cow}" }.join("\n") }
11
+ let(:wget_garbage) { "\n and an index\nhttp://somethingelse.com/robots" }
12
+ let(:repo_configs) { cows.reject {|cow| cow.empty?}.map {|dist| "pkg/repo_configs/deb/pl-#{project}-#{ref}-#{dist}.list" } }
13
+
14
+ # Setup and tear down for the tests
15
+ around do |example|
16
+ orig_server = Pkg::Config.builds_server
17
+ orig_host = Pkg::Config.distribution_server
18
+ orig_project = Pkg::Config.project
19
+ orig_ref = Pkg::Config.ref
20
+ orig_repo_path = Pkg::Config.jenkins_repo_path
21
+ Pkg::Config.builds_server = builds_server
22
+ Pkg::Config.project = project
23
+ Pkg::Config.ref = ref
24
+ example.run
25
+ Pkg::Config.builds_server = orig_server
26
+ Pkg::Config.distribution_server = orig_host
27
+ Pkg::Config.project = orig_project
28
+ Pkg::Config.ref = orig_ref
29
+ Pkg::Config.jenkins_repo_path = orig_repo_path
30
+ end
31
+
32
+ describe "#generate_repo_configs" do
33
+ it "fails if wget isn't available" do
34
+ Pkg::Util::Tool.should_receive(:find_tool).with("wget", {:required => true}).and_raise(RuntimeError)
35
+ expect {Pkg::Deb::Repo.generate_repo_configs}.to raise_error(RuntimeError)
36
+ end
37
+
38
+ it "warns if there are no deb repos available for the build" do
39
+ Pkg::Util::Tool.should_receive(:find_tool).with("wget", {:required => true}).and_return(wget)
40
+ Pkg::Util::Execution.should_receive(:capture3).with("#{wget} --spider -r -l 1 --no-parent #{base_url}/repos/apt/ 2>&1").and_raise(RuntimeError)
41
+ Pkg::Deb::Repo.should_receive(:warn).with("No debian repos available for #{project} at #{ref}.")
42
+ Pkg::Deb::Repo.generate_repo_configs
43
+ end
44
+
45
+ it "writes the expected repo configs to disk" do
46
+ Pkg::Util::Tool.should_receive(:find_tool).with("wget", {:required => true}).and_return(wget)
47
+ Pkg::Util::Execution.should_receive(:capture3).with("#{wget} --spider -r -l 1 --no-parent #{base_url}/repos/apt/ 2>&1").and_return(wget_results + wget_garbage)
48
+ FileUtils.should_receive(:mkdir_p).with("pkg/repo_configs/deb")
49
+ config = []
50
+ repo_configs.each_with_index do |repo_config, i|
51
+ config[i] = double(File)
52
+ File.should_receive(:open).with(repo_config, 'w').and_yield(config[i])
53
+ config[i].should_receive(:puts)
54
+ end
55
+ Pkg::Deb::Repo.generate_repo_configs
56
+ end
57
+ end
58
+
59
+ describe "#retrieve_repo_configs" do
60
+ it "fails if wget isn't available" do
61
+ Pkg::Util::Tool.should_receive(:find_tool).with("wget", {:required => true}).and_raise(RuntimeError)
62
+ expect {Pkg::Deb::Repo.generate_repo_configs}.to raise_error(RuntimeError)
63
+ end
64
+
65
+ it "warns if there are no deb repos available for the build" do
66
+ Pkg::Util::Tool.should_receive(:find_tool).with("wget", {:required => true}).and_return(wget)
67
+ FileUtils.should_receive(:mkdir_p).with("pkg/repo_configs").and_return(true)
68
+ Pkg::Util::Execution.should_receive(:capture3).with("#{wget} -r -np -nH --cut-dirs 3 -P pkg/repo_configs --reject 'index*' #{base_url}/repo_configs/deb/").and_raise(RuntimeError)
69
+ expect {Pkg::Deb::Repo.retrieve_repo_configs}.to raise_error(RuntimeError, /Couldn't retrieve deb apt repo configs/)
70
+ end
71
+ end
72
+
73
+ describe "#repo_creation_command" do
74
+ let(:prefix) { "thing" }
75
+ let(:artifact_directory) { ["/a/b/c/xenial"] }
76
+
77
+ it "returns a command to make repos" do
78
+ command = Pkg::Deb::Repo.repo_creation_command(prefix, artifact_directory)
79
+ command.should match(/reprepro/)
80
+ command.should match(/#{prefix}/)
81
+ command.should match(/#{artifact_directory}/)
82
+ end
83
+ end
84
+
85
+ describe "#create_repos" do
86
+ let(:command) { "/usr/bin/make some repos" }
87
+ let(:artifact_directory) { "/tmp/dir/thing" }
88
+ let(:pkg_directories) { ['place/to/deb/xenial', 'other/deb/trusty'] }
89
+
90
+ it "generates repo configs remotely and then ships them" do
91
+ File.stub(:join) {artifact_directory}
92
+ Pkg::Repo.should_receive(:directories_that_contain_packages).and_return(pkg_directories)
93
+ Pkg::Repo.should_receive(:populate_repo_directory)
94
+ Pkg::Deb::Repo.should_receive(:repo_creation_command).and_return(command)
95
+ Pkg::Util::Net.should_receive(:remote_execute).with(Pkg::Config.distribution_server, command)
96
+ Pkg::Deb::Repo.should_receive(:generate_repo_configs)
97
+ Pkg::Deb::Repo.should_receive(:ship_repo_configs)
98
+ Pkg::Util::Net.should_receive(:remote_execute).with(Pkg::Config.distribution_server, "rm -f #{artifact_directory}/repos/.lock" )
99
+ Pkg::Deb::Repo.create_repos
100
+ end
101
+ end
102
+
103
+ describe "#ship_repo_configs" do
104
+ it "warns if there are no repo configs to ship" do
105
+ File.should_receive(:exist?).with("pkg/repo_configs/deb").and_return(true)
106
+ Pkg::Util::File.should_receive(:empty_dir?).with("pkg/repo_configs/deb").and_return(true)
107
+ Pkg::Deb::Repo.should_receive(:warn).with("No repo configs have been generated! Try pl:deb_repo_configs.")
108
+ Pkg::Deb::Repo.ship_repo_configs
109
+ end
110
+
111
+ it "ships repo configs to the build server" do
112
+ File.should_receive(:exist?).with("pkg/repo_configs/deb").and_return(true)
113
+ Pkg::Config.jenkins_repo_path = "/a/b/c/d"
114
+ Pkg::Config.distribution_server = "a.host.that.wont.exist"
115
+ repo_dir = "#{Pkg::Config.jenkins_repo_path}/#{Pkg::Config.project}/#{Pkg::Config.ref}/repo_configs/deb"
116
+ Pkg::Util::File.should_receive(:empty_dir?).with("pkg/repo_configs/deb").and_return(false)
117
+ Pkg::Util::RakeUtils.should_receive(:invoke_task).with("pl:fetch")
118
+ Pkg::Util::Net.should_receive(:remote_execute).with(Pkg::Config.distribution_server, "mkdir -p #{repo_dir}")
119
+ Pkg::Util::Execution.should_receive(:retry_on_fail).with(:times => 3)
120
+ Pkg::Deb::Repo.ship_repo_configs
121
+ end
122
+ end
123
+
124
+ describe "#sign_repos" do
125
+ it "fails without reprepro" do
126
+ Pkg::Util::Tool.should_receive(:find_tool).with('reprepro', {:required => true}).and_raise(RuntimeError)
127
+ expect { Pkg::Deb::Repo.sign_repos }.to raise_error(RuntimeError)
128
+ end
129
+
130
+ it "makes a repo for each dist" do
131
+ # stub out start_keychain to prevent actual keychain starts.
132
+ Pkg::Util::Gpg.stub(:start_keychain)
133
+
134
+ dists = cows.reject { |cow| cow.empty? }
135
+ distfiles = {}
136
+ Pkg::Util::File.should_receive(:directories).with("repos/apt").and_return(dists)
137
+
138
+ # Let the keychain command happen if find_tool('keychain') finds it
139
+ keychain_command = "/usr/bin/keychain -k mine"
140
+ allow(Pkg::Util::Execution).to receive(:capture3) { keychain_command }
141
+
142
+ # Enforce reprepro
143
+ reprepro_command = "/bin/reprepro"
144
+ Pkg::Util::Tool.should_receive(:check_tool).with("reprepro").and_return(reprepro_command)
145
+ Pkg::Util::Execution.should_receive(:capture3).at_least(1).times.with("#{reprepro_command} -vvv --confdir ./conf --dbdir ./db --basedir ./ export")
146
+
147
+ dists.each do |dist|
148
+ distfiles[dist] = double
149
+ Dir.should_receive(:chdir).with("repos/apt/#{dist}").and_yield
150
+ File.should_receive(:open).with("conf/distributions", "w").and_yield(distfiles[dist])
151
+ distfiles[dist].should_receive(:puts)
152
+ end
153
+
154
+ Pkg::Deb::Repo.sign_repos
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,52 @@
1
+ # -*- ruby -*-
2
+ require 'spec_helper'
3
+ require 'packaging/deb'
4
+
5
+ describe 'deb.rb' do
6
+ describe "#set_cow_envs" do
7
+ before(:each) do
8
+ reset_env(["DIST", "ARCH", "PE_VER", "BUILDMIRROR"])
9
+ Pkg::Config.deb_build_mirrors = nil
10
+ Pkg::Config.build_pe = nil
11
+ Pkg::Config.pe_version = nil
12
+ end
13
+
14
+ after(:all) do
15
+ reset_env(["DIST", "ARCH", "PE_VER", "BUILDMIRROR"])
16
+ Pkg::Config.deb_build_mirrors = nil
17
+ Pkg::Config.build_pe = nil
18
+ Pkg::Config.pe_version = nil
19
+ end
20
+
21
+ it "should always set DIST and ARCH correctly" do
22
+ Pkg::Deb.send(:set_cow_envs, "base-wheezy-i386.cow")
23
+ ENV["DIST"].should eq("wheezy")
24
+ ENV["ARCH"].should eq("i386")
25
+ ENV["PE_VER"].should be_nil
26
+ ENV["BUILDMIRROR"].should be_nil
27
+ end
28
+
29
+ it "should set BUILDMIRROR if Pkg::Config.deb_build_mirrors is set" do
30
+ Pkg::Config.deb_build_mirrors = ["deb http://pl-build-tools.delivery.puppetlabs.net/debian __DIST__ main", "deb http://debian.is.awesome/wait no it is not"]
31
+ Pkg::Deb.send(:set_cow_envs, "base-wheezy-i386.cow")
32
+ ENV["DIST"].should eq("wheezy")
33
+ ENV["ARCH"].should eq("i386")
34
+ ENV["PE_VER"].should be_nil
35
+ ENV["BUILDMIRROR"].should eq("deb http://pl-build-tools.delivery.puppetlabs.net/debian wheezy main | deb http://debian.is.awesome/wait no it is not")
36
+ end
37
+
38
+ it "should set PE_VER if Pkg::Config.build_pe is truthy" do
39
+ Pkg::Config.build_pe = true
40
+ Pkg::Config.pe_version = "3.2"
41
+ Pkg::Deb.send(:set_cow_envs, "base-wheezy-i386.cow")
42
+ ENV["DIST"].should eq("wheezy")
43
+ ENV["ARCH"].should eq("i386")
44
+ ENV["PE_VER"].should eq("3.2")
45
+ ENV["BUILDMIRROR"].should be_nil
46
+ end
47
+
48
+ it "should fail on a badly formatted cow" do
49
+ expect { Pkg::Deb.send(:set_cow_envs, "wheezy-i386") }.to raise_error(RuntimeError)
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Pkg::Gem' do
4
+ describe '#shipped_to_rubygems?' do
5
+ let(:gem_data) {
6
+ [
7
+ {"authors"=>"Puppet Labs",
8
+ "built_at"=>"2018-12-17T00:00:00.000Z",
9
+ "created_at"=>"2018-12-18T17:31:50.852Z",
10
+ "description"=>"Puppet, an automated configuration management tool",
11
+ "downloads_count"=>32750,
12
+ "metadata"=>{},
13
+ "number"=>"6.1.0",
14
+ "summary"=>"Puppet, an automated configuration management tool",
15
+ "platform"=>"ruby",
16
+ "rubygems_version"=>"> 1.3.1",
17
+ "ruby_version"=>">= 2.3.0",
18
+ "prerelease"=>false,
19
+ "licenses"=>[],
20
+ "requirements"=>[],
21
+ "sha"=>"71ecec1f554cd7a7f23abf1523e4f0f15fb8ddbc973201234d0cc2a889566373"},
22
+ {"authors"=>"Puppet Labs",
23
+ "built_at"=>"2019-01-14T00:00:00.000Z",
24
+ "created_at"=>"2019-01-15T15:25:25.183Z",
25
+ "description"=>"Puppet, an automated configuration management tool",
26
+ "downloads_count"=>540,
27
+ "metadata"=>{},
28
+ "number"=>"6.0.5",
29
+ "summary"=>"Puppet, an automated configuration management tool",
30
+ "platform"=>"ruby",
31
+ "rubygems_version"=>"> 1.3.1",
32
+ "ruby_version"=>">= 2.3.0",
33
+ "prerelease"=>false,
34
+ "licenses"=>[],
35
+ "requirements"=>[],
36
+ "sha"=>"76811bcf4c5ab75470dd6ae5eea552347767748bd80136cac74261336b208916"},
37
+ {"authors"=>"Puppet Labs",
38
+ "built_at"=>"2018-10-31T00:00:00.000Z",
39
+ "created_at"=>"2018-11-01T17:07:19.274Z",
40
+ "description"=>"Puppet, an automated configuration management tool",
41
+ "downloads_count"=>71808,
42
+ "metadata"=>{},
43
+ "number"=>"6.0.4",
44
+ "summary"=>"Puppet, an automated configuration management tool",
45
+ "platform"=>"ruby",
46
+ "rubygems_version"=>"> 1.3.1",
47
+ "ruby_version"=>">= 2.3.0",
48
+ "prerelease"=>false,
49
+ "licenses"=>[],
50
+ "requirements"=>[],
51
+ "sha"=>"203e8b529d37260115ab7e804e607dde5e543144331b40c3c4a77c2d33445026"},
52
+ {"authors"=>"Puppet Labs",
53
+ "built_at"=>"2018-10-31T00:00:00.000Z",
54
+ "created_at"=>"2018-11-01T17:07:10.268Z",
55
+ "description"=>"Puppet, an automated configuration management tool",
56
+ "downloads_count"=>1179,
57
+ "metadata"=>{},
58
+ "number"=>"6.0.4",
59
+ "summary"=>"Puppet, an automated configuration management tool",
60
+ "platform"=>"x86-mingw32",
61
+ "rubygems_version"=>"> 1.3.1",
62
+ "ruby_version"=>">= 2.3.0",
63
+ "prerelease"=>false,
64
+ "licenses"=>[],
65
+ "requirements"=>[],
66
+ "sha"=>"e57ef7d537aaf66343615d7413d1ff759cc2b6ae95cc90514dd8f3caf0f08cb1"}
67
+ ]
68
+ }
69
+ it 'returns true if gem version has already been shipped' do
70
+ allow(JSON).to receive(:parse).and_return(gem_data)
71
+ expect(Pkg::Gem.shipped_to_rubygems?('puppet', '6.0.5', 'ruby')).to be true
72
+ end
73
+ it 'returns false if the platform doesn\'t match' do
74
+ allow(JSON).to receive(:parse).and_return(gem_data)
75
+ expect(Pkg::Gem.shipped_to_rubygems?('puppet', '6.0.5', 'x64-mingw32')).to be false
76
+ end
77
+ it 'returns false if gem version has not already been shipped' do
78
+ allow(JSON).to receive(:parse).and_return(gem_data)
79
+ expect(Pkg::Gem.shipped_to_rubygems?('puppet', '6.0.9', 'ruby')).to be false
80
+ end
81
+ it 'returns false if gem is not found at all on rubygems' do
82
+ expect { Pkg::Gem.shipped_to_rubygems?('totally-not-a-real-gem', '9.9.9', 'ruby') }.to_not raise_error
83
+ expect(Pkg::Gem.shipped_to_rubygems?('totally-not-a-real-gem', '9.9.9', 'ruby')).to be false
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,418 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Pkg::Paths' do
4
+ describe '#arch_from_artifact_path' do
5
+ arch_transformations = {
6
+ ['pkg/el-8-x86_64/puppet-agent-6.9.0-1.el8.x86_64.rpm', 'el', '8'] => 'x86_64',
7
+ ['pkg/el/8/puppet6/aarch64/puppet-agent-6.5.0.3094.g16b6fa6f-1.el8.aarch64.rpm', 'el', '8'] => 'aarch64',
8
+ ['artifacts/fedora/32/puppet6/x86_64/puppet-agent-6.9.0-1.fc30.x86_64.rpm', 'fedora', '32'] => 'x86_64',
9
+ ['pkg/ubuntu-16.04-amd64/puppet-agent_4.99.0-1xenial_amd64.deb', 'ubuntu', '16.04'] => 'amd64',
10
+ ['artifacts/deb/focal/puppet6/puppet-agent_6.5.0.3094.g16b6fa6f-1focal_arm64.deb', 'ubuntu', '20.04'] => 'aarch64',
11
+
12
+ ['artifacts/ubuntu-16.04-i386/puppetserver_5.0.1-0.1SNAPSHOT.2017.07.27T2346puppetlabs1.debian.tar.gz', 'ubuntu', '16.04'] => 'source',
13
+ ['artifacts/deb/jessie/PC1/puppetserver_5.0.1.master.orig.tar.gz', 'debian', '8'] => 'source',
14
+ ['artifacts/el/6/PC1/SRPMS/puppetserver-5.0.1.master-0.1SNAPSHOT.2017.08.18T0951.el6.src.rpm', 'el', '6'] => 'SRPMS'
15
+ }
16
+ arch_transformations.each do |path_array, arch|
17
+ it "should correctly return #{arch} for #{path_array[0]}" do
18
+ expect(Pkg::Paths.arch_from_artifact_path(path_array[1], path_array[2], path_array[0]))
19
+ .to eq(arch)
20
+ end
21
+ end
22
+ end
23
+
24
+ describe '#tag_from_artifact_path' do
25
+ path_tranformations = {
26
+ 'pkg/el-7-x86_64/puppet-agent-5.5.22-1.el8.x86_64.rpm' => 'el-7-x86_64',
27
+ 'pkg/ubuntu-20.04-amd64/puppet-agent_5.5.22-1xenial_amd64.deb' => 'ubuntu-20.04-amd64',
28
+ 'pkg/windows/puppet-agent-5.5.22-x86.msi' => 'windows-2012-x86',
29
+ 'artifacts/el/6/products/x86_64/pe-r10k-2.5.4.3-1.el6.x86_64.rpm' => 'el-6-x86_64',
30
+ 'pkg/pe/rpm/el-6-i386/pe-puppetserver-2017.3.0.3-1.el6.noarch.rpm' => 'el-6-i386',
31
+ 'pkg/deb/bionic/pe-r10k_3.5.2.0-1bionic_amd64.deb' => 'ubuntu-18.04-amd64',
32
+ 'pkg/deb/buster/pe-r10k_3.5.2.0-1buster_amd64.deb' => 'debian-10-amd64',
33
+ 'pkg/pe/deb/bionic/pe-puppetserver_2019.8.2.32-1bionic_all.deb' => 'ubuntu-18.04-amd64',
34
+ 'artifacts/deb/focal/puppet6/puppetdb_6.13.0-1focal_all.deb' => 'ubuntu-20.04-amd64',
35
+ 'pkg/apple/10.15/puppet6/x86_64/puppet-agent-6.19.0-1.osx10.15.dmg' => 'osx-10.15-x86_64',
36
+ 'pkg/apple/11/puppet6/x86_64/puppet-agent-6.19.0-1.osx11.dmg' => 'osx-11-x86_64',
37
+ 'pkg/windows/puppet-agent-1.9.0-x86.msi' => 'windows-2012-x86',
38
+ 'pkg/pe/rpm/el-6-i386/pe-puppetserver-2017.3.0.3-1.el6.src.rpm' => 'el-6-SRPMS',
39
+ 'pkg/pe/deb/xenial/pe-puppetserver_2017.3.0.3-1puppet1.orig.tar.gz' => 'ubuntu-16.04-source',
40
+ 'pkg/puppet-agent-5.1.0.79.g782e03c.gem' => nil,
41
+ 'pkg/puppet-agent-5.1.0.7.g782e03c.tar.gz' => nil,
42
+ }
43
+ path_tranformations.each do |pre, post|
44
+ it "should correctly return '#{post}' when given #{pre}" do
45
+ expect(Pkg::Paths.tag_from_artifact_path(pre)).to eq(post)
46
+ end
47
+ end
48
+
49
+ failure_cases = [
50
+ 'pkg/pe/deb/preice',
51
+ 'pkg/el-4-x86_64',
52
+ 'a/package/that/sucks.rpm',
53
+ ]
54
+ failure_cases.each do |fail_path|
55
+ it "should fail gracefully if given '#{fail_path}'" do
56
+ expect { Pkg::Paths.tag_from_artifact_path(fail_path) }.to raise_error
57
+ end
58
+ end
59
+ end
60
+
61
+ describe '#repo_name' do
62
+ it 'should return repo_name for final version' do
63
+ allow(Pkg::Config).to receive(:repo_name).and_return('puppet6')
64
+ expect(Pkg::Paths.repo_name).to eq('puppet6')
65
+ end
66
+
67
+ it 'should return repo_name for final version' do
68
+ allow(Pkg::Config).to receive(:repo_name).and_return('FUTURE-puppet7')
69
+ expect(Pkg::Paths.repo_name).to eq('FUTURE-puppet7')
70
+ end
71
+
72
+ it 'should be empty string if repo_name is not set for final version' do
73
+ allow(Pkg::Config).to receive(:repo_name).and_return(nil)
74
+ expect(Pkg::Paths.repo_name).to eq('')
75
+ end
76
+
77
+ it 'should return nonfinal_repo_name for non-final version' do
78
+ allow(Pkg::Config).to receive(:nonfinal_repo_name).and_return('puppet6-nightly')
79
+ expect(Pkg::Paths.repo_name(true)).to eq('puppet6-nightly')
80
+ end
81
+
82
+ it 'should fail if nonfinal_repo_name is not set for non-final version' do
83
+ allow(Pkg::Config).to receive(:repo_name).and_return('puppet6')
84
+ allow(Pkg::Config).to receive(:nonfinal_repo_name).and_return(nil)
85
+ expect { Pkg::Paths.repo_name(true) }.to raise_error
86
+ end
87
+ end
88
+
89
+ describe '#artifacts_path' do
90
+ context 'all puppet versions' do
91
+ before :each do
92
+ allow(Pkg::Config).to receive(:repo_name).and_return('puppet6')
93
+ end
94
+
95
+ it 'should work on all current platforms' do
96
+ Pkg::Platforms.platform_tags.each do |tag|
97
+ expect { Pkg::Paths.artifacts_path(tag) }.not_to raise_error
98
+ end
99
+ end
100
+ end
101
+
102
+ context 'for puppet 6 and prior' do
103
+ before :each do
104
+ allow(Pkg::Config).to receive(:repo_name).and_return('puppet6')
105
+ end
106
+
107
+ it 'should be correct for el7' do
108
+ expect(Pkg::Paths.artifacts_path('el-7-x86_64'))
109
+ .to eq('artifacts/puppet6/el/7/x86_64')
110
+ end
111
+
112
+ it 'should be correct for bionic' do
113
+ expect(Pkg::Paths.artifacts_path('ubuntu-18.04-amd64'))
114
+ .to eq('artifacts/bionic/puppet6')
115
+ end
116
+
117
+ it 'should be correct for solaris 11' do
118
+ expect(Pkg::Paths.artifacts_path('solaris-11-sparc'))
119
+ .to eq('artifacts/solaris/puppet6/11')
120
+ end
121
+
122
+ it 'should be correct for osx' do
123
+ expect(Pkg::Paths.artifacts_path('osx-10.15-x86_64'))
124
+ .to eq('artifacts/mac/puppet6/10.15/x86_64')
125
+ end
126
+
127
+ it 'should be correct for osx11' do
128
+ expect(Pkg::Paths.artifacts_path('osx-11-x86_64'))
129
+ .to eq('artifacts/mac/puppet6/11/x86_64')
130
+ end
131
+
132
+ it 'should be correct for windows' do
133
+ expect(Pkg::Paths.artifacts_path('windows-2012-x64'))
134
+ .to eq('artifacts/windows/puppet6')
135
+ end
136
+ end
137
+
138
+ context 'after puppet 7 apt changes' do
139
+ before :each do
140
+ allow(Pkg::Config).to receive(:repo_name).and_return('FUTURE-puppet7')
141
+ end
142
+
143
+ it 'should be correct for bionic' do
144
+ expect(Pkg::Paths.artifacts_path('ubuntu-18.04-amd64'))
145
+ .to eq('artifacts/FUTURE-puppet7/bionic')
146
+ end
147
+ it 'should be correct for focal' do
148
+ expect(Pkg::Paths.artifacts_path('ubuntu-20.04-amd64'))
149
+ .to eq('artifacts/FUTURE-puppet7/focal')
150
+ end
151
+ end
152
+ end
153
+
154
+ describe '#repo_path' do
155
+ before :each do
156
+ allow(Pkg::Config).to receive(:repo_name).and_return('puppet6')
157
+ end
158
+
159
+ it 'should be correct' do
160
+ expect(Pkg::Paths.repo_path('el-7-x86_64')).to eq('repos/puppet6/el/7/x86_64')
161
+ end
162
+
163
+ it 'should work on all current platforms' do
164
+ Pkg::Platforms.platform_tags.each do |tag|
165
+ expect { Pkg::Paths.repo_path(tag) }.not_to raise_error
166
+ end
167
+ end
168
+ end
169
+
170
+ describe '#repo_config_path' do
171
+ it 'should construct rpm/deb-specific repo configs' do
172
+ expect(Pkg::Paths.repo_config_path('el-7-x86_64'))
173
+ .to eq('repo_configs/rpm/*el-7-x86_64*.repo')
174
+ expect(Pkg::Paths.repo_config_path('ubuntu-18.04-amd64'))
175
+ .to eq('repo_configs/deb/*bionic*.list')
176
+ end
177
+
178
+ it 'should raise a RuntimeError with unfamilar repo configs' do
179
+ expect { Pkg::Paths.repo_config_path('bogus') }
180
+ .to raise_error(/Could not verify that 'bogus' is a valid tag/)
181
+ end
182
+
183
+ it 'should work on all current platforms' do
184
+ Pkg::Platforms.platform_tags.each do |tag|
185
+ expect { Pkg::Paths.repo_config_path(tag) }.not_to raise_error
186
+ end
187
+ end
188
+ end
189
+
190
+ describe '#apt_repo_name' do
191
+ it 'should return `Pkg::Config.repo_name` if set' do
192
+ allow(Pkg::Config).to receive(:repo_name).and_return('puppet6')
193
+ allow(Pkg::Config).to receive(:apt_repo_name).and_return('stuff')
194
+ expect(Pkg::Paths.apt_repo_name).to eq('puppet6')
195
+ end
196
+
197
+ it 'should return `Pkg::Config.apt_repo_name` if `Pkg::Config.repo_name` is not set' do
198
+ allow(Pkg::Config).to receive(:repo_name).and_return(nil)
199
+ allow(Pkg::Config).to receive(:apt_repo_name).and_return('puppet6')
200
+ expect(Pkg::Paths.apt_repo_name).to eq('puppet6')
201
+ end
202
+
203
+ it 'should return \'main\' if nothing is set' do
204
+ allow(Pkg::Config).to receive(:repo_name).and_return(nil)
205
+ allow(Pkg::Config).to receive(:apt_repo_name).and_return(nil)
206
+ expect(Pkg::Paths.apt_repo_name).to eq('main')
207
+ end
208
+
209
+ it 'should return nonfinal_repo_name for nonfinal version' do
210
+ allow(Pkg::Config).to receive(:repo_name).and_return('FUTURE-puppet7')
211
+ allow(Pkg::Config).to receive(:nonfinal_repo_name).and_return('FUTURE-puppet7-nightly')
212
+ expect(Pkg::Paths.apt_repo_name(true)).to eq('FUTURE-puppet7-nightly')
213
+ end
214
+
215
+ it 'should fail if nonfinal_repo_name is not set for non-final version' do
216
+ allow(Pkg::Config).to receive(:repo_name).and_return('FUTURE-puppet7')
217
+ allow(Pkg::Config).to receive(:nonfinal_repo_name).and_return(nil)
218
+ expect { Pkg::Paths.apt_repo_name(true) }.to raise_error
219
+ end
220
+ end
221
+
222
+ describe '#yum_repo_name' do
223
+ it 'should return `Pkg::Config.repo_name` if set' do
224
+ allow(Pkg::Config).to receive(:repo_name).and_return('puppet6')
225
+ allow(Pkg::Config).to receive(:yum_repo_name).and_return('stuff')
226
+ expect(Pkg::Paths.yum_repo_name).to eq('puppet6')
227
+ end
228
+
229
+ it 'should return `Pkg::Config.yum_repo_name` if `Pkg::Config.repo_name` is not set' do
230
+ allow(Pkg::Config).to receive(:repo_name).and_return(nil)
231
+ allow(Pkg::Config).to receive(:yum_repo_name).and_return('FUTURE-puppet7')
232
+ expect(Pkg::Paths.yum_repo_name).to eq('FUTURE-puppet7')
233
+ end
234
+
235
+ it 'should return \'products\' if nothing is set' do
236
+ allow(Pkg::Config).to receive(:repo_name).and_return(nil)
237
+ allow(Pkg::Config).to receive(:yum_repo_name).and_return(nil)
238
+ expect(Pkg::Paths.yum_repo_name).to eq('products')
239
+ end
240
+
241
+ it 'should return nonfinal_repo_name for nonfinal version' do
242
+ allow(Pkg::Config).to receive(:repo_name).and_return('FUTURE-puppet7')
243
+ allow(Pkg::Config).to receive(:nonfinal_repo_name).and_return('FUTURE-puppet7-nightly')
244
+ expect(Pkg::Paths.yum_repo_name(true)).to eq('FUTURE-puppet7-nightly')
245
+ end
246
+
247
+ it 'should fail if nonfinal_repo_name is not set for non-final version' do
248
+ allow(Pkg::Config).to receive(:repo_name).and_return('FUTURE-puppet7')
249
+ allow(Pkg::Config).to receive(:nonfinal_repo_name).and_return(nil)
250
+ expect { Pkg::Paths.yum_repo_name(true) }.to raise_error
251
+ end
252
+ end
253
+
254
+ describe '#remote_repo_base' do
255
+ fake_yum_repo_path = '/fake/yum'
256
+ fake_yum_nightly_repo_path = '/fake/yum-nightly'
257
+ fake_apt_repo_path = '/fake/apt'
258
+ fake_apt_nightly_repo_path = '/fake/apt-nightly'
259
+
260
+ before :each do
261
+ allow(Pkg::Config).to receive(:yum_repo_path).and_return(fake_yum_repo_path)
262
+ allow(Pkg::Config).to receive(:apt_repo_path).and_return(fake_apt_repo_path)
263
+ allow(Pkg::Config).to receive(:dmg_path).and_return('/opt/downloads/mac')
264
+ allow(Pkg::Config).to receive(:nonfinal_yum_repo_path).and_return(fake_yum_nightly_repo_path)
265
+ allow(Pkg::Config).to receive(:nonfinal_apt_repo_path).and_return(fake_apt_nightly_repo_path)
266
+ end
267
+ it 'returns yum_repo_path for rpms' do
268
+ expect(Pkg::Paths.remote_repo_base('el-7-x86_64'))
269
+ .to eq(fake_yum_repo_path)
270
+ end
271
+ it 'returns apt_repo_path for debs' do
272
+ expect(Pkg::Paths.remote_repo_base('ubuntu-18.04-amd64'))
273
+ .to eq(fake_apt_repo_path)
274
+ end
275
+ it 'returns nonfinal_yum_repo_path for nonfinal rpms' do
276
+ expect(Pkg::Paths.remote_repo_base('fedora-31-x86_64', nonfinal: true))
277
+ .to eq(fake_yum_nightly_repo_path)
278
+ end
279
+ it 'returns nonfinal_apt_repo_path for nonfinal debs' do
280
+ expect(Pkg::Paths.remote_repo_base('debian-9-amd64', nonfinal: true))
281
+ .to eq(fake_apt_nightly_repo_path)
282
+ end
283
+ it 'fails if neither tag nor package_format is provided' do
284
+ expect { Pkg::Paths.remote_repo_base }
285
+ .to raise_error(/Pkg::Paths.remote_repo_base must have/)
286
+ end
287
+
288
+ it 'returns /opt/downloads if the path is /opt/downloads/<something>' do
289
+ expect(Pkg::Paths.remote_repo_base(package_format: 'dmg')).to eq('/opt/downloads')
290
+ end
291
+
292
+ it 'fails for all other package formats' do
293
+ expect { Pkg::Paths.remote_repo_base('solaris-11-i386') }
294
+ .to raise_error(/Can't determine remote repo base path/)
295
+ end
296
+ end
297
+
298
+ describe '#apt_package_base_path' do
299
+ it 'fails for non-debian platforms' do
300
+ expect { Pkg::Paths.apt_package_base_path('el-7-x86_64', 'puppet6', 'puppet-agent') }
301
+ .to raise_error(/Can't determine path for non-debian platform/)
302
+ end
303
+
304
+ context 'for puppet 6 and prior' do
305
+ it 'returns the approprate apt repo path' do
306
+ allow(Pkg::Paths).to receive(:remote_repo_base).and_return('/opt/repository/apt')
307
+ expect(Pkg::Paths.apt_package_base_path('ubuntu-18.04-amd64', 'puppet6', 'puppet-agent'))
308
+ .to eq('/opt/repository/apt/pool/bionic/puppet6/p/puppet-agent')
309
+ expect(Pkg::Paths.apt_package_base_path('debian-9-amd64', 'puppet6', 'bolt-server'))
310
+ .to eq('/opt/repository/apt/pool/stretch/puppet6/b/bolt-server')
311
+
312
+
313
+ end
314
+ it 'returns the appropriate nonfinal repo path' do
315
+ allow(Pkg::Paths).to receive(:remote_repo_base).and_return('/opt/repository-nightlies/apt')
316
+ expect(Pkg::Paths.apt_package_base_path('ubuntu-18.04-amd64', 'puppet6-nightly',
317
+ 'puppet-agent', true))
318
+ .to eq('/opt/repository-nightlies/apt/pool/bionic/puppet6-nightly/p/puppet-agent')
319
+ expect(Pkg::Paths.apt_package_base_path('debian-10-amd64', 'puppet6-nightly',
320
+ 'pdk', true))
321
+ .to eq('/opt/repository-nightlies/apt/pool/buster/puppet6-nightly/p/pdk')
322
+ end
323
+ end
324
+
325
+ context 'for puppet 7 and after' do
326
+ it 'returns the approprate apt repo path' do
327
+ allow(Pkg::Paths).to receive(:remote_repo_base).and_return('/opt/repository/apt')
328
+ expect(Pkg::Paths.apt_package_base_path('ubuntu-18.04-amd64', 'FUTURE-puppet7', 'puppet-agent'))
329
+ .to eq('/opt/repository/apt/FUTURE-puppet7/pool/bionic/p/puppet-agent')
330
+ expect(Pkg::Paths.apt_package_base_path('ubuntu-20.04-amd64', 'FUTURE-puppet7', 'puppet-agent'))
331
+ .to eq('/opt/repository/apt/FUTURE-puppet7/pool/focal/p/puppet-agent')
332
+ end
333
+ it 'returns the appropriate nonfinal repo path' do
334
+ allow(Pkg::Paths).to receive(:remote_repo_base).and_return('/opt/repository-nightlies/apt')
335
+ expect(Pkg::Paths.apt_package_base_path('debian-10-amd64', 'FUTURE-puppet7-nightly', 'pdk', true))
336
+ .to eq('/opt/repository-nightlies/apt/FUTURE-puppet7-nightly/pool/buster/p/pdk')
337
+ end
338
+ end
339
+ end
340
+
341
+ describe '#release_package_link_path' do
342
+ context 'for puppet 6' do
343
+ repo_name = 'puppet6'
344
+ nonfinal_repo_name = 'puppet6-nightly'
345
+ yum_repo_path = '/opt/repository/yum'
346
+ apt_repo_path = '/opt/repository/apt'
347
+ nonfinal_yum_repo_path = '/opt/repository-nightlies/yum'
348
+ nonfinal_apt_repo_path = '/opt/repository-nightlies/apt'
349
+ before :each do
350
+ allow(Pkg::Config).to receive(:repo_name).and_return(repo_name)
351
+ allow(Pkg::Config).to receive(:nonfinal_repo_name).and_return(nonfinal_repo_name)
352
+ allow(Pkg::Config).to receive(:yum_repo_path).and_return(yum_repo_path)
353
+ allow(Pkg::Config).to receive(:apt_repo_path).and_return(apt_repo_path)
354
+ allow(Pkg::Config).to receive(:nonfinal_yum_repo_path).and_return(nonfinal_yum_repo_path)
355
+ allow(Pkg::Config).to receive(:nonfinal_apt_repo_path).and_return(nonfinal_apt_repo_path)
356
+ end
357
+ it 'returns the appropriate link path for rpm release packages' do
358
+ expect(Pkg::Paths.release_package_link_path('sles-12-ppc64le'))
359
+ .to eq("#{yum_repo_path}/#{repo_name}-release-sles-12.noarch.rpm")
360
+ end
361
+ it 'returns the appropriate link path for deb release packages' do
362
+ expect(Pkg::Paths.release_package_link_path('ubuntu-16.04-amd64'))
363
+ .to eq("#{apt_repo_path}/#{repo_name}-release-xenial.deb")
364
+ end
365
+ it 'returns the appropriate link path for nonfinal rpm release packages' do
366
+ expect(Pkg::Paths.release_package_link_path('el-7-x86_64', true))
367
+ .to eq("#{nonfinal_yum_repo_path}/#{nonfinal_repo_name}-release-el-7.noarch.rpm")
368
+ end
369
+ it 'returns the appropriate link path for nonfinal deb release packages' do
370
+ expect(Pkg::Paths.release_package_link_path('debian-9-i386', true))
371
+ .to eq("#{nonfinal_apt_repo_path}/#{nonfinal_repo_name}-release-stretch.deb")
372
+ end
373
+ it 'returns nil for package formats that do not have release packages' do
374
+ expect(Pkg::Paths.release_package_link_path('osx-10.15-x86_64')).to eq(nil)
375
+ expect(Pkg::Paths.release_package_link_path('osx-11-x86_64')).to eq(nil)
376
+ expect(Pkg::Paths.release_package_link_path('windows-2012-x86')).to eq(nil)
377
+ end
378
+ end
379
+
380
+ context 'for puppet 7' do
381
+ repo_name = 'FUTURE-puppet7'
382
+ nonfinal_repo_name = 'FUTURE-puppet7-nightly'
383
+ yum_repo_path = '/opt/repository/yum'
384
+ apt_repo_path = '/opt/repository/apt'
385
+ nonfinal_yum_repo_path = '/opt/repository-nightlies/yum'
386
+ nonfinal_apt_repo_path = '/opt/repository-nightlies/apt'
387
+ before :each do
388
+ allow(Pkg::Config).to receive(:repo_name).and_return(repo_name)
389
+ allow(Pkg::Config).to receive(:nonfinal_repo_name).and_return(nonfinal_repo_name)
390
+ allow(Pkg::Config).to receive(:yum_repo_path).and_return(yum_repo_path)
391
+ allow(Pkg::Config).to receive(:apt_repo_path).and_return(apt_repo_path)
392
+ allow(Pkg::Config).to receive(:nonfinal_yum_repo_path).and_return(nonfinal_yum_repo_path)
393
+ allow(Pkg::Config).to receive(:nonfinal_apt_repo_path).and_return(nonfinal_apt_repo_path)
394
+ end
395
+ it 'returns the appropriate link path for rpm release packages' do
396
+ expect(Pkg::Paths.release_package_link_path('sles-12-ppc64le'))
397
+ .to eq("#{yum_repo_path}/#{repo_name}-release-sles-12.noarch.rpm")
398
+ end
399
+ it 'returns the appropriate link path for deb release packages' do
400
+ expect(Pkg::Paths.release_package_link_path('ubuntu-20.04-amd64'))
401
+ .to eq("#{apt_repo_path}/#{repo_name}-release-focal.deb")
402
+ end
403
+ it 'returns the appropriate link path for nonfinal rpm release packages' do
404
+ expect(Pkg::Paths.release_package_link_path('el-8-x86_64', true))
405
+ .to eq("#{nonfinal_yum_repo_path}/#{nonfinal_repo_name}-release-el-8.noarch.rpm")
406
+ end
407
+ it 'returns the appropriate link path for nonfinal deb release packages' do
408
+ expect(Pkg::Paths.release_package_link_path('debian-10-i386', true))
409
+ .to eq("#{nonfinal_apt_repo_path}/#{nonfinal_repo_name}-release-buster.deb")
410
+ end
411
+ it 'returns nil for package formats that do not have release packages' do
412
+ expect(Pkg::Paths.release_package_link_path('osx-10.15-x86_64')).to eq(nil)
413
+ expect(Pkg::Paths.release_package_link_path('osx-11-x86_64')).to eq(nil)
414
+ expect(Pkg::Paths.release_package_link_path('windows-2012-x86')).to eq(nil)
415
+ end
416
+ end
417
+ end
418
+ end