Chris@909
|
1 require File.dirname(__FILE__) + '/test_helper'
|
Chris@909
|
2 require File.dirname(__FILE__) + '/../lib/open_id_authentication/mem_cache_store'
|
Chris@909
|
3
|
Chris@909
|
4 # Mock MemCacheStore with MemoryStore for testing
|
Chris@909
|
5 class OpenIdAuthentication::MemCacheStore < OpenID::Store::Interface
|
Chris@909
|
6 def initialize(*addresses)
|
Chris@909
|
7 @connection = ActiveSupport::Cache::MemoryStore.new
|
Chris@909
|
8 end
|
Chris@909
|
9 end
|
Chris@909
|
10
|
Chris@909
|
11 class MemCacheStoreTest < Test::Unit::TestCase
|
Chris@909
|
12 ALLOWED_HANDLE = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
|
Chris@909
|
13
|
Chris@909
|
14 def setup
|
Chris@909
|
15 @store = OpenIdAuthentication::MemCacheStore.new
|
Chris@909
|
16 end
|
Chris@909
|
17
|
Chris@909
|
18 def test_store
|
Chris@909
|
19 server_url = "http://www.myopenid.com/openid"
|
Chris@909
|
20 assoc = gen_assoc(0)
|
Chris@909
|
21
|
Chris@909
|
22 # Make sure that a missing association returns no result
|
Chris@909
|
23 assert_retrieve(server_url)
|
Chris@909
|
24
|
Chris@909
|
25 # Check that after storage, getting returns the same result
|
Chris@909
|
26 @store.store_association(server_url, assoc)
|
Chris@909
|
27 assert_retrieve(server_url, nil, assoc)
|
Chris@909
|
28
|
Chris@909
|
29 # more than once
|
Chris@909
|
30 assert_retrieve(server_url, nil, assoc)
|
Chris@909
|
31
|
Chris@909
|
32 # Storing more than once has no ill effect
|
Chris@909
|
33 @store.store_association(server_url, assoc)
|
Chris@909
|
34 assert_retrieve(server_url, nil, assoc)
|
Chris@909
|
35
|
Chris@909
|
36 # Removing an association that does not exist returns not present
|
Chris@909
|
37 assert_remove(server_url, assoc.handle + 'x', false)
|
Chris@909
|
38
|
Chris@909
|
39 # Removing an association that does not exist returns not present
|
Chris@909
|
40 assert_remove(server_url + 'x', assoc.handle, false)
|
Chris@909
|
41
|
Chris@909
|
42 # Removing an association that is present returns present
|
Chris@909
|
43 assert_remove(server_url, assoc.handle, true)
|
Chris@909
|
44
|
Chris@909
|
45 # but not present on subsequent calls
|
Chris@909
|
46 assert_remove(server_url, assoc.handle, false)
|
Chris@909
|
47
|
Chris@909
|
48 # Put assoc back in the store
|
Chris@909
|
49 @store.store_association(server_url, assoc)
|
Chris@909
|
50
|
Chris@909
|
51 # More recent and expires after assoc
|
Chris@909
|
52 assoc2 = gen_assoc(1)
|
Chris@909
|
53 @store.store_association(server_url, assoc2)
|
Chris@909
|
54
|
Chris@909
|
55 # After storing an association with a different handle, but the
|
Chris@909
|
56 # same server_url, the handle with the later expiration is returned.
|
Chris@909
|
57 assert_retrieve(server_url, nil, assoc2)
|
Chris@909
|
58
|
Chris@909
|
59 # We can still retrieve the older association
|
Chris@909
|
60 assert_retrieve(server_url, assoc.handle, assoc)
|
Chris@909
|
61
|
Chris@909
|
62 # Plus we can retrieve the association with the later expiration
|
Chris@909
|
63 # explicitly
|
Chris@909
|
64 assert_retrieve(server_url, assoc2.handle, assoc2)
|
Chris@909
|
65
|
Chris@909
|
66 # More recent, and expires earlier than assoc2 or assoc. Make sure
|
Chris@909
|
67 # that we're picking the one with the latest issued date and not
|
Chris@909
|
68 # taking into account the expiration.
|
Chris@909
|
69 assoc3 = gen_assoc(2, 100)
|
Chris@909
|
70 @store.store_association(server_url, assoc3)
|
Chris@909
|
71
|
Chris@909
|
72 assert_retrieve(server_url, nil, assoc3)
|
Chris@909
|
73 assert_retrieve(server_url, assoc.handle, assoc)
|
Chris@909
|
74 assert_retrieve(server_url, assoc2.handle, assoc2)
|
Chris@909
|
75 assert_retrieve(server_url, assoc3.handle, assoc3)
|
Chris@909
|
76
|
Chris@909
|
77 assert_remove(server_url, assoc2.handle, true)
|
Chris@909
|
78
|
Chris@909
|
79 assert_retrieve(server_url, nil, assoc3)
|
Chris@909
|
80 assert_retrieve(server_url, assoc.handle, assoc)
|
Chris@909
|
81 assert_retrieve(server_url, assoc2.handle, nil)
|
Chris@909
|
82 assert_retrieve(server_url, assoc3.handle, assoc3)
|
Chris@909
|
83
|
Chris@909
|
84 assert_remove(server_url, assoc2.handle, false)
|
Chris@909
|
85 assert_remove(server_url, assoc3.handle, true)
|
Chris@909
|
86
|
Chris@909
|
87 assert_retrieve(server_url, nil, assoc)
|
Chris@909
|
88 assert_retrieve(server_url, assoc.handle, assoc)
|
Chris@909
|
89 assert_retrieve(server_url, assoc2.handle, nil)
|
Chris@909
|
90 assert_retrieve(server_url, assoc3.handle, nil)
|
Chris@909
|
91
|
Chris@909
|
92 assert_remove(server_url, assoc2.handle, false)
|
Chris@909
|
93 assert_remove(server_url, assoc.handle, true)
|
Chris@909
|
94 assert_remove(server_url, assoc3.handle, false)
|
Chris@909
|
95
|
Chris@909
|
96 assert_retrieve(server_url, nil, nil)
|
Chris@909
|
97 assert_retrieve(server_url, assoc.handle, nil)
|
Chris@909
|
98 assert_retrieve(server_url, assoc2.handle, nil)
|
Chris@909
|
99 assert_retrieve(server_url, assoc3.handle, nil)
|
Chris@909
|
100
|
Chris@909
|
101 assert_remove(server_url, assoc2.handle, false)
|
Chris@909
|
102 assert_remove(server_url, assoc.handle, false)
|
Chris@909
|
103 assert_remove(server_url, assoc3.handle, false)
|
Chris@909
|
104 end
|
Chris@909
|
105
|
Chris@909
|
106 def test_nonce
|
Chris@909
|
107 server_url = "http://www.myopenid.com/openid"
|
Chris@909
|
108
|
Chris@909
|
109 [server_url, ''].each do |url|
|
Chris@909
|
110 nonce1 = OpenID::Nonce::mk_nonce
|
Chris@909
|
111
|
Chris@909
|
112 assert_nonce(nonce1, true, url, "#{url}: nonce allowed by default")
|
Chris@909
|
113 assert_nonce(nonce1, false, url, "#{url}: nonce not allowed twice")
|
Chris@909
|
114 assert_nonce(nonce1, false, url, "#{url}: nonce not allowed third time")
|
Chris@909
|
115
|
Chris@909
|
116 # old nonces shouldn't pass
|
Chris@909
|
117 old_nonce = OpenID::Nonce::mk_nonce(3600)
|
Chris@909
|
118 assert_nonce(old_nonce, false, url, "Old nonce #{old_nonce.inspect} passed")
|
Chris@909
|
119 end
|
Chris@909
|
120 end
|
Chris@909
|
121
|
Chris@909
|
122 private
|
Chris@909
|
123 def gen_assoc(issued, lifetime = 600)
|
Chris@909
|
124 secret = OpenID::CryptUtil.random_string(20, nil)
|
Chris@909
|
125 handle = OpenID::CryptUtil.random_string(128, ALLOWED_HANDLE)
|
Chris@909
|
126 OpenID::Association.new(handle, secret, Time.now + issued, lifetime, 'HMAC-SHA1')
|
Chris@909
|
127 end
|
Chris@909
|
128
|
Chris@909
|
129 def assert_retrieve(url, handle = nil, expected = nil)
|
Chris@909
|
130 assoc = @store.get_association(url, handle)
|
Chris@909
|
131
|
Chris@909
|
132 if expected.nil?
|
Chris@909
|
133 assert_nil(assoc)
|
Chris@909
|
134 else
|
Chris@909
|
135 assert_equal(expected, assoc)
|
Chris@909
|
136 assert_equal(expected.handle, assoc.handle)
|
Chris@909
|
137 assert_equal(expected.secret, assoc.secret)
|
Chris@909
|
138 end
|
Chris@909
|
139 end
|
Chris@909
|
140
|
Chris@909
|
141 def assert_remove(url, handle, expected)
|
Chris@909
|
142 present = @store.remove_association(url, handle)
|
Chris@909
|
143 assert_equal(expected, present)
|
Chris@909
|
144 end
|
Chris@909
|
145
|
Chris@909
|
146 def assert_nonce(nonce, expected, server_url, msg = "")
|
Chris@909
|
147 stamp, salt = OpenID::Nonce::split_nonce(nonce)
|
Chris@909
|
148 actual = @store.use_nonce(server_url, stamp, salt)
|
Chris@909
|
149 assert_equal(expected, actual, msg)
|
Chris@909
|
150 end
|
Chris@909
|
151 end
|