File

spec/util_xmppstream_spec.lua @ 8528:67311cda0625

net.server_select: Better detection of errors for outgoing connections On connection failure, a socket is marked readable and writable. So to detect initial connection failures (connection refused, etc.) we now watch for sockets becoming readable during initial connection, and also read from readable sockets before writing to writable sockets. This should fix 'onconnect' being called for outgoing connections that actually failed.
author Matthew Wild <mwild1@gmail.com>
date Fri, 23 Feb 2018 15:30:00 +0000
parent 8236:4878e4159e12
child 9021:548ba4090012
line wrap: on
line source


local xmppstream = require "util.xmppstream";

describe("util.xmppstream", function()
	describe("#new()", function()
		it("should work", function()
			local function test(xml, expect_success, ex)
				local stanzas = {};
				local session = { notopen = true };
				local callbacks = {
					stream_ns = "streamns";
					stream_tag = "stream";
					default_ns = "stanzans";
					streamopened = function (_session)
						assert.are.equal(session, _session);
						assert.are.equal(session.notopen, true);
						_session.notopen = nil;
						return true;
					end;
					handlestanza = function (_session, stanza)
						assert.are.equal(session, _session);
						assert.are.equal(_session.notopen, nil);
						table.insert(stanzas, stanza);
					end;
					streamclosed = function (_session)
						assert.are.equal(session, _session);
						assert.are.equal(_session.notopen, nil);
						_session.notopen = nil;
					end;
				}
				if type(ex) == "table" then
					for k, v in pairs(ex) do
						if k ~= "_size_limit" then
							callbacks[k] = v;
						end
					end
				end
				local stream = xmppstream.new(session, callbacks, size_limit);
				local ok, err = pcall(function ()
					assert(stream:feed(xml));
				end);

				if ok and type(expect_success) == "function" then
					expect_success(stanzas);
				end
				assert.are.equal(not not ok, not not expect_success, "Expected "..(expect_success and ("success ("..tostring(err)..")") or "failure"));
			end

			local function test_stanza(stanza, expect_success, ex)
				return test([[<stream:stream xmlns:stream="streamns" xmlns="stanzans">]]..stanza, expect_success, ex);
			end

			test([[<stream:stream xmlns:stream="streamns"/>]], true);
			test([[<stream xmlns="streamns"/>]], true);

			test([[<stream1 xmlns="streamns"/>]], false);
			test([[<stream xmlns="streamns1"/>]], false);
			test("<>", false);

			test_stanza("<message/>", function (stanzas)
				assert.are.equal(#stanzas, 1);
				assert.are.equal(stanzas[1].name, "message");
			end);
			test_stanza("< message>>>>/>\n", false);

			test_stanza([[<x xmlns:a="b">
				<y xmlns:a="c">
					<a:z/>
				</y>
				<a:z/>
			</x>]], function (stanzas)
				assert.are.equal(#stanzas, 1);
				local s = stanzas[1];
				assert.are.equal(s.name, "x");
				assert.are.equal(#s.tags, 2);

				assert.are.equal(s.tags[1].name, "y");
				assert.are.equal(s.tags[1].attr.xmlns, nil);

				assert.are.equal(s.tags[1].tags[1].name, "z");
				assert.are.equal(s.tags[1].tags[1].attr.xmlns, "c");

				assert.are.equal(s.tags[2].name, "z");
				assert.are.equal(s.tags[2].attr.xmlns, "b");

				assert.are.equal(s.namespaces, nil);
			end);
		end);
	end);
end);