mirror of
				https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
				synced 2025-11-04 05:53:26 +00:00 
			
		
		
		
	mgcp_test: extend / rewrite test_mgcp_codec_pt_translate()
Instead of manually entering codec values, use mgcp_codec_add() to populate test conns with codecs. The idea is to better test what actually happens when parsing SDP codec strings. Rewrite current test_mgcp_codec_pt_translate() from procedural to a data model with human readable stdout logging. This prepares to enable interpreting codec strings like "FOO/8000/1" as equivalent with "FOO/8000": the SDP standard defines the final "/1", indicating the nr of channels, as optional for a single channel, but osmo-mgw currently is unable to match these two formats as identical. So prepare the test_mgcp_codec_pt_translate() so that upcoming patches can incorporate strings with and without the final "/1" by extending the struct arrays. Change-Id: I888000d77512cfecb0f199b86ef6003e7fc0e6cb
This commit is contained in:
		@@ -1711,98 +1711,178 @@ static void test_check_local_cx_options(void *ctx)
 | 
				
			|||||||
	OSMO_ASSERT(check_local_cx_options(ctx, ",,,") == -1);
 | 
						OSMO_ASSERT(check_local_cx_options(ctx, ",,,") == -1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void test_mgcp_codec_pt_translate_pars(struct mgcp_rtp_codec *c)
 | 
					static const struct mgcp_codec_param amr_param_octet_aligned_true = {
 | 
				
			||||||
{
 | 
						.amr_octet_aligned_present = true,
 | 
				
			||||||
	c->rate = 8000;
 | 
						.amr_octet_aligned = true,
 | 
				
			||||||
	c->channels = 1;
 | 
					};
 | 
				
			||||||
	c->frame_duration_num = 23;
 | 
					
 | 
				
			||||||
	c->frame_duration_den = 42;
 | 
					#if 0
 | 
				
			||||||
}
 | 
					static const struct mgcp_codec_param amr_param_octet_aligned_false = {
 | 
				
			||||||
 | 
						.amr_octet_aligned_present = true,
 | 
				
			||||||
 | 
						.amr_octet_aligned = false,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct mgcp_codec_param amr_param_octet_aligned_unset = {
 | 
				
			||||||
 | 
						.amr_octet_aligned_present = false,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct testcase_mgcp_codec_pt_translate_codec {
 | 
				
			||||||
 | 
						int payload_type;
 | 
				
			||||||
 | 
						const char *audio_name;
 | 
				
			||||||
 | 
						const struct mgcp_codec_param *param;
 | 
				
			||||||
 | 
						int expect_rc;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct testcase_mgcp_codec_pt_translate_expect {
 | 
				
			||||||
 | 
						bool end;
 | 
				
			||||||
 | 
						int payload_type_map[2];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct testcase_mgcp_codec_pt_translate {
 | 
				
			||||||
 | 
						const char *descr;
 | 
				
			||||||
 | 
						/* two conns on an endpoint, each with N configured codecs */
 | 
				
			||||||
 | 
						struct testcase_mgcp_codec_pt_translate_codec codecs[2][10];
 | 
				
			||||||
 | 
						struct testcase_mgcp_codec_pt_translate_expect expect[32];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct testcase_mgcp_codec_pt_translate test_mgcp_codec_pt_translate_cases[] = {
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							.descr = "same order, but differing payload type numbers",
 | 
				
			||||||
 | 
							.codecs = {
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									{ 112, "AMR/8000/1", &amr_param_octet_aligned_true, },
 | 
				
			||||||
 | 
									{ 0, "PCMU/8000/1", NULL, },
 | 
				
			||||||
 | 
									{ 111, "GSM-HR-08/8000/1", NULL, },
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									{ 96, "AMR/8000/1", &amr_param_octet_aligned_true, },
 | 
				
			||||||
 | 
									{ 0, "PCMU/8000/1", NULL, },
 | 
				
			||||||
 | 
									{ 97, "GSM-HR-08/8000/1", NULL, },
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							.expect = {
 | 
				
			||||||
 | 
								{ .payload_type_map = {112, 96}, },
 | 
				
			||||||
 | 
								{ .payload_type_map = {0, 0}, },
 | 
				
			||||||
 | 
								{ .payload_type_map = {111, 97} },
 | 
				
			||||||
 | 
								{ .payload_type_map = {123, -EINVAL} },
 | 
				
			||||||
 | 
								{ .end = true },
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							.descr = "conn0 has no codecs",
 | 
				
			||||||
 | 
							.codecs = {
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									/* no codecs */
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									{ 96, "AMR/8000/1", &amr_param_octet_aligned_true, },
 | 
				
			||||||
 | 
									{ 0, "PCMU/8000/1", NULL, },
 | 
				
			||||||
 | 
									{ 97, "GSM-HR-08/8000/1", NULL, },
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							.expect = {
 | 
				
			||||||
 | 
								{ .payload_type_map = {112, -EINVAL}, },
 | 
				
			||||||
 | 
								{ .payload_type_map = {0, -EINVAL}, },
 | 
				
			||||||
 | 
								{ .payload_type_map = {111, -EINVAL} },
 | 
				
			||||||
 | 
								{ .end = true },
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							.descr = "conn1 has no codecs",
 | 
				
			||||||
 | 
							.codecs = {
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									{ 112, "AMR/8000/1", &amr_param_octet_aligned_true, },
 | 
				
			||||||
 | 
									{ 0, "PCMU/8000/1", NULL, },
 | 
				
			||||||
 | 
									{ 111, "GSM-HR-08/8000/1", NULL, },
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									/* no codecs */
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							.expect = {
 | 
				
			||||||
 | 
								{ .payload_type_map = {112, -EINVAL}, },
 | 
				
			||||||
 | 
								{ .payload_type_map = {0, -EINVAL}, },
 | 
				
			||||||
 | 
								{ .payload_type_map = {111, -EINVAL} },
 | 
				
			||||||
 | 
								{ .end = true },
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void test_mgcp_codec_pt_translate(void)
 | 
					static void test_mgcp_codec_pt_translate(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct mgcp_conn_rtp conn_src;
 | 
						int i;
 | 
				
			||||||
	struct mgcp_conn_rtp conn_dst;
 | 
						bool ok = true;
 | 
				
			||||||
	int pt_dst;
 | 
						printf("\nTesting mgcp_codec_pt_translate()\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Setup a realistic set of codec configurations on both
 | 
						for (i = 0; i < ARRAY_SIZE(test_mgcp_codec_pt_translate_cases); i++) {
 | 
				
			||||||
	 * ends. AMR and HR will use different payload types. PCMU
 | 
							const struct testcase_mgcp_codec_pt_translate *t = &test_mgcp_codec_pt_translate_cases[i];
 | 
				
			||||||
	 * must use 0 on both ends since this is not a dynamic payload
 | 
							struct mgcp_conn_rtp conn[2] = {};
 | 
				
			||||||
	 * type */
 | 
							int rc;
 | 
				
			||||||
	test_mgcp_codec_pt_translate_pars(&conn_src.end.codecs[0]);
 | 
							int conn_i;
 | 
				
			||||||
	test_mgcp_codec_pt_translate_pars(&conn_dst.end.codecs[0]);
 | 
							int c;
 | 
				
			||||||
	test_mgcp_codec_pt_translate_pars(&conn_src.end.codecs[1]);
 | 
					 | 
				
			||||||
	test_mgcp_codec_pt_translate_pars(&conn_dst.end.codecs[1]);
 | 
					 | 
				
			||||||
	test_mgcp_codec_pt_translate_pars(&conn_src.end.codecs[2]);
 | 
					 | 
				
			||||||
	test_mgcp_codec_pt_translate_pars(&conn_dst.end.codecs[2]);
 | 
					 | 
				
			||||||
	conn_src.end.codecs[0].payload_type = 112;
 | 
					 | 
				
			||||||
	conn_dst.end.codecs[0].payload_type = 96;
 | 
					 | 
				
			||||||
	conn_src.end.codecs[1].payload_type = 0;
 | 
					 | 
				
			||||||
	conn_dst.end.codecs[1].payload_type = 0;
 | 
					 | 
				
			||||||
	conn_src.end.codecs[2].payload_type = 111;
 | 
					 | 
				
			||||||
	conn_dst.end.codecs[2].payload_type = 97;
 | 
					 | 
				
			||||||
	conn_src.end.codecs[0].audio_name = "AMR/8000/1";
 | 
					 | 
				
			||||||
	conn_dst.end.codecs[0].audio_name = "AMR/8000/1";
 | 
					 | 
				
			||||||
	conn_src.end.codecs[1].audio_name = "PCMU/8000/1";
 | 
					 | 
				
			||||||
	conn_dst.end.codecs[1].audio_name = "PCMU/8000/1";
 | 
					 | 
				
			||||||
	conn_src.end.codecs[2].audio_name = "GSM-HR-08/8000/1";
 | 
					 | 
				
			||||||
	conn_dst.end.codecs[2].audio_name = "GSM-HR-08/8000/1";
 | 
					 | 
				
			||||||
	conn_src.end.codecs[0].subtype_name = "AMR";
 | 
					 | 
				
			||||||
	conn_dst.end.codecs[0].subtype_name = "AMR";
 | 
					 | 
				
			||||||
	conn_src.end.codecs[1].subtype_name = "PCMU";
 | 
					 | 
				
			||||||
	conn_dst.end.codecs[1].subtype_name = "PCMU";
 | 
					 | 
				
			||||||
	conn_src.end.codecs[2].subtype_name = "GSM-HR-08";
 | 
					 | 
				
			||||||
	conn_dst.end.codecs[2].subtype_name = "GSM-HR-08";
 | 
					 | 
				
			||||||
	conn_src.end.codecs_assigned = 3;
 | 
					 | 
				
			||||||
	conn_dst.end.codecs_assigned = 3;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* We expect the function to find the PT we must use when we send the
 | 
							printf("#%d: %s\n", i, t->descr);
 | 
				
			||||||
	 * packet out to the destination. All we know is the context for both
 | 
					 | 
				
			||||||
	 * connections and the payload type from the source packet */
 | 
					 | 
				
			||||||
	pt_dst =
 | 
					 | 
				
			||||||
	    mgcp_codec_pt_translate(&conn_src, &conn_dst,
 | 
					 | 
				
			||||||
				    conn_src.end.codecs[0].payload_type);
 | 
					 | 
				
			||||||
	OSMO_ASSERT(pt_dst == conn_dst.end.codecs[0].payload_type);
 | 
					 | 
				
			||||||
	pt_dst =
 | 
					 | 
				
			||||||
	    mgcp_codec_pt_translate(&conn_src, &conn_dst,
 | 
					 | 
				
			||||||
				    conn_src.end.codecs[1].payload_type);
 | 
					 | 
				
			||||||
	OSMO_ASSERT(pt_dst == conn_dst.end.codecs[1].payload_type);
 | 
					 | 
				
			||||||
	pt_dst =
 | 
					 | 
				
			||||||
	    mgcp_codec_pt_translate(&conn_src, &conn_dst,
 | 
					 | 
				
			||||||
				    conn_src.end.codecs[2].payload_type);
 | 
					 | 
				
			||||||
	OSMO_ASSERT(pt_dst == conn_dst.end.codecs[2].payload_type);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Try some constellations that must fail */
 | 
							for (conn_i = 0; conn_i < 2; conn_i++) {
 | 
				
			||||||
	pt_dst = mgcp_codec_pt_translate(&conn_src, &conn_dst, 123);
 | 
								printf(" - add codecs on conn%d:\n", conn_i);
 | 
				
			||||||
	OSMO_ASSERT(pt_dst == -EINVAL);
 | 
								for (c = 0; c < ARRAY_SIZE(t->codecs[conn_i]); c++) {
 | 
				
			||||||
	conn_src.end.codecs_assigned = 0;
 | 
									const struct testcase_mgcp_codec_pt_translate_codec *codec = &t->codecs[conn_i][c];
 | 
				
			||||||
	conn_dst.end.codecs_assigned = 3;
 | 
									if (!codec->audio_name)
 | 
				
			||||||
	pt_dst =
 | 
										break;
 | 
				
			||||||
	    mgcp_codec_pt_translate(&conn_src, &conn_dst,
 | 
					
 | 
				
			||||||
				    conn_src.end.codecs[0].payload_type);
 | 
									rc = mgcp_codec_add(&conn[conn_i], codec->payload_type, codec->audio_name, codec->param);
 | 
				
			||||||
	OSMO_ASSERT(pt_dst == -EINVAL);
 | 
					
 | 
				
			||||||
	pt_dst =
 | 
									printf("   %2d: %3d %s%s  -> rc=%d\n", c, codec->payload_type, codec->audio_name,
 | 
				
			||||||
	    mgcp_codec_pt_translate(&conn_src, &conn_dst,
 | 
									       codec->param ?
 | 
				
			||||||
				    conn_src.end.codecs[1].payload_type);
 | 
										       (codec->param->amr_octet_aligned_present?
 | 
				
			||||||
	OSMO_ASSERT(pt_dst == -EINVAL);
 | 
												(codec->param->amr_octet_aligned ?
 | 
				
			||||||
	pt_dst =
 | 
													" octet-aligned=1" : " octet-aligned=0")
 | 
				
			||||||
	    mgcp_codec_pt_translate(&conn_src, &conn_dst,
 | 
												: " octet-aligned=unset")
 | 
				
			||||||
				    conn_src.end.codecs[2].payload_type);
 | 
											: "",
 | 
				
			||||||
	OSMO_ASSERT(pt_dst == -EINVAL);
 | 
											rc);
 | 
				
			||||||
	conn_src.end.codecs_assigned = 3;
 | 
									if (rc != codec->expect_rc) {
 | 
				
			||||||
	conn_dst.end.codecs_assigned = 0;
 | 
										printf("     ERROR: expected rc=%d\n", codec->expect_rc);
 | 
				
			||||||
	pt_dst =
 | 
										ok = false;
 | 
				
			||||||
	    mgcp_codec_pt_translate(&conn_src, &conn_dst,
 | 
									}
 | 
				
			||||||
				    conn_src.end.codecs[0].payload_type);
 | 
								}
 | 
				
			||||||
	OSMO_ASSERT(pt_dst == -EINVAL);
 | 
								if (!c)
 | 
				
			||||||
	pt_dst =
 | 
									printf("    (none)\n");
 | 
				
			||||||
	    mgcp_codec_pt_translate(&conn_src, &conn_dst,
 | 
							}
 | 
				
			||||||
				    conn_src.end.codecs[1].payload_type);
 | 
					
 | 
				
			||||||
	OSMO_ASSERT(pt_dst == -EINVAL);
 | 
							for (c = 0; c < ARRAY_SIZE(t->expect); c++) {
 | 
				
			||||||
	pt_dst =
 | 
								const struct testcase_mgcp_codec_pt_translate_expect *expect = &t->expect[c];
 | 
				
			||||||
	    mgcp_codec_pt_translate(&conn_src, &conn_dst,
 | 
								int result;
 | 
				
			||||||
				    conn_src.end.codecs[2].payload_type);
 | 
					
 | 
				
			||||||
	OSMO_ASSERT(pt_dst == -EINVAL);
 | 
								if (expect->end)
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								result = mgcp_codec_pt_translate(&conn[0], &conn[1], expect->payload_type_map[0]);
 | 
				
			||||||
 | 
								printf(" - mgcp_codec_pt_translate(conn0, conn1, %d) -> %d\n",
 | 
				
			||||||
 | 
								       expect->payload_type_map[0], result);
 | 
				
			||||||
 | 
								if (result != expect->payload_type_map[1]) {
 | 
				
			||||||
 | 
									printf("     ERROR: expected -> %d\n", expect->payload_type_map[1]);
 | 
				
			||||||
 | 
									ok = false;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								/* If the expected result is an error, don't do reverse map test */
 | 
				
			||||||
 | 
								if (expect->payload_type_map[1] < 0)
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								result = mgcp_codec_pt_translate(&conn[1], &conn[0], expect->payload_type_map[1]);
 | 
				
			||||||
 | 
								printf(" - mgcp_codec_pt_translate(conn1, conn0, %d) -> %d\n",
 | 
				
			||||||
 | 
								       expect->payload_type_map[1], result);
 | 
				
			||||||
 | 
								if (result != expect->payload_type_map[0]) {
 | 
				
			||||||
 | 
									printf("     ERROR: expected -> %d\n", expect->payload_type_map[0]);
 | 
				
			||||||
 | 
									ok = false;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for (conn_i = 0; conn_i < 2; conn_i++)
 | 
				
			||||||
 | 
								mgcp_codec_reset_all(&conn[conn_i]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						OSMO_ASSERT(ok);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void test_conn_id_matching()
 | 
					void test_conn_id_matching()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1218,6 +1218,44 @@ p:10, a:PCMU -> p:10, a:PCMU
 | 
				
			|||||||
Testing get_lco_identifier()
 | 
					Testing get_lco_identifier()
 | 
				
			||||||
p:10, a:PCMU -> p:10, a:PCMU
 | 
					p:10, a:PCMU -> p:10, a:PCMU
 | 
				
			||||||
p:10, a:PCMU -> p:10, a:PCMU
 | 
					p:10, a:PCMU -> p:10, a:PCMU
 | 
				
			||||||
 | 
					'XXXX, p:10, a:PCMU' -> 'p:10, a:PCMU'
 | 
				
			||||||
 | 
					'XXXX,p:10,a:PCMU' -> 'p:10,a:PCMU'
 | 
				
			||||||
 | 
					'10,a:PCMU' -> 'a:PCMU'
 | 
				
			||||||
 | 
					'10, a:PCMU' -> 'a:PCMU'
 | 
				
			||||||
 | 
					'10,a: PCMU' -> 'a: PCMU'
 | 
				
			||||||
 | 
					'10 ,a: PCMU' -> 'a: PCMU'
 | 
				
			||||||
 | 
					', a:PCMU' -> 'a:PCMU'
 | 
				
			||||||
 | 
					' a:PCMU' -> 'a:PCMU'
 | 
				
			||||||
 | 
					'' -> '(null)'
 | 
				
			||||||
 | 
					p10, aPCMU -> (null)
 | 
				
			||||||
 | 
					'10,a :PCMU' -> '(null)'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Testing mgcp_codec_pt_translate()
 | 
				
			||||||
 | 
					#0: same order, but differing payload type numbers
 | 
				
			||||||
 | 
					 - add codecs on conn0:
 | 
				
			||||||
 | 
					    0: 112 AMR/8000/1 octet-aligned=1  -> rc=0
 | 
				
			||||||
 | 
					    1:   0 PCMU/8000/1  -> rc=0
 | 
				
			||||||
 | 
					    2: 111 GSM-HR-08/8000/1  -> rc=0
 | 
				
			||||||
 | 
					 - add codecs on conn1:
 | 
				
			||||||
 | 
					    0:  96 AMR/8000/1 octet-aligned=1  -> rc=0
 | 
				
			||||||
 | 
					    1:   0 PCMU/8000/1  -> rc=0
 | 
				
			||||||
 | 
					    2:  97 GSM-HR-08/8000/1  -> rc=0
 | 
				
			||||||
 | 
					 - mgcp_codec_pt_translate(conn0, conn1, 112) -> 96
 | 
				
			||||||
 | 
					 - mgcp_codec_pt_translate(conn1, conn0, 96) -> 112
 | 
				
			||||||
 | 
					 - mgcp_codec_pt_translate(conn0, conn1, 0) -> 0
 | 
				
			||||||
 | 
					 - mgcp_codec_pt_translate(conn1, conn0, 0) -> 0
 | 
				
			||||||
 | 
					 - mgcp_codec_pt_translate(conn0, conn1, 111) -> 97
 | 
				
			||||||
 | 
					 - mgcp_codec_pt_translate(conn1, conn0, 97) -> 111
 | 
				
			||||||
 | 
					 - mgcp_codec_pt_translate(conn0, conn1, 123) -> -22
 | 
				
			||||||
 | 
					#1: conn0 has no codecs
 | 
				
			||||||
 | 
					 - add codecs on conn0:
 | 
				
			||||||
 | 
					    (none)
 | 
				
			||||||
 | 
					 - add codecs on conn1:
 | 
				
			||||||
 | 
					    0:  96 AMR/8000/1 octet-aligned=1  -> rc=0
 | 
				
			||||||
 | 
					    1:   0 PCMU/8000/1  -> rc=0
 | 
				
			||||||
 | 
					    2:  97 GSM-HR-08/8000/1  -> rc=0
 | 
				
			||||||
 | 
					 - mgcp_codec_pt_translate(conn0, conn1, 112) -> -22
 | 
				
			||||||
 | 
					 - mgcp_codec_pt_translate(conn0, conn1, 0) -> -22
 | 
				
			||||||
 - mgcp_codec_pt_translate(conn0, conn1, 111) -> -22
 | 
					 - mgcp_codec_pt_translate(conn0, conn1, 111) -> -22
 | 
				
			||||||
#2: conn1 has no codecs
 | 
					#2: conn1 has no codecs
 | 
				
			||||||
 - add codecs on conn0:
 | 
					 - add codecs on conn0:
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user