/*
 * (C) 2016 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
 * All Rights Reserved
 *
 * Author: Neels Hofmeyr
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

#include <string.h>

#include <osmocom/core/msgb.h>
#include <osmocom/core/application.h>
#include <osmocom/mgcp_client/mgcp_client.h>
#include <osmocom/mgcp_client/mgcp_client_internal.h>
#include <errno.h>

void *ctx;

#define buf_len 4096

#if 0
static struct msgb *from_hex(const char *hex)
{
	struct msgb *msg = msgb_alloc(buf_len, "mgcpgw_test_from_hex");
	unsigned int l = osmo_hexparse(hex, msg->data, buf_len);
	msg->l2h = msgb_put(msg, l);
	return msg;
}

static struct msgb *mgcp_from_str(const char *head, const char *params)
{
	struct msgb *msg = msgb_alloc(buf_len, "mgcp_from_str");
	unsigned int l;
	char *data;
	l = strlen(head);
	msg->l2h = msgb_put(msg, l);
	data = (char*)msgb_l2(msg);
	osmo_strlcpy(data, head, l);

	data = (char*)msgb_put(msg, 1);
	*data = '\n';

	l = strlen(params);
	data = (char*)msgb_put(msg, l);
	osmo_strlcpy(data, params, l);

	return msg;
}
#endif

static struct msgb *from_str(const char *str)
{
	struct msgb *msg = msgb_alloc(buf_len, "from_str");
	unsigned int l = strlen(str);
	char *data;
	msg->l2h = msgb_put(msg, l);
	data = (char*)msgb_l2(msg);
	osmo_strlcpy(data, str, l);
	return msg;
}

static struct mgcp_client_conf *conf;
struct mgcp_client *mgcp = NULL;

static int reply_to(mgcp_trans_id_t trans_id, int code, const char *comment,
		    const char *params)
{
	static char compose[4096 - 128];
	int len;

	len = snprintf(compose, sizeof(compose),
		       "%d %u %s\r\n%s",
		       code, trans_id, comment, params);
	OSMO_ASSERT(len < sizeof(compose));
	OSMO_ASSERT(len > 0);

	printf("composed response:\n-----\n%s\n-----\n",
	       compose);
	return mgcp_client_rx(mgcp, from_str(compose));
}

void test_response_cb(struct mgcp_response *response, void *priv)
{
	unsigned int i;
	OSMO_ASSERT(priv == mgcp);
	mgcp_response_parse_params(response);

	printf("response cb received:\n");
	printf("  head.response_code = %d\n", response->head.response_code);
	printf("  head.trans_id = %u\n", response->head.trans_id);
	printf("  head.conn_id = %s\n", response->head.conn_id);
	printf("  head.comment = %s\n", response->head.comment);
	printf("  audio_port = %u\n", response->audio_port);
	printf("  audio_ip = %s\n", response->audio_ip);
	printf("  ptime = %u\n", response->ptime);
	printf("  ptmap_len = %u\n", response->ptmap_len);
	for(i=0;i<response->ptmap_len;i++) {
		printf("  ptmap[%u].codec = %u\n", i, response->ptmap[i].codec);
		printf("  ptmap[%u].pt = %u\n", i, response->ptmap[i].pt);
	}

}

mgcp_trans_id_t dummy_mgcp_send(struct msgb *msg)
{
	mgcp_trans_id_t trans_id;
	trans_id = msg->cb[MSGB_CB_MGCP_TRANS_ID];
	char *end;

	OSMO_ASSERT(mgcp_client_pending_add(mgcp, trans_id, test_response_cb, mgcp));

	end = (char*)msgb_put(msg, 1);
	*end = '\0';
	printf("composed:\n-----\n%s\n-----\n",
	       (char*)msgb_l2(msg));

	talloc_free(msg);
	return trans_id;
}

void test_mgcp_msg(void)
{
	struct msgb *msg;
	char audio_ip_overflow[5000];

	/* A message struct prefilled with some arbitary values */
	struct mgcp_msg mgcp_msg = {
		.audio_ip = "192.168.100.23",
		.endpoint = "23@mgw",
		.audio_port = 1234,
		.call_id = 47,
		.conn_id = "11",
		.conn_mode = MGCP_CONN_RECV_SEND,
		.ptime = 20,
		.ptmap = {
			{ .codec = CODEC_GSM_8000_1, .pt = CODEC_GSM_8000_1 },
			{ .codec = CODEC_AMR_8000_1, .pt = CODEC_AMR_8000_1 },
			{ .codec = CODEC_GSMEFR_8000_1, .pt = 96 },
		},
		.ptmap_len = 1,
		.x_osmo_ign = MGCP_X_OSMO_IGN_CALLID,
		.x_osmo_osmux_cid = -1, /* wildcard */
	};

	if (mgcp)
		talloc_free(mgcp);
	mgcp = mgcp_client_init(ctx, conf);

	printf("\n");

	printf("Generated CRCX message:\n");
	mgcp_msg.verb = MGCP_VERB_CRCX;
	mgcp_msg.presence =
	    (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
	     MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE);
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	printf("%s\n", (char *)msg->data);

	printf("Generated CRCX message (two codecs):\n");
	mgcp_msg.verb = MGCP_VERB_CRCX;
	mgcp_msg.presence =
	    (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
	     MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE);
	mgcp_msg.ptmap_len = 2;
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	mgcp_msg.ptmap_len = 1;
	printf("%s\n", (char *)msg->data);

	printf("Generated CRCX message (three codecs, one with custom pt):\n");
	mgcp_msg.verb = MGCP_VERB_CRCX;
	mgcp_msg.presence =
	    (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
	     MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE);
	mgcp_msg.ptmap_len = 3;
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	mgcp_msg.ptmap_len = 1;
	printf("%s\n", (char *)msg->data);

	printf("Generated MDCX message:\n");
	mgcp_msg.verb = MGCP_VERB_MDCX;
	mgcp_msg.presence =
	    (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
	     MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE |
	     MGCP_MSG_PRESENCE_AUDIO_IP | MGCP_MSG_PRESENCE_AUDIO_PORT);
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	printf("%s\n", (char *)msg->data);

	printf("Generated MDCX message (two codecs):\n");
	mgcp_msg.verb = MGCP_VERB_MDCX;
	mgcp_msg.presence =
	    (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
	     MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE |
	     MGCP_MSG_PRESENCE_AUDIO_IP | MGCP_MSG_PRESENCE_AUDIO_PORT);
	mgcp_msg.ptmap_len = 2;
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	mgcp_msg.ptmap_len = 1;
	printf("%s\n", (char *)msg->data);

	printf("Generated MDCX message (three codecs, one with custom pt):\n");
	mgcp_msg.verb = MGCP_VERB_MDCX;
	mgcp_msg.presence =
	    (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
	     MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE |
	     MGCP_MSG_PRESENCE_AUDIO_IP | MGCP_MSG_PRESENCE_AUDIO_PORT);
	mgcp_msg.ptmap_len = 3;
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	mgcp_msg.ptmap_len = 1;
	printf("%s\n", (char *)msg->data);

	printf("Generated DLCX message:\n");
	mgcp_msg.verb = MGCP_VERB_DLCX;
	mgcp_msg.presence =
	    (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
	     MGCP_MSG_PRESENCE_CONN_ID);
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	printf("%s\n", (char *)msg->data);

	printf("Generated AUEP message:\n");
	mgcp_msg.verb = MGCP_VERB_AUEP;
	mgcp_msg.presence = (MGCP_MSG_PRESENCE_ENDPOINT);
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	printf("%s\n", msg->data);

	printf("Generated RSIP message:\n");
	mgcp_msg.verb = MGCP_VERB_RSIP;
	mgcp_msg.presence = (MGCP_MSG_PRESENCE_ENDPOINT);
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	printf("%s\n", (char *)msg->data);

	printf("Generate X-Osmo-IGN message:\n");
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	mgcp_msg.verb = MGCP_VERB_CRCX;
	mgcp_msg.presence =
	    (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
	     MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE
	     | MGCP_MSG_PRESENCE_X_OSMO_IGN);
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	printf("%s\n", (char *)msg->data);

	printf("Generate X-Osmo-Osmux message:\n");
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	mgcp_msg.verb = MGCP_VERB_CRCX;
	mgcp_msg.presence =
	    (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
	     MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE
	     | MGCP_MSG_PRESENCE_X_OSMO_OSMUX_CID);
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	printf("%s\n", (char *)msg->data);

	printf("Generate X-Osmo-Osmux message (fixed CID 2):\n");
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	mgcp_msg.verb = MGCP_VERB_CRCX;
	mgcp_msg.x_osmo_osmux_cid = 2;
	mgcp_msg.presence =
	    (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
	     MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE
	     | MGCP_MSG_PRESENCE_X_OSMO_OSMUX_CID);
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	printf("%s\n", (char *)msg->data);

	printf("Generate X-Osmo-Osmux message (MDCX):\n");
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	mgcp_msg.verb = MGCP_VERB_MDCX;
	mgcp_msg.x_osmo_osmux_cid = 2;
	mgcp_msg.presence =
	    (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
	     MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE
	     | MGCP_MSG_PRESENCE_X_OSMO_OSMUX_CID);
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	printf("%s\n", (char *)msg->data);

	printf("Overfolow test:\n");
	mgcp_msg.verb = MGCP_VERB_MDCX;
	mgcp_msg.presence =
	    (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
	     MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE |
	     MGCP_MSG_PRESENCE_AUDIO_IP | MGCP_MSG_PRESENCE_AUDIO_PORT);
	memset(audio_ip_overflow, 'X', sizeof(audio_ip_overflow));
	audio_ip_overflow[1] = '.';
	audio_ip_overflow[sizeof(audio_ip_overflow) - 1] = '\0';
	mgcp_msg.audio_ip = audio_ip_overflow;
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	OSMO_ASSERT(msg == NULL);

	printf("IPv6 test:\n");
	mgcp_msg.verb = MGCP_VERB_MDCX;
	mgcp_msg.presence =
	    (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID |
	     MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE |
	     MGCP_MSG_PRESENCE_AUDIO_IP | MGCP_MSG_PRESENCE_AUDIO_PORT);
	mgcp_msg.audio_ip = "2001:db8:1::ab9:c0a8:102";
	mgcp->actual.remote_addr = "::1";
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	printf("%s\n", (char *)msg->data);

	printf("\n");
	msgb_free(msg);
}

