test_all.c 13.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
/* NetworkManager system settings service (ifnet)
 *
 * Mu Qiao <qiaomuf@gmail.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Copyright (C) 1999-2010 Gentoo Foundation, Inc.
 */

#include <stdio.h>
#include <string.h>
#include <glib.h>
#include <arpa/inet.h>
#include <stdlib.h>
28
#include <unistd.h>
29 30 31 32 33 34 35 36
#include <nm-utils.h>

#include "net_parser.h"
#include "nm-test-helpers.h"
#include "net_utils.h"
#include "wpa_parser.h"
#include "connection_parser.h"

Dan Williams's avatar
Dan Williams committed
37 38 39 40 41 42 43 44 45 46
/* Fake config file function to make the linker happy */
const char *ifnet_plugin_get_conf_file (void);

const char *
ifnet_plugin_get_conf_file (void)
{
	return "/etc/foo/barasdfasdfasdfasdf";
}


47 48 49 50
static void
test_getdata ()
{
	ASSERT (ifnet_get_data ("eth1", "config")
Mu Qiao's avatar
Mu Qiao committed
51
		&& strcmp (ifnet_get_data ("eth1", "config"), "( \"dhcp\" )") == 0,
52 53 54 55 56 57 58 59
		"get data", "config_eth1 is not correct");
	ASSERT (ifnet_get_data ("ppp0", "username")
		&& strcmp (ifnet_get_data ("ppp0", "username"), "user") == 0,
		"get data", "config_ppp0 username is not correctly read");
	ASSERT (ifnet_get_data ("ppp0", "password")
		&& strcmp (ifnet_get_data ("ppp0", "password"),
			   "password") == 0, "get data",
		"config_ppp0 password is not correctly read");
60 61 62
	ASSERT (ifnet_get_global_data ("modules")
		&& strcmp ("!wpa_supplicant", ifnet_get_global_data ("modules")) == 0,
		"get data", "config_eth1 is not correct");
63 64 65
}

static void
66
test_read_hostname (const char *base_path)
67
{
68 69 70 71 72 73
	char *hostname_path, *hostname;

	hostname_path = g_build_filename (base_path, "hostname", NULL);
	hostname = read_hostname (hostname_path);

	g_assert_cmpstr (hostname, ==, "gentoo");
74

75
	g_free (hostname);
76
	g_free (hostname_path);
77 78 79
}

static void
80
test_write_hostname (const char *temp_path)
81
{
82 83 84 85 86 87 88 89
	char *hostname_path, *hostname;

	hostname_path = g_build_filename (temp_path, "hostname-test", NULL);
	write_hostname (hostname_path, "gentoo-nm");
	hostname = read_hostname (hostname_path);

	g_assert_cmpstr (hostname, ==, "gentoo-nm");

90
	g_free (hostname);
91 92
	unlink (hostname_path);
	g_free (hostname_path);
93 94 95 96 97 98 99 100 101 102
}

static void
test_is_static ()
{
	ASSERT (is_static_ip4 ("eth1") == FALSE, "is static",
		"a dhcp interface is recognized as static");
	ASSERT (is_static_ip4 ("eth0") == TRUE, "is static",
		"a static interface is recognized as dhcp");
	ASSERT (!is_static_ip6 ("eth0") == TRUE, "is static",
Mu Qiao's avatar
Mu Qiao committed
103
		"a dhcp interface is recognized as static");
104 105 106 107 108
}

static void
test_has_default_route ()
{
109 110 111 112
	ASSERT (has_default_ip4_route ("eth0"),
		"has default route", "eth0 should have a default ipv4 route");
	ASSERT (has_default_ip6_route ("eth4"),
		"has default route", "eth4 should have a default ipv6 route");
113
	ASSERT (!has_default_ip4_route ("eth5")
114 115
		&& !has_default_ip6_route ("eth5"),
		"has default route", "eth5 shouldn't have a default route");
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
}

static void
test_has_ip6_address ()
{
	ASSERT (has_ip6_address ("eth2"), "has ip6 address",
		"eth2 should have a ipv6 address");
	ASSERT (!has_ip6_address ("eth0"), "has ip6 address",
		"eth0 shouldn't have a ipv6 address")

}

static void
test_is_ip4_address ()
{
	gchar *address1 = "192.168.4.232/24";
	gchar *address2 = "192.168.100.{1..254}/24";
	gchar *address3 = "192.168.4.2555/24";

	ASSERT (is_ip4_address (address1), "is ip4 address",
		"%s should be a valid address", address1);
	ASSERT (is_ip4_address (address2), "is ip4 address",
		"%s should be a valid address", address2);
	ASSERT (!is_ip4_address (address3), "is ip4 address",
		"%s should be an invalid address", address3);
}

