summaryrefslogtreecommitdiff
path: root/spec/unit/provider/remote_file/cache_control_data_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/unit/provider/remote_file/cache_control_data_spec.rb')
-rw-r--r--spec/unit/provider/remote_file/cache_control_data_spec.rb220
1 files changed, 0 insertions, 220 deletions
diff --git a/spec/unit/provider/remote_file/cache_control_data_spec.rb b/spec/unit/provider/remote_file/cache_control_data_spec.rb
deleted file mode 100644
index 8e396b1b40..0000000000
--- a/spec/unit/provider/remote_file/cache_control_data_spec.rb
+++ /dev/null
@@ -1,220 +0,0 @@
-#
-# Author:: Daniel DeLeo (<dan@opscode.com>)
-# Copyright:: Copyright (c) 2013 Opscode, Inc.
-# License:: Apache License, Version 2.0
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-require 'spec_helper'
-require 'uri'
-
-CACHE_FILE_TRUNCATED_FRIENDLY_FILE_NAME_LENGTH = 64
-CACHE_FILE_MD5_HEX_LENGTH = 32
-CACHE_FILE_JSON_FILE_EXTENSION_LENGTH = 5
-CACHE_FILE_PATH_LIMIT =
- CACHE_FILE_TRUNCATED_FRIENDLY_FILE_NAME_LENGTH +
- 1 +
- CACHE_FILE_MD5_HEX_LENGTH +
- CACHE_FILE_JSON_FILE_EXTENSION_LENGTH # {friendly}-{md5hex}.json == 102
-
-describe Chef::Provider::RemoteFile::CacheControlData do
-
- let(:uri) { URI.parse("http://www.google.com/robots.txt") }
-
- subject(:cache_control_data) do
- Chef::Provider::RemoteFile::CacheControlData.load_and_validate(uri, current_file_checksum)
- end
-
- let(:cache_path) { "remote_file/http___www_google_com_robots_txt-9839677abeeadf0691026e0cabca2339.json" }
-
- # the checksum of the file we have on disk already
- let(:current_file_checksum) { "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }
-
- context "when loading data for an unknown URI" do
-
- before do
- Chef::FileCache.should_receive(:load).with(cache_path).and_raise(Chef::Exceptions::FileNotFound, "nope")
- end
-
- context "and there is no current copy of the file" do
- let(:current_file_checksum) { nil }
-
- it "returns empty cache control data" do
- cache_control_data.etag.should be_nil
- cache_control_data.mtime.should be_nil
- end
- end
-
- it "returns empty cache control data" do
- cache_control_data.etag.should be_nil
- cache_control_data.mtime.should be_nil
- end
-
- context "and the URI contains a password" do
-
- let(:uri) { URI.parse("http://bob:password@example.org/") }
- let(:cache_path) { "remote_file/http___bob_XXXX_example_org_-f121caacb74c05a35bcefdf578ed5fc9.json" }
-
- it "loads the cache data from a path based on a sanitized URI" do
- Chef::Provider::RemoteFile::CacheControlData.load_and_validate(uri, current_file_checksum)
- end
- end
- end
-
- describe "when loading data for a known URI" do
-
- # the checksum of the file last we fetched it.
- let(:last_fetched_checksum) { "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }
-
- let(:etag) { "\"a-strong-identifier\"" }
- let(:mtime) { "Tue, 21 May 2013 19:19:23 GMT" }
-
- let(:cache_json_data) do
- cache = {}
- cache["etag"] = etag
- cache["mtime"] = mtime
- cache["checksum"] = last_fetched_checksum
- cache.to_json
- end
-
- before do
- Chef::FileCache.should_receive(:load).with(cache_path).and_return(cache_json_data)
- end
-
- context "and there is no on-disk copy of the file" do
- let(:current_file_checksum) { nil }
-
- it "returns empty cache control data" do
- cache_control_data.etag.should be_nil
- cache_control_data.mtime.should be_nil
- end
- end
-
- context "and the cached checksum does not match the on-disk copy" do
- let(:current_file_checksum) { "e2a8938cc31754f6c067b35aab1d0d4864272e9bf8504536ef3e79ebf8432305" }
-
- it "returns empty cache control data" do
- cache_control_data.etag.should be_nil
- cache_control_data.mtime.should be_nil
- end
- end
-
- context "and the cached checksum matches the on-disk copy" do
-
- it "populates the cache control data" do
- cache_control_data.etag.should == etag
- cache_control_data.mtime.should == mtime
- end
- end
-
- context "and the cached checksum data is corrupted" do
- let(:cache_json_data) { '{"foo",,"bar" []}' }
-
- it "returns empty cache control data" do
- cache_control_data.etag.should be_nil
- cache_control_data.mtime.should be_nil
- end
-
- context "and it still is valid JSON" do
- let(:cache_json_data) { '' }
-
- it "returns empty cache control data" do
- cache_control_data.etag.should be_nil
- cache_control_data.mtime.should be_nil
- end
- end
- end
- end
-
- describe "when saving to disk" do
-
- let(:etag) { "\"a-strong-identifier\"" }
- let(:mtime) { "Tue, 21 May 2013 19:19:23 GMT" }
- let(:fetched_file_checksum) { "e2a8938cc31754f6c067b35aab1d0d4864272e9bf8504536ef3e79ebf8432305" }
-
- let(:expected_serialization_data) do
- data = {}
- data["etag"] = etag
- data["mtime"] = mtime
- data["checksum"] = fetched_file_checksum
- data
- end
-
- before do
- cache_control_data.etag = etag
- cache_control_data.mtime = mtime
- cache_control_data.checksum = fetched_file_checksum
- end
-
- it "serializes its attributes to JSON" do
- # we have to test this separately because ruby 1.8 hash order is unstable
- # so we can't count on the order of the keys in the json format.
-
- json_data = cache_control_data.json_data
- Chef::JSONCompat.from_json(json_data).should == expected_serialization_data
- end
-
- it "writes data to the cache" do
- json_data = cache_control_data.json_data
- Chef::FileCache.should_receive(:store).with(cache_path, json_data)
- cache_control_data.save
- end
-
- context "and the URI contains a password" do
-
- let(:uri) { URI.parse("http://bob:password@example.org/") }
- let(:cache_path) { "remote_file/http___bob_XXXX_example_org_-f121caacb74c05a35bcefdf578ed5fc9.json" }
-
- it "writes the data to the cache with a sanitized path name" do
- json_data = cache_control_data.json_data
- Chef::FileCache.should_receive(:store).with(cache_path, json_data)
- cache_control_data.save
- end
- end
-
- # Cover the very long remote file path case -- see CHEF-4422 where
- # local cache file names generated from the long uri exceeded
- # local file system path limits resulting in exceptions from
- # file system API's on both Windows and Unix systems.
- context "and the URI results in a file cache path that exceeds #{CACHE_FILE_PATH_LIMIT} characters in length" do
- let(:long_remote_path) { "http://www.bing.com/" + ('0' * (CACHE_FILE_TRUNCATED_FRIENDLY_FILE_NAME_LENGTH * 2 )) }
- let(:uri) { URI.parse(long_remote_path) }
- let(:truncated_remote_uri) { URI.parse(long_remote_path[0...CACHE_FILE_TRUNCATED_FRIENDLY_FILE_NAME_LENGTH]) }
- let(:truncated_file_cache_path) do
- cache_control_data_truncated = Chef::Provider::RemoteFile::CacheControlData.load_and_validate(truncated_remote_uri, current_file_checksum)
- cache_control_data_truncated.send('sanitized_cache_file_basename')[0...CACHE_FILE_TRUNCATED_FRIENDLY_FILE_NAME_LENGTH]
- end
-
- it "truncates the file cache path to 102 characters" do
- normalized_cache_path = cache_control_data.send('sanitized_cache_file_basename')
-
- Chef::FileCache.should_receive(:store).with("remote_file/" + normalized_cache_path, cache_control_data.json_data)
-
- cache_control_data.save
-
- normalized_cache_path.length.should == CACHE_FILE_PATH_LIMIT
- end
-
- it "uses a file cache path that starts with the first #{CACHE_FILE_TRUNCATED_FRIENDLY_FILE_NAME_LENGTH} characters of the URI" do
- normalized_cache_path = cache_control_data.send('sanitized_cache_file_basename')
-
- truncated_file_cache_path.length.should == CACHE_FILE_TRUNCATED_FRIENDLY_FILE_NAME_LENGTH
- normalized_cache_path.start_with?(truncated_file_cache_path).should == true
- end
- end
-
- end
-
-end
-