void test_mgcp_client_cancel(void)
{
	mgcp_trans_id_t trans_id;
	struct msgb *msg;
	struct mgcp_msg mgcp_msg = {
		.verb = MGCP_VERB_CRCX,
		.audio_ip = "192.168.100.23",
		.endpoint = "23@mgw",
		.audio_port = 1234,
		.call_id = 47,
		.conn_id = "11",
		.conn_mode = MGCP_CONN_RECV_SEND,
		.presence = (MGCP_MSG_PRESENCE_ENDPOINT | MGCP_MSG_PRESENCE_CALL_ID
			     | MGCP_MSG_PRESENCE_CONN_ID | MGCP_MSG_PRESENCE_CONN_MODE),
		.ptime = 20,
		.ptmap = {
			{ .codec = CODEC_AMR_8000_1, .pt = CODEC_AMR_8000_1 },
		},
		.ptmap_len = 1
	};

	printf("\n%s():\n", __func__);
	fprintf(stderr, "\n%s():\n", __func__);

	if (mgcp)
		talloc_free(mgcp);
	mgcp = mgcp_client_init(ctx, conf);

	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	trans_id = mgcp_msg_trans_id(msg);
	fprintf(stderr, "- composed msg with trans_id=%u\n", trans_id);

	fprintf(stderr, "- not in queue yet, cannot cancel yet\n");
	OSMO_ASSERT(mgcp_client_cancel(mgcp, trans_id) == -ENOENT);

	fprintf(stderr, "- enqueue\n");
	dummy_mgcp_send(msg);

	fprintf(stderr, "- cancel succeeds\n");
	OSMO_ASSERT(mgcp_client_cancel(mgcp, trans_id) == 0);

	fprintf(stderr, "- late response gets discarded\n");
	OSMO_ASSERT(reply_to(trans_id, 200, "OK", "I: 1\r\n\r\nv=0\r\n") == -ENOENT);

	fprintf(stderr, "- canceling again does nothing\n");
	OSMO_ASSERT(mgcp_client_cancel(mgcp, trans_id) == -ENOENT);

	fprintf(stderr, "%s() done\n", __func__);
}