static void
test_is_ip6_address ()
{
	gchar *address1 = "4321:0:1:2:3:4:567:89ac/24";

	ASSERT (is_ip6_address (address1), "is ip6 address",
		"%s should be a valid address", address1);
}

static void
check_ip_block (ip_block * iblock, gchar * ip, gchar * netmask, gchar * gateway)
{
	char *str;
	struct in_addr tmp_ip4_addr;

	str = malloc (INET_ADDRSTRLEN);
	tmp_ip4_addr.s_addr = iblock->ip;
	inet_ntop (AF_INET, &tmp_ip4_addr, str, INET_ADDRSTRLEN);
161 162
	ASSERT (strcmp (ip, str) == 0, "check ip",
		"ip expected:%s, find:%s", ip, str);
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
	tmp_ip4_addr.s_addr = iblock->netmask;
	inet_ntop (AF_INET, &tmp_ip4_addr, str, INET_ADDRSTRLEN);
	ASSERT (strcmp (netmask, str) == 0, "check netmask",
		"netmask expected:%s, find:%s", netmask, str);
	tmp_ip4_addr.s_addr = iblock->gateway;
	inet_ntop (AF_INET, &tmp_ip4_addr, str, INET_ADDRSTRLEN);
	ASSERT (strcmp (gateway, str) == 0, "check gateway",
		"gateway expected:%s, find:%s", gateway, str);
	free (str);
}

static void
test_convert_ipv4_config_block ()
{
	ip_block *iblock = convert_ip4_config_block ("eth0");
	ip_block *tmp = iblock;

	ASSERT (iblock != NULL, "convert ipv4 block",
		"block eth0 should not be NULL");
	check_ip_block (iblock, "202.117.16.121", "255.255.255.0",
			"202.117.16.1");
	iblock = iblock->next;
	destroy_ip_block (tmp);
	ASSERT (iblock != NULL, "convert ipv4 block",
		"block eth0 should have a second IP address");
	check_ip_block (iblock, "192.168.4.121", "255.255.255.0",
			"202.117.16.1");
	destroy_ip_block (iblock);
	iblock = convert_ip4_config_block ("eth2");
	ASSERT (iblock != NULL
193 194
		&& iblock->next == NULL,
		"convert error IPv4 address", "should only get one address");
195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
	check_ip_block (iblock, "192.168.4.121", "255.255.255.0", "0.0.0.0");
	destroy_ip_block (iblock);
	iblock = convert_ip4_config_block ("eth3");
	ASSERT (iblock == NULL, "convert config_block",
		"convert error configuration");
	destroy_ip_block (iblock);
}

static void
test_convert_ipv4_routes_block ()
{
	ip_block *iblock = convert_ip4_routes_block ("eth0");
	ip_block *tmp = iblock;

	ASSERT (iblock != NULL, "convert ip4 routes", "should get one route");
	check_ip_block (iblock, "192.168.4.0", "255.255.255.0", "192.168.4.1");
	iblock = iblock->next;
	destroy_ip_block (tmp);
	ASSERT (iblock == NULL, "convert ip4 routes",
		"should only get one route");
Mu Qiao's avatar
Mu Qiao committed
215 216 217 218 219 220 221 222 223 224

	iblock = convert_ip4_routes_block ("eth9");
	tmp = iblock;

	ASSERT (iblock != NULL, "convert ip4 routes", "should get one route");
	check_ip_block (iblock, "10.0.0.0", "255.0.0.0", "192.168.0.1");
	iblock = iblock->next;
	destroy_ip_block (tmp);
	ASSERT (iblock == NULL, "convert ip4 routes",
		"should only get one route");
225 226 227 228 229
}

static void
test_wpa_parser ()
{
Dan Williams's avatar
Dan Williams committed
230
	const char *value;
231

232 233 234
	g_assert (exist_ssid ("example"));

	g_assert (exist_ssid ("static-wep-test"));
235
	value = wpa_get_value ("static-wep-test", "key_mgmt");
236
	g_assert_cmpstr (value, ==, "NONE");
237
	value = wpa_get_value ("static-wep-test", "wep_key0");
238 239 240
	g_assert_cmpstr (value, ==, "\"abcde\"");

	g_assert (exist_ssid ("leap-example"));
241 242 243

	value = wpa_get_value ("test-with-hash-in-psk", "psk");
	g_assert_cmpstr (value, ==, "\"xjtudlc3731###asdfasdfasdf\"");
244 245 246 247 248 249 250 251 252 253 254 255
}

