test_jabberxmppstringprep.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. # Copyright (c) Twisted Matrix Laboratories.
  2. # See LICENSE for details.
  3. from twisted.trial import unittest
  4. from twisted.words.protocols.jabber.xmpp_stringprep import (
  5. nodeprep, resourceprep, nameprep)
  6. class DeprecationTests(unittest.TestCase):
  7. """
  8. Deprecations in L{twisted.words.protocols.jabber.xmpp_stringprep}.
  9. """
  10. def test_crippled(self):
  11. """
  12. L{xmpp_stringprep.crippled} is deprecated and always returns C{False}.
  13. """
  14. from twisted.words.protocols.jabber.xmpp_stringprep import crippled
  15. warnings = self.flushWarnings(
  16. offendingFunctions=[self.test_crippled])
  17. self.assertEqual(DeprecationWarning, warnings[0]['category'])
  18. self.assertEqual(
  19. "twisted.words.protocols.jabber.xmpp_stringprep.crippled was "
  20. "deprecated in Twisted 13.1.0: crippled is always False",
  21. warnings[0]['message'])
  22. self.assertEqual(1, len(warnings))
  23. self.assertEqual(crippled, False)
  24. class XMPPStringPrepTests(unittest.TestCase):
  25. """
  26. The nodeprep stringprep profile is similar to the resourceprep profile,
  27. but does an extra mapping of characters (table B.2) and disallows
  28. more characters (table C.1.1 and eight extra punctuation characters).
  29. Due to this similarity, the resourceprep tests are more extensive, and
  30. the nodeprep tests only address the mappings additional restrictions.
  31. The nameprep profile is nearly identical to the nameprep implementation in
  32. L{encodings.idna}, but that implementation assumes the C{UseSTD4ASCIIRules}
  33. flag to be false. This implementation assumes it to be true, and restricts
  34. the allowed set of characters. The tests here only check for the
  35. differences.
  36. """
  37. def testResourcePrep(self):
  38. self.assertEqual(resourceprep.prepare(u'resource'), u'resource')
  39. self.assertNotEqual(resourceprep.prepare(u'Resource'), u'resource')
  40. self.assertEqual(resourceprep.prepare(u' '), u' ')
  41. self.assertEqual(resourceprep.prepare(u'Henry \u2163'), u'Henry IV')
  42. self.assertEqual(resourceprep.prepare(u'foo\xad\u034f\u1806\u180b'
  43. u'bar\u200b\u2060'
  44. u'baz\ufe00\ufe08\ufe0f\ufeff'),
  45. u'foobarbaz')
  46. self.assertEqual(resourceprep.prepare(u'\u00a0'), u' ')
  47. self.assertRaises(UnicodeError, resourceprep.prepare, u'\u1680')
  48. self.assertEqual(resourceprep.prepare(u'\u2000'), u' ')
  49. self.assertEqual(resourceprep.prepare(u'\u200b'), u'')
  50. self.assertRaises(UnicodeError, resourceprep.prepare, u'\u0010\u007f')
  51. self.assertRaises(UnicodeError, resourceprep.prepare, u'\u0085')
  52. self.assertRaises(UnicodeError, resourceprep.prepare, u'\u180e')
  53. self.assertEqual(resourceprep.prepare(u'\ufeff'), u'')
  54. self.assertRaises(UnicodeError, resourceprep.prepare, u'\uf123')
  55. self.assertRaises(UnicodeError, resourceprep.prepare, u'\U000f1234')
  56. self.assertRaises(UnicodeError, resourceprep.prepare, u'\U0010f234')
  57. self.assertRaises(UnicodeError, resourceprep.prepare, u'\U0008fffe')
  58. self.assertRaises(UnicodeError, resourceprep.prepare, u'\U0010ffff')
  59. self.assertRaises(UnicodeError, resourceprep.prepare, u'\udf42')
  60. self.assertRaises(UnicodeError, resourceprep.prepare, u'\ufffd')
  61. self.assertRaises(UnicodeError, resourceprep.prepare, u'\u2ff5')
  62. self.assertEqual(resourceprep.prepare(u'\u0341'), u'\u0301')
  63. self.assertRaises(UnicodeError, resourceprep.prepare, u'\u200e')
  64. self.assertRaises(UnicodeError, resourceprep.prepare, u'\u202a')
  65. self.assertRaises(UnicodeError, resourceprep.prepare, u'\U000e0001')
  66. self.assertRaises(UnicodeError, resourceprep.prepare, u'\U000e0042')
  67. self.assertRaises(UnicodeError, resourceprep.prepare, u'foo\u05bebar')
  68. self.assertRaises(UnicodeError, resourceprep.prepare, u'foo\ufd50bar')
  69. #self.assertEqual(resourceprep.prepare(u'foo\ufb38bar'),
  70. # u'foo\u064ebar')
  71. self.assertRaises(UnicodeError, resourceprep.prepare, u'\u06271')
  72. self.assertEqual(resourceprep.prepare(u'\u06271\u0628'),
  73. u'\u06271\u0628')
  74. self.assertRaises(UnicodeError, resourceprep.prepare, u'\U000e0002')
  75. def testNodePrep(self):
  76. self.assertEqual(nodeprep.prepare(u'user'), u'user')
  77. self.assertEqual(nodeprep.prepare(u'User'), u'user')
  78. self.assertRaises(UnicodeError, nodeprep.prepare, u'us&er')
  79. def test_nodeprepUnassignedInUnicode32(self):
  80. """
  81. Make sure unassigned code points from Unicode 3.2 are rejected.
  82. """
  83. self.assertRaises(UnicodeError, nodeprep.prepare, u'\u1d39')
  84. def testNamePrep(self):
  85. self.assertEqual(nameprep.prepare(u'example.com'), u'example.com')
  86. self.assertEqual(nameprep.prepare(u'Example.com'), u'example.com')
  87. self.assertRaises(UnicodeError, nameprep.prepare, u'ex@mple.com')
  88. self.assertRaises(UnicodeError, nameprep.prepare, u'-example.com')
  89. self.assertRaises(UnicodeError, nameprep.prepare, u'example-.com')
  90. self.assertEqual(nameprep.prepare(u'stra\u00dfe.example.com'),
  91. u'strasse.example.com')
  92. def test_nameprepTrailingDot(self):
  93. """
  94. A trailing dot in domain names is preserved.
  95. """
  96. self.assertEqual(nameprep.prepare(u'example.com.'), u'example.com.')