struct sdp_section_start_test {
	const char *body;
	int expect_rc;
	struct mgcp_response expect_params;
};

static struct sdp_section_start_test sdp_section_start_tests[] = {
	{
		.body = "",
		.expect_rc = 0,
	},
	{
		.body = "\n\n",
	},
	{
		.body = "\r\n\r\n",
	},
	{
		.body = "\n\r\n\r",
	},
	{
		.body = "some mgcp header data\r\nand header params"
			"\n\n"
			"m=audio 23\r\n",
		.expect_params = {
			.audio_port = 23,
		},
	},
	{
		.body = "some mgcp header data\r\nand header params"
			"\r\n\r\n"
			"m=audio 23\r\n",
		.expect_params = {
			.audio_port = 23,
		},
	},
	{
		.body = "some mgcp header data\r\nand header params"
			"\n\r\n\r"
			"m=audio 23\r\n",
		.expect_params = {
			.audio_port = 23,
		},
	},
	{
		.body = "some mgcp header data\r\nand header params"
			"\n\r\n"
			"m=audio 23\r\n",
		.expect_rc = 0,
	},
	{
		.body = "some mgcp header data\r\nand header params"
			"\r\n\r"
			"m=audio 23\r\n",
		.expect_rc = 0,
	},
	{
		.body = "some mgcp header data\r\nand header params"
			"\n\r\r"
			"m=audio 23\r\n",
		.expect_rc = 0,
	},
	{
		.body = "some mgcp header data\r\nand header params"
			"\r\n\r\n"
			"c=IN IP4 1.2.3.4\r\n",
		.expect_params = {
			.audio_ip = "1.2.3.4",
		},
		.expect_rc = 0,
	},
	{
		.body = "some mgcp header data\r\nand header params"
			"\r\n\r\n"
			"c=IN IP6 2001:db8:1::ab9:c0a8:102\r\n",
		.expect_params = {
			.audio_ip = "2001:db8:1::ab9:c0a8:102",
		},
		.expect_rc = 0,
	},
	{
		.body = "some mgcp header data\r\nand header params"
			"\r\n\r\n"
			"c=IN IP6 1.2.3.4\r\n",
		.expect_rc = -22,
	},
	{
		.body = "some mgcp header data\r\nand header params"
			"\r\n\r\n"
			"c=IN IP4 ::1\r\n",
		.expect_rc = -22,
	},
	{
		.body = "some mgcp header data\r\nand header params"
			"\r\n\r\n"
			"c=IN IP4 notanip\r\n",
		.expect_rc = -22,
	},
	{
		.body = "some mgcp header data\r\nand header params"
			"\r\n\r\n"
			"c=IN IP4 1.2.3.4.5.6\r\n",
		.expect_rc = -22,
	},
	{
		.body = "some mgcp header data\r\nand header params"
			"\r\n\r\n"
			"c=IN IP4 1.2 .3\r\n",
		.expect_rc = -22,
	},
	{
		.body = "some mgcp header data\r\nand header params"
			"\r\n\r\n"
			"c=IN IP4 1.2 .3\r\n",
		.expect_rc = -22,
	},
	{
		.body = "some mgcp header data\r\nand header params"
			"\r\n\r\n"
			"c=IN IP4 \r\n",
		.expect_rc = -22,
	},
};