static void
test_strip_string ()
{
	gchar *str = "( \"default via     202.117.16.1\" )";
	gchar *result = g_strdup (str);
	gchar *result_b = result;

	result = strip_string (result, '(');
	result = strip_string (result, ')');
	result = strip_string (result, '"');
256 257 258
	ASSERT (strcmp (result, "default via     202.117.16.1") ==
		0, "strip_string",
		"string isn't stripped, result is: %s", result);
259 260 261 262 263 264 265 266 267 268 269 270 271 272 273
	g_free (result_b);
}

static void
test_is_unmanaged ()
{
	ASSERT (is_managed ("eth0"), "test_is_unmanaged",
		"eth0 should be managed");
	ASSERT (!is_managed ("eth4"), "test_is_unmanaged",
		"eth4 should be unmanaged");
}

static void
test_new_connection ()
{
Jiří Klimeš's avatar
Jiří Klimeš committed
274
	GError *error = NULL;
275 276
	NMConnection *connection;

Jiří Klimeš's avatar
Jiří Klimeš committed
277
	connection = ifnet_update_connection_from_config_block ("eth2", &error);
278 279
	ASSERT (connection != NULL, "new connection",
		"new connection failed: %s",
Jiří Klimeš's avatar
Jiří Klimeš committed
280
		error ? error->message : "None");
281
	g_object_unref (connection);
Jiří Klimeš's avatar
Jiří Klimeš committed
282 283

	connection = ifnet_update_connection_from_config_block ("qiaomuf", &error);
284
	ASSERT (connection != NULL, "new connection",
Jiří Klimeš's avatar
Jiří Klimeš committed
285 286
		"new connection failed: %s",
		error ? error->message : "NONE");
287
	g_object_unref (connection);
Jiří Klimeš's avatar
Jiří Klimeš committed
288 289

	connection = ifnet_update_connection_from_config_block ("myxjtu2", &error);
290
	ASSERT (connection != NULL, "new connection",
Jiří Klimeš's avatar
Jiří Klimeš committed
291 292
		"new connection failed: %s",
		error ? error->message : "NONE");
293
	g_object_unref (connection);
Mu Qiao's avatar
Mu Qiao committed
294 295 296 297 298 299 300 301 302 303 304 305

	connection = ifnet_update_connection_from_config_block ("eth9", &error);
	ASSERT (connection != NULL, "new connection",
		"new connection(eth9) failed: %s",
		error ? error->message : "NONE");
	g_object_unref (connection);

	connection = ifnet_update_connection_from_config_block ("eth10", &error);
	ASSERT (connection != NULL, "new connection",
		"new connection(eth10) failed: %s",
		error ? error->message : "NONE");
	g_object_unref (connection);
306 307
}

308 309 310
#define NET_GEN_NAME "net.generate"
#define SUP_GEN_NAME "wpa_supplicant.conf.generate"

311 312 313
static void
test_update_connection ()
{
Jiří Klimeš's avatar
Jiří Klimeš committed
314
	GError *error = NULL;
315
	NMConnection *connection;
Dan Williams's avatar
Dan Williams committed
316
	gboolean success;
317

Jiří Klimeš's avatar
Jiří Klimeš committed
318
	connection = ifnet_update_connection_from_config_block ("eth0", &error);
319 320
	ASSERT (connection != NULL, "get connection",
		"get connection failed: %s",
Jiří Klimeš's avatar
Jiří Klimeš committed
321
		error ? error->message : "None");
Dan Williams's avatar
Dan Williams committed
322 323

	success = ifnet_update_parsers_by_connection (connection, "eth0",
324 325
	                                              NET_GEN_NAME,
	                                              SUP_GEN_NAME,
Dan Williams's avatar
Dan Williams committed
326
	                                              NULL,
Jiří Klimeš's avatar
Jiří Klimeš committed
327
	                                              &error);
Dan Williams's avatar
Dan Williams committed
328
	ASSERT (success, "update connection", "update connection failed %s", "eth0");
329
	g_object_unref (connection);
Dan Williams's avatar
Dan Williams committed
330

Jiří Klimeš's avatar
Jiří Klimeš committed
331
	connection = ifnet_update_connection_from_config_block ("0xab3ace", &error);
332
	ASSERT (connection != NULL, "get connection", "get connection failed: %s",
Jiří Klimeš's avatar
Jiří Klimeš committed
333
		error ? error->message : "None");
Dan Williams's avatar
Dan Williams committed
334 335

	success = ifnet_update_parsers_by_connection (connection, "0xab3ace",
336 337
	                                              NET_GEN_NAME,
	                                              SUP_GEN_NAME,
Dan Williams's avatar
Dan Williams committed
338
	                                              NULL,
Jiří Klimeš's avatar
Jiří Klimeš committed
339
	                                              &error);
340
	ASSERT (success, "update connection", "update connection failed %s", "0xab3ace");
341
	g_object_unref (connection);
342 343 344

	unlink (NET_GEN_NAME);
	unlink (SUP_GEN_NAME);
345 346 347 348 349 350 351
}

