summaryrefslogtreecommitdiff
path: root/test/ua.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/ua.c')
-rw-r--r--test/ua.c288
1 files changed, 280 insertions, 8 deletions
diff --git a/test/ua.c b/test/ua.c
index c039705..2cfbce8 100644
--- a/test/ua.c
+++ b/test/ua.c
@@ -7,20 +7,35 @@
#include <re.h>
#include <baresip.h>
#include "test.h"
+#include "sip/sipsrv.h"
struct test {
- struct sip_server *srv;
+ struct sip_server *srvv[16];
+ size_t srvc;
struct ua *ua;
int err;
unsigned got_register_ok;
};
+static void test_reset(struct test *t)
+{
+ size_t i;
+
+ for (i=0; i<ARRAY_SIZE(t->srvv); i++)
+ mem_deref(t->srvv[i]);
+ mem_deref(t->ua);
+
+ memset(t, 0, sizeof(*t));
+}
+
+
static void ua_event_handler(struct ua *ua, enum ua_event ev,
struct call *call, const char *prm, void *arg)
{
struct test *t = arg;
+ size_t i;
int err = 0;
(void)call;
(void)prm;
@@ -32,15 +47,24 @@ static void ua_event_handler(struct ua *ua, enum ua_event ev,
if (ev == UA_EVENT_REGISTER_OK) {
+ re_printf("event: Register OK!\n");
+
++t->got_register_ok;
/* verify register success */
ASSERT_TRUE(ua_isregistered(t->ua));
/* Terminate SIP Server, then De-REGISTER */
- t->srv->terminate = true;
+ for (i=0; i<t->srvc; i++)
+ t->srvv[i]->terminate = true;
+
t->ua = mem_deref(t->ua);
}
+ else if (ev == UA_EVENT_REGISTER_FAIL) {
+
+ err = EAUTH;
+ re_cancel();
+ }
out:
if (err) {
@@ -58,13 +82,13 @@ static int reg(enum sip_transp tp)
memset(&t, 0, sizeof t);
- err = sip_server_alloc(&t.srv);
+ err = sip_server_alloc(&t.srvv[0]);
if (err) {
warning("failed to create sip server (%d/%m)\n", err, err);
goto out;
}
- err = sip_server_uri(t.srv, aor, sizeof(aor), tp);
+ err = sip_server_uri(t.srvv[0], aor, sizeof(aor), tp);
TEST_ERR(err);
err = ua_alloc(&t.ua, aor);
@@ -82,8 +106,8 @@ static int reg(enum sip_transp tp)
if (t.err)
err = t.err;
- ASSERT_TRUE(t.srv->n_register_req > 0);
- ASSERT_EQ(tp, t.srv->tp_last);
+ ASSERT_TRUE(t.srvv[0]->n_register_req > 0);
+ ASSERT_EQ(tp, t.srvv[0]->tp_last);
ASSERT_TRUE(t.got_register_ok > 0);
out:
@@ -91,8 +115,7 @@ static int reg(enum sip_transp tp)
warning("selftest: ua_register test failed (%m)\n", err);
}
uag_event_unregister(ua_event_handler);
- mem_deref(t.srv);
- mem_deref(t.ua);
+ test_reset(&t);
return err;
}
@@ -102,12 +125,18 @@ int test_ua_register(void)
{
int err = 0;
+ err = ua_init("test", true, true, true, false);
+ TEST_ERR(err);
+
err |= reg(SIP_TRANSP_UDP);
err |= reg(SIP_TRANSP_TCP);
#ifdef USE_TLS
err |= reg(SIP_TRANSP_TLS);
#endif
+ ua_close();
+
+ out:
return err;
}
@@ -169,3 +198,246 @@ int test_uag_find_param(void)
return err;
}
+
+
+#define SERVER_COUNT 1
+
+
+static const char *_sip_transp_srvid(enum sip_transp tp)
+{
+ switch (tp) {
+
+ case SIP_TRANSP_UDP: return "_sip._udp";
+ case SIP_TRANSP_TCP: return "_sip._tcp";
+ case SIP_TRANSP_TLS: return "_sips._tcp";
+ default: return "???";
+ }
+}
+
+
+static int reg_dns(enum sip_transp tp)
+{
+ struct dns_server *dnssrv = NULL;
+ struct test t;
+ const char *domain = "test.invalid";
+ char aor[256];
+ char srv[256];
+ size_t i;
+ int err;
+
+ memset(&t, 0, sizeof t);
+
+ /*
+ * Setup server-side mocks:
+ */
+
+ err = dns_server_alloc(&dnssrv, true);
+ TEST_ERR(err);
+
+ info("| DNS-server on %J\n", &dnssrv->addr);
+
+ /* NOTE: must be done before ua_init() */
+ err = net_dnssrv_add(&dnssrv->addr);
+ TEST_ERR(err);
+
+ for (i=0; i<SERVER_COUNT; i++) {
+ struct sa sip_addr;
+ char arec[256];
+
+ err = sip_server_alloc(&t.srvv[i]);
+ if (err) {
+ warning("failed to create sip server (%d/%m)\n",
+ err, err);
+ goto out;
+ }
+
+ err = domain_add(t.srvv[0], domain);
+ if (err)
+ goto out;
+
+ err = sip_transp_laddr(t.srvv[i]->sip, &sip_addr, tp, NULL);
+ TEST_ERR(err);
+
+ info("| SIP-server on %J\n", &sip_addr);
+
+ re_snprintf(arec, sizeof(arec),
+ "alpha%u.%s", i+1, domain);
+
+ re_snprintf(srv, sizeof(srv),
+ "%s.%s", _sip_transp_srvid(tp), domain);
+ err = dns_server_add_srv(dnssrv, srv,
+ 20, 0, sa_port(&sip_addr),
+ arec);
+ TEST_ERR(err);
+
+ err = dns_server_add_a(dnssrv, arec, sa_in(&sip_addr));
+ TEST_ERR(err);
+ }
+ t.srvc = SERVER_COUNT;
+
+ /* NOTE: angel brackets needed to parse ;transport parameter */
+ if (re_snprintf(aor, sizeof(aor), "<sip:x:x@%s;transport=%s>",
+ domain, sip_transp_name(tp)) < 0)
+ return ENOMEM;
+
+ /*
+ * Start SIP client:
+ */
+
+ err = ua_init("test", true, true, true, false);
+ TEST_ERR(err);
+
+ err = ua_alloc(&t.ua, aor);
+ TEST_ERR(err);
+
+ err = uag_event_register(ua_event_handler, &t);
+ if (err)
+ goto out;
+
+ /* run main-loop with timeout, wait for events */
+ err = re_main_timeout(5000);
+ if (err)
+ goto out;
+
+ if (t.err)
+ err = t.err;
+
+ /* verify that all SIP requests was sent to the first
+ * SIP-server.
+ */
+ ASSERT_TRUE(t.srvv[0]->n_register_req > 0);
+ ASSERT_EQ(tp, t.srvv[0]->tp_last);
+ ASSERT_TRUE(t.got_register_ok > 0);
+
+ out:
+ if (err) {
+ warning("selftest: ua_register test failed (%m)\n", err);
+ }
+ uag_event_unregister(ua_event_handler);
+
+ test_reset(&t);
+
+ ua_stop_all(true);
+ ua_close();
+
+ mem_deref(dnssrv);
+
+ return err;
+}
+
+
+int test_ua_register_dns(void)
+{
+ int err = 0;
+
+ err |= reg_dns(SIP_TRANSP_UDP);
+ TEST_ERR(err);
+ err |= reg_dns(SIP_TRANSP_TCP);
+ TEST_ERR(err);
+#ifdef USE_TLS
+ err |= reg_dns(SIP_TRANSP_TLS);
+ TEST_ERR(err);
+#endif
+
+ out:
+ return err;
+}
+
+
+#define USER "alfredh"
+#define PASS "password"
+#define DOMAIN "localhost"
+
+static int reg_auth(enum sip_transp tp)
+{
+ struct sa laddr;
+ struct test t;
+ char aor[256];
+ int err;
+
+ memset(&t, 0, sizeof t);
+
+ err = sip_server_alloc(&t.srvv[0]);
+ if (err) {
+ warning("failed to create sip server (%d/%m)\n", err, err);
+ goto out;
+ }
+
+ err = domain_add(t.srvv[0], DOMAIN);
+ TEST_ERR(err);
+
+ err = user_add(domain_lookup(t.srvv[0], DOMAIN)->ht_usr,
+ "alfredh", "password", DOMAIN);
+ TEST_ERR(err);
+
+ t.srvv[0]->auth_enabled = true;
+
+ err = sip_transp_laddr(t.srvv[0]->sip, &laddr, tp, NULL);
+ if (err)
+ return err;
+
+ /* NOTE: angel brackets needed to parse ;transport parameter */
+ if (re_snprintf(aor, sizeof(aor),
+ "<sip:%s:%s@%s>;outbound=\"sip:%J;transport=%s\"",
+ USER,
+ PASS,
+ DOMAIN,
+ &laddr,
+ sip_transp_name(tp)) < 0)
+ return ENOMEM;
+
+ err = ua_alloc(&t.ua, aor);
+ TEST_ERR(err);
+
+ err = uag_event_register(ua_event_handler, &t);
+ if (err)
+ goto out;
+
+ /* run main-loop with timeout, wait for events */
+ err = re_main_timeout(5000);
+ if (err)
+ goto out;
+
+ if (t.err) {
+ err = t.err;
+ goto out;
+ }
+
+ ASSERT_TRUE(t.srvv[0]->n_register_req > 0);
+ ASSERT_EQ(tp, t.srvv[0]->tp_last);
+ ASSERT_TRUE(t.got_register_ok > 0);
+
+ out:
+ if (err) {
+ warning("selftest: ua_register test failed (%m)\n", err);
+ }
+ uag_event_unregister(ua_event_handler);
+ test_reset(&t);
+
+
+ return err;
+}
+
+
+int test_ua_register_auth(void)
+{
+ int err;
+
+ err = ua_init("test", true, true, true, false);
+ TEST_ERR(err);
+
+ err |= reg_auth(SIP_TRANSP_UDP);
+ TEST_ERR(err);
+ err |= reg_auth(SIP_TRANSP_TCP);
+ TEST_ERR(err);
+#ifdef USE_TLS
+ err |= reg_auth(SIP_TRANSP_TLS);
+ TEST_ERR(err);
+#endif
+
+ out:
+ ua_stop_all(true);
+ ua_close();
+
+ return err;
+}