void test_sdp_section_start(void)
{
	int i;
	int failures = 0;

	for (i = 0; i < ARRAY_SIZE(sdp_section_start_tests); i++) {
		int rc;
		struct sdp_section_start_test *t = &sdp_section_start_tests[i];
		struct mgcp_response *r = talloc_zero(ctx, struct mgcp_response);

		r->body = talloc_strdup(r, t->body);

		printf("\n%s() test [%d]:\n", __func__, i);
		fprintf(stderr, "\n%s() test [%d]:\n", __func__, i);
		fprintf(stderr, "body: \"%s\"\n", osmo_escape_str(r->body, -1));

		rc = mgcp_response_parse_params(r);

		fprintf(stderr, "got rc=%d\n", rc);
		if (rc != t->expect_rc) {
			fprintf(stderr, "FAIL: Expected rc=%d\n", t->expect_rc);
			failures++;
		}
		if (rc) {
			talloc_free(r);
			continue;
		}

		fprintf(stderr, "got audio_ip=\"%s\"\n", r->audio_ip);
		if (strcmp(r->audio_ip, t->expect_params.audio_ip)) {
			fprintf(stderr, "FAIL: Expected audio_ip=\"%s\"\n", t->expect_params.audio_ip);
			failures++;
		}
		fprintf(stderr, "got audio_port=%u\n", r->audio_port);
		if (r->audio_port != t->expect_params.audio_port) {
			fprintf(stderr, "FAIL: Expected audio_port=%u\n", t->expect_params.audio_port);
			failures++;
		}
		talloc_free(r);
	}

	OSMO_ASSERT(!failures);
}

