test/unit/vagrant/util/downloader_test.rb in vagrant-unbundled-1.8.5.2 vs test/unit/vagrant/util/downloader_test.rb in vagrant-unbundled-1.9.1.1

- old
+ new

@@ -91,9 +91,107 @@ and_return(subprocess_result) expect(subject.download!).to be_true end end + + context "with checksum" do + let(:checksum_expected_value){ 'MD5_CHECKSUM_VALUE' } + let(:checksum_invalid_value){ 'INVALID_VALUE' } + let(:digest){ double("digest") } + + before do + allow(digest).to receive(:file).and_return(digest) + end + + [Digest::MD5, Digest::SHA1].each do |klass| + short_name = klass.to_s.split("::").last.downcase + + context "using #{short_name} digest" do + subject { described_class.new(source, destination, short_name.to_sym => checksum_expected_value) } + + context "that matches expected value" do + before do + expect(klass).to receive(:new).and_return(digest) + expect(digest).to receive(:hexdigest).and_return(checksum_expected_value) + end + + it "should not raise an exception" do + expect(subject.download!).to be_true + end + end + + context "that does not match expected value" do + before do + expect(klass).to receive(:new).and_return(digest) + expect(digest).to receive(:hexdigest).and_return(checksum_invalid_value) + end + + it "should raise an exception" do + expect{ subject.download! }.to raise_error(Vagrant::Errors::DownloaderChecksumError) + end + end + end + end + + context "using both md5 and sha1 digests" do + context "that both match expected values" do + subject { described_class.new(source, destination, md5: checksum_expected_value, sha1: checksum_expected_value) } + + before do + expect(Digest::MD5).to receive(:new).and_return(digest) + expect(Digest::SHA1).to receive(:new).and_return(digest) + expect(digest).to receive(:hexdigest).and_return(checksum_expected_value).exactly(2).times + end + + it "should not raise an exception" do + expect(subject.download!).to be_true + end + end + + context "that only sha1 matches expected value" do + subject { described_class.new(source, destination, md5: checksum_invalid_value, sha1: checksum_expected_value) } + + before do + allow(Digest::MD5).to receive(:new).and_return(digest) + allow(Digest::SHA1).to receive(:new).and_return(digest) + expect(digest).to receive(:hexdigest).and_return(checksum_expected_value).at_least(:once) + end + + it "should raise an exception" do + expect{ subject.download! }.to raise_error(Vagrant::Errors::DownloaderChecksumError) + end + end + + context "that only md5 matches expected value" do + subject { described_class.new(source, destination, md5: checksum_expected_value, sha1: checksum_invalid_value) } + + before do + allow(Digest::MD5).to receive(:new).and_return(digest) + allow(Digest::SHA1).to receive(:new).and_return(digest) + expect(digest).to receive(:hexdigest).and_return(checksum_expected_value).at_least(:once) + end + + it "should raise an exception" do + expect{ subject.download! }.to raise_error(Vagrant::Errors::DownloaderChecksumError) + end + end + + context "that none match expected value" do + subject { described_class.new(source, destination, md5: checksum_invalid_value, sha1: checksum_invalid_value) } + + before do + allow(Digest::MD5).to receive(:new).and_return(digest) + allow(Digest::SHA1).to receive(:new).and_return(digest) + expect(digest).to receive(:hexdigest).and_return(checksum_expected_value).at_least(:once) + end + + it "should raise an exception" do + expect{ subject.download! }.to raise_error(Vagrant::Errors::DownloaderChecksumError) + end + end + end + end end describe "#head" do let(:curl_options) { ["-q", "--fail", "--location", "--max-redirs", "10", "--user-agent", described_class::USER_AGENT, source, {}]