From 5cbd1d17177236f7c4515f077c18d328c76af9b1 Mon Sep 17 00:00:00 2001 From: "Alfred E. Heggestad" Date: Sun, 4 Oct 2015 21:24:31 +0200 Subject: test: use new sipsrv from retest --- test/main.c | 2 +- test/mock/cert.c | 82 ++++++++++++++++++++++++++++++ test/mock/sipsrv.c | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++++ test/sip_server.c | 113 ----------------------------------------- test/srcs.mk | 18 +++++-- test/test.h | 32 ++++++++++-- test/ua.c | 27 +++++++--- 7 files changed, 291 insertions(+), 128 deletions(-) create mode 100644 test/mock/cert.c create mode 100644 test/mock/sipsrv.c delete mode 100644 test/sip_server.c (limited to 'test') diff --git a/test/main.c b/test/main.c index 11cc1b2..d39adfe 100644 --- a/test/main.c +++ b/test/main.c @@ -45,7 +45,7 @@ int main(void) if (err) return err; - re_printf("running test..\n"); + re_printf("running test version %s\n", BARESIP_VERSION); /* note: run SIP-traffic on localhost */ config = conf_config(); diff --git a/test/mock/cert.c b/test/mock/cert.c new file mode 100644 index 0000000..a711082 --- /dev/null +++ b/test/mock/cert.c @@ -0,0 +1,82 @@ +/** + * @file cert.c TLS Certificate + * + * Copyright (C) 2010 Creytiv.com + */ +#include +#include "../test.h" + + +/** + * Dummy certificate for testing. + * + * + * It was generated like this: + * + * $ openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem \ + * -days 36500 -nodes + * + * + * Dumping information: + * + * $ openssl x509 -subject -dates -fingerprint -in cert.pem + * subject= /C=NO/ST=Retest/O=Retest AS/CN=Mr Retest/emailAddress=re@test.org + * notBefore=Nov 23 18:40:38 2014 GMT + * notAfter=Oct 30 18:40:38 2114 GMT + * Fingerprint=49:A4:E9:F4:80:3A:D4:38:84:F1:64:C3:B9:4B:F9:BB:80:F7:07:76 + */ + +const char test_certificate[] = + +"-----BEGIN CERTIFICATE-----\r\n" +"MIIDmTCCAoGgAwIBAgIJAIt1/MAlTpB7MA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNV\r\n" +"BAYTAk5PMQ8wDQYDVQQIDAZSZXRlc3QxEjAQBgNVBAoMCVJldGVzdCBBUzESMBAG\r\n" +"A1UEAwwJTXIgUmV0ZXN0MRowGAYJKoZIhvcNAQkBFgtyZUB0ZXN0Lm9yZzAgFw0x\r\n" +"NDExMjMxODQwMzhaGA8yMTE0MTAzMDE4NDAzOFowYjELMAkGA1UEBhMCTk8xDzAN\r\n" +"BgNVBAgMBlJldGVzdDESMBAGA1UECgwJUmV0ZXN0IEFTMRIwEAYDVQQDDAlNciBS\r\n" +"ZXRlc3QxGjAYBgkqhkiG9w0BCQEWC3JlQHRlc3Qub3JnMIIBIjANBgkqhkiG9w0B\r\n" +"AQEFAAOCAQ8AMIIBCgKCAQEAqnX4j6WK6tcN/X+C8C9ZSSlhVT2OdPB/lAPa3T3w\r\n" +"eB3wu2C9gnZcCSvekBhyFKSi4w0Az5HNjJWWQqpSeYW2MCEKI97DIu0hg/5qn2le\r\n" +"2sDjo4u/SNdH0CQHaLD2Xu0hhvZ/dTIulxpy5hLVmxs8/UZ8QKZ3vxDFE92p4LBL\r\n" +"tLYz6+TvWovmUqYL97J+2muXUMcZCCTbk8DQSGLBbsawXejVF8RgPiFHCvefybUQ\r\n" +"JCbtTDTfMykVnMEv3yMmfcXG/mwG8CLDRv7y8wh632aDdWfKN+g70gH0CFdjn070\r\n" +"eIZyJ3TyRi4b55RSC4FAdP2YKToOUH55N86wrbprnHb8swIDAQABo1AwTjAdBgNV\r\n" +"HQ4EFgQUcaZeVPUmMPFvKwYzn27b8BUJV3AwHwYDVR0jBBgwFoAUcaZeVPUmMPFv\r\n" +"KwYzn27b8BUJV3AwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAbsMt\r\n" +"zruNpBUZv08vdoWN9QWaJrmv8fvcx/RcuVLRuAaLYExEUJnoz3+dNFbR38BvncVC\r\n" +"LlDcSIK06JIHX6E7gJegWQdECoO/YgQGCwoIoQJtNCybxtZccb5uAGY/+qO3uOx0\r\n" +"Vx1NxrAMh5cpOIhZ8XiSYA2+JB71prW97diSQS+cU9xWCJxPU7UqQ10nV7PbfSmp\r\n" +"XTnj+togZPXYzJmSQR4RoM4Vqu27syo7xYQ90twoRKpRYTPdDTArpkTn6KuUuCJ1\r\n" +"t2v9LOkkxOvF11rLY6rLf0BG4XYkhnz4CLLt428wvAPykPcs95Q9TwpF/nKEwyfh\r\n" +"J+cC3FZTiBf/YmPPaA==\r\n" +"-----END CERTIFICATE-----\r\n" + +"-----BEGIN PRIVATE KEY-----\r\n" +"MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCqdfiPpYrq1w39\r\n" +"f4LwL1lJKWFVPY508H+UA9rdPfB4HfC7YL2CdlwJK96QGHIUpKLjDQDPkc2MlZZC\r\n" +"qlJ5hbYwIQoj3sMi7SGD/mqfaV7awOOji79I10fQJAdosPZe7SGG9n91Mi6XGnLm\r\n" +"EtWbGzz9RnxApne/EMUT3angsEu0tjPr5O9ai+ZSpgv3sn7aa5dQxxkIJNuTwNBI\r\n" +"YsFuxrBd6NUXxGA+IUcK95/JtRAkJu1MNN8zKRWcwS/fIyZ9xcb+bAbwIsNG/vLz\r\n" +"CHrfZoN1Z8o36DvSAfQIV2OfTvR4hnIndPJGLhvnlFILgUB0/ZgpOg5Qfnk3zrCt\r\n" +"umucdvyzAgMBAAECggEAC1xxhKFz8NMEi7DD+V4uhUHMyvGfXQvqdOMM41INhPP5\r\n" +"54M7HkblO3dBDjmS4O1YLenf8/WzzXrq2OahOJhA3FRXaKygNOO5KCL82EMdn1bb\r\n" +"1TqrNR+kGatNEx04TntfkK89L4J4uHl6zvrSYdQe7IKWJXjy4jkr6XcMq30Ujqa6\r\n" +"Val03Cr40VL0ZSYXnwTf/P65GtQTdyTOemYkUbMH9qRoxHmE7ZsPRpbXU4k30JWh\r\n" +"6VYy+7h5XmjrX+VdIiia6sMjy0mbtsxJb6DOo19ro4DfF5JmFZpXnBhsJGhMxiEM\r\n" +"94QEC5Tv6b0hWomFpOm3I5jOnktavCFQ1NsNHUspgQKBgQDUQm2+F06YdC6Pgt+9\r\n" +"COnd9rz2lB2TjGRIJvis6MW7EfQ7XHkH9y/sDGLzINBVn6DkaHmQZDrIg77Mey+H\r\n" +"LG0QL6+7WK7c1X/Zga6LKvkLlmcMWq6i1uu+Q3UODu7XcFh6f8kDThP+BubfUWpw\r\n" +"rCRq74gF1JzQISoKqmyW/AXMZQKBgQDNln0jzgh/ySWRjJbuh6GqPQunDQsh3K3I\r\n" +"4WDHK40NHFgIzPomKO+pqsOu3V/X81NARqfUyoIp/455YRheLHBUJg7maLfxrBq/\r\n" +"qQPEUwSAI6lheMz1WNWri65GvwBlVENajVuMh/xfmKVL1KVV+LXGO5L1UClWITCM\r\n" +"VSC0QT8XNwKBgQC7bYUWS+JdAIp0su36MDrCgzPM0HFlbpzGkZMYq9qeG3Z8TGWb\r\n" +"QQyR9UYSxjDwyqn5xr9BXyABG0SJr2UCiZosps8YMXEHE4d3eumzfdi4ALEx2YlH\r\n" +"xVwZf9uG9Gy21D9svBW102YX8+Q94diJcZgezTBhZaKqrf4/uMl2cUh1eQKBgQDB\r\n" +"heZYXOqdN0A5CUlOUbg5YutkHaAcCPpBvP33niRRchvgdOsIHsKzSL6ZDWPaCP+V\r\n" +"4qy7XsE2PYzk7yQcCeLXI1glRe/Y+3PWdIfKN4dmA6u+yBLO5QeFSqALkmISAEbC\r\n" +"p4vE9oD3j94RSqM0EUEy0ANfDk1K+UUU5FE7vKth8wKBgQCoKvPNfC3FmyhLK7EK\r\n" +"zgfIYAcoi52EFu6xQ9PvZHg60ptYvq1L+H6LR8cxYfcrPTt3aDbFf41RahPkokNh\r\n" +"2HDxiHd4HwWkAGiqZXCTA2znb+rnJ9fheI6g/Wb3p+oGeCFHMcdUcsl1qWBFDtax\r\n" +"ygS/tEFgy1z2dVMLbLKqEUscsA==\r\n" +"-----END PRIVATE KEY-----\r\n" +; diff --git a/test/mock/sipsrv.c b/test/mock/sipsrv.c new file mode 100644 index 0000000..0707962 --- /dev/null +++ b/test/mock/sipsrv.c @@ -0,0 +1,145 @@ +/** + * @file mock/sipsrv.c Mock SIP server + * + * Copyright (C) 2010 - 2015 Creytiv.com + */ +#include +#include +#include "../test.h" + + +#define DEBUG_MODULE "mock/sipsrv" +#define DEBUG_LEVEL 5 +#include + + +#define LOCAL_PORT 0 +#define LOCAL_SECURE_PORT 0 + + +static bool sip_msg_handler(const struct sip_msg *msg, void *arg) +{ + struct sip_server *srv = arg; + int err; + +#if 0 + DEBUG_NOTICE("recv %r via %s\n", &msg->met, sip_transp_name(msg->tp)); +#endif + + if (0 == pl_strcmp(&msg->met, "REGISTER")) { + ++srv->n_register_req; + } + else { + DEBUG_NOTICE("method not handled (%r)\n", &msg->met); + return false; + } + + srv->tp_last = msg->tp; + + if (srv->terminate) + err = sip_reply(srv->sip, msg, 503, "Server Error"); + else + err = sip_reply(srv->sip, msg, 200, "OK"); + + if (err) { + DEBUG_WARNING("could not reply: %m\n", err); + } + +#if 1 + if (srv->terminate) + re_cancel(); +#endif + + return true; +} + + +static void destructor(void *arg) +{ + struct sip_server *srv = arg; + + srv->terminate = true; + + sip_close(srv->sip, false); + mem_deref(srv->sip); +} + + +int sip_server_alloc(struct sip_server **srvp) +{ + struct sip_server *srv; + struct sa laddr, laddrs; + struct tls *tls = NULL; + int err; + + if (!srvp) + return EINVAL; + + srv = mem_zalloc(sizeof *srv, destructor); + if (!srv) + return ENOMEM; + + err = sa_set_str(&laddr, "127.0.0.1", LOCAL_PORT); + err |= sa_set_str(&laddrs, "127.0.0.1", LOCAL_SECURE_PORT); + if (err) + goto out; + + err = sip_alloc(&srv->sip, NULL, 16, 16, 16, + "mock SIP server", NULL, NULL); + if (err) + goto out; + + err |= sip_transp_add(srv->sip, SIP_TRANSP_UDP, &laddr); + err |= sip_transp_add(srv->sip, SIP_TRANSP_TCP, &laddr); + if (err) + goto out; + +#ifdef USE_TLS + err = tls_alloc(&tls, TLS_METHOD_SSLV23, NULL, NULL); + if (err) + goto out; + + err = tls_set_certificate(tls, test_certificate, + strlen(test_certificate)); + if (err) + goto out; + + err |= sip_transp_add(srv->sip, SIP_TRANSP_TLS, &laddrs, tls); +#endif + if (err) + goto out; + + err = sip_listen(&srv->lsnr, srv->sip, true, sip_msg_handler, srv); + if (err) + goto out; + + out: + mem_deref(tls); + if (err) + mem_deref(srv); + else + *srvp = srv; + + return err; +} + + +int sip_server_uri(struct sip_server *srv, char *uri, size_t sz, + enum sip_transp tp) +{ + struct sa laddr; + int err; + + if (!srv || !uri || !sz) + return EINVAL; + + err = sip_transp_laddr(srv->sip, &laddr, tp, NULL); + if (err) + return err; + + if (re_snprintf(uri, sz, "sip:x:x@%J%s", + &laddr, sip_transp_param(tp)) < 0) + return ENOMEM; + + return 0; +} diff --git a/test/sip_server.c b/test/sip_server.c deleted file mode 100644 index 0e637de..0000000 --- a/test/sip_server.c +++ /dev/null @@ -1,113 +0,0 @@ -/** - * @file sip_server.c Selftest for Baresip core -- SIP Server - * - * Copyright (C) 2010 Creytiv.com - */ -#include -#include -#include -#include "test.h" - - -static void udp_recv(const struct sa *src, struct mbuf *mb, void *arg) -{ - struct sip_server *srv = arg; - struct sip_msg *msg; - int err; - -#if 0 - re_printf("sip: %zu bytes from %J\n", mbuf_get_left(mb), src); - re_printf("%b\n", mb->buf, mb->end); -#endif - - err = sip_msg_decode(&msg, mb); - if (err) { - warning("selftest: sip_msg_decode: %m\n", err); - return; - } - - if (0 == pl_strcmp(&msg->met, "REGISTER")) - srv->got_register_req = true; - - msg->sock = mem_ref(srv->us); - msg->src = *src; - msg->dst = srv->laddr; - msg->tp = SIP_TRANSP_UDP; - - if (srv->terminate) - err = sip_reply(srv->sip, msg, 503, "Server Error"); - else - err = sip_reply(srv->sip, msg, 200, "OK"); - if (err) { - warning("selftest: could not reply: %m\n", err); - } - - mem_deref(msg); - - if (srv->terminate) - re_cancel(); -} - - -static void destructor(void *arg) -{ - struct sip_server *srv = arg; - - sip_close(srv->sip, false); - mem_deref(srv->sip); - - mem_deref(srv->us); -} - - -int sip_server_create(struct sip_server **srvp) -{ - struct sip_server *srv; - struct sa laddr_tp; - int err; - - srv = mem_zalloc(sizeof *srv, destructor); - if (!srv) - return ENOMEM; - - err = sa_set_str(&laddr_tp, "127.0.0.1", 0); - err |= sa_set_str(&srv->laddr, "127.0.0.1", 0); - if (err) - goto out; - - err = sip_alloc(&srv->sip, NULL, 16, 16, 16, - "dummy SIP registrar", NULL, NULL); - if (err) - goto out; - - err = sip_transp_add(srv->sip, SIP_TRANSP_UDP, &laddr_tp); - if (err) { - warning("failed to add sip transport (%m)\n", err); - goto out; - } - - err = udp_listen(&srv->us, &srv->laddr, udp_recv, srv); - if (err) { - warning("sip: udp_listen on '%J' failed (%d/%m)\n", - &srv->laddr, err, err); - goto out; - } - - err = udp_local_get(srv->us, &srv->laddr); - if (err) { - warning("sip: udp_local_get\n"); - goto out; - } - -#if 0 - re_printf("sip: listen on %J\n", &srv->laddr); -#endif - - out: - if (err) - mem_deref(srv); - else - *srvp = srv; - - return err; -} diff --git a/test/srcs.mk b/test/srcs.mk index 4115fdb..1caafbb 100644 --- a/test/srcs.mk +++ b/test/srcs.mk @@ -4,12 +4,24 @@ # Copyright (C) 2010 Creytiv.com # + +# +# Test-cases: +# TEST_SRCS += cmd.c TEST_SRCS += ua.c +TEST_SRCS += cplusplus.c -TEST_SRCS += sip_server.c -TEST_SRCS += test.c -TEST_SRCS += cplusplus.c +# +# Mocks +# +TEST_SRCS += mock/sipsrv.c +ifneq ($(USE_TLS),) +TEST_SRCS += mock/cert.c +endif + + +TEST_SRCS += test.c TEST_SRCS += main.c diff --git a/test/test.h b/test/test.h index c2caa6a..61ddd27 100644 --- a/test/test.h +++ b/test/test.h @@ -33,21 +33,43 @@ goto out; \ } +#define TEST_ERR(err) \ + if ((err)) { \ + (void)re_fprintf(stderr, "\n"); \ + warning("TEST_ERR: %s:%u:" \ + " (%m)\n", \ + __FILE__, __LINE__, \ + (err)); \ + goto out; \ + } + /* helpers */ int re_main_timeout(uint32_t timeout); + +#ifdef USE_TLS +extern const char test_certificate[]; +#endif + + +/* + * SIP Server + */ + struct sip_server { - struct sa laddr; - struct udp_sock *us; struct sip *sip; - - bool got_register_req; + struct sip_lsnr *lsnr; bool terminate; + + unsigned n_register_req; + enum sip_transp tp_last; }; -int sip_server_create(struct sip_server **srvp); +int sip_server_alloc(struct sip_server **srvp); +int sip_server_uri(struct sip_server *srv, char *uri, size_t sz, + enum sip_transp tp); /* test cases */ diff --git a/test/ua.c b/test/ua.c index ddfa76e..80fd3a4 100644 --- a/test/ua.c +++ b/test/ua.c @@ -50,7 +50,7 @@ static void ua_event_handler(struct ua *ua, enum ua_event ev, } -int test_ua_register(void) +static int reg(enum sip_transp tp) { struct test t; char aor[256]; @@ -58,17 +58,17 @@ int test_ua_register(void) memset(&t, 0, sizeof t); - err = sip_server_create(&t.srv); + err = sip_server_alloc(&t.srv); if (err) { warning("failed to create sip server (%d/%m)\n", err, err); goto out; } - re_snprintf(aor, sizeof(aor), "sip:x:x@%J", &t.srv->laddr); + err = sip_server_uri(t.srv, aor, sizeof(aor), tp); + TEST_ERR(err); err = ua_alloc(&t.ua, aor); - if (err) - goto out; + TEST_ERR(err); err = uag_event_register(ua_event_handler, &t); if (err) @@ -82,7 +82,8 @@ int test_ua_register(void) if (t.err) err = t.err; - ASSERT_TRUE(t.srv->got_register_req); + ASSERT_TRUE(t.srv->n_register_req > 0); + ASSERT_EQ(tp, t.srv->tp_last); ASSERT_TRUE(t.got_register_ok); out: @@ -97,6 +98,20 @@ int test_ua_register(void) } +int test_ua_register(void) +{ + int err = 0; + + err = reg(SIP_TRANSP_UDP); +#if 0 + err |= reg(SIP_TRANSP_TCP); + err |= reg(SIP_TRANSP_TLS); +#endif + + return err; +} + + int test_ua_alloc(void) { struct ua *ua; -- cgit v1.2.3