static void test_map_str_to_codec(void)
{
	/* Full form */
	OSMO_ASSERT(map_str_to_codec("PCMU/8000/1") == CODEC_PCMU_8000_1);
	OSMO_ASSERT(map_str_to_codec("GSM/8000/1") == CODEC_GSM_8000_1);
	OSMO_ASSERT(map_str_to_codec("PCMA/8000/1") == CODEC_PCMA_8000_1);
	OSMO_ASSERT(map_str_to_codec("G729/8000/1") == CODEC_G729_8000_1);
	OSMO_ASSERT(map_str_to_codec("GSM-EFR/8000/1") == CODEC_GSMEFR_8000_1);
	OSMO_ASSERT(map_str_to_codec("GSM-HR-08/8000/1") == CODEC_GSMHR_8000_1);
	OSMO_ASSERT(map_str_to_codec("AMR/8000/1") == CODEC_AMR_8000_1);
	OSMO_ASSERT(map_str_to_codec("AMR-WB/16000/1") == CODEC_AMRWB_16000_1);

	/* Short form */
	OSMO_ASSERT(map_str_to_codec("GSM-EFR") == CODEC_GSMEFR_8000_1);
	OSMO_ASSERT(map_str_to_codec("G729") == CODEC_G729_8000_1);
	OSMO_ASSERT(map_str_to_codec("GSM-HR-08") == CODEC_GSMHR_8000_1);

	/* We do not care about what is after the first delimiter */
	OSMO_ASSERT(map_str_to_codec("AMR-WB/123///456") == CODEC_AMRWB_16000_1);
	OSMO_ASSERT(map_str_to_codec("PCMA/asdf") == CODEC_PCMA_8000_1);
	OSMO_ASSERT(map_str_to_codec("GSM/qwertz") == CODEC_GSM_8000_1);

	/* A trailing delimiter should not hurt */
	OSMO_ASSERT(map_str_to_codec("AMR/") == CODEC_AMR_8000_1);
	OSMO_ASSERT(map_str_to_codec("G729/") == CODEC_G729_8000_1);
	OSMO_ASSERT(map_str_to_codec("GSM/") == CODEC_GSM_8000_1);

	/* This is expected to fail */
	OSMO_ASSERT(map_str_to_codec("INVALID/1234/7") == -1);
	OSMO_ASSERT(map_str_to_codec(NULL) == -1);
	OSMO_ASSERT(map_str_to_codec("") == -1);
	OSMO_ASSERT(map_str_to_codec("/////") == -1);

	/* The buffers are 64 bytes long, check what happens with overlong
	 * strings as input (This schould still work.) */
	OSMO_ASSERT(map_str_to_codec("AMR-WB/16000/1############################################################################################################") == CODEC_AMRWB_16000_1);

	/* This should not work, as there is no delimiter after the codec
	 * name */
	OSMO_ASSERT(map_str_to_codec("AMR-WB####################################################################################################################") == -1);
}

