diff .svn/pristine/2d/2d84dac3d9e6ebc1cf62421fe475b32d70661abb.svn-base @ 927:9ee5fd0b9bd3

Merge from cannam_integration
author luisf <luis.figueira@eecs.qmul.ac.uk>
date Fri, 11 May 2012 16:13:59 +0100
parents cbb26bc654de
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.svn/pristine/2d/2d84dac3d9e6ebc1cf62421fe475b32d70661abb.svn-base	Fri May 11 16:13:59 2012 +0100
@@ -0,0 +1,151 @@
+require File.dirname(__FILE__) + '/test_helper'
+require File.dirname(__FILE__) + '/../lib/open_id_authentication/mem_cache_store'
+
+# Mock MemCacheStore with MemoryStore for testing
+class OpenIdAuthentication::MemCacheStore < OpenID::Store::Interface
+  def initialize(*addresses)
+    @connection = ActiveSupport::Cache::MemoryStore.new
+  end
+end
+
+class MemCacheStoreTest < Test::Unit::TestCase
+  ALLOWED_HANDLE = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
+
+  def setup
+    @store = OpenIdAuthentication::MemCacheStore.new
+  end
+
+  def test_store
+    server_url = "http://www.myopenid.com/openid"
+    assoc = gen_assoc(0)
+
+    # Make sure that a missing association returns no result
+    assert_retrieve(server_url)
+
+    # Check that after storage, getting returns the same result
+    @store.store_association(server_url, assoc)
+    assert_retrieve(server_url, nil, assoc)
+
+    # more than once
+    assert_retrieve(server_url, nil, assoc)
+
+    # Storing more than once has no ill effect
+    @store.store_association(server_url, assoc)
+    assert_retrieve(server_url, nil, assoc)
+
+    # Removing an association that does not exist returns not present
+    assert_remove(server_url, assoc.handle + 'x', false)
+
+    # Removing an association that does not exist returns not present
+    assert_remove(server_url + 'x', assoc.handle, false)
+
+    # Removing an association that is present returns present
+    assert_remove(server_url, assoc.handle, true)
+
+    # but not present on subsequent calls
+    assert_remove(server_url, assoc.handle, false)
+
+    # Put assoc back in the store
+    @store.store_association(server_url, assoc)
+
+    # More recent and expires after assoc
+    assoc2 = gen_assoc(1)
+    @store.store_association(server_url, assoc2)
+
+    # After storing an association with a different handle, but the
+    # same server_url, the handle with the later expiration is returned.
+    assert_retrieve(server_url, nil, assoc2)
+
+    # We can still retrieve the older association
+    assert_retrieve(server_url, assoc.handle, assoc)
+
+    # Plus we can retrieve the association with the later expiration
+    # explicitly
+    assert_retrieve(server_url, assoc2.handle, assoc2)
+
+    # More recent, and expires earlier than assoc2 or assoc. Make sure
+    # that we're picking the one with the latest issued date and not
+    # taking into account the expiration.
+    assoc3 = gen_assoc(2, 100)
+    @store.store_association(server_url, assoc3)
+
+    assert_retrieve(server_url, nil, assoc3)
+    assert_retrieve(server_url, assoc.handle, assoc)
+    assert_retrieve(server_url, assoc2.handle, assoc2)
+    assert_retrieve(server_url, assoc3.handle, assoc3)
+
+    assert_remove(server_url, assoc2.handle, true)
+
+    assert_retrieve(server_url, nil, assoc3)
+    assert_retrieve(server_url, assoc.handle, assoc)
+    assert_retrieve(server_url, assoc2.handle, nil)
+    assert_retrieve(server_url, assoc3.handle, assoc3)
+
+    assert_remove(server_url, assoc2.handle, false)
+    assert_remove(server_url, assoc3.handle, true)
+
+    assert_retrieve(server_url, nil, assoc)
+    assert_retrieve(server_url, assoc.handle, assoc)
+    assert_retrieve(server_url, assoc2.handle, nil)
+    assert_retrieve(server_url, assoc3.handle, nil)
+
+    assert_remove(server_url, assoc2.handle, false)
+    assert_remove(server_url, assoc.handle, true)
+    assert_remove(server_url, assoc3.handle, false)
+
+    assert_retrieve(server_url, nil, nil)
+    assert_retrieve(server_url, assoc.handle, nil)
+    assert_retrieve(server_url, assoc2.handle, nil)
+    assert_retrieve(server_url, assoc3.handle, nil)
+
+    assert_remove(server_url, assoc2.handle, false)
+    assert_remove(server_url, assoc.handle, false)
+    assert_remove(server_url, assoc3.handle, false)
+  end
+
+  def test_nonce
+    server_url = "http://www.myopenid.com/openid"
+
+    [server_url, ''].each do |url|
+      nonce1 = OpenID::Nonce::mk_nonce
+
+      assert_nonce(nonce1, true, url, "#{url}: nonce allowed by default")
+      assert_nonce(nonce1, false, url, "#{url}: nonce not allowed twice")
+      assert_nonce(nonce1, false, url, "#{url}: nonce not allowed third time")
+
+      # old nonces shouldn't pass
+      old_nonce = OpenID::Nonce::mk_nonce(3600)
+      assert_nonce(old_nonce, false, url, "Old nonce #{old_nonce.inspect} passed")
+    end
+  end
+
+  private
+    def gen_assoc(issued, lifetime = 600)
+      secret = OpenID::CryptUtil.random_string(20, nil)
+      handle = OpenID::CryptUtil.random_string(128, ALLOWED_HANDLE)
+      OpenID::Association.new(handle, secret, Time.now + issued, lifetime, 'HMAC-SHA1')
+    end
+
+    def assert_retrieve(url, handle = nil, expected = nil)
+      assoc = @store.get_association(url, handle)
+
+      if expected.nil?
+        assert_nil(assoc)
+      else
+        assert_equal(expected, assoc)
+        assert_equal(expected.handle, assoc.handle)
+        assert_equal(expected.secret, assoc.secret)
+      end
+    end
+
+    def assert_remove(url, handle, expected)
+      present = @store.remove_association(url, handle)
+      assert_equal(expected, present)
+    end
+
+    def assert_nonce(nonce, expected, server_url, msg = "")
+      stamp, salt = OpenID::Nonce::split_nonce(nonce)
+      actual = @store.use_nonce(server_url, stamp, salt)
+      assert_equal(expected, actual, msg)
+    end
+end