/*
 * (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("  codecs_len = %u\n", response->codecs_len);
	for(i=0;i<response->codecs_len;i++)
		printf("  codecs[%u] = %u\n", i, response->codecs[i]);
	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_crcx(void)
{
	struct msgb *msg;
	mgcp_trans_id_t trans_id;

	printf("\n===== %s =====\n", __func__);

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

	msg = mgcp_msg_crcx(mgcp, 23, 42, MGCP_CONN_LOOPBACK);
	trans_id = dummy_mgcp_send(msg);

	reply_to(trans_id, 200, "OK",
		"I: 1\r\n\r\n"
		"v=0\r\n"
		"o=- 1 23 IN IP4 10.9.1.120\r\n"
		"s=-\r\n"
		"c=IN IP4 10.9.1.120\r\n"
		"t=0 0\r\n"
		"m=audio 16002 RTP/AVP 110 96\r\n"
		"a=rtpmap:110 AMR/8000\r\n"
		"a=rtpmap:96 GSM-EFR/8000\r\n"
		"a=ptime:20\r\n");
}

void test_crcx_long_conn_id(void)
{
	struct msgb *msg;
	mgcp_trans_id_t trans_id;

	printf("\n===== %s =====\n", __func__);

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

	msg = mgcp_msg_crcx(mgcp, 23, 42, MGCP_CONN_LOOPBACK);
	trans_id = dummy_mgcp_send(msg);

	reply_to(trans_id, 200, "OK",
		"I: 123456789abcdef0123456789ABCDEF0\r\n\r\n"
		"v=0\r\n"
		"o=- 1 23 IN IP4 10.9.1.120\r\n"
		"s=-\r\n"
		"c=IN IP4 10.9.1.120\r\n"
		"t=0 0\r\n"
		"m=audio 16002 RTP/AVP 110 96\r\n"
		"a=rtpmap:110 AMR/8000\r\n"
		"a=rtpmap:96 GSM-EFR/8000\r\n"
		"a=ptime:20\r\n");
}

void test_crcx_too_long_conn_id(void)
{
	struct msgb *msg;
	mgcp_trans_id_t trans_id;

	printf("\n===== %s =====\n", __func__);

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

	msg = mgcp_msg_crcx(mgcp, 23, 42, MGCP_CONN_LOOPBACK);
	trans_id = dummy_mgcp_send(msg);

	reply_to(trans_id, 200, "OK",
		"I: 123456789abcdef0123456789ABCDEF01001029\r\n\r\n"
		"v=0\r\n"
		"o=- 1 23 IN IP4 10.9.1.120\r\n"
		"s=-\r\n"
		"c=IN IP4 10.9.1.120\r\n"
		"t=0 0\r\n"
		"m=audio 16002 RTP/AVP 110 96\r\n"
		"a=rtpmap:110 AMR/8000\r\n"
		"a=rtpmap:96 GSM-EFR/8000\r\n"
		"a=ptime:20\r\n");
}

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,
		.codecs[0] = CODEC_GSM_8000_1,
		.codecs[1] = CODEC_AMR_8000_1,
		.codecs[2] = CODEC_GSMEFR_8000_1,
		.codecs_len = 1,
		.ptmap[0].codec = CODEC_GSMEFR_8000_1,
		.ptmap[0].pt = 96,
		.ptmap_len = 1,
		.x_osmo_ign = MGCP_X_OSMO_IGN_CALLID,
	};

	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.codecs_len = 2;
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	mgcp_msg.codecs_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.codecs_len = 3;
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	mgcp_msg.codecs_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.codecs_len = 2;
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	mgcp_msg.codecs_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.codecs_len = 3;
	msg = mgcp_msg_gen(mgcp, &mgcp_msg);
	mgcp_msg.codecs_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("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[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("\n");
	msgb_free(msg);
}

void test_mgcp_client_cancel()
{
	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,
		.codecs[0] = CODEC_AMR_8000_1,
		.codecs_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 = -EINVAL,
	},
	{
		.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 = -EINVAL,
	},
	{
		.body = "some mgcp header data\r\nand header params"
			"\r\n\r"
			"m=audio 23\r\n",
		.expect_rc = -EINVAL,
	},
	{
		.body = "some mgcp header data\r\nand header params"
			"\n\r\r"
			"m=audio 23\r\n",
		.expect_rc = -EINVAL,
	},
};

void test_sdp_section_start()
{
	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_port=%u\n", t->expect_params.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_pt_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");
}

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_filename(osmo_stderr_target, 0);
	log_set_print_timestamp(osmo_stderr_target, 0);
	log_set_use_color(osmo_stderr_target, 0);
	log_set_print_category(osmo_stderr_target, 1);

	log_set_category_filter(osmo_stderr_target, DLMGCP, 1, LOGL_DEBUG);

	mgcp_client_conf_init(&conf);

	test_crcx();
	test_mgcp_msg();
	test_mgcp_client_cancel();
	test_sdp_section_start();
	test_map_codec_to_pt_and_map_pt_to_codec();
	test_map_pt_to_codec();
	test_crcx_long_conn_id();
	test_crcx_too_long_conn_id();

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