static void test_map_codec_to_pt_and_map_pt_to_codec(void)
{
	struct ptmap ptmap[10];
	unsigned int ptmap_len;
	unsigned int i;

	ptmap[0].codec = CODEC_GSMEFR_8000_1;
	ptmap[0].pt = 96;
	ptmap[1].codec = CODEC_GSMHR_8000_1;
	ptmap[1].pt = 97;
	ptmap[2].codec = CODEC_AMR_8000_1;
	ptmap[2].pt = 98;
	ptmap[3].codec = CODEC_AMRWB_16000_1;
	ptmap[3].pt = 99;
	ptmap_len = 4;

	/* Mappings that are covered by the table */
	for (i = 0; i < ptmap_len; i++)
		printf(" %u => %u\n", ptmap[i].codec, map_codec_to_pt(ptmap, ptmap_len, ptmap[i].codec));
	for (i = 0; i < ptmap_len; i++)
		printf(" %u <= %u\n", ptmap[i].pt, map_pt_to_codec(ptmap, ptmap_len, ptmap[i].pt));
	printf("\n");

	/* Map some codecs/payload types from the static range, result must
	 * always be a 1:1 mapping */
	printf(" %u => %u\n", CODEC_PCMU_8000_1, map_codec_to_pt(ptmap, ptmap_len, CODEC_PCMU_8000_1));
	printf(" %u => %u\n", CODEC_GSM_8000_1, map_codec_to_pt(ptmap, ptmap_len, CODEC_GSM_8000_1));
	printf(" %u => %u\n", CODEC_PCMA_8000_1, map_codec_to_pt(ptmap, ptmap_len, CODEC_PCMA_8000_1));
	printf(" %u => %u\n", CODEC_G729_8000_1, map_codec_to_pt(ptmap, ptmap_len, CODEC_G729_8000_1));
	printf(" %u <= %u\n", CODEC_PCMU_8000_1, map_pt_to_codec(ptmap, ptmap_len, CODEC_PCMU_8000_1));
	printf(" %u <= %u\n", CODEC_GSM_8000_1, map_pt_to_codec(ptmap, ptmap_len, CODEC_GSM_8000_1));
	printf(" %u <= %u\n", CODEC_PCMA_8000_1, map_pt_to_codec(ptmap, ptmap_len, CODEC_PCMA_8000_1));
	printf(" %u <= %u\n", CODEC_G729_8000_1, map_pt_to_codec(ptmap, ptmap_len, CODEC_G729_8000_1));
	printf("\n");

	/* Try to do mappings from statically defined range to danymic range and vice versa. This
	 * is illegal and should result into a 1:1 mapping */
	ptmap[3].codec = CODEC_AMRWB_16000_1;
	ptmap[3].pt = 2;
	ptmap[4].codec = CODEC_PCMU_8000_1;
	ptmap[4].pt = 100;
	ptmap_len = 5;

	/* Apply all mappings again, the illegal ones we defined should result into 1:1 mappings */
	for (i = 0; i < ptmap_len; i++)
		printf(" %u => %u\n", ptmap[i].codec, map_codec_to_pt(ptmap, ptmap_len, ptmap[i].codec));
	for (i = 0; i < ptmap_len; i++)
		printf(" %u <= %u\n", ptmap[i].pt, map_pt_to_codec(ptmap, ptmap_len, ptmap[i].pt));
	printf("\n");
}

void test_mgcp_client_e1_epname(void)
{
	char *epname;

	if (mgcp)
		talloc_free(mgcp);
	mgcp = mgcp_client_init(ctx, conf);

	/* Valid endpoint names */
	epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 1, 15, 64, 0);
	printf("%s\n", epname);
	epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 2, 14, 32, 0);
	printf("%s\n", epname);
	epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 3, 13, 32, 4);
	printf("%s\n", epname);
	epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 4, 12, 16, 0);
	printf("%s\n", epname);
	epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 5, 11, 16, 2);
	printf("%s\n", epname);
	epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 6, 10, 16, 4);
	printf("%s\n", epname);
	epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 7, 9, 16, 6);
	printf("%s\n", epname);
	epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 8, 8, 8, 0);
	printf("%s\n", epname);
	epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 9, 7, 8, 1);
	printf("%s\n", epname);
	epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 10, 6, 8, 2);
	printf("%s\n", epname);
	epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 11, 5, 8, 3);
	printf("%s\n", epname);
	epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 12, 4, 8, 4);
	printf("%s\n", epname);
	epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 13, 3, 8, 5);
	printf("%s\n", epname);
	epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 14, 2, 8, 6);
	printf("%s\n", epname);
	epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 15, 1, 8, 7);
	printf("%s\n", epname);

	/* A few invalid enpoint names */
	epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 15, 1, 128, 0);
	OSMO_ASSERT(epname == NULL);
	epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 15, 1, 8, 16);
	OSMO_ASSERT(epname == NULL);
	epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 15, 0, 8, 2);
	OSMO_ASSERT(epname == NULL);
	epname = (char *)mgcp_client_e1_epname(ctx, mgcp, 15, 64, 8, 2);
	OSMO_ASSERT(epname == NULL);
}

struct parse_response_test {
	const char *body;
	int expect_rc;
	struct mgcp_response expect_params;
};

