NetworkManager/src/settings/plugins/keyfile/tests/test-keyfile.c
Thomas Haller 25ade39752 tests: use NMTST_EXPECT*() macros
Tests are commonly created via copy&paste. Hence, it's
better to express a certain concept explicitly via a function
or macro. This way, the implementation of the concept can be
adjusted at one place, without requiring to change all the callers.

Also, the macro is shorter, and brevity is better for tests
so it's easier to understand what the test does. Without being
bothered by noise from the redundant information.

Also, the macro knows better which message to expect. For example,
messages inside "src" are prepended by nm-logging.c with a level
and a timestamp. The expect macro is aware of that and tests for it

  #define NMTST_EXPECT_NM_ERROR(msg)      NMTST_EXPECT_NM (G_LOG_LEVEL_MESSAGE, "*<error> [*] "msg)

This again allows the caller to ignore this prefix, but still assert
more strictly.
2018-01-08 12:38:54 +01:00

2854 lines
98 KiB
C

/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
/* NetworkManager system settings service - keyfile plugin
*
* 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) 2008 - 2017 Red Hat, Inc.
*/
#include "nm-default.h"
#include <stdio.h>
#include <stdarg.h>
#include <unistd.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <linux/pkt_sched.h>
#include "nm-core-internal.h"
#include "settings/plugins/keyfile/nms-keyfile-reader.h"
#include "settings/plugins/keyfile/nms-keyfile-writer.h"
#include "settings/plugins/keyfile/nms-keyfile-utils.h"
#include "nm-test-utils-core.h"
/*****************************************************************************/
static void
check_ip_address (NMSettingIPConfig *config, int idx, const char *address, int plen)
{
NMIPAddress *ip4 = nm_setting_ip_config_get_address (config, idx);
g_assert (ip4);
g_assert_cmpstr (nm_ip_address_get_address (ip4), ==, address);
g_assert_cmpint (nm_ip_address_get_prefix (ip4), ==, plen);
}
static void
check_ip_route (NMSettingIPConfig *config, int idx, const char *destination, int plen,
const char *next_hop, gint64 metric)
{
NMIPRoute *route = nm_setting_ip_config_get_route (config, idx);
g_assert (route);
g_assert_cmpstr (nm_ip_route_get_dest (route), ==, destination);
g_assert_cmpint (nm_ip_route_get_prefix (route), ==, plen);
g_assert_cmpstr (nm_ip_route_get_next_hop (route), ==, next_hop);
g_assert_cmpint (nm_ip_route_get_metric (route), ==, metric);
}
static NMConnection *
keyfile_read_connection_from_file (const char *filename)
{
gs_free_error GError *error = NULL;
NMConnection *connection;
g_assert (filename);
connection = nms_keyfile_reader_from_file (filename, &error);
g_assert_no_error (error);
nmtst_assert_connection_verifies_without_normalization (connection);
return connection;
}
static void
assert_reread (NMConnection *connection, gboolean normalize_connection, const char *testfile)
{
gs_unref_object NMConnection *reread = NULL;
gs_unref_object NMConnection *connection_clone = NULL;
GError *error = NULL;
GError **p_error = (nmtst_get_rand_int () % 2) ? &error : NULL;
NMSettingConnection *s_con;
g_assert (NM_IS_CONNECTION (connection));
g_assert (testfile && testfile[0]);
reread = nms_keyfile_reader_from_file (testfile, p_error);
g_assert_no_error (error);
g_assert (NM_IS_CONNECTION (reread));
if ( !normalize_connection
&& (s_con = nm_connection_get_setting_connection (connection))
&& !nm_setting_connection_get_master (s_con)
&& !nm_connection_get_setting_proxy (connection)) {
connection_clone = nmtst_clone_connection (connection);
connection = connection_clone;
nm_connection_add_setting (connection, nm_setting_proxy_new ());
}
nmtst_assert_connection_equals (connection, normalize_connection, reread, FALSE);
}
static void
assert_reread_and_unlink (NMConnection *connection, gboolean normalize_connection, const char *testfile)
{
assert_reread (connection, normalize_connection, testfile);
unlink (testfile);
}
static void
assert_reread_same (NMConnection *connection,
NMConnection *reread)
{
nmtst_assert_connection_verifies_without_normalization (reread);
nmtst_assert_connection_equals (connection, TRUE, reread, FALSE);
}
static void
write_test_connection_reread (NMConnection *connection,
char **testfile,
NMConnection **out_reread,
gboolean *out_reread_same)
{
uid_t owner_uid;
gid_t owner_grp;
gboolean success;
GError *error = NULL;
GError **p_error = (nmtst_get_rand_int () % 2) ? &error : NULL;
gs_unref_object NMConnection *connection_normalized = NULL;
g_assert (NM_IS_CONNECTION (connection));
g_assert (testfile && !*testfile);
owner_uid = geteuid ();
owner_grp = getegid ();
connection_normalized = nmtst_connection_duplicate_and_normalize (connection);
success = nms_keyfile_writer_test_connection (connection_normalized,
TEST_SCRATCH_DIR,
owner_uid,
owner_grp,
testfile,
out_reread,
out_reread_same,
p_error);
g_assert_no_error (error);
g_assert (success);
g_assert (*testfile && (*testfile)[0]);
}
static void
write_test_connection (NMConnection *connection, char **testfile)
{
gs_unref_object NMConnection *reread = NULL;
gboolean reread_same = FALSE;
write_test_connection_reread (connection, testfile, &reread, &reread_same);
assert_reread_same (connection, reread);
g_assert (reread_same);
}
static void
write_test_connection_and_reread (NMConnection *connection, gboolean normalize_connection)
{
gs_free char *testfile = NULL;
g_assert (NM_IS_CONNECTION (connection));
write_test_connection (connection, &testfile);
assert_reread_and_unlink (connection, normalize_connection, testfile);
}
static GKeyFile *
keyfile_load_from_file (const char *testfile)
{
GKeyFile *keyfile;
GError *error = NULL;
gboolean success;
g_assert (testfile && *testfile);
keyfile = g_key_file_new ();
success = g_key_file_load_from_file (keyfile, testfile, G_KEY_FILE_NONE, &error);
g_assert_no_error (error);
g_assert(success);
return keyfile;
}
static void
_setting_copy_property_gbytes (NMConnection *src, NMConnection *dst, const char *setting_name, const char *property_name)
{
gs_unref_bytes GBytes *blob = NULL;
NMSetting *s_src;
NMSetting *s_dst;
g_assert (NM_IS_CONNECTION (src));
g_assert (NM_IS_CONNECTION (dst));
g_assert (setting_name);
g_assert (property_name);
s_src = nm_connection_get_setting_by_name (src, setting_name);
g_assert (NM_IS_SETTING (s_src));
s_dst = nm_connection_get_setting_by_name (dst, setting_name);
g_assert (NM_IS_SETTING (s_dst));
g_object_get (s_src, property_name, &blob, NULL);
g_object_set (s_dst, property_name, blob, NULL);
}
/*****************************************************************************/
static void
test_read_valid_wired_connection (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingWired *s_wired;
NMSettingIPConfig *s_ip4;
NMSettingIPConfig *s_ip6;
NMIPRoute *route;
gs_free_error GError *error = NULL;
const char *mac;
char expected_mac_address[ETH_ALEN] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 };
gboolean success;
NMTST_EXPECT_NM_INFO ("*ipv4.addresses:*semicolon at the end*addresses1*");
NMTST_EXPECT_NM_INFO ("*ipv4.addresses:*semicolon at the end*addresses2*");
NMTST_EXPECT_NM_WARN ("*missing prefix length*address4*");
NMTST_EXPECT_NM_WARN ("*missing prefix length*address5*");
NMTST_EXPECT_NM_INFO ("*ipv4.routes*semicolon at the end*routes2*");
NMTST_EXPECT_NM_INFO ("*ipv4.routes*semicolon at the end*routes3*");
NMTST_EXPECT_NM_INFO ("*ipv4.routes*semicolon at the end*routes5*");
NMTST_EXPECT_NM_INFO ("*ipv4.routes*semicolon at the end*routes8*");
NMTST_EXPECT_NM_WARN ("*missing prefix length*address4*");
NMTST_EXPECT_NM_INFO ("*ipv6.address*semicolon at the end*address5*");
NMTST_EXPECT_NM_WARN ("*missing prefix length*address5*");
NMTST_EXPECT_NM_INFO ("*ipv6.address*semicolon at the end*address7*");
NMTST_EXPECT_NM_INFO ("*ipv6.routes*semicolon at the end*routes1*");
NMTST_EXPECT_NM_INFO ("*ipv6.route*semicolon at the end*route6*");
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR "/Test_Wired_Connection", &error);
g_assert_no_error (error);
g_test_assert_expected_messages ();
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* ===== CONNECTION SETTING ===== */
s_con = nm_connection_get_setting_connection (connection);
g_assert (s_con);
g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "Test Wired Connection");
g_assert_cmpstr (nm_setting_connection_get_uuid (s_con), ==, "4e80a56d-c99f-4aad-a6dd-b449bc398c57");
g_assert_cmpuint (nm_setting_connection_get_timestamp (s_con), ==, 6654332);
g_assert (nm_setting_connection_get_autoconnect (s_con));
/* ===== WIRED SETTING ===== */
s_wired = nm_connection_get_setting_wired (connection);
g_assert (s_wired);
mac = nm_setting_wired_get_mac_address (s_wired);
g_assert (mac);
g_assert (nm_utils_hwaddr_matches (mac, -1, expected_mac_address, sizeof (expected_mac_address)));
g_assert_cmpint (nm_setting_wired_get_mtu (s_wired), ==, 1400);
/* ===== IPv4 SETTING ===== */
s_ip4 = nm_connection_get_setting_ip4_config (connection);
g_assert (s_ip4);
g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_MANUAL);
g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip4), ==, 2);
g_assert_cmpstr (nm_setting_ip_config_get_dns (s_ip4, 0), ==, "4.2.2.1");
g_assert_cmpstr (nm_setting_ip_config_get_dns (s_ip4, 1), ==, "4.2.2.2");
/* IPv4 addresses */
g_assert_cmpint (nm_setting_ip_config_get_num_addresses (s_ip4), ==, 6);
check_ip_address (s_ip4, 0, "2.3.4.5", 24);
check_ip_address (s_ip4, 1, "192.168.0.5", 24);
check_ip_address (s_ip4, 2, "1.2.3.4", 16);
check_ip_address (s_ip4, 3, "3.4.5.6", 16);
check_ip_address (s_ip4, 4, "4.5.6.7", 24);
check_ip_address (s_ip4, 5, "5.6.7.8", 24);
/* IPv4 gateway */
g_assert_cmpstr (nm_setting_ip_config_get_gateway (s_ip4), ==, "2.3.4.6");
/* IPv4 routes */
g_assert_cmpint (nm_setting_ip_config_get_num_routes (s_ip4), ==, 12);
check_ip_route (s_ip4, 0, "5.6.7.8", 32, NULL, -1);
check_ip_route (s_ip4, 1, "1.2.3.0", 24, "2.3.4.8", 99);
check_ip_route (s_ip4, 2, "1.1.1.2", 12, NULL, -1);
check_ip_route (s_ip4, 3, "1.1.1.3", 13, NULL, -1);
check_ip_route (s_ip4, 4, "1.1.1.4", 14, "2.2.2.4", -1);
check_ip_route (s_ip4, 5, "1.1.1.5", 15, "2.2.2.5", -1);
check_ip_route (s_ip4, 6, "1.1.1.6", 16, "2.2.2.6", 0);
check_ip_route (s_ip4, 7, "1.1.1.7", 17, NULL, -1);
check_ip_route (s_ip4, 8, "1.1.1.8", 18, NULL, -1);
check_ip_route (s_ip4, 9, "1.1.1.9", 19, NULL, 0);
check_ip_route (s_ip4, 10, "1.1.1.10", 20, NULL, 0);
check_ip_route (s_ip4, 11, "1.1.1.11", 21, NULL, 21);
/* Route attributes */
route = nm_setting_ip_config_get_route (s_ip4, 11);
g_assert (route);
nmtst_assert_route_attribute_uint32 (route, NM_IP_ROUTE_ATTRIBUTE_CWND, 10);
nmtst_assert_route_attribute_uint32 (route, NM_IP_ROUTE_ATTRIBUTE_MTU, 1430);
nmtst_assert_route_attribute_boolean (route, NM_IP_ROUTE_ATTRIBUTE_LOCK_CWND, TRUE);
nmtst_assert_route_attribute_string (route, NM_IP_ROUTE_ATTRIBUTE_SRC, "7.7.7.7");
/* ===== IPv6 SETTING ===== */
s_ip6 = nm_connection_get_setting_ip6_config (connection);
g_assert (s_ip6);
g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_MANUAL);
g_assert_cmpint (nm_setting_ip_config_get_num_dns (s_ip6), ==, 2);
g_assert_cmpstr (nm_setting_ip_config_get_dns (s_ip6, 0), ==, "1111:dddd::aaaa");
g_assert_cmpstr (nm_setting_ip_config_get_dns (s_ip6, 1), ==, "1::cafe");
g_assert_cmpint (nm_setting_ip_config_get_num_dns_searches (s_ip6), ==, 3);
g_assert_cmpstr (nm_setting_ip_config_get_dns_search (s_ip6, 0), ==, "super-domain.com");
g_assert_cmpstr (nm_setting_ip_config_get_dns_search (s_ip6, 1), ==, "redhat.com");
g_assert_cmpstr (nm_setting_ip_config_get_dns_search (s_ip6, 2), ==, "gnu.org");
/* IPv6 addresses */
g_assert_cmpint (nm_setting_ip_config_get_num_addresses (s_ip6), ==, 10);
check_ip_address (s_ip6, 0, "2:3:4:5:6:7:8:9", 64);
check_ip_address (s_ip6, 1, "abcd:1234:ffff::cdde", 64);
check_ip_address (s_ip6, 2, "1:2:3:4:5:6:7:8", 96);
check_ip_address (s_ip6, 3, "3:4:5:6:7:8:9:0", 128);
check_ip_address (s_ip6, 4, "3:4:5:6:7:8:9:14", 64);
check_ip_address (s_ip6, 5, "3:4:5:6:7:8:9:15", 64);
check_ip_address (s_ip6, 6, "3:4:5:6:7:8:9:16", 66);
check_ip_address (s_ip6, 7, "3:4:5:6:7:8:9:17", 67);
check_ip_address (s_ip6, 8, "3:4:5:6:7:8:9:18", 68);
check_ip_address (s_ip6, 9, "3:4:5:6:7:8:9:19", 69);
/* IPv6 gateway */
g_assert_cmpstr (nm_setting_ip_config_get_gateway (s_ip6), ==, "2:3:4:5:1:2:3:4");
/* Routes */
g_assert_cmpint (nm_setting_ip_config_get_num_routes (s_ip6), ==, 7);
check_ip_route (s_ip6, 0, "d:e:f:0:1:2:3:4", 64, "f:e:d:c:1:2:3:4", -1);
check_ip_route (s_ip6, 1, "a:b:c:d::", 64, "f:e:d:c:1:2:3:4", 99);
check_ip_route (s_ip6, 2, "8:7:6:5:4:3:2:1", 128, NULL, -1);
check_ip_route (s_ip6, 3, "6:7:8:9:0:1:2:3", 126, NULL, 1);
check_ip_route (s_ip6, 4, "7:8:9:0:1:2:3:4", 125, NULL, 5);
check_ip_route (s_ip6, 5, "8:9:0:1:2:3:4:5", 124, NULL, 6);
check_ip_route (s_ip6, 6, "8:9:0:1:2:3:4:6", 123, NULL, -1);
/* Route attributes */
route = nm_setting_ip_config_get_route (s_ip6, 6);
g_assert (route);
nmtst_assert_route_attribute_string (route, NM_IP_ROUTE_ATTRIBUTE_FROM, "abce::/63");
}
static void
add_one_ip_address (NMSettingIPConfig *s_ip,
const char *addr,
guint32 prefix)
{
NMIPAddress *ip_addr;
gs_free_error GError *error = NULL;
ip_addr = nm_ip_address_new (NM_IS_SETTING_IP4_CONFIG (s_ip) ? AF_INET : AF_INET6,
addr, prefix, &error);
g_assert_no_error (error);
nm_setting_ip_config_add_address (s_ip, ip_addr);
nm_ip_address_unref (ip_addr);
}
static void
add_one_ip_route (NMSettingIPConfig *s_ip,
const char *dest,
const char *nh,
guint32 prefix,
gint64 metric)
{
NMIPRoute *route;
gs_free_error GError *error = NULL;
g_assert (prefix > 0);
route = nm_ip_route_new (NM_IS_SETTING_IP4_CONFIG (s_ip) ? AF_INET : AF_INET6,
dest, prefix, nh, metric, &error);
g_assert_no_error (error);
nm_setting_ip_config_add_route (s_ip, route);
nm_ip_route_unref (route);
}
static void
test_write_wired_connection (void)
{
NMTST_UUID_INIT (uuid);
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingWired *s_wired;
NMSettingIPConfig *s_ip4;
NMSettingIPConfig *s_ip6;
NMIPRoute *rt;
const char *mac = "99:88:77:66:55:44";
const char *dns1 = "4.2.2.1";
const char *dns2 = "4.2.2.2";
const char *address1 = "192.168.0.5";
const char *address2 = "1.2.3.4";
const char *gw = "192.168.0.1";
const char *route1 = "10.10.10.2";
const char *route1_nh = "10.10.10.1";
const char *route2 = "1.1.1.1";
const char *route2_nh = "1.2.1.1";
const char *route3 = "2.2.2.2";
const char *route3_nh = NULL;
const char *route4 = "3.3.3.3";
const char *route4_nh = NULL;
const char *dns6_1 = "1::cafe";
const char *dns6_2 = "2::cafe";
const char *address6_1 = "abcd::beef";
const char *address6_2 = "dcba::beef";
const char *route6_1 = "1:2:3:4:5:6:7:8";
const char *route6_1_nh = "8:7:6:5:4:3:2:1";
const char *route6_2 = "2001::1000";
const char *route6_2_nh = "2001::1111";
const char *route6_3 = "4:5:6:7:8:9:0:1";
const char *route6_3_nh = "::";
const char *route6_4 = "5:6:7:8:9:0:1:2";
const char *route6_4_nh = "::";
guint64 timestamp = 0x12345678L;
GError *error = NULL;
connection = nm_simple_connection_new ();
/* Connection setting */
s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
nm_connection_add_setting (connection, NM_SETTING (s_con));
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, "Work Wired",
NM_SETTING_CONNECTION_UUID, uuid,
NM_SETTING_CONNECTION_AUTOCONNECT, FALSE,
NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME,
NM_SETTING_CONNECTION_TIMESTAMP, timestamp,
NULL);
/* Wired setting */
s_wired = NM_SETTING_WIRED (nm_setting_wired_new ());
nm_connection_add_setting (connection, NM_SETTING (s_wired));
g_object_set (s_wired,
NM_SETTING_WIRED_MAC_ADDRESS, mac,
NM_SETTING_WIRED_MTU, 900,
NULL);
/* IP4 setting */
s_ip4 = NM_SETTING_IP_CONFIG (nm_setting_ip4_config_new ());
nm_connection_add_setting (connection, NM_SETTING (s_ip4));
g_object_set (s_ip4,
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_MANUAL,
NM_SETTING_IP_CONFIG_GATEWAY, gw,
NULL);
/* Addresses */
add_one_ip_address (s_ip4, address1, 24);
add_one_ip_address (s_ip4, address2, 8);
/* Routes */
add_one_ip_route (s_ip4, route1, route1_nh, 24, 3);
add_one_ip_route (s_ip4, route2, route2_nh, 8, 1);
add_one_ip_route (s_ip4, route3, route3_nh, 7, -1);
rt = nm_ip_route_new (AF_INET, route4, 6, route4_nh, 4, &error);
g_assert_no_error (error);
nm_ip_route_set_attribute (rt, NM_IP_ROUTE_ATTRIBUTE_CWND, g_variant_new_uint32 (10));
nm_ip_route_set_attribute (rt, NM_IP_ROUTE_ATTRIBUTE_MTU, g_variant_new_uint32 (1492));
nm_ip_route_set_attribute (rt, NM_IP_ROUTE_ATTRIBUTE_SRC, g_variant_new_string ("1.2.3.4"));
g_assert (nm_setting_ip_config_add_route (s_ip4, rt));
nm_ip_route_unref (rt);
/* DNS servers */
nm_setting_ip_config_add_dns (s_ip4, dns1);
nm_setting_ip_config_add_dns (s_ip4, dns2);
/* IP6 setting */
s_ip6 = NM_SETTING_IP_CONFIG (nm_setting_ip6_config_new ());
nm_connection_add_setting (connection, NM_SETTING (s_ip6));
g_object_set (s_ip6,
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_MANUAL,
NULL);
/* Addresses */
add_one_ip_address (s_ip6, address6_1, 64);
add_one_ip_address (s_ip6, address6_2, 56);
/* Routes */
add_one_ip_route (s_ip6, route6_1, route6_1_nh, 64, 3);
add_one_ip_route (s_ip6, route6_2, route6_2_nh, 56, 1);
add_one_ip_route (s_ip6, route6_3, route6_3_nh, 63, 5);
add_one_ip_route (s_ip6, route6_4, route6_4_nh, 62, -1);
/* DNS servers */
nm_setting_ip_config_add_dns (s_ip6, dns6_1);
nm_setting_ip_config_add_dns (s_ip6, dns6_2);
/* DNS searches */
nm_setting_ip_config_add_dns_search (s_ip6, "wallaceandgromit.com");
write_test_connection_and_reread (connection, FALSE);
}
static void
test_read_ip6_wired_connection (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingWired *s_wired;
NMSettingIPConfig *s_ip4;
NMSettingIPConfig *s_ip6;
gs_free_error GError *error = NULL;
gboolean success;
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR "/Test_Wired_Connection_IP6", NULL);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* ===== CONNECTION SETTING ===== */
s_con = nm_connection_get_setting_connection (connection);
g_assert (s_con);
g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "Test Wired Connection IP6");
g_assert_cmpstr (nm_setting_connection_get_uuid (s_con), ==, "4e80a56d-c99f-4aad-a6dd-b449bc398c57");
/* ===== WIRED SETTING ===== */
s_wired = nm_connection_get_setting_wired (connection);
g_assert (s_wired);
/* ===== IPv4 SETTING ===== */
s_ip4 = nm_connection_get_setting_ip4_config (connection);
g_assert (s_ip4);
g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_DISABLED);
g_assert_cmpint (nm_setting_ip_config_get_num_addresses (s_ip4), ==, 0);
/* ===== IPv6 SETTING ===== */
s_ip6 = nm_connection_get_setting_ip6_config (connection);
g_assert (s_ip6);
g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6), ==, NM_SETTING_IP6_CONFIG_METHOD_MANUAL);
g_assert_cmpint (nm_setting_ip_config_get_num_addresses (s_ip6), ==, 1);
check_ip_address (s_ip6, 0, "abcd:1234:ffff::cdde", 64);
g_assert_cmpstr (nm_setting_ip_config_get_gateway (s_ip6), ==, "abcd:1234:ffff::cdd1");
}
static void
test_write_ip6_wired_connection (void)
{
NMTST_UUID_INIT (uuid);
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingWired *s_wired;
NMSettingIPConfig *s_ip4;
NMSettingIPConfig *s_ip6;
const char *dns = "1::cafe";
const char *address = "abcd::beef";
const char *gw = "dcba::beef";
connection = nm_simple_connection_new ();
/* Connection setting */
s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
nm_connection_add_setting (connection, NM_SETTING (s_con));
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, "Work Wired IP6",
NM_SETTING_CONNECTION_UUID, uuid,
NM_SETTING_CONNECTION_AUTOCONNECT, FALSE,
NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME,
NULL);
/* Wired setting */
s_wired = NM_SETTING_WIRED (nm_setting_wired_new ());
nm_connection_add_setting (connection, NM_SETTING (s_wired));
/* IP4 setting */
s_ip4 = NM_SETTING_IP_CONFIG (nm_setting_ip4_config_new ());
nm_connection_add_setting (connection, NM_SETTING (s_ip4));
g_object_set (s_ip4,
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_DISABLED,
NULL);
/* IP6 setting */
s_ip6 = NM_SETTING_IP_CONFIG (nm_setting_ip6_config_new ());
nm_connection_add_setting (connection, NM_SETTING (s_ip6));
g_object_set (s_ip6,
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_MANUAL,
NM_SETTING_IP_CONFIG_GATEWAY, gw,
NULL);
/* Addresses */
add_one_ip_address (s_ip6, address, 64);
/* DNS servers */
nm_setting_ip_config_add_dns (s_ip6, dns);
/* DNS searches */
nm_setting_ip_config_add_dns_search (s_ip6, "wallaceandgromit.com");
write_test_connection_and_reread (connection, FALSE);
}
static void
test_read_wired_mac_case (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingWired *s_wired;
gs_free_error GError *error = NULL;
const char *mac;
char expected_mac_address[ETH_ALEN] = { 0x00, 0x11, 0xaa, 0xbb, 0xcc, 0x55 };
gboolean success;
NMTST_EXPECT_NM_INFO ("*ipv4.addresses*semicolon at the end*addresses1*");
NMTST_EXPECT_NM_INFO ("*ipv4.addresses*semicolon at the end*addresses2*");
NMTST_EXPECT_NM_INFO ("*ipv6.routes*semicolon at the end*routes1*");
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR "/Test_Wired_Connection_MAC_Case", NULL);
g_test_assert_expected_messages ();
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* ===== CONNECTION SETTING ===== */
s_con = nm_connection_get_setting_connection (connection);
g_assert (s_con);
g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "Test Wired Connection MAC Case");
g_assert_cmpstr (nm_setting_connection_get_uuid (s_con), ==, "4e80a56d-c99f-4aad-a6dd-b449bc398c57");
/* ===== WIRED SETTING ===== */
s_wired = nm_connection_get_setting_wired (connection);
g_assert (s_wired);
mac = nm_setting_wired_get_mac_address (s_wired);
g_assert (mac);
g_assert (nm_utils_hwaddr_matches (mac, -1, expected_mac_address, sizeof (expected_mac_address)));
}
static void
test_read_mac_old_format (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingWired *s_wired;
gs_free_error GError *error = NULL;
gboolean success;
const char *mac;
char expected_mac[ETH_ALEN] = { 0x00, 0x11, 0xaa, 0xbb, 0xcc, 0x55 };
char expected_cloned_mac[ETH_ALEN] = { 0x00, 0x16, 0xaa, 0xbb, 0xcc, 0xfe };
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR "/Test_MAC_Old_Format", &error);
g_assert_no_error (error);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
s_wired = nm_connection_get_setting_wired (connection);
g_assert (s_wired);
/* MAC address */
mac = nm_setting_wired_get_mac_address (s_wired);
g_assert (mac);
g_assert (nm_utils_hwaddr_matches (mac, -1, expected_mac, ETH_ALEN));
/* Cloned MAC address */
mac = nm_setting_wired_get_cloned_mac_address (s_wired);
g_assert (mac);
g_assert (nm_utils_hwaddr_matches (mac, -1, expected_cloned_mac, ETH_ALEN));
}
static void
test_read_mac_ib_old_format (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingInfiniband *s_ib;
gs_free_error GError *error = NULL;
gboolean success;
const char *mac;
guint8 expected_mac[INFINIBAND_ALEN] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66,
0x77, 0x88, 0x99, 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 0x89,
0x90 };
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR "/Test_MAC_IB_Old_Format", &error);
g_assert_no_error (error);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
s_ib = nm_connection_get_setting_infiniband (connection);
g_assert (s_ib);
/* MAC address */
mac = nm_setting_infiniband_get_mac_address (s_ib);
g_assert (mac);
g_assert (nm_utils_hwaddr_matches (mac, -1, expected_mac, sizeof (expected_mac)));
}
static void
test_read_valid_wireless_connection (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingWireless *s_wireless;
NMSettingIPConfig *s_ip4;
gs_free_error GError *error = NULL;
const char *bssid;
const guint8 expected_bssid[ETH_ALEN] = { 0x00, 0x1a, 0x33, 0x44, 0x99, 0x82 };
gboolean success;
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR "/Test_Wireless_Connection", NULL);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* ===== CONNECTION SETTING ===== */
s_con = nm_connection_get_setting_connection (connection);
g_assert (s_con);
g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "Test Wireless Connection");
g_assert_cmpstr (nm_setting_connection_get_uuid (s_con), ==, "2f962388-e5f3-45af-a62c-ac220b8f7baa");
g_assert_cmpuint (nm_setting_connection_get_timestamp (s_con), ==, 1226604314);
g_assert (nm_setting_connection_get_autoconnect (s_con) == FALSE);
/* ===== WIRELESS SETTING ===== */
s_wireless = nm_connection_get_setting_wireless (connection);
g_assert (s_wireless);
bssid = nm_setting_wireless_get_bssid (s_wireless);
g_assert (bssid);
g_assert (nm_utils_hwaddr_matches (bssid, -1, expected_bssid, sizeof (expected_bssid)));
/* ===== IPv4 SETTING ===== */
s_ip4 = nm_connection_get_setting_ip4_config (connection);
g_assert (s_ip4);
g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
}
static void
test_write_wireless_connection (void)
{
NMTST_UUID_INIT (uuid);
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingWireless *s_wireless;
NMSettingIPConfig *s_ip4;
NMSettingIPConfig *s_ip6;
const char *bssid = "aa:b9:a1:74:55:44";
GBytes *ssid;
unsigned char tmpssid[] = { 0x31, 0x33, 0x33, 0x37 };
guint64 timestamp = 0x12344433L;
connection = nm_simple_connection_new ();
/* Connection setting */
s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
nm_connection_add_setting (connection, NM_SETTING (s_con));
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, "Work Wireless",
NM_SETTING_CONNECTION_UUID, uuid,
NM_SETTING_CONNECTION_AUTOCONNECT, FALSE,
NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRELESS_SETTING_NAME,
NM_SETTING_CONNECTION_TIMESTAMP, timestamp,
NULL);
/* Wireless setting */
s_wireless = NM_SETTING_WIRELESS (nm_setting_wireless_new ());
nm_connection_add_setting (connection, NM_SETTING (s_wireless));
ssid = g_bytes_new (tmpssid, sizeof (tmpssid));
g_object_set (s_wireless,
NM_SETTING_WIRELESS_BSSID, bssid,
NM_SETTING_WIRELESS_SSID, ssid,
NM_SETTING_WIRED_MTU, 1000,
NULL);
g_bytes_unref (ssid);
/* IP4 setting */
s_ip4 = NM_SETTING_IP_CONFIG (nm_setting_ip4_config_new ());
nm_connection_add_setting (connection, NM_SETTING (s_ip4));
g_object_set (s_ip4,
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO,
NULL);
/* IP6 setting */
s_ip6 = NM_SETTING_IP_CONFIG (nm_setting_ip6_config_new ());
nm_connection_add_setting (connection, NM_SETTING (s_ip6));
g_object_set (s_ip6,
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_AUTO,
NULL);
write_test_connection_and_reread (connection, FALSE);
}
static void
test_read_string_ssid (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingWireless *s_wireless;
gs_free_error GError *error = NULL;
GBytes *ssid;
const guint8 *ssid_data;
gsize ssid_len;
const char *expected_ssid = "blah blah ssid 1234";
gboolean success;
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR "/Test_String_SSID", NULL);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* ===== WIRELESS SETTING ===== */
s_wireless = nm_connection_get_setting_wireless (connection);
g_assert (s_wireless);
ssid = nm_setting_wireless_get_ssid (s_wireless);
g_assert (ssid);
ssid_data = g_bytes_get_data (ssid, &ssid_len);
g_assert_cmpmem (ssid_data, ssid_len, expected_ssid, strlen (expected_ssid));
}
static void
test_write_string_ssid (void)
{
NMTST_UUID_INIT (uuid);
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingWireless *s_wireless;
NMSettingIPConfig *s_ip4;
char *tmp;
gs_free char *testfile = NULL;
GBytes *ssid;
unsigned char tmpssid[] = { 65, 49, 50, 51, 32, 46, 92, 46, 36, 37, 126, 93 };
gs_unref_keyfile GKeyFile *keyfile = NULL;
connection = nm_simple_connection_new ();
/* Connection setting */
s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
nm_connection_add_setting (connection, NM_SETTING (s_con));
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, "String SSID Test",
NM_SETTING_CONNECTION_UUID, uuid,
NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRELESS_SETTING_NAME,
NULL);
/* Wireless setting */
s_wireless = NM_SETTING_WIRELESS (nm_setting_wireless_new ());
nm_connection_add_setting (connection, NM_SETTING (s_wireless));
ssid = g_bytes_new (tmpssid, sizeof (tmpssid));
g_object_set (s_wireless, NM_SETTING_WIRELESS_SSID, ssid, NULL);
g_bytes_unref (ssid);
/* IP4 setting */
s_ip4 = NM_SETTING_IP_CONFIG (nm_setting_ip4_config_new ());
nm_connection_add_setting (connection, NM_SETTING (s_ip4));
g_object_set (s_ip4,
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO,
NULL);
write_test_connection (connection, &testfile);
/* Ensure the SSID was written out as a string */
keyfile = keyfile_load_from_file (testfile);
tmp = g_key_file_get_string (keyfile, "wifi", NM_SETTING_WIRELESS_SSID, NULL);
g_assert (tmp);
g_assert_cmpmem (tmp, strlen (tmp), tmpssid, sizeof (tmpssid));
g_free (tmp);
assert_reread_and_unlink (connection, TRUE, testfile);
}
static void
test_read_intlist_ssid (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingWireless *s_wifi;
gs_free_error GError *error = NULL;
gboolean success;
GBytes *ssid;
const guint8 *ssid_data;
gsize ssid_len;
const char *expected_ssid = "blah1234";
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR "/Test_Intlist_SSID", &error);
g_assert_no_error (error);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* SSID */
s_wifi = nm_connection_get_setting_wireless (connection);
g_assert (s_wifi);
ssid = nm_setting_wireless_get_ssid (s_wifi);
g_assert (ssid != NULL);
ssid_data = g_bytes_get_data (ssid, &ssid_len);
g_assert_cmpmem (ssid_data, ssid_len, expected_ssid, strlen (expected_ssid));
}
static void
test_write_intlist_ssid (void)
{
NMTST_UUID_INIT (uuid);
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingWireless *s_wifi;
NMSettingIPConfig *s_ip4;
gs_free char *testfile = NULL;
GBytes *ssid;
unsigned char tmpssid[] = { 65, 49, 50, 51, 0, 50, 50 };
gs_free_error GError *error = NULL;
gs_unref_keyfile GKeyFile *keyfile = NULL;
gint *intlist;
gsize len = 0, i;
connection = nm_simple_connection_new ();
g_assert (connection);
/* Connection setting */
s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
g_assert (s_con);
nm_connection_add_setting (connection, NM_SETTING (s_con));
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, "Intlist SSID Test",
NM_SETTING_CONNECTION_UUID, uuid,
NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRELESS_SETTING_NAME,
NULL);
/* Wireless setting */
s_wifi = NM_SETTING_WIRELESS (nm_setting_wireless_new ());
g_assert (s_wifi);
nm_connection_add_setting (connection, NM_SETTING (s_wifi));
ssid = g_bytes_new (tmpssid, sizeof (tmpssid));
g_object_set (s_wifi, NM_SETTING_WIRELESS_SSID, ssid, NULL);
g_bytes_unref (ssid);
/* IP4 setting */
s_ip4 = NM_SETTING_IP_CONFIG (nm_setting_ip4_config_new ());
g_assert (s_ip4);
nm_connection_add_setting (connection, NM_SETTING (s_ip4));
g_object_set (s_ip4, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, NULL);
write_test_connection (connection, &testfile);
/* Ensure the SSID was written out as an int list */
keyfile = keyfile_load_from_file (testfile);
intlist = g_key_file_get_integer_list (keyfile, "wifi", NM_SETTING_WIRELESS_SSID, &len, &error);
g_assert_no_error (error);
g_assert (intlist);
g_assert_cmpint (len, ==, sizeof (tmpssid));
for (i = 0; i < len; i++)
g_assert_cmpint (intlist[i], ==, tmpssid[i]);
g_free (intlist);
assert_reread_and_unlink (connection, TRUE, testfile);
}
static void
test_read_intlike_ssid (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingWireless *s_wifi;
gs_free_error GError *error = NULL;
gboolean success;
GBytes *ssid;
const guint8 *ssid_data;
gsize ssid_len;
const char *expected_ssid = "101";
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR "/Test_Intlike_SSID", &error);
g_assert_no_error (error);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* SSID */
s_wifi = nm_connection_get_setting_wireless (connection);
g_assert (s_wifi);
ssid = nm_setting_wireless_get_ssid (s_wifi);
g_assert (ssid != NULL);
ssid_data = g_bytes_get_data (ssid, &ssid_len);
g_assert_cmpint (ssid_len, ==, strlen (expected_ssid));
g_assert_cmpint (memcmp (ssid_data, expected_ssid, strlen (expected_ssid)), ==, 0);
}
static void
test_read_intlike_ssid_2 (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingWireless *s_wifi;
gs_free_error GError *error = NULL;
gboolean success;
GBytes *ssid;
const guint8 *ssid_data;
gsize ssid_len;
const char *expected_ssid = "11;12;13;";
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR "/Test_Intlike_SSID_2", &error);
g_assert_no_error (error);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* SSID */
s_wifi = nm_connection_get_setting_wireless (connection);
g_assert (s_wifi);
ssid = nm_setting_wireless_get_ssid (s_wifi);
g_assert (ssid != NULL);
ssid_data = g_bytes_get_data (ssid, &ssid_len);
g_assert_cmpint (ssid_len, ==, strlen (expected_ssid));
g_assert_cmpint (memcmp (ssid_data, expected_ssid, strlen (expected_ssid)), ==, 0);
}
static void
test_write_intlike_ssid (void)
{
NMTST_UUID_INIT (uuid);
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingWireless *s_wifi;
NMSettingIPConfig *s_ip4;
gs_free char *testfile = NULL;
GBytes *ssid;
unsigned char tmpssid[] = { 49, 48, 49 };
gs_free_error GError *error = NULL;
gs_unref_keyfile GKeyFile *keyfile = NULL;
char *tmp;
connection = nm_simple_connection_new ();
/* Connection setting */
s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
g_assert (s_con);
nm_connection_add_setting (connection, NM_SETTING (s_con));
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, "Intlike SSID Test",
NM_SETTING_CONNECTION_UUID, uuid,
NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRELESS_SETTING_NAME,
NULL);
/* Wireless setting */
s_wifi = NM_SETTING_WIRELESS (nm_setting_wireless_new ());
g_assert (s_wifi);
nm_connection_add_setting (connection, NM_SETTING (s_wifi));
ssid = g_bytes_new (tmpssid, sizeof (tmpssid));
g_object_set (s_wifi, NM_SETTING_WIRELESS_SSID, ssid, NULL);
g_bytes_unref (ssid);
/* IP4 setting */
s_ip4 = NM_SETTING_IP_CONFIG (nm_setting_ip4_config_new ());
g_assert (s_ip4);
nm_connection_add_setting (connection, NM_SETTING (s_ip4));
g_object_set (s_ip4, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, NULL);
write_test_connection (connection, &testfile);
/* Ensure the SSID was written out as a plain "101" */
keyfile = keyfile_load_from_file (testfile);
tmp = g_key_file_get_string (keyfile, "wifi", NM_SETTING_WIRELESS_SSID, &error);
g_assert_no_error (error);
g_assert (tmp);
g_assert_cmpstr (tmp, ==, "101");
g_free (tmp);
assert_reread_and_unlink (connection, TRUE, testfile);
}
static void
test_write_intlike_ssid_2 (void)
{
NMTST_UUID_INIT (uuid);
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingWireless *s_wifi;
NMSettingIPConfig *s_ip4;
gs_free char *testfile = NULL;
GBytes *ssid;
unsigned char tmpssid[] = { 49, 49, 59, 49, 50, 59, 49, 51, 59};
gs_free_error GError *error = NULL;
gs_unref_keyfile GKeyFile *keyfile = NULL;
char *tmp;
connection = nm_simple_connection_new ();
g_assert (connection);
/* Connection setting */
s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
g_assert (s_con);
nm_connection_add_setting (connection, NM_SETTING (s_con));
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, "Intlike SSID Test 2",
NM_SETTING_CONNECTION_UUID, uuid,
NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRELESS_SETTING_NAME,
NULL);
/* Wireless setting */
s_wifi = NM_SETTING_WIRELESS (nm_setting_wireless_new ());
g_assert (s_wifi);
nm_connection_add_setting (connection, NM_SETTING (s_wifi));
ssid = g_bytes_new (tmpssid, sizeof (tmpssid));
g_object_set (s_wifi, NM_SETTING_WIRELESS_SSID, ssid, NULL);
g_bytes_unref (ssid);
/* IP4 setting */
s_ip4 = NM_SETTING_IP_CONFIG (nm_setting_ip4_config_new ());
g_assert (s_ip4);
nm_connection_add_setting (connection, NM_SETTING (s_ip4));
g_object_set (s_ip4, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, NULL);
write_test_connection (connection, &testfile);
/* Ensure the SSID was written out as a plain "11;12;13;" */
keyfile = keyfile_load_from_file (testfile);
tmp = g_key_file_get_string (keyfile, "wifi", NM_SETTING_WIRELESS_SSID, &error);
g_assert_no_error (error);
g_assert (tmp);
g_assert_cmpstr (tmp, ==, "11\\;12\\;13\\;");
g_free (tmp);
assert_reread_and_unlink (connection, TRUE, testfile);
}
static void
test_read_bt_dun_connection (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingBluetooth *s_bluetooth;
NMSettingSerial *s_serial;
NMSettingGsm *s_gsm;
gs_free_error GError *error = NULL;
const char *bdaddr;
const guint8 expected_bdaddr[ETH_ALEN] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 };
gboolean success;
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR "/ATT_Data_Connect_BT", NULL);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* ===== CONNECTION SETTING ===== */
s_con = nm_connection_get_setting_connection (connection);
g_assert (s_con);
g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "AT&T Data Connect BT");
g_assert_cmpstr (nm_setting_connection_get_uuid (s_con), ==, "089130ab-ce28-46e4-ad77-d44869b03d19");
/* ===== BLUETOOTH SETTING ===== */
s_bluetooth = nm_connection_get_setting_bluetooth (connection);
g_assert (s_bluetooth);
bdaddr = nm_setting_bluetooth_get_bdaddr (s_bluetooth);
g_assert (bdaddr);
g_assert (nm_utils_hwaddr_matches (bdaddr, -1, expected_bdaddr, sizeof (expected_bdaddr)));
g_assert_cmpstr (nm_setting_bluetooth_get_connection_type (s_bluetooth), ==, NM_SETTING_BLUETOOTH_TYPE_DUN);
/* ===== GSM SETTING ===== */
s_gsm = nm_connection_get_setting_gsm (connection);
g_assert (s_gsm);
g_assert_cmpstr (nm_setting_gsm_get_apn (s_gsm), ==, "ISP.CINGULAR");
g_assert_cmpstr (nm_setting_gsm_get_username (s_gsm), ==, "ISP@CINGULARGPRS.COM");
g_assert_cmpstr (nm_setting_gsm_get_password (s_gsm), ==, "CINGULAR1");
/* ===== SERIAL SETTING ===== */
s_serial = nm_connection_get_setting_serial (connection);
g_assert (s_serial);
g_assert (nm_setting_serial_get_parity (s_serial) == NM_SETTING_SERIAL_PARITY_ODD);
}
static void
test_write_bt_dun_connection (void)
{
NMTST_UUID_INIT (uuid);
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingBluetooth *s_bt;
NMSettingIPConfig *s_ip4;
NMSettingGsm *s_gsm;
const char *bdaddr = "aa:b9:a1:74:55:44";
guint64 timestamp = 0x12344433L;
connection = nm_simple_connection_new ();
/* Connection setting */
s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
nm_connection_add_setting (connection, NM_SETTING (s_con));
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, "T-Mobile Funkadelic",
NM_SETTING_CONNECTION_UUID, uuid,
NM_SETTING_CONNECTION_AUTOCONNECT, FALSE,
NM_SETTING_CONNECTION_TYPE, NM_SETTING_BLUETOOTH_SETTING_NAME,
NM_SETTING_CONNECTION_TIMESTAMP, timestamp,
NULL);
/* Bluetooth setting */
s_bt = NM_SETTING_BLUETOOTH (nm_setting_bluetooth_new ());
nm_connection_add_setting (connection, NM_SETTING (s_bt));
g_object_set (s_bt,
NM_SETTING_BLUETOOTH_BDADDR, bdaddr,
NM_SETTING_BLUETOOTH_TYPE, NM_SETTING_BLUETOOTH_TYPE_DUN,
NULL);
/* IP4 setting */
s_ip4 = NM_SETTING_IP_CONFIG (nm_setting_ip4_config_new ());
nm_connection_add_setting (connection, NM_SETTING (s_ip4));
g_object_set (s_ip4,
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO,
NULL);
/* GSM setting */
s_gsm = NM_SETTING_GSM (nm_setting_gsm_new ());
nm_connection_add_setting (connection, NM_SETTING (s_gsm));
g_object_set (s_gsm,
NM_SETTING_GSM_APN, "internet2.voicestream.com",
NM_SETTING_GSM_USERNAME, "george.clinton",
NM_SETTING_GSM_PASSWORD, "parliament",
NM_SETTING_GSM_NUMBER, "*99#",
NULL);
write_test_connection_and_reread (connection, TRUE);
}
static void
test_read_gsm_connection (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingSerial *s_serial;
NMSettingGsm *s_gsm;
gs_free_error GError *error = NULL;
gboolean success;
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR "/ATT_Data_Connect_Plain", &error);
g_assert_no_error (error);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* ===== CONNECTION SETTING ===== */
s_con = nm_connection_get_setting_connection (connection);
g_assert (s_con);
g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "AT&T Data Connect");
g_assert_cmpstr (nm_setting_connection_get_connection_type (s_con), ==, NM_SETTING_GSM_SETTING_NAME);
/* ===== BLUETOOTH SETTING ===== */
/* Plain GSM, so no BT setting expected */
g_assert (nm_connection_get_setting_bluetooth (connection) == NULL);
/* ===== GSM SETTING ===== */
s_gsm = nm_connection_get_setting_gsm (connection);
g_assert (s_gsm);
g_assert_cmpstr (nm_setting_gsm_get_apn (s_gsm), ==, "ISP.CINGULAR");
g_assert_cmpstr (nm_setting_gsm_get_username (s_gsm), ==, "ISP@CINGULARGPRS.COM");
g_assert_cmpstr (nm_setting_gsm_get_password (s_gsm), ==, "CINGULAR1");
g_assert_cmpstr (nm_setting_gsm_get_network_id (s_gsm), ==, "24005");
g_assert_cmpstr (nm_setting_gsm_get_pin (s_gsm), ==, "2345");
g_assert_cmpstr (nm_setting_gsm_get_device_id (s_gsm), ==, "da812de91eec16620b06cd0ca5cbc7ea25245222");
g_assert_cmpstr (nm_setting_gsm_get_sim_id (s_gsm), ==, "89148000000060671234");
g_assert_cmpstr (nm_setting_gsm_get_sim_operator_id (s_gsm), ==, "310260");
/* ===== SERIAL SETTING ===== */
s_serial = nm_connection_get_setting_serial (connection);
g_assert (s_serial);
g_assert_cmpint (nm_setting_serial_get_parity (s_serial), ==, NM_SETTING_SERIAL_PARITY_ODD);
}
static void
test_write_gsm_connection (void)
{
NMTST_UUID_INIT (uuid);
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingIPConfig *s_ip4;
NMSettingGsm *s_gsm;
guint64 timestamp = 0x12344433L;
connection = nm_simple_connection_new ();
/* Connection setting */
s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
nm_connection_add_setting (connection, NM_SETTING (s_con));
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, "T-Mobile Funkadelic 2",
NM_SETTING_CONNECTION_UUID, uuid,
NM_SETTING_CONNECTION_AUTOCONNECT, FALSE,
NM_SETTING_CONNECTION_TYPE, NM_SETTING_GSM_SETTING_NAME,
NM_SETTING_CONNECTION_TIMESTAMP, timestamp,
NULL);
/* IP4 setting */
s_ip4 = NM_SETTING_IP_CONFIG (nm_setting_ip4_config_new ());
nm_connection_add_setting (connection, NM_SETTING (s_ip4));
g_object_set (s_ip4,
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO,
NULL);
/* GSM setting */
s_gsm = NM_SETTING_GSM (nm_setting_gsm_new ());
nm_connection_add_setting (connection, NM_SETTING (s_gsm));
g_object_set (s_gsm,
NM_SETTING_GSM_APN, "internet2.voicestream.com",
NM_SETTING_GSM_USERNAME, "george.clinton.again",
NM_SETTING_GSM_PASSWORD, "parliament2",
NM_SETTING_GSM_NUMBER, "*99#",
NM_SETTING_GSM_PIN, "123456",
NM_SETTING_GSM_NETWORK_ID, "254098",
NM_SETTING_GSM_HOME_ONLY, TRUE,
NM_SETTING_GSM_DEVICE_ID, "da812de91eec16620b06cd0ca5cbc7ea25245222",
NM_SETTING_GSM_SIM_ID, "89148000000060671234",
NM_SETTING_GSM_SIM_OPERATOR_ID, "310260",
NULL);
write_test_connection_and_reread (connection, TRUE);
}
static void
test_read_wired_8021x_tls_blob_connection (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingWired *s_wired;
NMSetting8021x *s_8021x;
gs_free_error GError *error = NULL;
const char *tmp;
gboolean success;
GBytes *blob;
NMTST_EXPECT_NM_WARN ("keyfile: 802-1x.client-cert: certificate or key file '/CASA/dcbw/Desktop/certinfra/client.pem' does not exist*");
NMTST_EXPECT_NM_WARN ("keyfile: 802-1x.private-key: certificate or key file '/CASA/dcbw/Desktop/certinfra/client.pem' does not exist*");
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR "/Test_Wired_TLS_Blob", &error);
g_assert_no_error (error);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* ===== Wired Setting ===== */
s_wired = nm_connection_get_setting_wired (connection);
g_assert (s_wired != NULL);
/* ===== 802.1x Setting ===== */
s_8021x = nm_connection_get_setting_802_1x (connection);
g_assert (s_8021x != NULL);
g_assert (nm_setting_802_1x_get_num_eap_methods (s_8021x) == 1);
tmp = nm_setting_802_1x_get_eap_method (s_8021x, 0);
g_assert (g_strcmp0 (tmp, "tls") == 0);
tmp = nm_setting_802_1x_get_identity (s_8021x);
g_assert (g_strcmp0 (tmp, "Bill Smith") == 0);
tmp = nm_setting_802_1x_get_private_key_password (s_8021x);
g_assert (g_strcmp0 (tmp, "12345testing") == 0);
g_assert_cmpint (nm_setting_802_1x_get_ca_cert_scheme (s_8021x), ==, NM_SETTING_802_1X_CK_SCHEME_BLOB);
/* Make sure it's not a path, since it's a blob */
NMTST_EXPECT_LIBNM_CRITICAL (NMTST_G_RETURN_MSG (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH));
tmp = nm_setting_802_1x_get_ca_cert_path (s_8021x);
g_test_assert_expected_messages ();
g_assert (tmp == NULL);
/* Validate the path */
blob = nm_setting_802_1x_get_ca_cert_blob (s_8021x);
g_assert (blob != NULL);
g_assert_cmpint (g_bytes_get_size (blob), ==, 568);
tmp = nm_setting_802_1x_get_client_cert_path (s_8021x);
g_assert_cmpstr (tmp, ==, "/CASA/dcbw/Desktop/certinfra/client.pem");
tmp = nm_setting_802_1x_get_private_key_path (s_8021x);
g_assert_cmpstr (tmp, ==, "/CASA/dcbw/Desktop/certinfra/client.pem");
}
static void
test_read_wired_8021x_tls_bad_path_connection (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingWired *s_wired;
NMSetting8021x *s_8021x;
gs_free_error GError *error = NULL;
const char *tmp;
char *tmp2;
gboolean success;
NMTST_EXPECT_NM_WARN ("*does not exist*");
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR "/Test_Wired_TLS_Path_Missing", &error);
g_test_assert_expected_messages ();
g_assert_no_error (error);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* ===== Wired Setting ===== */
s_wired = nm_connection_get_setting_wired (connection);
g_assert (s_wired != NULL);
/* ===== 802.1x Setting ===== */
s_8021x = nm_connection_get_setting_802_1x (connection);
g_assert (s_8021x != NULL);
g_assert (nm_setting_802_1x_get_num_eap_methods (s_8021x) == 1);
tmp = nm_setting_802_1x_get_eap_method (s_8021x, 0);
g_assert (g_strcmp0 (tmp, "tls") == 0);
tmp = nm_setting_802_1x_get_identity (s_8021x);
g_assert (g_strcmp0 (tmp, "Bill Smith") == 0);
tmp = nm_setting_802_1x_get_private_key_password (s_8021x);
g_assert (g_strcmp0 (tmp, "12345testing") == 0);
g_assert_cmpint (nm_setting_802_1x_get_ca_cert_scheme (s_8021x), ==, NM_SETTING_802_1X_CK_SCHEME_PATH);
tmp = nm_setting_802_1x_get_ca_cert_path (s_8021x);
g_assert_cmpstr (tmp, ==, "/some/random/cert/path.pem");
tmp2 = g_strdup_printf (TEST_KEYFILES_DIR "/test-key-and-cert.pem");
tmp = nm_setting_802_1x_get_client_cert_path (s_8021x);
g_assert_cmpstr (tmp, ==, tmp2);
tmp = nm_setting_802_1x_get_private_key_path (s_8021x);
g_assert_cmpstr (tmp, ==, tmp2);
g_free (tmp2);
}
static void
test_read_wired_8021x_tls_old_connection (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingWired *s_wired;
NMSetting8021x *s_8021x;
gs_free_error GError *error = NULL;
const char *tmp;
gboolean success;
NMTST_EXPECT_NM_WARN ("keyfile: 802-1x.ca-cert: certificate or key file '/CASA/dcbw/Desktop/certinfra/CA/eaptest_ca_cert.pem' does not exist*");
NMTST_EXPECT_NM_WARN ("keyfile: 802-1x.client-cert: certificate or key file '/CASA/dcbw/Desktop/certinfra/client.pem' does not exist*");
NMTST_EXPECT_NM_WARN ("keyfile: 802-1x.private-key: certificate or key file '/CASA/dcbw/Desktop/certinfra/client.pem' does not exist*");
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR "/Test_Wired_TLS_Old", &error);
g_assert_no_error (error);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* ===== Wired Setting ===== */
s_wired = nm_connection_get_setting_wired (connection);
g_assert (s_wired != NULL);
/* ===== 802.1x Setting ===== */
s_8021x = nm_connection_get_setting_802_1x (connection);
g_assert (s_8021x != NULL);
g_assert (nm_setting_802_1x_get_num_eap_methods (s_8021x) == 1);
tmp = nm_setting_802_1x_get_eap_method (s_8021x, 0);
g_assert (g_strcmp0 (tmp, "tls") == 0);
tmp = nm_setting_802_1x_get_identity (s_8021x);
g_assert (g_strcmp0 (tmp, "Bill Smith") == 0);
tmp = nm_setting_802_1x_get_private_key_password (s_8021x);
g_assert (g_strcmp0 (tmp, "12345testing") == 0);
tmp = nm_setting_802_1x_get_ca_cert_path (s_8021x);
g_assert (g_strcmp0 (tmp, "/CASA/dcbw/Desktop/certinfra/CA/eaptest_ca_cert.pem") == 0);
tmp = nm_setting_802_1x_get_client_cert_path (s_8021x);
g_assert (g_strcmp0 (tmp, "/CASA/dcbw/Desktop/certinfra/client.pem") == 0);
tmp = nm_setting_802_1x_get_private_key_path (s_8021x);
g_assert (g_strcmp0 (tmp, "/CASA/dcbw/Desktop/certinfra/client.pem") == 0);
}
static void
test_read_wired_8021x_tls_new_connection (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingWired *s_wired;
NMSetting8021x *s_8021x;
gs_free_error GError *error = NULL;
const char *tmp;
char *tmp2;
gboolean success;
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR "/Test_Wired_TLS_New", &error);
g_assert_no_error (error);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* ===== Wired Setting ===== */
s_wired = nm_connection_get_setting_wired (connection);
g_assert (s_wired != NULL);
/* ===== 802.1x Setting ===== */
s_8021x = nm_connection_get_setting_802_1x (connection);
g_assert (s_8021x != NULL);
g_assert (nm_setting_802_1x_get_num_eap_methods (s_8021x) == 1);
tmp = nm_setting_802_1x_get_eap_method (s_8021x, 0);
g_assert (g_strcmp0 (tmp, "tls") == 0);
tmp = nm_setting_802_1x_get_identity (s_8021x);
g_assert (g_strcmp0 (tmp, "Bill Smith") == 0);
tmp = nm_setting_802_1x_get_private_key_password (s_8021x);
g_assert (g_strcmp0 (tmp, "12345testing") == 0);
tmp2 = g_strdup_printf (TEST_KEYFILES_DIR "/test-ca-cert.pem");
tmp = nm_setting_802_1x_get_ca_cert_path (s_8021x);
g_assert_cmpstr (tmp, ==, tmp2);
g_free (tmp2);
tmp2 = g_strdup_printf (TEST_KEYFILES_DIR "/test-key-and-cert.pem");
tmp = nm_setting_802_1x_get_client_cert_path (s_8021x);
g_assert_cmpstr (tmp, ==, tmp2);
tmp = nm_setting_802_1x_get_private_key_path (s_8021x);
g_assert_cmpstr (tmp, ==, tmp2);
g_free (tmp2);
}
#define TEST_WIRED_TLS_CA_CERT TEST_KEYFILES_DIR"/test-ca-cert.pem"
#define TEST_WIRED_TLS_CLIENT_CERT TEST_KEYFILES_DIR"/test-key-and-cert.pem"
#define TEST_WIRED_TLS_PRIVKEY TEST_KEYFILES_DIR"/test-key-and-cert.pem"
static NMConnection *
create_wired_tls_connection (NMSetting8021xCKScheme scheme)
{
NMTST_UUID_INIT (uuid);
NMConnection *connection;
NMSettingConnection *s_con;
NMSettingIPConfig *s_ip4;
NMSetting *s_wired;
NMSetting8021x *s_8021x;
gboolean success;
gs_free_error GError *error = NULL;
connection = nm_simple_connection_new ();
g_assert (connection != NULL);
/* Connection setting */
s_con = (NMSettingConnection *) nm_setting_connection_new ();
g_assert (s_con);
nm_connection_add_setting (connection, NM_SETTING (s_con));
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, "Wired Really Secure TLS",
NM_SETTING_CONNECTION_UUID, uuid,
NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME,
NULL);
/* IP4 setting */
s_ip4 = (NMSettingIPConfig *) nm_setting_ip4_config_new ();
g_assert (s_ip4);
g_object_set (s_ip4, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, NULL);
nm_connection_add_setting (connection, NM_SETTING (s_ip4));
/* Wired setting */
s_wired = nm_setting_wired_new ();
g_assert (s_wired);
nm_connection_add_setting (connection, s_wired);
/* 802.1x setting */
s_8021x = (NMSetting8021x *) nm_setting_802_1x_new ();
g_assert (s_8021x);
nm_connection_add_setting (connection, NM_SETTING (s_8021x));
nm_setting_802_1x_add_eap_method (s_8021x, "tls");
g_object_set (s_8021x, NM_SETTING_802_1X_IDENTITY, "Bill Smith", NULL);
success = nm_setting_802_1x_set_ca_cert (s_8021x,
TEST_WIRED_TLS_CA_CERT,
scheme,
NULL,
&error);
g_assert_no_error (error);
g_assert (success);
success = nm_setting_802_1x_set_client_cert (s_8021x,
TEST_WIRED_TLS_CLIENT_CERT,
scheme,
NULL,
&error);
g_assert_no_error (error);
g_assert (success);
success = nm_setting_802_1x_set_private_key (s_8021x,
TEST_WIRED_TLS_PRIVKEY,
"test1",
scheme,
NULL,
&error);
g_assert_no_error (error);
g_assert (success);
return connection;
}
static char *
get_path (const char *file, gboolean relative)
{
return relative ? g_path_get_basename (file) : g_strdup (file);
}
static void
test_write_wired_8021x_tls_connection_path (void)
{
gs_unref_object NMConnection *connection = NULL;
gs_unref_object NMConnection *reread = NULL;
char *tmp, *tmp2;
gboolean success;
gs_free char *testfile = NULL;
gs_free_error GError *error = NULL;
gs_unref_keyfile GKeyFile *keyfile = NULL;
gboolean relative = FALSE;
gboolean reread_same = FALSE;
connection = create_wired_tls_connection (NM_SETTING_802_1X_CK_SCHEME_PATH);
g_assert (connection != NULL);
write_test_connection_reread (connection, &testfile, &reread, &reread_same);
nmtst_assert_connection_verifies_without_normalization (reread);
_setting_copy_property_gbytes (connection, reread, NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_CA_CERT);
_setting_copy_property_gbytes (connection, reread, NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_CLIENT_CERT);
_setting_copy_property_gbytes (connection, reread, NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PRIVATE_KEY);
assert_reread_same (connection, reread);
g_clear_object (&reread);
/* Read the connection back in and compare it to the one we just wrote out */
reread = nms_keyfile_reader_from_file (testfile, &error);
if (!reread) {
g_assert (error);
g_warning ("Failed to re-read test connection: %s", error->message);
g_assert (reread);
}
success = nm_connection_compare (connection, reread, NM_SETTING_COMPARE_FLAG_EXACT);
if (!reread) {
g_warning ("Written and re-read connection weren't the same");
g_assert (success);
}
/* Ensure the cert and key values are properly written out */
keyfile = keyfile_load_from_file (testfile);
/* Depending on whether this test is being run from 'make check' or
* 'make distcheck' we might be using relative paths (check) or
* absolute ones (distcheck).
*/
tmp2 = g_path_get_dirname (testfile);
if (g_strcmp0 (tmp2, TEST_KEYFILES_DIR) == 0)
relative = TRUE;
g_free (tmp2);
/* CA cert */
tmp = g_key_file_get_string (keyfile,
NM_SETTING_802_1X_SETTING_NAME,
NM_SETTING_802_1X_CA_CERT,
NULL);
tmp2 = get_path (TEST_WIRED_TLS_CA_CERT, relative);
g_assert_cmpstr (tmp, ==, tmp2);
g_free (tmp2);
g_free (tmp);
/* Client cert */
tmp = g_key_file_get_string (keyfile,
NM_SETTING_802_1X_SETTING_NAME,
NM_SETTING_802_1X_CLIENT_CERT,
NULL);
tmp2 = get_path (TEST_WIRED_TLS_CLIENT_CERT, relative);
g_assert_cmpstr (tmp, ==, tmp2);
g_free (tmp2);
g_free (tmp);
/* Private key */
tmp = g_key_file_get_string (keyfile,
NM_SETTING_802_1X_SETTING_NAME,
NM_SETTING_802_1X_PRIVATE_KEY,
NULL);
tmp2 = get_path (TEST_WIRED_TLS_PRIVKEY, relative);
g_assert_cmpstr (tmp, ==, tmp2);
g_free (tmp2);
g_free (tmp);
unlink (testfile);
}
static void
test_write_wired_8021x_tls_connection_blob (void)
{
gs_unref_object NMConnection *connection = NULL;
gs_unref_object NMConnection *reread = NULL;
NMSettingConnection *s_con;
NMSetting8021x *s_8021x;
gs_free char *testfile = NULL;
char *new_ca_cert;
char *new_client_cert;
char *new_priv_key;
const char *uuid;
gboolean reread_same = FALSE;
gs_free_error GError *error = NULL;
GBytes *password_raw = NULL;
#define PASSWORD_RAW "password-raw\0test"
connection = create_wired_tls_connection (NM_SETTING_802_1X_CK_SCHEME_BLOB);
g_assert (connection != NULL);
s_8021x = nm_connection_get_setting_802_1x (connection);
g_assert (s_8021x);
password_raw = g_bytes_new (PASSWORD_RAW, NM_STRLEN (PASSWORD_RAW));
g_object_set (s_8021x,
NM_SETTING_802_1X_PASSWORD_RAW,
password_raw,
NULL);
g_bytes_unref (password_raw);
write_test_connection_reread (connection, &testfile, &reread, &reread_same);
nmtst_assert_connection_verifies_without_normalization (reread);
_setting_copy_property_gbytes (connection, reread, NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_CA_CERT);
_setting_copy_property_gbytes (connection, reread, NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_CLIENT_CERT);
_setting_copy_property_gbytes (connection, reread, NM_SETTING_802_1X_SETTING_NAME, NM_SETTING_802_1X_PRIVATE_KEY);
assert_reread_same (connection, reread);
g_clear_object (&reread);
/* Check that the new certs got written out */
s_con = nm_connection_get_setting_connection (connection);
g_assert (s_con);
uuid = nm_setting_connection_get_uuid (s_con);
g_assert (uuid);
new_ca_cert = g_strdup_printf ("%s/%s-ca-cert.pem", TEST_SCRATCH_DIR, uuid);
g_assert (new_ca_cert);
g_assert (g_file_test (new_ca_cert, G_FILE_TEST_EXISTS));
new_client_cert = g_strdup_printf ("%s/%s-client-cert.pem", TEST_SCRATCH_DIR, uuid);
g_assert (new_client_cert);
g_assert (g_file_test (new_client_cert, G_FILE_TEST_EXISTS));
new_priv_key = g_strdup_printf ("%s/%s-private-key.pem", TEST_SCRATCH_DIR, uuid);
g_assert (new_priv_key);
g_assert (g_file_test (new_priv_key, G_FILE_TEST_EXISTS));
/* Read the connection back in and compare it to the one we just wrote out */
reread = nms_keyfile_reader_from_file (testfile, &error);
if (!reread) {
g_assert (error);
g_warning ("Failed to re-read test connection: %s", error->message);
g_assert (reread);
}
/* Ensure the re-read connection's certificates use the path scheme */
s_8021x = nm_connection_get_setting_802_1x (reread);
g_assert (s_8021x);
g_assert (nm_setting_802_1x_get_ca_cert_scheme (s_8021x) == NM_SETTING_802_1X_CK_SCHEME_PATH);
g_assert (nm_setting_802_1x_get_client_cert_scheme (s_8021x) == NM_SETTING_802_1X_CK_SCHEME_PATH);
g_assert (nm_setting_802_1x_get_private_key_scheme (s_8021x) == NM_SETTING_802_1X_CK_SCHEME_PATH);
password_raw = nm_setting_802_1x_get_password_raw (s_8021x);
g_assert (password_raw);
g_assert (g_bytes_get_size (password_raw) == NM_STRLEN (PASSWORD_RAW));
g_assert (!memcmp (g_bytes_get_data (password_raw, NULL), PASSWORD_RAW, NM_STRLEN (PASSWORD_RAW)));
unlink (testfile);
/* Clean up written certs */
unlink (new_ca_cert);
g_free (new_ca_cert);
unlink (new_client_cert);
g_free (new_client_cert);
unlink (new_priv_key);
g_free (new_priv_key);
}
static void
test_read_dcb_connection (void)
{
gs_unref_object NMConnection *connection = NULL;
connection = keyfile_read_connection_from_file (TEST_KEYFILES_DIR"/Test_dcb_connection");
}
static void
test_read_infiniband_connection (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingInfiniband *s_ib;
gs_free_error GError *error = NULL;
const char *mac;
guint8 expected_mac[INFINIBAND_ALEN] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66,
0x77, 0x88, 0x99, 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 0x89,
0x90 };
const char *expected_id = "Test InfiniBand Connection";
const char *expected_uuid = "4e80a56d-c99f-4aad-a6dd-b449bc398c57";
gboolean success;
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR "/Test_InfiniBand_Connection", &error);
g_assert_no_error (error);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* Connection setting */
s_con = nm_connection_get_setting_connection (connection);
g_assert (s_con);
g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, expected_id);
g_assert_cmpstr (nm_setting_connection_get_uuid (s_con), ==, expected_uuid);
/* InfiniBand setting */
s_ib = nm_connection_get_setting_infiniband (connection);
g_assert (s_ib);
mac = nm_setting_infiniband_get_mac_address (s_ib);
g_assert (mac);
g_assert (nm_utils_hwaddr_matches (mac, -1, expected_mac, sizeof (expected_mac)));
}
static void
test_write_infiniband_connection (void)
{
NMTST_UUID_INIT (uuid);
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingInfiniband *s_ib;
NMSettingIPConfig *s_ip4;
NMSettingIPConfig *s_ip6;
const char *mac = "99:88:77:66:55:44:ab:bc:cd:de:ef:f0:0a:1b:2c:3d:4e:5f:6f:ba";
connection = nm_simple_connection_new ();
/* Connection setting */
s_con = (NMSettingConnection *) nm_setting_connection_new ();
g_assert (s_con);
nm_connection_add_setting (connection, NM_SETTING (s_con));
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, "Work InfiniBand",
NM_SETTING_CONNECTION_UUID, uuid,
NM_SETTING_CONNECTION_AUTOCONNECT, FALSE,
NM_SETTING_CONNECTION_TYPE, NM_SETTING_INFINIBAND_SETTING_NAME,
NULL);
/* InfiniBand setting */
s_ib = (NMSettingInfiniband *) nm_setting_infiniband_new ();
g_assert (s_ib);
nm_connection_add_setting (connection, NM_SETTING (s_ib));
g_object_set (s_ib,
NM_SETTING_INFINIBAND_MAC_ADDRESS, mac,
NM_SETTING_INFINIBAND_MTU, 900,
NM_SETTING_INFINIBAND_TRANSPORT_MODE, "datagram",
NULL);
/* IP4 setting */
s_ip4 = (NMSettingIPConfig *) nm_setting_ip4_config_new ();
g_assert (s_ip4);
nm_connection_add_setting (connection, NM_SETTING (s_ip4));
g_object_set (s_ip4, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, NULL);
/* IP6 setting */
s_ip6 = (NMSettingIPConfig *) nm_setting_ip6_config_new ();
g_assert (s_ip6);
nm_connection_add_setting (connection, NM_SETTING (s_ip6));
g_object_set (s_ip6, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_AUTO, NULL);
write_test_connection_and_reread (connection, FALSE);
}
static void
test_read_bridge_main (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingIPConfig *s_ip4;
NMSettingBridge *s_bridge;
gs_free_error GError *error = NULL;
const char *expected_id = "Test Bridge Main";
const char *expected_uuid = "8f061643-fe41-4d4c-a8d9-097d26e2ad3a";
gboolean success;
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR "/Test_Bridge_Main", &error);
g_assert_no_error (error);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* Connection setting */
s_con = nm_connection_get_setting_connection (connection);
g_assert (s_con);
g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, expected_id);
g_assert_cmpstr (nm_setting_connection_get_uuid (s_con), ==, expected_uuid);
g_assert_cmpstr (nm_setting_connection_get_interface_name (s_con), ==, "br0");
/* IPv4 setting */
s_ip4 = nm_connection_get_setting_ip4_config (connection);
g_assert (s_ip4);
g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4), ==, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
/* Bridge setting */
s_bridge = nm_connection_get_setting_bridge (connection);
g_assert (s_bridge);
g_assert_cmpuint (nm_setting_bridge_get_forward_delay (s_bridge), ==, 2);
g_assert_cmpuint (nm_setting_bridge_get_stp (s_bridge), ==, TRUE);
g_assert_cmpuint (nm_setting_bridge_get_priority (s_bridge), ==, 32744);
g_assert_cmpuint (nm_setting_bridge_get_hello_time (s_bridge), ==, 7);
g_assert_cmpuint (nm_setting_bridge_get_max_age (s_bridge), ==, 39);
g_assert_cmpuint (nm_setting_bridge_get_ageing_time (s_bridge), ==, 235352);
g_assert_cmpuint (nm_setting_bridge_get_multicast_snooping (s_bridge), ==, FALSE);
}
static void
test_write_bridge_main (void)
{
NMTST_UUID_INIT (uuid);
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingBridge *s_bridge;
NMSettingIPConfig *s_ip4;
NMSettingIPConfig *s_ip6;
connection = nm_simple_connection_new ();
g_assert (connection);
/* Connection setting */
s_con = (NMSettingConnection *) nm_setting_connection_new ();
g_assert (s_con);
nm_connection_add_setting (connection, NM_SETTING (s_con));
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, "Test Write Bridge Main",
NM_SETTING_CONNECTION_UUID, uuid,
NM_SETTING_CONNECTION_AUTOCONNECT, TRUE,
NM_SETTING_CONNECTION_TYPE, NM_SETTING_BRIDGE_SETTING_NAME,
NM_SETTING_CONNECTION_INTERFACE_NAME, "br0",
NULL);
/* Bridge setting */
s_bridge = (NMSettingBridge *) nm_setting_bridge_new ();
g_assert (s_bridge);
nm_connection_add_setting (connection, NM_SETTING (s_bridge));
/* IP4 setting */
s_ip4 = (NMSettingIPConfig *) nm_setting_ip4_config_new ();
g_assert (s_ip4);
nm_connection_add_setting (connection, NM_SETTING (s_ip4));
g_object_set (s_ip4,
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_MANUAL,
NM_SETTING_IP_CONFIG_MAY_FAIL, TRUE,
NM_SETTING_IP_CONFIG_GATEWAY, "1.1.1.1",
NULL);
add_one_ip_address (s_ip4, "1.2.3.4", 24);
/* IP6 setting */
s_ip6 = (NMSettingIPConfig *) nm_setting_ip6_config_new ();
g_assert (s_ip6);
nm_connection_add_setting (connection, NM_SETTING (s_ip6));
g_object_set (s_ip6, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_AUTO, NULL);
write_test_connection_and_reread (connection, FALSE);
}
static void
test_read_bridge_component (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingBridgePort *s_port;
NMSettingWired *s_wired;
const char *mac;
guint8 expected_mac[ETH_ALEN] = { 0x00, 0x22, 0x15, 0x59, 0x62, 0x97 };
gs_free_error GError *error = NULL;
const char *expected_id = "Test Bridge Component";
const char *expected_uuid = "d7b4f96c-c45e-4298-bef8-f48574f8c1c0";
gboolean success;
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR "/Test_Bridge_Component", &error);
g_assert_no_error (error);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* Connection setting */
s_con = nm_connection_get_setting_connection (connection);
g_assert (s_con);
g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, expected_id);
g_assert_cmpstr (nm_setting_connection_get_uuid (s_con), ==, expected_uuid);
g_assert_cmpstr (nm_setting_connection_get_master (s_con), ==, "br0");
g_assert (nm_setting_connection_is_slave_type (s_con, NM_SETTING_BRIDGE_SETTING_NAME));
/* Wired setting */
s_wired = nm_connection_get_setting_wired (connection);
g_assert (s_wired);
mac = nm_setting_wired_get_mac_address (s_wired);
g_assert (mac);
g_assert (nm_utils_hwaddr_matches (mac, -1, expected_mac, sizeof (expected_mac)));
/* BridgePort setting */
s_port = nm_connection_get_setting_bridge_port (connection);
g_assert (s_port);
g_assert (nm_setting_bridge_port_get_hairpin_mode (s_port));
g_assert_cmpuint (nm_setting_bridge_port_get_priority (s_port), ==, 28);
g_assert_cmpuint (nm_setting_bridge_port_get_path_cost (s_port), ==, 100);
}
static void
test_write_bridge_component (void)
{
NMTST_UUID_INIT (uuid);
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingBridgePort *s_port;
NMSettingWired *s_wired;
const char *mac = "99:88:77:66:55:44";
connection = nm_simple_connection_new ();
g_assert (connection);
/* Connection setting */
s_con = (NMSettingConnection *) nm_setting_connection_new ();
g_assert (s_con);
nm_connection_add_setting (connection, NM_SETTING (s_con));
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, "Test Write Bridge Component",
NM_SETTING_CONNECTION_UUID, uuid,
NM_SETTING_CONNECTION_AUTOCONNECT, TRUE,
NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME,
NM_SETTING_CONNECTION_MASTER, "br0",
NM_SETTING_CONNECTION_SLAVE_TYPE, NM_SETTING_BRIDGE_SETTING_NAME,
NULL);
/* Wired setting */
s_wired = NM_SETTING_WIRED (nm_setting_wired_new ());
g_assert (s_wired);
nm_connection_add_setting (connection, NM_SETTING (s_wired));
g_object_set (s_wired,
NM_SETTING_WIRED_MAC_ADDRESS, mac,
NM_SETTING_WIRED_MTU, 1300,
NULL);
/* BridgePort setting */
s_port = (NMSettingBridgePort *) nm_setting_bridge_port_new ();
g_assert (s_port);
nm_connection_add_setting (connection, NM_SETTING (s_port));
g_object_set (s_port,
NM_SETTING_BRIDGE_PORT_PRIORITY, 3,
NM_SETTING_BRIDGE_PORT_PATH_COST, 99,
NULL);
write_test_connection_and_reread (connection, FALSE);
}
static void
test_read_new_wired_group_name (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingWired *s_wired;
const char *mac;
guint8 expected_mac[ETH_ALEN] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 };
gs_free_error GError *error = NULL;
gboolean success;
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR"/Test_New_Wired_Group_Name", &error);
g_assert_no_error (error);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* Wired setting */
s_wired = nm_connection_get_setting_wired (connection);
g_assert (s_wired);
g_assert_cmpint (nm_setting_wired_get_mtu (s_wired), ==, 1400);
mac = nm_setting_wired_get_mac_address (s_wired);
g_assert (mac);
g_assert (nm_utils_hwaddr_matches (mac, -1, expected_mac, sizeof (expected_mac)));
}
static void
test_write_new_wired_group_name (void)
{
NMTST_UUID_INIT (uuid);
gs_unref_object NMConnection *connection = NULL;
gs_unref_keyfile GKeyFile *kf = NULL;
NMSettingConnection *s_con;
NMSettingWired *s_wired;
gs_free char *testfile = NULL;
gs_free_error GError *error = NULL;
char *s;
gint mtu;
connection = nm_simple_connection_new ();
g_assert (connection);
/* Connection setting */
s_con = (NMSettingConnection *) nm_setting_connection_new ();
g_assert (s_con);
nm_connection_add_setting (connection, NM_SETTING (s_con));
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, "Test Write Wired New Group Name",
NM_SETTING_CONNECTION_UUID, uuid,
NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME,
NULL);
/* Wired setting */
s_wired = (NMSettingWired *) nm_setting_wired_new ();
g_assert (s_wired);
g_object_set (s_wired, NM_SETTING_WIRED_MTU, 1400, NULL);
nm_connection_add_setting (connection, NM_SETTING (s_wired));
write_test_connection (connection, &testfile);
assert_reread (connection, TRUE, testfile);
/* Look at the keyfile itself to ensure we wrote out the new group names and type */
kf = keyfile_load_from_file (testfile);
s = g_key_file_get_string (kf, NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_TYPE, &error);
g_assert_no_error (error);
g_assert_cmpstr (s, ==, "ethernet");
g_free (s);
mtu = g_key_file_get_integer (kf, "ethernet", NM_SETTING_WIRED_MTU, &error);
g_assert_no_error (error);
g_assert_cmpint (mtu, ==, 1400);
unlink (testfile);
}
static void
test_read_new_wireless_group_names (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingWireless *s_wifi;
NMSettingWirelessSecurity *s_wsec;
GBytes *ssid;
const guint8 *ssid_data;
gsize ssid_len;
const char *expected_ssid = "foobar";
gs_free_error GError *error = NULL;
gboolean success;
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR"/Test_New_Wireless_Group_Names", &error);
g_assert_no_error (error);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* Wifi setting */
s_wifi = nm_connection_get_setting_wireless (connection);
g_assert (s_wifi);
ssid = nm_setting_wireless_get_ssid (s_wifi);
g_assert (ssid);
ssid_data = g_bytes_get_data (ssid, &ssid_len);
g_assert_cmpint (ssid_len, ==, strlen (expected_ssid));
g_assert_cmpint (memcmp (ssid_data, expected_ssid, ssid_len), ==, 0);
g_assert_cmpstr (nm_setting_wireless_get_mode (s_wifi), ==, NM_SETTING_WIRELESS_MODE_INFRA);
/* Wifi security setting */
s_wsec = nm_connection_get_setting_wireless_security (connection);
g_assert (s_wsec);
g_assert_cmpstr (nm_setting_wireless_security_get_key_mgmt (s_wsec), ==, "wpa-psk");
g_assert_cmpstr (nm_setting_wireless_security_get_psk (s_wsec), ==, "s3cu4e passphrase");
}
static void
test_write_new_wireless_group_names (void)
{
NMTST_UUID_INIT (uuid);
gs_unref_object NMConnection *connection = NULL;
gs_unref_keyfile GKeyFile *kf = NULL;
NMSettingConnection *s_con;
NMSettingWireless *s_wifi;
NMSettingWirelessSecurity *s_wsec;
GBytes *ssid;
unsigned char tmpssid[] = { 0x31, 0x33, 0x33, 0x37 };
const char *expected_psk = "asdfasdfasdfa12315";
gs_free char *testfile = NULL;
gs_free_error GError *error = NULL;
char *s;
connection = nm_simple_connection_new ();
/* Connection setting */
s_con = (NMSettingConnection *) nm_setting_connection_new ();
nm_connection_add_setting (connection, NM_SETTING (s_con));
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, "Test Write New Wireless Group Names",
NM_SETTING_CONNECTION_UUID, uuid,
NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRELESS_SETTING_NAME,
NULL);
/* WiFi setting */
s_wifi = (NMSettingWireless *) nm_setting_wireless_new ();
nm_connection_add_setting (connection, NM_SETTING (s_wifi));
ssid = g_bytes_new (tmpssid, sizeof (tmpssid));
g_object_set (s_wifi,
NM_SETTING_WIRELESS_SSID, ssid,
NM_SETTING_WIRELESS_MODE, NM_SETTING_WIRELESS_MODE_INFRA,
NULL);
g_bytes_unref (ssid);
/* WiFi security setting */
s_wsec = (NMSettingWirelessSecurity *) nm_setting_wireless_security_new ();
nm_connection_add_setting (connection, NM_SETTING (s_wsec));
g_object_set (s_wsec,
NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "wpa-psk",
NM_SETTING_WIRELESS_SECURITY_PSK, expected_psk,
NULL);
write_test_connection (connection, &testfile);
assert_reread (connection, TRUE, testfile);
/* Look at the keyfile itself to ensure we wrote out the new group names and type */
kf = keyfile_load_from_file (testfile);
s = g_key_file_get_string (kf, NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_TYPE, &error);
g_assert_no_error (error);
g_assert_cmpstr (s, ==, "wifi");
g_free (s);
s = g_key_file_get_string (kf, "wifi", NM_SETTING_WIRELESS_MODE, &error);
g_assert_no_error (error);
g_assert_cmpstr (s, ==, NM_SETTING_WIRELESS_MODE_INFRA);
g_free (s);
s = g_key_file_get_string (kf, "wifi-security", NM_SETTING_WIRELESS_SECURITY_PSK, &error);
g_assert_no_error (error);
g_assert_cmpstr (s, ==, expected_psk);
g_free (s);
unlink (testfile);
}
static void
test_read_missing_vlan_setting (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingVlan *s_vlan;
gs_free_error GError *error = NULL;
gboolean success;
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR"/Test_Missing_Vlan_Setting", &error);
g_assert_no_error (error);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* Ensure the VLAN setting exists */
s_vlan = nm_connection_get_setting_vlan (connection);
g_assert (s_vlan);
g_assert_cmpint (nm_setting_vlan_get_id (s_vlan), ==, 0);
g_assert_cmpint (nm_setting_vlan_get_flags (s_vlan), ==, NM_VLAN_FLAG_REORDER_HEADERS);
}
static void
test_read_missing_vlan_flags (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingVlan *s_vlan;
gs_free_error GError *error = NULL;
gboolean success;
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR"/Test_Missing_Vlan_Flags", &error);
g_assert_no_error (error);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* Ensure the VLAN setting exists */
s_vlan = nm_connection_get_setting_vlan (connection);
g_assert (s_vlan);
g_assert_cmpint (nm_setting_vlan_get_id (s_vlan), ==, 444);
g_assert_cmpstr (nm_setting_vlan_get_parent (s_vlan), ==, "em1");
g_assert_cmpint (nm_setting_vlan_get_flags (s_vlan), ==, NM_VLAN_FLAG_REORDER_HEADERS);
}
static void
test_read_missing_id_uuid (void)
{
gs_unref_object NMConnection *connection = NULL;
gs_free_error GError *error = NULL;
gboolean success;
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR"/Test_Missing_ID_UUID", &error);
g_assert_no_error (error);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* Ensure the ID and UUID properties are there */
g_assert_cmpstr (nm_connection_get_id (connection), ==, "Test_Missing_ID_UUID");
g_assert (nm_connection_get_uuid (connection));
}
static void
test_read_minimal (void)
{
gs_unref_object NMConnection *connection = NULL;
gs_unref_object NMConnection *con_archetype = NULL;
NMSettingConnection *s_con;
con_archetype = nmtst_create_minimal_connection ("Test_minimal_x",
"a15bd68f-c32b-40b8-8d27-49e472a85919",
NM_SETTING_WIRED_SETTING_NAME,
&s_con);
nmtst_connection_normalize (con_archetype);
connection = keyfile_read_connection_from_file (TEST_KEYFILES_DIR"/Test_minimal_1");
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, nm_connection_get_id (connection),
NM_SETTING_CONNECTION_UUID, nm_connection_get_uuid (connection),
NULL);
nmtst_assert_connection_equals (con_archetype, FALSE, connection, FALSE);
g_clear_object (&connection);
connection = keyfile_read_connection_from_file (TEST_KEYFILES_DIR"/Test_minimal_2");
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, nm_connection_get_id (connection),
NM_SETTING_CONNECTION_UUID, nm_connection_get_uuid (connection),
NULL);
nmtst_assert_connection_equals (con_archetype, FALSE, connection, FALSE);
g_clear_object (&connection);
}
static void
test_read_minimal_slave (void)
{
gs_unref_object NMConnection *connection = NULL;
gs_unref_object NMConnection *con_archetype = NULL;
NMSettingConnection *s_con;
con_archetype = nmtst_create_minimal_connection ("Test_minimal_slave_x",
"a56b4ca5-7075-43d4-82c7-5d0cb15f7654",
NM_SETTING_WIRED_SETTING_NAME,
&s_con);
g_object_set (s_con,
NM_SETTING_CONNECTION_MASTER, "br0",
NM_SETTING_CONNECTION_SLAVE_TYPE, "bridge",
NULL);
nmtst_connection_normalize (con_archetype);
connection = keyfile_read_connection_from_file (TEST_KEYFILES_DIR"/Test_minimal_slave_1");
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, nm_connection_get_id (connection),
NM_SETTING_CONNECTION_UUID, nm_connection_get_uuid (connection),
NULL);
nmtst_assert_connection_equals (con_archetype, FALSE, connection, FALSE);
g_clear_object (&connection);
connection = keyfile_read_connection_from_file (TEST_KEYFILES_DIR"/Test_minimal_slave_2");
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, nm_connection_get_id (connection),
NM_SETTING_CONNECTION_UUID, nm_connection_get_uuid (connection),
NULL);
nmtst_assert_connection_equals (con_archetype, FALSE, connection, FALSE);
g_clear_object (&connection);
connection = keyfile_read_connection_from_file (TEST_KEYFILES_DIR"/Test_minimal_slave_3");
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, nm_connection_get_id (connection),
NM_SETTING_CONNECTION_UUID, nm_connection_get_uuid (connection),
NULL);
nmtst_assert_connection_equals (con_archetype, FALSE, connection, FALSE);
g_clear_object (&connection);
connection = keyfile_read_connection_from_file (TEST_KEYFILES_DIR"/Test_minimal_slave_4");
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, nm_connection_get_id (connection),
NM_SETTING_CONNECTION_UUID, nm_connection_get_uuid (connection),
NULL);
nmtst_assert_connection_equals (con_archetype, FALSE, connection, FALSE);
g_clear_object (&connection);
}
static void
test_read_enum_property (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingIPConfig *s_ip6;
gs_free_error GError *error = NULL;
gboolean success;
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR"/Test_Enum_Property", &error);
g_assert_no_error (error);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* IPv6 setting */
s_ip6 = nm_connection_get_setting_ip6_config (connection);
g_assert (s_ip6);
g_assert_cmpint (nm_setting_ip6_config_get_ip6_privacy (NM_SETTING_IP6_CONFIG (s_ip6)), ==, NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_TEMP_ADDR);
}
static void
test_write_enum_property (void)
{
NMTST_UUID_INIT (uuid);
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSettingWired *s_wired;
NMSettingIPConfig *s_ip6;
connection = nm_simple_connection_new ();
/* Connection setting */
s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
nm_connection_add_setting (connection, NM_SETTING (s_con));
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, "Test Write Enum Property",
NM_SETTING_CONNECTION_UUID, uuid,
NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME,
NULL);
/* Wired setting */
s_wired = NM_SETTING_WIRED (nm_setting_wired_new ());
nm_connection_add_setting (connection, NM_SETTING (s_wired));
/* IP6 setting */
s_ip6 = NM_SETTING_IP_CONFIG (nm_setting_ip6_config_new ());
nm_connection_add_setting (connection, NM_SETTING (s_ip6));
g_object_set (s_ip6,
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_AUTO,
NM_SETTING_IP6_CONFIG_IP6_PRIVACY, NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_TEMP_ADDR,
NULL);
nmtst_connection_normalize (connection);
write_test_connection_and_reread (connection, FALSE);
}
static void
test_read_flags_property (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingGsm *s_gsm;
gs_free_error GError *error = NULL;
gboolean success;
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR"/Test_Flags_Property", &error);
g_assert_no_error (error);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
/* GSM setting */
s_gsm = nm_connection_get_setting_gsm (connection);
g_assert (s_gsm);
g_assert_cmpint (nm_setting_gsm_get_password_flags (s_gsm), ==,
NM_SETTING_SECRET_FLAG_AGENT_OWNED | NM_SETTING_SECRET_FLAG_NOT_REQUIRED);
}
static void
test_write_flags_property (void)
{
NMTST_UUID_INIT (uuid);
gs_unref_object NMConnection *connection = NULL;
NMSettingConnection *s_con;
NMSetting *s_gsm;
connection = nm_simple_connection_new ();
/* Connection setting */
s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
nm_connection_add_setting (connection, NM_SETTING (s_con));
g_object_set (s_con,
NM_SETTING_CONNECTION_ID, "Test Write Flags Property",
NM_SETTING_CONNECTION_UUID, uuid,
NM_SETTING_CONNECTION_TYPE, NM_SETTING_GSM_SETTING_NAME,
NULL);
/* GSM setting */
s_gsm = nm_setting_gsm_new ();
nm_connection_add_setting (connection, s_gsm);
g_object_set (s_gsm,
NM_SETTING_GSM_NUMBER, "#99*",
NM_SETTING_GSM_APN, "myapn",
NM_SETTING_GSM_USERNAME, "adfasdfasdf",
NM_SETTING_GSM_PASSWORD_FLAGS, NM_SETTING_SECRET_FLAG_NOT_SAVED | NM_SETTING_SECRET_FLAG_NOT_REQUIRED,
NULL);
nmtst_connection_normalize (connection);
write_test_connection_and_reread (connection, FALSE);
}
/*****************************************************************************/
static void
test_read_tc_config (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingTCConfig *s_tc;
NMTCQdisc *qdisc1, *qdisc2;
NMTCAction *action1, *action2;
NMTCTfilter *tfilter1, *tfilter2;
gs_free_error GError *error = NULL;
gboolean success;
connection = nms_keyfile_reader_from_file (TEST_KEYFILES_DIR "/Test_TC_Config", NULL);
g_assert (connection);
success = nm_connection_verify (connection, &error);
g_assert_no_error (error);
g_assert (success);
s_tc = nm_connection_get_setting_tc_config (connection);
g_assert (s_tc);
g_assert (nm_setting_tc_config_get_num_qdiscs (s_tc) == 2);
qdisc1 = nm_setting_tc_config_get_qdisc (s_tc, 0);
g_assert (qdisc1);
g_assert (g_strcmp0 (nm_tc_qdisc_get_kind (qdisc1), "fq_codel") == 0);
g_assert (nm_tc_qdisc_get_handle (qdisc1) == TC_H_MAKE (0x1234 << 16, 0x0000));
g_assert (nm_tc_qdisc_get_parent (qdisc1) == TC_H_ROOT);
qdisc2 = nm_setting_tc_config_get_qdisc (s_tc, 1);
g_assert (qdisc2);
g_assert (g_strcmp0 (nm_tc_qdisc_get_kind (qdisc2), "ingress") == 0);
g_assert (nm_tc_qdisc_get_handle (qdisc2) == TC_H_MAKE (TC_H_INGRESS, 0));
g_assert (nm_tc_qdisc_get_parent (qdisc2) == TC_H_INGRESS);
g_assert (nm_setting_tc_config_get_num_tfilters (s_tc) == 2);
tfilter1 = nm_setting_tc_config_get_tfilter (s_tc, 0);
g_assert (tfilter1);
g_assert (g_strcmp0 (nm_tc_tfilter_get_kind (tfilter1), "matchall") == 0);
g_assert (nm_tc_tfilter_get_handle (tfilter1) == TC_H_UNSPEC);
g_assert (nm_tc_tfilter_get_parent (tfilter1) == TC_H_MAKE (0x1234 << 16, 0x0000));
action1 = nm_tc_tfilter_get_action (tfilter1);
g_assert (action1);
g_assert (g_strcmp0 (nm_tc_action_get_kind (action1), "drop") == 0);
tfilter2 = nm_setting_tc_config_get_tfilter (s_tc, 1);
g_assert (tfilter2);
g_assert (g_strcmp0 (nm_tc_tfilter_get_kind (tfilter2), "matchall") == 0);
g_assert (nm_tc_tfilter_get_handle (tfilter2) == TC_H_UNSPEC);
g_assert (nm_tc_tfilter_get_parent (tfilter2) == TC_H_MAKE (TC_H_INGRESS, 0));
action2 = nm_tc_tfilter_get_action (tfilter2);
g_assert (action2);
g_assert (g_strcmp0 (nm_tc_action_get_kind (action2), "simple") == 0);
g_assert (g_strcmp0 (g_variant_get_bytestring (nm_tc_action_get_attribute (action2, "sdata")),
"Hello") == 0);
}
static void
test_write_tc_config (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSetting *s_tc;
NMTCQdisc *qdisc1, *qdisc2;
NMTCTfilter *tfilter1, *tfilter2;
NMTCAction *action;
GError *error = NULL;
connection = nmtst_create_minimal_connection ("Test TC",
NULL,
NM_SETTING_WIRED_SETTING_NAME,
NULL);
s_tc = nm_setting_tc_config_new ();
qdisc1 = nm_tc_qdisc_new ("fq_codel", TC_H_ROOT, &error);
nmtst_assert_success (qdisc1, error);
nm_tc_qdisc_set_handle (qdisc1, TC_H_MAKE (0x1234 << 16, 0x0000));
nm_setting_tc_config_add_qdisc (NM_SETTING_TC_CONFIG (s_tc), qdisc1);
qdisc2 = nm_tc_qdisc_new ("ingress", TC_H_INGRESS, &error);
nmtst_assert_success (qdisc2, error);
nm_tc_qdisc_set_handle (qdisc2, TC_H_MAKE (TC_H_INGRESS, 0));
nm_setting_tc_config_add_qdisc (NM_SETTING_TC_CONFIG (s_tc), qdisc2);
tfilter1 = nm_tc_tfilter_new ("matchall",
TC_H_MAKE (0x1234 << 16, 0x0000),
&error);
nmtst_assert_success (tfilter1, error);
action = nm_tc_action_new ("drop", &error);
nmtst_assert_success (action, error);
nm_tc_tfilter_set_action (tfilter1, action);
nm_tc_action_unref (action);
nm_setting_tc_config_add_tfilter (NM_SETTING_TC_CONFIG (s_tc), tfilter1);
nm_tc_tfilter_unref (tfilter1);
tfilter2 = nm_tc_tfilter_new ("matchall",
TC_H_MAKE (TC_H_INGRESS, 0),
&error);
nmtst_assert_success (tfilter2, error);
action = nm_tc_action_new ("simple", &error);
nmtst_assert_success (action, error);
nm_tc_action_set_attribute (action, "sdata", g_variant_new_bytestring ("Hello"));
nm_tc_tfilter_set_action (tfilter2, action);
nm_tc_action_unref (action);
nm_setting_tc_config_add_tfilter (NM_SETTING_TC_CONFIG (s_tc), tfilter2);
nm_tc_tfilter_unref (tfilter2);
nm_connection_add_setting (connection, s_tc);
nmtst_connection_normalize (connection);
write_test_connection_and_reread (connection, FALSE);
nm_tc_qdisc_unref (qdisc1);
nm_tc_qdisc_unref (qdisc2);
}
/*****************************************************************************/
static void
_escape_filename (const char *filename, gboolean would_be_ignored)
{
gs_free char *esc = NULL;
g_assert (filename && filename[0]);
if (!!would_be_ignored != !!nms_keyfile_utils_should_ignore_file (filename)) {
if (would_be_ignored)
g_error ("We expect filename \"%s\" to be ignored, but it isn't", filename);
else
g_error ("We expect filename \"%s\" not to be ignored, but it is", filename);
}
esc = nms_keyfile_utils_escape_filename (filename);
g_assert (esc && esc[0]);
g_assert (!strchr (esc, '/'));
if (nms_keyfile_utils_should_ignore_file (esc))
g_error ("Escaping filename \"%s\" yielded \"%s\", but this is ignored", filename, esc);
}
static void
test_nm_keyfile_plugin_utils_escape_filename (void)
{
_escape_filename ("ab", FALSE);
_escape_filename (".vim-file.swp", TRUE);
_escape_filename (".vim-file.Swp", TRUE);
_escape_filename (".vim-file.SWP", TRUE);
_escape_filename (".vim-file.swpx", TRUE);
_escape_filename (".vim-file.Swpx", TRUE);
_escape_filename (".vim-file.SWPX", TRUE);
_escape_filename (".pem-file.pem", TRUE);
_escape_filename (".pem-file.Pem", TRUE);
_escape_filename (".pem-file.PEM", TRUE);
_escape_filename (".pem-file.der", TRUE);
_escape_filename (".pem-file.Der", TRUE);
_escape_filename (".mkstemp.ABCEDF", TRUE);
_escape_filename (".mkstemp.abcdef", TRUE);
_escape_filename (".mkstemp.123456", TRUE);
_escape_filename (".mkstemp.A23456", TRUE);
_escape_filename (".#emacs-locking", TRUE);
_escape_filename ("file-with-tilde~", TRUE);
_escape_filename (".file-with-dot", TRUE);
}
/*****************************************************************************/
NMTST_DEFINE ();
int main (int argc, char **argv)
{
_nm_utils_set_testing (NM_UTILS_TEST_NO_KEYFILE_OWNER_CHECK);
nmtst_init_assert_logging (&argc, &argv, "INFO", "DEFAULT");
if (g_mkdir_with_parents (TEST_SCRATCH_DIR, 0755) != 0)
g_error ("failure to create test directory \"%s\": %s", TEST_SCRATCH_DIR, g_strerror (errno));
/* The tests */
g_test_add_func ("/keyfile/test_read_valid_wired_connection", test_read_valid_wired_connection);
g_test_add_func ("/keyfile/test_write_wired_connection", test_write_wired_connection);
g_test_add_func ("/keyfile/test_read_ip6_wired_connection", test_read_ip6_wired_connection);
g_test_add_func ("/keyfile/test_write_ip6_wired_connection", test_write_ip6_wired_connection);
g_test_add_func ("/keyfile/test_read_wired_mac_case", test_read_wired_mac_case);
g_test_add_func ("/keyfile/test_read_mac_old_format", test_read_mac_old_format);
g_test_add_func ("/keyfile/test_read_mac_ib_old_format", test_read_mac_ib_old_format);
g_test_add_func ("/keyfile/test_read_valid_wireless_connection", test_read_valid_wireless_connection);
g_test_add_func ("/keyfile/test_write_wireless_connection", test_write_wireless_connection);
g_test_add_func ("/keyfile/test_read_string_ssid", test_read_string_ssid);
g_test_add_func ("/keyfile/test_write_string_ssid", test_write_string_ssid);
g_test_add_func ("/keyfile/test_read_intlist_ssid", test_read_intlist_ssid);
g_test_add_func ("/keyfile/test_write_intlist_ssid", test_write_intlist_ssid);
g_test_add_func ("/keyfile/test_read_intlike_ssid", test_read_intlike_ssid);
g_test_add_func ("/keyfile/test_write_intlike_ssid", test_write_intlike_ssid);
g_test_add_func ("/keyfile/test_read_intlike_ssid_2", test_read_intlike_ssid_2);
g_test_add_func ("/keyfile/test_write_intlike_ssid_2", test_write_intlike_ssid_2);
g_test_add_func ("/keyfile/test_read_bt_dun_connection", test_read_bt_dun_connection);
g_test_add_func ("/keyfile/test_write_bt_dun_connection", test_write_bt_dun_connection);
g_test_add_func ("/keyfile/test_read_gsm_connection", test_read_gsm_connection);
g_test_add_func ("/keyfile/test_write_gsm_connection", test_write_gsm_connection);
g_test_add_func ("/keyfile/test_read_wired_8021x_tls_blob_connection", test_read_wired_8021x_tls_blob_connection);
g_test_add_func ("/keyfile/test_read_wired_8021x_tls_bad_path_connection", test_read_wired_8021x_tls_bad_path_connection);
g_test_add_func ("/keyfile/test_read_wired_8021x_tls_old_connection", test_read_wired_8021x_tls_old_connection);
g_test_add_func ("/keyfile/test_read_wired_8021x_tls_new_connection", test_read_wired_8021x_tls_new_connection);
g_test_add_func ("/keyfile/test_write_wired_8021x_tls_connection_path", test_write_wired_8021x_tls_connection_path);
g_test_add_func ("/keyfile/test_write_wired_8021x_tls_connection_blob", test_write_wired_8021x_tls_connection_blob);
g_test_add_func ("/keyfile/test_read_dcb_connection", test_read_dcb_connection);
g_test_add_func ("/keyfile/test_read_infiniband_connection", test_read_infiniband_connection);
g_test_add_func ("/keyfile/test_write_infiniband_connection", test_write_infiniband_connection);
g_test_add_func ("/keyfile/test_read_bridge_main", test_read_bridge_main);
g_test_add_func ("/keyfile/test_write_bridge_main", test_write_bridge_main);
g_test_add_func ("/keyfile/test_read_bridge_component", test_read_bridge_component);
g_test_add_func ("/keyfile/test_write_bridge_component", test_write_bridge_component);
g_test_add_func ("/keyfile/test_read_new_wired_group_name", test_read_new_wired_group_name);
g_test_add_func ("/keyfile/test_write_new_wired_group_name", test_write_new_wired_group_name);
g_test_add_func ("/keyfile/test_read_new_wireless_group_names", test_read_new_wireless_group_names);
g_test_add_func ("/keyfile/test_write_new_wireless_group_names", test_write_new_wireless_group_names);
g_test_add_func ("/keyfile/test_read_missing_vlan_setting", test_read_missing_vlan_setting);
g_test_add_func ("/keyfile/test_read_missing_vlan_flags", test_read_missing_vlan_flags);
g_test_add_func ("/keyfile/test_read_missing_id_uuid", test_read_missing_id_uuid);
g_test_add_func ("/keyfile/test_read_minimal", test_read_minimal);
g_test_add_func ("/keyfile/test_read_minimal_slave", test_read_minimal_slave);
g_test_add_func ("/keyfile/test_read_enum_property", test_read_enum_property);
g_test_add_func ("/keyfile/test_write_enum_property", test_write_enum_property);
g_test_add_func ("/keyfile/test_read_flags_property", test_read_flags_property);
g_test_add_func ("/keyfile/test_write_flags_property", test_write_flags_property);
g_test_add_func ("/keyfile/test_read_tc_config", test_read_tc_config);
g_test_add_func ("/keyfile/test_write_tc_config", test_write_tc_config);
g_test_add_func ("/keyfile/test_nm_keyfile_plugin_utils_escape_filename", test_nm_keyfile_plugin_utils_escape_filename);
return g_test_run ();
}