From: marios <[email protected]>
Signed-off-by: marios <[email protected]> --- tests/deltacloud/buckets_test.rb | 135 ++++++++++---------------- tests/deltacloud/common_tests_collections.rb | 105 ++++++++++++++++++++ tests/deltacloud/test_setup.rb | 23 ++++- 3 files changed, 178 insertions(+), 85 deletions(-) create mode 100644 tests/deltacloud/common_tests_collections.rb diff --git a/tests/deltacloud/buckets_test.rb b/tests/deltacloud/buckets_test.rb index e8732b1..e16e743 100644 --- a/tests/deltacloud/buckets_test.rb +++ b/tests/deltacloud/buckets_test.rb @@ -61,19 +61,63 @@ describe 'Deltacloud API buckets collection' do end } - it 'must advertise the buckets collection in API entrypoint' do + #Run the 'common' tests for all collections defined in common_tests_collections.rb + test_collection = "buckets" + $:.unshift File.join(File.dirname(__FILE__), '..') + eval File.read('deltacloud/common_tests_collections.rb') - res = get("/").xml - (res/'api/link[@rel=buckets]').wont_be_empty + #Now run the bucket-specific tests: + it 'must have the "size" element defined for each bucket in collection' do + res = get(BUCKETS, :accept => :xml) + (res.xml/'buckets/bucket').each do |r| + (r/'size').wont_be_nil + (r/'size').wont_be_empty + end end - it 'must require authentication to access the "bucket" collection' do - proc { get(BUCKETS, :noauth => true) }.must_raise RestClient::Request::Unauthorized + it 'all "blob" elements for the bucket should match the ones in collection' do + res = get(BUCKETS, :accept => :xml) + (res.xml/'buckets/bucket').each do |r| + bucket = get(BUCKETS+"/#{r[:id]}", :accept=>:xml) + (bucket.xml/'bucket/blob').each do |b| + b[:id].wont_be_nil + b[:href].wont_be_nil + b[:href].must_match /^http/ + b[:href].must_match /#{r[:id]}\/#{b[:id]}$/ + end + end end - it 'should respond with HTTP_OK when accessing the :buckets collection with authentication' do - res = get(BUCKETS) - res.code.must_equal 200 + it 'must allow to get all blobs details and the details should be set correctly' do + res = get(BUCKETS, :accept => :xml) + (res.xml/'buckets/bucket').each do |r| + bucket = get(BUCKETS+"/#{r[:id]}", :accept=>:xml) + (bucket.xml/'bucket/blob').each do |b| + blob = get(BUCKETS+"/#{r[:id]}/#{b[:id]}", :accept=>:xml) + blob.xml.root.name.must_equal 'blob' + blob.xml.root[:id].must_equal b[:id] + (blob.xml/'bucket').wont_be_empty + (blob.xml/'bucket').size.must_equal 1 + (blob.xml/'bucket').first.text.wont_be_nil + (blob.xml/'bucket').first.text.must_equal r[:id] + (blob.xml/'content_length').wont_be_empty + (blob.xml/'content_length').size.must_equal 1 + (blob.xml/'content_length').first.text.must_match /^(\d+)$/ + (blob.xml/'content_type').wont_be_empty + (blob.xml/'content_type').size.must_equal 1 + (blob.xml/'content_type').first.text.wont_be_nil + (blob.xml/'last_modified').wont_be_empty + (blob.xml/'last_modified').size.must_equal 1 + (blob.xml/'last_modified').first.text.wont_be_empty + (blob.xml/'content').wont_be_empty + (blob.xml/'content').size.must_equal 1 + (blob.xml/'content').first[:rel].wont_be_nil + (blob.xml/'content').first[:rel].must_equal 'blob_content' + (blob.xml/'content').first[:href].wont_be_nil + (blob.xml/'content').first[:href].must_match /^http/ + (blob.xml/'content').first[:href].must_match /\/content$/ + end + end end it 'should be possible to create bucket with POST /api/buckets and delete it with DELETE /api/buckets/:id' do @@ -179,64 +223,6 @@ describe 'Deltacloud API buckets collection' do end end - it 'should support the JSON media type' do - res = get(BUCKETS, :accept=>:json) - res.code.must_equal 200 - res.headers[:content_type].must_equal 'application/json' - assert_silent {JSON.parse(res)} - end - - it 'must include the ETag in HTTP headers' do - res = get(BUCKETS) - res.headers[:etag].wont_be_nil - end - - it 'must have the "buckets" element on top level' do - res = get(BUCKETS, :accept=>:xml) - res.xml.root.name.must_equal 'buckets' - end - - it 'must have some "bucket" elements inside "buckets"' do - res = get(BUCKETS, :accept=>:xml) - (res.xml/'buckets/bucket').wont_be_empty - end - - it 'must provide the :id attribute for each bucket in collection' do - res = get(BUCKETS, :accept=>:xml) - (res.xml/'buckets/bucket').each do |r| - r[:id].wont_be_nil - end - end - - it 'must include the :href attribute for each "bucket" element in collection' do - res = get(BUCKETS, :accept=>:xml) - (res.xml/'buckets/bucket').each do |r| - r[:href].wont_be_nil - end - end - - it 'must use the absolute URL in each :href attribute' do - res = get(BUCKETS, :accept=>:xml) - (res.xml/'buckets/bucket').each do |r| - r[:href].must_match /^http/ - end - end - - it 'must have the URL ending with the :id of the bucket' do - res = get(BUCKETS, :accept=>:xml) - (res.xml/'buckets/bucket').each do |r| - r[:href].must_match /#{r[:id]}$/ - end - end - - it 'must have the "name" element defined for each bucket in collection' do - res = get(BUCKETS, :accept => :xml) - (res.xml/'buckets/bucket').each do |r| - (r/'name').wont_be_nil - (r/'name').wont_be_empty - end - end - it 'must have the "size" element defined for each bucket in collection' do res = get(BUCKETS, :accept => :xml) (res.xml/'buckets/bucket').each do |r| @@ -245,23 +231,6 @@ describe 'Deltacloud API buckets collection' do end end - it 'must return 200 OK when following the URL in bucket element' do - res = get(BUCKETS, :accept => :xml) - (res.xml/'buckets/bucket').each do |r| - bucket_res = get r[:href] - bucket_res.code.must_equal 200 - end - end - - it 'must have the "name" element for the bucket and it should match with the one in collection' do - res = get(BUCKETS, :accept => :xml) - (res.xml/'buckets/bucket').each do |r| - bucket = get(BUCKETS+"/#{r[:id]}", :accept=>:xml) - (bucket.xml/'name').wont_be_empty - (bucket.xml/'name').first.text.must_equal((r/'name').first.text) - end - end - it 'all "blob" elements for the bucket should match the ones in collection' do res = get(BUCKETS, :accept => :xml) (res.xml/'buckets/bucket').each do |r| diff --git a/tests/deltacloud/common_tests_collections.rb b/tests/deltacloud/common_tests_collections.rb new file mode 100644 index 0000000..9a98cf5 --- /dev/null +++ b/tests/deltacloud/common_tests_collections.rb @@ -0,0 +1,105 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you 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. + + it "must advertise the #{test_collection} collection in API entrypoint" do + res = get("/").xml + (res/"api/link[@rel=#{test_collection}]").wont_be_empty + end + + it "must require authentication to access the #{test_collection} collection" do + proc { get(test_collection, :noauth => true) }.must_raise RestClient::Request::Unauthorized + end + + it "should respond with HTTP_OK when accessing the #{test_collection} collection with authentication" do + res = get(test_collection) + res.code.must_equal 200 + end + + it 'should support the JSON media type' do + res = get(test_collection, :accept=>:json) + res.code.must_equal 200 + res.headers[:content_type].must_equal 'application/json' + assert_silent {JSON.parse(res)} + end + + it 'must include the ETag in HTTP headers' do + res = get(test_collection) + res.headers[:etag].wont_be_nil + end + + it "must have the #{test_collection} element on top level" do + res = get(test_collection, :accept=>:xml) + res.xml.root.name.must_equal test_collection + end + + it "must have some #{test_collection.singularize} elements inside #{test_collection} " do + res = get(test_collection, :accept=>:xml) + (res.xml/"#{test_collection}/#{test_collection.singularize}").wont_be_empty + end + + it "must provide the :id attribute for each #{test_collection.singularize} in collection" do + res = get(test_collection, :accept=>:xml) + (res.xml/"#{test_collection}/#{test_collection.singularize}").each do |r| + r[:id].wont_be_nil + end + end + + it "must include the :href attribute for each #{test_collection} element in collection" do + res = get(test_collection, :accept=>:xml) + (res.xml/"#{test_collection}/#{test_collection.singularize}").each do |r| + r[:href].wont_be_nil + end + end + + it 'must use the absolute URL in each :href attribute' do + res = get(test_collection, :accept=>:xml) + (res.xml/"#{test_collection}/#{test_collection.singularize}").each do |r| + r[:href].must_match /^http/ + end + end + + it "must have the URL ending with the :id of the #{test_collection.singularize}" do + res = get(test_collection, :accept=>:xml) + (res.xml/"#{test_collection}/#{test_collection.singularize}").each do |r| + r[:href].must_match /#{r[:id]}$/ + end + end + + it "must have the \"name\" element defined for each #{test_collection.singularize} in collection" do + res = get(test_collection, :accept => :xml) + (res.xml/"#{test_collection}/#{test_collection.singularize}").each do |r| + (r/'name').wont_be_nil + (r/'name').wont_be_empty + end + end + + it "must return 200 OK when following the URL in #{test_collection.singularize} element" do + res = get(test_collection, :accept => :xml) + (res.xml/"#{test_collection}/#{test_collection.singularize}").each do |r| + element_res = get r[:href] + element_res.code.must_equal 200 + end + end + + it "must have the \"name\" element for the #{test_collection.singularize} and it should match with the one in collection" do + res = get(test_collection, :accept => :xml) + (res.xml/"#{test_collection}/#{test_collection.singularize}").each do |r| + element = get(test_collection+"/#{r[:id]}", :accept=>:xml) + (element.xml/'name').wont_be_empty + (element.xml/'name').first.text.must_equal((r/'name').first.text) + end + end + diff --git a/tests/deltacloud/test_setup.rb b/tests/deltacloud/test_setup.rb index a3bae4f..ab95035 100644 --- a/tests/deltacloud/test_setup.rb +++ b/tests/deltacloud/test_setup.rb @@ -37,6 +37,14 @@ module RestClient::Response end end +class String + def singularize + return self.gsub(/ies$/, 'y') if self =~ /ies$/ + return self.gsub(/es$/, '') if self =~ /sses$/ + self.gsub(/s$/, '') + end +end + module Deltacloud module Test @@ -64,6 +72,14 @@ module Deltacloud @hash[driver]["bucket_locations"] end + def instances_config + @hash[driver]["instances"] || {} + end + + def preferred_provider + @hash[driver]["preferred_provider"] + end + def driver xml.root[:driver] end @@ -139,6 +155,9 @@ module Deltacloud::Test::Methods end def post(path, post_body, params={}) + if api.preferred_provider and not params[:provider] + params[:provider] = api.preferred_provider + end url, headers = process_url_params(path, params) RestClient.post url, post_body, headers end @@ -147,7 +166,7 @@ module Deltacloud::Test::Methods url, headers = process_url_params(path, params) if body.is_a?(File) #set timeouts http://rdoc.info/github/archiloque/rest-client/RestClient/Resource - resource = RestClient::Resource.new(url, :open_timeout => 10, :timeout=> 9999) + resource = RestClient::Resource.new(url, :open_timeout => 120, :timeout=> 9999) resource.put body.read, headers else RestClient.put url, body, headers @@ -200,7 +219,7 @@ module Deltacloud::Test::Methods if path =~ /^https?:/ url = path else - url = api.url + path + url = path.start_with?("/", ";") ? api.url + path : api.url+"/"+ path end url += "?" + params.map { |k,v| "#{k}=#{v}" }.join("&") unless params.empty? if ENV["LOG"] && ENV["LOG"].include?("requests") -- 1.7.6.5