static struct parse_response_test parse_response_tests[] = {
	{
		.body = "200 2 OK\r\n"
			"I: foo\r\n"
			"\r\n"
			"v=0\r\n"
			"o=- name 23 IN IP4 0.0.0.0\r\n"
			"s=-\r\n"
			"c=IN IP4 1.2.3.4\r\n"
			"t=0 0\r\n"
			"m=audio 23 RTP/AVP 112 3\r\n" /* <-- implicit: 3 = GSM-FR */
			"a=rtpmap:112 AMR/8000\r\n"
			"a=ptime:20\r\n",
		.expect_rc = 0,
		.expect_params = {
			.audio_port = 23,
			.audio_ip = "1.2.3.4",
			.ptmap = {
				{ .codec = CODEC_AMR_8000_1, .pt = 112 },
				{ .codec = CODEC_GSM_8000_1, .pt = 3 },
			},
			.ptmap_len = 2,
		},
	},
	{
		.body = "200 2 OK\r\n"
			"I: foo\r\n"
			"\r\n"
			"v=0\r\n"
			"o=- name 23 IN IP4 0.0.0.0\r\n"
			"s=-\r\n"
			"c=IN IP4 1.2.3.4\r\n"
			"t=0 0\r\n"
			"m=audio 23 RTP/AVP 112 3\r\n"
			"a=rtpmap:112 AMR/8000\r\n"
			"a=rtpmap:3 GSM/8000\r\n" /* 3 == GSM-FR implicitly, is an explicit entry a problem? */
			"a=ptime:20\r\n",
		.expect_rc = 0,
		.expect_params = {
			.audio_port = 23,
			.audio_ip = "1.2.3.4",
			.ptmap = {
				{ .codec = CODEC_AMR_8000_1, .pt = 112 },
				{ .codec = CODEC_GSM_8000_1, .pt = 3 }, /* no, not a problem */
			},
			.ptmap_len = 2,
		},
	},
	{
		.body = "200 2 OK\r\n"
			"I: foo\r\n"
			"\r\n"
			"v=0\r\n"
			"o=- name 23 IN IP4 0.0.0.0\r\n"
			"s=-\r\n"
			"c=IN IP4 1.2.3.4\r\n"
			"t=0 0\r\n"
			"m=audio 23 RTP/AVP 3\r\n" /* <-- 112 is missing here. Will it still appear? */
			"a=rtpmap:112 AMR/8000\r\n"
			"a=ptime:20\r\n",
		.expect_rc = 0,
		.expect_params = {
			.audio_port = 23,
			.audio_ip = "1.2.3.4",
			.ptmap = {
				{ .codec = CODEC_GSM_8000_1, .pt = 3 },
				{ .codec = CODEC_AMR_8000_1, .pt = 112 }, /* <-- yes, it was added to the end. */
			},
			.ptmap_len = 2,
		},
	},
	{
		/* test MGCP_MAX_CODECS */
		.body = "200 2 OK\r\n"
			"I: foo\r\n"
			"\r\n"
			"v=0\r\n"
			"o=- name 23 IN IP4 0.0.0.0\r\n"
			"s=-\r\n"
			"c=IN IP4 1.2.3.4\r\n"
			"t=0 0\r\n"
			"m=audio 23 RTP/AVP 101 102 103 104 105 106 107 108 109 110\r\n" /* <-- 10 codecs max */
			"a=rtpmap:101 AMR/8000\r\n"
			"a=rtpmap:102 AMR/8000\r\n"
			"a=rtpmap:103 AMR/8000\r\n"
			"a=rtpmap:104 AMR/8000\r\n"
			"a=rtpmap:105 AMR/8000\r\n"
			"a=rtpmap:106 AMR/8000\r\n"
			"a=rtpmap:107 AMR/8000\r\n"
			"a=rtpmap:108 AMR/8000\r\n"
			"a=rtpmap:109 AMR/8000\r\n"
			"a=rtpmap:110 AMR/8000\r\n"
			"a=ptime:20\r\n",
		.expect_rc = 0,
		.expect_params = {
			.audio_port = 23,
			.audio_ip = "1.2.3.4",
			.ptmap = {
				{ .codec = CODEC_AMR_8000_1, .pt = 101 },
				{ .codec = CODEC_AMR_8000_1, .pt = 102 },
				{ .codec = CODEC_AMR_8000_1, .pt = 103 },
				{ .codec = CODEC_AMR_8000_1, .pt = 104 },
				{ .codec = CODEC_AMR_8000_1, .pt = 105 },
				{ .codec = CODEC_AMR_8000_1, .pt = 106 },
				{ .codec = CODEC_AMR_8000_1, .pt = 107 },
				{ .codec = CODEC_AMR_8000_1, .pt = 108 },
				{ .codec = CODEC_AMR_8000_1, .pt = 109 },
				{ .codec = CODEC_AMR_8000_1, .pt = 110 },
			},
			.ptmap_len = 10,
		},
	},
	{
		/* test MGCP_MAX_CODECS */
		.body = "200 2 OK\r\n"
			"I: foo\r\n"
			"\r\n"
			"v=0\r\n"
			"o=- name 23 IN IP4 0.0.0.0\r\n"
			"s=-\r\n"
			"c=IN IP4 1.2.3.4\r\n"
			"t=0 0\r\n"
			"m=audio 23 RTP/AVP 101 102 103 104 105 106 107 108 109 110 3\r\n" /* <-- 11 > MGCP_MAX_CODECS */
			"a=rtpmap:101 AMR/8000\r\n"
			"a=rtpmap:102 AMR/8000\r\n"
			"a=rtpmap:103 AMR/8000\r\n"
			"a=rtpmap:104 AMR/8000\r\n"
			"a=rtpmap:105 AMR/8000\r\n"
			"a=rtpmap:106 AMR/8000\r\n"
			"a=rtpmap:107 AMR/8000\r\n"
			"a=rtpmap:108 AMR/8000\r\n"
			"a=rtpmap:109 AMR/8000\r\n"
			"a=rtpmap:110 AMR/8000\r\n"
			"a=ptime:20\r\n",
		.expect_rc = -EINVAL,
	},
};

