3 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
4 print "This script must be run from the command line\n";
8 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
9 define('GNUSOCIAL', true);
10 define('STATUSNET', true); // compatibility
12 mb_internal_encoding('UTF-8'); // @fixme this probably belongs in common.php?
14 require_once INSTALLDIR . '/lib/common.php';
15 require_once INSTALLDIR . '/plugins/Xmpp/XmppPlugin.php';
17 class XmppValidateTest extends PHPUnit_Framework_TestCase
19 public function setUp()
21 if(!array_key_exists('Xmpp', GNUsocial::getActivePlugins())){
22 $this->markTestSkipped('XmppPlugin is not enabled.');
26 * @dataProvider validationCases
29 public function testValidate($jid, $validFull, $validBase)
31 $xmpp = new TestXmppPlugin();
32 $this->assertEquals($validFull || $validBase, $xmpp->validate($jid));
33 $this->assertEquals($validFull, $xmpp->validateFullJid($jid), "validating as full or base JID");
34 $this->assertEquals($validBase, $xmpp->validateBaseJid($jid), "validating as base JID only");
38 * @dataProvider normalizationCases
41 public function testNormalize($jid, $expected)
43 $xmpp = new XmppPlugin();
44 $this->assertEquals($expected, $xmpp->normalize($jid));
48 * @dataProvider domainCheckCases()
50 public function testDomainCheck($domain, $expected, $note)
52 $xmpp = new TestXmppPlugin();
53 $this->assertEquals($expected, $xmpp->checkDomain($domain), $note);
56 static public function validationCases()
58 $long1023 = "long1023" . str_repeat('x', 1023 - 8);
59 $long1024 = "long1024" . str_repeat('x', 1024 - 8);
61 // Our own test cases for standard things & those mentioned in bug reports
62 // (jid, valid_full, valid_base)
63 array('user@example.com', true, true),
64 array('user@example.com/resource', true, false),
65 array('user with spaces@example.com', false, false), // not kosher
67 array('user.@example.com', true, true), // "common in intranets"
68 array('example.com', true, true),
69 array('example.com/resource', true, false),
70 array('jabchat', true, true),
72 array("$long1023@$long1023/$long1023", true, false), // max 1023 "bytes" per portion per spec. Do they really mean bytes though?
73 array("$long1024@$long1023/$long1023", false, false),
74 array("$long1023@$long1024/$long1023", false, false),
75 array("$long1023@$long1023/$long1024", false, false),
77 // Borrowed from test_jabber_jutil.c in libpurple
78 array("gmail.com", true, true),
79 array("gmail.com/Test", true, false),
80 array("gmail.com/Test@", true, false),
81 array("gmail.com/@", true, false),
82 array("gmail.com/Test@alkjaweflkj", true, false),
83 array("mark.doliner@gmail.com", true, true),
84 array("mark.doliner@gmail.com/Test12345", true, false),
85 array("mark.doliner@gmail.com/Test@12345", true, false),
86 array("mark.doliner@gmail.com/Te/st@12@//345", true, false),
87 array("わいど@conference.jabber.org", true, true),
88 array("まりるーむ@conference.jabber.org", true, true),
89 array("mark.doliner@gmail.com/まりるーむ", true, false),
90 array("mark.doliner@gmail/stuff.org", true, false),
91 array("stuart@nödåtXäYZ.se", true, true),
92 array("stuart@nödåtXäYZ.se/まりるーむ", true, false),
93 array("mark.doliner@わいど.org", true, true),
94 array("nick@まつ.おおかみ.net", true, true),
95 array("paul@10.0.42.230/s", true, false),
96 array("paul@[::1]", true, true), /* IPv6 */
97 array("paul@[2001:470:1f05:d58::2]", true, true),
98 array("paul@[2001:470:1f05:d58::2]/foo", true, false),
99 array("pa=ul@10.0.42.230", true, true),
100 array("pa,ul@10.0.42.230", true, true),
102 array("@gmail.com", false, false),
103 array("@@gmail.com", false, false),
104 array("mark.doliner@@gmail.com/Test12345", false, false),
105 array("mark@doliner@gmail.com/Test12345", false, false),
106 array("@gmail.com/Test@12345", false, false),
107 array("/Test@12345", false, false),
108 array("mark.doliner@", false, false),
109 array("mark.doliner/", false, false),
110 array("mark.doliner@gmail_stuff.org", false, false),
111 array("mark.doliner@gmail[stuff.org", false, false),
112 array("mark.doliner@gmail\\stuff.org", false, false),
113 array("paul@[::1]124", false, false),
114 array("paul@2[::1]124/as", false, false),
115 array("paul@まつ.おおかみ/\x01", false, false),
118 * RFC 3454 Section 6 reads, in part,
119 * "If a string contains any RandALCat character, the
120 * string MUST NOT contain any LCat character."
121 * The character is U+066D (ARABIC FIVE POINTED STAR).
123 // Leaving this one commented out for the moment
124 // as it shouldn't hurt anything for our purposes.
125 //array("foo@example.com/٭simplexe٭", false, false)
129 static public function normalizationCases()
132 // Borrowed from test_jabber_jutil.c in libpurple
133 array('PaUL@DaRkRain42.org', 'paul@darkrain42.org'),
134 array('PaUL@DaRkRain42.org/', 'paul@darkrain42.org'),
135 array('PaUL@DaRkRain42.org/resource', 'paul@darkrain42.org'),
137 // Also adapted from libpurple tests...
138 array('Ф@darkrain42.org', 'ф@darkrain42.org'),
139 array('paul@Өarkrain.org', 'paul@өarkrain.org'),
143 static public function domainCheckCases()
146 array('gmail.com', true, 'known SRV record'),
147 array('jabber.org', true, 'known SRV record'),
148 array('status.net', true, 'known SRV record'),
149 array('status.leuksman.com', true, 'known no SRV record but valid domain'),
156 class TestXmppPlugin extends XmppPlugin {
157 public function checkDomain($domain)
159 return parent::checkDomain($domain);
162 public function validateBaseJid($jid, $check_domain=false)
164 return parent::validateBaseJid($jid, $check_domain);
167 public function validateFullJid($jid, $check_domain=false)
169 return parent::validateFullJid($jid, $check_domain);