diff options
author | Brant Knudson <bknudson@us.ibm.com> | 2013-06-03 16:27:16 -0500 |
---|---|---|
committer | Brant Knudson <bknudson@us.ibm.com> | 2013-06-11 12:41:36 -0500 |
commit | dc7fdb031a41f2c8e8f7479dc8e9d232a8da86de (patch) | |
tree | 7ba030c01875a59efce4e2dbdb813d57f313b214 | |
parent | 5df7424b2df765c590b91cf6e5a49a38e58a5554 (diff) | |
download | keystone-dc7fdb031a41f2c8e8f7479dc8e9d232a8da86de.tar.gz keystone-dc7fdb031a41f2c8e8f7479dc8e9d232a8da86de.tar.xz keystone-dc7fdb031a41f2c8e8f7479dc8e9d232a8da86de.zip |
Adds tests for XML version response
Adds tests for the version response when use
Accept: application/xml
To share code, moved assertEqualXML from test_serializer
to keystone.test.
Change-Id: I92e28a9167d0c77fc7efbd1eda2893ec1128354f
-rw-r--r-- | keystone/test.py | 25 | ||||
-rw-r--r-- | tests/test_serializer.py | 26 | ||||
-rw-r--r-- | tests/test_versions.py | 159 |
3 files changed, 184 insertions, 26 deletions
diff --git a/keystone/test.py b/keystone/test.py index fc5cd1c6..3fc0b301 100644 --- a/keystone/test.py +++ b/keystone/test.py @@ -18,11 +18,13 @@ import datetime import errno import os import socket +import StringIO import subprocess import sys import time import gettext +from lxml import etree import mox import nose.exc from paste import deploy @@ -373,6 +375,29 @@ class TestCase(NoModule, unittest.TestCase): self.fail(self._formatMessage(msg, standardMsg)) + def assertEqualXML(self, a, b): + """Parses two XML documents from strings and compares the results. + + This provides easy-to-read failures from nose. + + """ + parser = etree.XMLParser(remove_blank_text=True) + + def canonical_xml(s): + s = s.strip() + + fp = StringIO.StringIO() + dom = etree.fromstring(s, parser) + dom.getroottree().write_c14n(fp) + s = fp.getvalue() + + dom = etree.fromstring(s, parser) + return etree.tostring(dom, pretty_print=True) + + a = canonical_xml(a) + b = canonical_xml(b) + self.assertEqual(a.split('\n'), b.split('\n')) + @staticmethod def skip_if_no_ipv6(): try: diff --git a/tests/test_serializer.py b/tests/test_serializer.py index ebeb3f3e..ba162955 100644 --- a/tests/test_serializer.py +++ b/tests/test_serializer.py @@ -15,38 +15,12 @@ # under the License. import copy -import StringIO - -from lxml import etree from keystone.common import serializer from keystone import test class XmlSerializerTestCase(test.TestCase): - def assertEqualXML(self, a, b): - """Parses two XML documents from strings and compares the results. - - This provides easy-to-read failures from nose. - - """ - parser = etree.XMLParser(remove_blank_text=True) - - def canonical_xml(s): - s = s.strip() - - fp = StringIO.StringIO() - dom = etree.fromstring(s, parser) - dom.getroottree().write_c14n(fp) - s = fp.getvalue() - - dom = etree.fromstring(s, parser) - return etree.tostring(dom, pretty_print=True) - - a = canonical_xml(a) - b = canonical_xml(b) - self.assertEqual(a.split('\n'), b.split('\n')) - def assertSerializeDeserialize(self, d, xml, xmlns=None): self.assertEqualXML( serializer.to_xml(copy.deepcopy(d), xmlns), diff --git a/tests/test_versions.py b/tests/test_versions.py index 5d5de56d..2a53952f 100644 --- a/tests/test_versions.py +++ b/tests/test_versions.py @@ -256,3 +256,162 @@ class VersionTestCase(test.TestCase): self.assertEqual(resp.status_int, 300) data = jsonutils.loads(resp.body) self.assertEqual(data, v2_only_response) + + +class XmlVersionTestCase(test.TestCase): + + REQUEST_HEADERS = {'Accept': 'application/xml'} + + DOC_INTRO = '<?xml version="1.0" encoding="UTF-8"?>' + XML_NAMESPACE_ATTR = 'xmlns="http://docs.openstack.org/identity/api/v2.0"' + + v2_VERSION_DATA = """ +<version %(v2_namespace)s status="stable" updated="2013-03-06T00:00:00Z" + id="v2.0"> + <media-types> + <media-type base="application/json" type="application/\ +vnd.openstack.identity-v2.0+json"/> + <media-type base="application/xml" type="application/\ +vnd.openstack.identity-v2.0+xml"/> + </media-types> + <links> + <link href="http://localhost:%%(port)s/v2.0/" rel="self"/> + <link href="http://docs.openstack.org/api/openstack-identity-service/\ +2.0/content/" type="text/html" rel="describedby"/> + <link href="http://docs.openstack.org/api/openstack-identity-service/\ +2.0/identity-dev-guide-2.0.pdf" type="application/pdf" rel="describedby"/> + </links> +</version> +""" + + v2_VERSION_RESPONSE = ((DOC_INTRO + v2_VERSION_DATA) % + dict(v2_namespace=XML_NAMESPACE_ATTR)) + + v3_VERSION_DATA = """ +<version %(v3_namespace)s status="stable" updated="2013-03-06T00:00:00Z" + id="v3.0"> + <media-types> + <media-type base="application/json" type="application/\ +vnd.openstack.identity-v3+json"/> + <media-type base="application/xml" type="application/\ +vnd.openstack.identity-v3+xml"/> + </media-types> + <links> + <link href="http://localhost:%%(port)s/v3/" rel="self"/> + </links> +</version> +""" + + v3_VERSION_RESPONSE = ((DOC_INTRO + v3_VERSION_DATA) % + dict(v3_namespace=XML_NAMESPACE_ATTR)) + + VERSIONS_RESPONSE = ((DOC_INTRO + """ +<versions %(namespace)s> +""" + + v3_VERSION_DATA + + v2_VERSION_DATA + """ +</versions> +""") % dict(namespace=XML_NAMESPACE_ATTR, v3_namespace='', v2_namespace='')) + + def setUp(self): + super(XmlVersionTestCase, self).setUp() + self.load_backends() + self.public_app = self.loadapp('keystone', 'main') + self.admin_app = self.loadapp('keystone', 'admin') + + self.public_server = self.serveapp('keystone', name='main') + self.admin_server = self.serveapp('keystone', name='admin') + + def test_public_versions(self): + client = self.client(self.public_app) + resp = client.get('/', headers=self.REQUEST_HEADERS) + self.assertEqual(resp.status_int, 300) + data = resp.body + expected = self.VERSIONS_RESPONSE % dict(port=CONF.public_port) + self.assertEqualXML(data, expected) + + def test_admin_versions(self): + client = self.client(self.admin_app) + resp = client.get('/', headers=self.REQUEST_HEADERS) + self.assertEqual(resp.status_int, 300) + data = resp.body + expected = self.VERSIONS_RESPONSE % dict(port=CONF.admin_port) + self.assertEqualXML(data, expected) + + def test_public_version_v2(self): + client = self.client(self.public_app) + resp = client.get('/v2.0/', headers=self.REQUEST_HEADERS) + self.assertEqual(resp.status_int, 200) + data = resp.body + expected = self.v2_VERSION_RESPONSE % dict(port=CONF.public_port) + self.assertEqualXML(data, expected) + + def test_admin_version_v2(self): + client = self.client(self.admin_app) + resp = client.get('/v2.0/', headers=self.REQUEST_HEADERS) + self.assertEqual(resp.status_int, 200) + data = resp.body + expected = self.v2_VERSION_RESPONSE % dict(port=CONF.admin_port) + self.assertEqualXML(data, expected) + + def test_public_version_v3(self): + client = self.client(self.public_app) + resp = client.get('/v3/', headers=self.REQUEST_HEADERS) + self.assertEqual(resp.status_int, 200) + data = resp.body + expected = self.v3_VERSION_RESPONSE % dict(port=CONF.public_port) + self.assertEqualXML(data, expected) + + def test_admin_version_v3(self): + client = self.client(self.public_app) + resp = client.get('/v3/', headers=self.REQUEST_HEADERS) + self.assertEqual(resp.status_int, 200) + data = resp.body + expected = self.v3_VERSION_RESPONSE % dict(port=CONF.admin_port) + self.assertEqualXML(data, expected) + + def test_v2_disabled(self): + self.stubs.Set(controllers, '_VERSIONS', ['v3']) + client = self.client(self.public_app) + + # request to /v3 should pass + resp = client.get('/v3/', headers=self.REQUEST_HEADERS) + self.assertEqual(resp.status_int, 200) + data = resp.body + expected = self.v3_VERSION_RESPONSE % dict(port=CONF.public_port) + self.assertEqualXML(data, expected) + + # only v3 information should be displayed by requests to / + v3_only_response = ((self.DOC_INTRO + '<versions %(namespace)s>' + + self.v3_VERSION_DATA + '</versions>') % + dict(namespace=self.XML_NAMESPACE_ATTR, + v3_namespace='') % + dict(port=CONF.public_port)) + + resp = client.get('/', headers=self.REQUEST_HEADERS) + self.assertEqual(resp.status_int, 300) + data = resp.body + self.assertEqualXML(data, v3_only_response) + + def test_v3_disabled(self): + self.stubs.Set(controllers, '_VERSIONS', ['v2.0']) + client = self.client(self.public_app) + + # request to /v2.0 should pass + resp = client.get('/v2.0/', headers=self.REQUEST_HEADERS) + self.assertEqual(resp.status_int, 200) + data = resp.body + expected = self.v2_VERSION_RESPONSE % dict(port=CONF.public_port) + self.assertEqualXML(data, expected) + + # only v2 information should be displayed by requests to / + v2_only_response = ((self.DOC_INTRO + '<versions %(namespace)s>' + + self.v2_VERSION_DATA + '</versions>') % + dict(namespace=self.XML_NAMESPACE_ATTR, + v2_namespace='') % + dict(port=CONF.public_port)) + + resp = client.get('/', headers=self.REQUEST_HEADERS) + self.assertEqual(resp.status_int, 300) + data = resp.body + self.assertEqualXML(data, v2_only_response) |