179 lines
4.7 KiB
Ruby
179 lines
4.7 KiB
Ruby
|
|
||
|
require 'test/unit'
|
||
|
require 'openid/consumer/discovery'
|
||
|
require 'openid/yadis/services'
|
||
|
|
||
|
module OpenID
|
||
|
|
||
|
XRDS_BOILERPLATE = <<EOF
|
||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||
|
<xrds:XRDS xmlns:xrds="xri://$xrds"
|
||
|
xmlns="xri://$xrd*($v*2.0)"
|
||
|
xmlns:openid="http://openid.net/xmlns/1.0">
|
||
|
<XRD>
|
||
|
%s
|
||
|
</XRD>
|
||
|
</xrds:XRDS>
|
||
|
EOF
|
||
|
|
||
|
def self.mkXRDS(services)
|
||
|
return sprintf(XRDS_BOILERPLATE, services)
|
||
|
end
|
||
|
|
||
|
def self.mkService(uris=nil, type_uris=nil, local_id=nil, dent=" ")
|
||
|
chunks = [dent, "<Service>\n"]
|
||
|
dent2 = dent + " "
|
||
|
if type_uris
|
||
|
type_uris.each { |type_uri|
|
||
|
chunks += [dent2 + "<Type>", type_uri, "</Type>\n"]
|
||
|
}
|
||
|
end
|
||
|
|
||
|
if uris
|
||
|
uris.each { |uri|
|
||
|
if uri.is_a?(Array)
|
||
|
uri, prio = uri
|
||
|
else
|
||
|
prio = nil
|
||
|
end
|
||
|
|
||
|
chunks += [dent2, "<URI"]
|
||
|
if !prio.nil?
|
||
|
chunks += [" priority='", str(prio), "'"]
|
||
|
end
|
||
|
chunks += [">", uri, "</URI>\n"]
|
||
|
}
|
||
|
end
|
||
|
|
||
|
if local_id
|
||
|
chunks += [dent2, "<openid:Delegate>", local_id, "</openid:Delegate>\n"]
|
||
|
end
|
||
|
|
||
|
chunks += [dent, "</Service>\n"]
|
||
|
|
||
|
return chunks.join("")
|
||
|
end
|
||
|
|
||
|
# Different sets of server URLs for use in the URI tag
|
||
|
SERVER_URL_OPTIONS = [
|
||
|
[], # This case should not generate an endpoint object
|
||
|
['http://server.url/'],
|
||
|
['https://server.url/'],
|
||
|
['https://server.url/', 'http://server.url/'],
|
||
|
['https://server.url/',
|
||
|
'http://server.url/',
|
||
|
'http://example.server.url/'],
|
||
|
]
|
||
|
|
||
|
# Used for generating test data
|
||
|
def OpenID.subsets(l)
|
||
|
subsets_list = [[]]
|
||
|
l.each { |x|
|
||
|
subsets_list += subsets_list.collect { |t| [x] + t }
|
||
|
}
|
||
|
|
||
|
return subsets_list
|
||
|
end
|
||
|
|
||
|
# A couple of example extension type URIs. These are not at all
|
||
|
# official, but are just here for testing.
|
||
|
EXT_TYPES = [
|
||
|
'http://janrain.com/extension/blah',
|
||
|
'http://openid.net/sreg/1.0',
|
||
|
]
|
||
|
|
||
|
# Range of valid Delegate tag values for generating test data
|
||
|
LOCAL_ID_OPTIONS = [
|
||
|
nil,
|
||
|
'http://vanity.domain/',
|
||
|
'https://somewhere/yadis/',
|
||
|
]
|
||
|
|
||
|
class OpenIDYadisTest
|
||
|
def initialize(uris, type_uris, local_id)
|
||
|
super()
|
||
|
@uris = uris
|
||
|
@type_uris = type_uris
|
||
|
@local_id = local_id
|
||
|
|
||
|
@yadis_url = 'http://unit.test/'
|
||
|
|
||
|
# Create an XRDS document to parse
|
||
|
services = OpenID.mkService(@uris,
|
||
|
@type_uris,
|
||
|
@local_id)
|
||
|
@xrds = OpenID.mkXRDS(services)
|
||
|
end
|
||
|
|
||
|
def runTest(testcase)
|
||
|
# Parse into endpoint objects that we will check
|
||
|
endpoints = Yadis.apply_filter(@yadis_url, @xrds, OpenIDServiceEndpoint)
|
||
|
|
||
|
# make sure there are the same number of endpoints as URIs. This
|
||
|
# assumes that the type_uris contains at least one OpenID type.
|
||
|
testcase.assert_equal(@uris.length, endpoints.length)
|
||
|
|
||
|
# So that we can check equality on the endpoint types
|
||
|
type_uris = @type_uris.dup
|
||
|
type_uris.sort!
|
||
|
|
||
|
seen_uris = []
|
||
|
endpoints.each { |endpoint|
|
||
|
seen_uris << endpoint.server_url
|
||
|
|
||
|
# All endpoints will have same yadis_url
|
||
|
testcase.assert_equal(@yadis_url, endpoint.claimed_id)
|
||
|
|
||
|
# and local_id
|
||
|
testcase.assert_equal(@local_id, endpoint.local_id)
|
||
|
|
||
|
# and types
|
||
|
actual_types = endpoint.type_uris.dup
|
||
|
actual_types.sort!
|
||
|
testcase.assert_equal(type_uris, actual_types, actual_types.inspect)
|
||
|
}
|
||
|
|
||
|
# So that they will compare equal, because we don't care what
|
||
|
# order they are in
|
||
|
seen_uris.sort!
|
||
|
uris = @uris.dup
|
||
|
uris.sort!
|
||
|
|
||
|
# Make sure we saw all URIs, and saw each one once
|
||
|
testcase.assert_equal(uris, seen_uris)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class OpenIDYadisTests < Test::Unit::TestCase
|
||
|
def test_openid_yadis
|
||
|
data = []
|
||
|
|
||
|
# All valid combinations of Type tags that should produce an
|
||
|
# OpenID endpoint
|
||
|
type_uri_options = []
|
||
|
|
||
|
OpenID.subsets([OPENID_1_0_TYPE, OPENID_1_1_TYPE]).each { |ts|
|
||
|
OpenID.subsets(EXT_TYPES).each { |exts|
|
||
|
if !ts.empty?
|
||
|
type_uri_options << exts + ts
|
||
|
end
|
||
|
}
|
||
|
}
|
||
|
|
||
|
# All combinations of valid URIs, Type URIs and Delegate tags
|
||
|
SERVER_URL_OPTIONS.each { |uris|
|
||
|
type_uri_options.each { |type_uris|
|
||
|
LOCAL_ID_OPTIONS.each { |local_id|
|
||
|
data << [uris, type_uris, local_id]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
data.each { |args|
|
||
|
t = OpenIDYadisTest.new(*args)
|
||
|
t.runTest(self)
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
end
|