static void test_parse_response(void)
{
	int i;
	int failures = 0;

	for (i = 0; i < ARRAY_SIZE(parse_response_tests); i++) {
		int rc;
		struct parse_response_test *t = &parse_response_tests[i];
		struct mgcp_response *r = talloc_zero(ctx, struct mgcp_response);
		int p;

		r->body = talloc_strdup(r, t->body);

		//printf("\n%s() test [%d]:\n", __func__, i);
		fprintf(stderr, "\n%s() test [%d]:\n", __func__, i);
		fprintf(stderr, "body: \"%s\"\n", osmo_escape_str(r->body, -1));

		rc = mgcp_response_parse_params(r);

		fprintf(stderr, "got rc=%d\n", rc);
		if (rc != t->expect_rc) {
			fprintf(stderr, "FAIL: Expected rc=%d\n", t->expect_rc);
			failures++;
		}
		if (rc) {
			talloc_free(r);
			continue;
		}

		fprintf(stderr, "got audio_ip=\"%s\"\n", r->audio_ip);
		if (strcmp(r->audio_ip, t->expect_params.audio_ip)) {
			fprintf(stderr, "FAIL: Expected audio_ip=\"%s\"\n", t->expect_params.audio_ip);
			failures++;
		}
		fprintf(stderr, "got audio_port=%u\n", r->audio_port);
		if (r->audio_port != t->expect_params.audio_port) {
			fprintf(stderr, "FAIL: Expected audio_port=%u\n", t->expect_params.audio_port);
			failures++;
		}

		for (p = 0; p < r->ptmap_len; p++) {
			struct ptmap *got = &r->ptmap[p];
			struct ptmap *expect = NULL;
			fprintf(stderr, "  %d %s\n", got->pt, osmo_mgcpc_codec_name(got->codec));
			if (p >= t->expect_params.ptmap_len) {
				fprintf(stderr, "    - ERROR: too many codec entries\n");
				failures++;
				continue;
			}
			expect = &t->expect_params.ptmap[p];
			if (ptmap_cmp(got, expect)) {
				fprintf(stderr, "    - ERROR: expected: %d %s\n",
					expect->pt, osmo_mgcpc_codec_name(expect->codec));
				failures++;
			}
		}

		talloc_free(r);
	}

	OSMO_ASSERT(!failures);
}


static const struct log_info_cat log_categories[] = {
};

const struct log_info log_info = {
        .cat = log_categories,
        .num_cat = ARRAY_SIZE(log_categories),
};


int main(int argc, char **argv)
{
	ctx = talloc_named_const(NULL, 1, "mgcp_client_test");
	msgb_talloc_ctx_init(ctx, 0);
	osmo_init_logging2(ctx, &log_info);
	log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_NONE);
	log_set_print_timestamp(osmo_stderr_target, 0);
	log_set_use_color(osmo_stderr_target, 0);
	log_set_print_category_hex(osmo_stderr_target, 0);
	log_set_print_category(osmo_stderr_target, 1);

	log_set_category_filter(osmo_stderr_target, DLMGCP, 1, LOGL_DEBUG);

	conf = mgcp_client_conf_alloc(ctx);

	test_mgcp_msg();
	test_mgcp_client_cancel();
	test_sdp_section_start();
	test_map_codec_to_pt_and_map_pt_to_codec();
	test_map_str_to_codec();
	test_mgcp_client_e1_epname();

	test_parse_response();

	printf("Done\n");
	fprintf(stderr, "Done\n");
	return EXIT_SUCCESS;
}