static void
test_add_connection ()
{
	NMConnection *connection;

352 353 354
	connection = ifnet_update_connection_from_config_block ("eth0", NULL);
	ASSERT (ifnet_add_new_connection (connection, NET_GEN_NAME, SUP_GEN_NAME, NULL),
	        "add connection", "add connection failed: %s", "eth0");
355
	g_object_unref (connection);
356 357 358
	connection = ifnet_update_connection_from_config_block ("myxjtu2", NULL);
	ASSERT (ifnet_add_new_connection (connection, NET_GEN_NAME, SUP_GEN_NAME, NULL),
	        "add connection", "add connection failed: %s", "myxjtu2");
359
	g_object_unref (connection);
360 361 362

	unlink (NET_GEN_NAME);
	unlink (SUP_GEN_NAME);
363 364 365 366 367
}

static void
test_delete_connection ()
{
368
	GError *error = NULL;
369 370
	NMConnection *connection;

371
	connection = ifnet_update_connection_from_config_block ("eth7", &error);
372
	ASSERT (connection != NULL, "get connection",
373 374 375 376
	        "get connection failed: %s",
	        error ? error->message : "None");
	ASSERT (ifnet_delete_connection_in_parsers ("eth7", NET_GEN_NAME, SUP_GEN_NAME),
	        "delete connection", "delete connection failed: %s", "eth7");
377
	g_object_unref (connection);
378
	connection = ifnet_update_connection_from_config_block ("qiaomuf", &error);
379
	ASSERT (connection != NULL, "get connection",
380 381 382 383
	        "get connection failed: %s",
	        error ? error->message : "None");
	ASSERT (ifnet_delete_connection_in_parsers ("qiaomuf", NET_GEN_NAME, SUP_GEN_NAME),
	        "delete connection", "delete connection failed: %s", "qiaomuf");
384
	g_object_unref (connection);
385 386 387

	unlink (NET_GEN_NAME);
	unlink (SUP_GEN_NAME);
388 389
}

390 391 392 393 394 395 396 397 398 399 400
static void
test_missing_config ()
{
	GError *error = NULL;
	NMConnection *connection;

	connection = ifnet_update_connection_from_config_block ("eth8", &error);
	ASSERT (connection == NULL && error != NULL, "get connection",
	        "get connection should fail with 'Unknown config for eth8'");
}

Dan Williams's avatar
Dan Williams committed
401 402
int
main (int argc, char **argv)
403
{
Dan Williams's avatar
Dan Williams committed
404 405 406 407 408 409 410 411 412 413 414 415
	char *f;

	g_type_init ();

	f = g_build_filename (argv[1], "net", NULL);
	ifnet_init (f);
	g_free (f);

	f = g_build_filename (argv[1], "wpa_supplicant.conf", NULL);
	wpa_parser_init (f);
	g_free (f);

416 417 418 419 420
	test_strip_string ();
	test_is_static ();
	test_has_ip6_address ();
	test_has_default_route ();
	test_getdata ();
Dan Williams's avatar
Dan Williams committed
421 422
	test_read_hostname (argv[1]);
	test_write_hostname (argv[2]);
423 424 425 426 427 428 429 430 431 432 433 434 435
	test_is_ip4_address ();
	test_is_ip6_address ();
	test_convert_ipv4_config_block ();
	test_convert_ipv4_routes_block ();
	test_is_unmanaged ();
	test_wpa_parser ();
	test_convert_ipv4_routes_block ();
	test_new_connection ();
	test_update_connection ();
	test_add_connection ();
	test_delete_connection ();
	test_missing_config ();

436 437
	ifnet_destroy ();
	wpa_parser_destroy ();
Dan Williams's avatar
Dan Williams committed
438 439 440 441

	f = g_path_get_basename (argv[0]);
	fprintf (stdout, "%s: SUCCESS\n", f);
	g_free (f);
442 443
	return 0;
}