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

Reply via email to