summary refs log tree commit diff
path: root/libnm-core/tests/test-general.c
diff options
context:
space:
mode:
Diffstat (limited to 'libnm-core/tests/test-general.c')
-rw-r--r--libnm-core/tests/test-general.c202
1 files changed, 192 insertions, 10 deletions
diff --git a/libnm-core/tests/test-general.c b/libnm-core/tests/test-general.c
index d309c800..7df4e57a 100644
--- a/libnm-core/tests/test-general.c
+++ b/libnm-core/tests/test-general.c
@@ -25,6 +25,7 @@
 #include <string.h>
 
 #include <nm-utils.h>
+#include "gsystem-local-alloc.h"
 
 #include "nm-setting-private.h"
 #include "nm-utils.h"
@@ -648,7 +649,7 @@ test_setting_ip4_config_address_data (void)
 static void
 test_setting_gsm_apn_spaces (void)
 {
-	NMSettingGsm *s_gsm;
+	gs_unref_object NMSettingGsm *s_gsm = NULL;
 	const char *tmp;
 
 	s_gsm = (NMSettingGsm *) nm_setting_gsm_new ();
@@ -676,7 +677,7 @@ test_setting_gsm_apn_spaces (void)
 static void
 test_setting_gsm_apn_bad_chars (void)
 {
-	NMSettingGsm *s_gsm;
+	gs_unref_object NMSettingGsm *s_gsm = NULL;
 
 	s_gsm = (NMSettingGsm *) nm_setting_gsm_new ();
 	ASSERT (s_gsm != NULL,
@@ -714,7 +715,7 @@ test_setting_gsm_apn_bad_chars (void)
 static void
 test_setting_gsm_apn_underscore (void)
 {
-	NMSettingGsm *s_gsm;
+	gs_unref_object NMSettingGsm *s_gsm = NULL;
 
 	s_gsm = (NMSettingGsm *) nm_setting_gsm_new ();
 	g_assert (s_gsm);
@@ -729,7 +730,7 @@ test_setting_gsm_apn_underscore (void)
 static void
 test_setting_gsm_without_number (void)
 {
-	NMSettingGsm *s_gsm;
+	gs_unref_object NMSettingGsm *s_gsm = NULL;
 
 	s_gsm = (NMSettingGsm *) nm_setting_gsm_new ();
 	g_assert (s_gsm);
@@ -1140,6 +1141,183 @@ test_setting_new_from_dbus_enum (void)
 	g_object_unref (s_serial);
 }
 
+static void
+test_setting_new_from_dbus_bad (void)
+{
+	NMSetting *setting;
+	NMConnection *conn;
+	GBytes *ssid;
+	GPtrArray *addrs;
+	GVariant *orig_dict, *dict;
+	GError *error = NULL;
+
+	/* We want to test:
+	 * - ordinary scalar properties
+	 * - string properties
+	 * - GBytes-valued properties (which are handled specially by set_property_from_dbus())
+	 * - enum/flags-valued properties
+	 * - overridden properties
+	 * - transformed properties
+	 *
+	 * No single setting class has examples of all of these, so we need two settings.
+	 */
+
+	conn = nm_simple_connection_new ();
+
+	setting = nm_setting_connection_new ();
+	g_object_set (setting,
+	              NM_SETTING_CONNECTION_ID, "test",
+	              NM_SETTING_CONNECTION_UUID, "83c5a841-1759-4cdb-bfce-8d4087956497",
+	              NULL);
+	nm_connection_add_setting (conn, setting);
+
+	setting = nm_setting_wireless_new ();
+	ssid = g_bytes_new ("my-ssid", 7);
+	g_object_set (setting,
+	              /* scalar */
+	              NM_SETTING_WIRELESS_RATE, 100,
+	              /* string */
+	              NM_SETTING_WIRELESS_MODE, NM_SETTING_WIRELESS_MODE_INFRA,
+	              /* GBytes */
+	              NM_SETTING_WIRELESS_SSID, ssid,
+	              /* transformed */
+	              NM_SETTING_WIRELESS_BSSID, "00:11:22:33:44:55",
+	              NULL);
+	g_bytes_unref (ssid);
+	nm_connection_add_setting (conn, setting);
+
+	setting = nm_setting_ip6_config_new ();
+	addrs = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_ip_address_unref);
+	g_ptr_array_add (addrs, nm_ip_address_new (AF_INET6, "1234::5678", 64, NULL));
+	g_object_set (setting,
+	              /* enum */
+	              NM_SETTING_IP6_CONFIG_IP6_PRIVACY, NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_PUBLIC_ADDR,
+	              /* overridden */
+	              NM_SETTING_IP_CONFIG_ADDRESSES, addrs,
+	              /* (needed in order to verify()) */
+	              NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_AUTO,
+	              NULL);
+	g_ptr_array_unref (addrs);
+	nm_connection_add_setting (conn, setting);
+
+	orig_dict = nm_connection_to_dbus (conn, NM_CONNECTION_SERIALIZE_ALL);
+	g_object_unref (conn);
+
+	/* sanity-check */
+	conn = nm_simple_connection_new_from_dbus (orig_dict, &error);
+	g_assert_no_error (error);
+	g_assert (conn);
+	g_object_unref (conn);
+
+	/* Compatible mismatches */
+
+	dict = g_variant_ref (orig_dict);
+	NMTST_VARIANT_EDITOR (dict,
+	                      NMTST_VARIANT_CHANGE_PROPERTY (NM_SETTING_WIRELESS_SETTING_NAME,
+	                                                     NM_SETTING_WIRELESS_RATE,
+	                                                     "i", 10);
+	                      );
+	conn = nm_simple_connection_new_from_dbus (dict, &error);
+	g_assert (conn);
+	g_assert_no_error (error);
+	setting = nm_connection_get_setting (conn, NM_TYPE_SETTING_WIRELESS);
+	g_assert (setting);
+	g_assert_cmpint (nm_setting_wireless_get_rate (NM_SETTING_WIRELESS (setting)), ==, 10);
+	g_object_unref (conn);
+	g_variant_unref (dict);
+
+	dict = g_variant_ref (orig_dict);
+	NMTST_VARIANT_EDITOR (dict,
+	                      NMTST_VARIANT_CHANGE_PROPERTY (NM_SETTING_IP6_CONFIG_SETTING_NAME,
+	                                                     NM_SETTING_IP6_CONFIG_IP6_PRIVACY,
+	                                                     "i", NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_TEMP_ADDR);
+	                      );
+	conn = nm_simple_connection_new_from_dbus (dict, &error);
+	g_assert (conn);
+	g_assert_no_error (error);
+	setting = nm_connection_get_setting (conn, NM_TYPE_SETTING_IP6_CONFIG);
+	g_assert (setting);
+	g_assert_cmpint (nm_setting_ip6_config_get_ip6_privacy (NM_SETTING_IP6_CONFIG (setting)), ==, NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_TEMP_ADDR);
+	g_object_unref (conn);
+	g_variant_unref (dict);
+
+	/* Incompatible mismatches */
+
+	dict = g_variant_ref (orig_dict);
+	NMTST_VARIANT_EDITOR (dict,
+	                      NMTST_VARIANT_CHANGE_PROPERTY (NM_SETTING_WIRELESS_SETTING_NAME,
+	                                                     NM_SETTING_WIRELESS_RATE,
+	                                                     "s", "ten");
+	                      );
+	conn = nm_simple_connection_new_from_dbus (dict, &error);
+	g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY);
+	g_assert (g_str_has_prefix (error->message, "802-11-wireless.rate:"));
+	g_clear_error (&error);
+	g_variant_unref (dict);
+
+	dict = g_variant_ref (orig_dict);
+	NMTST_VARIANT_EDITOR (dict,
+	                      NMTST_VARIANT_CHANGE_PROPERTY (NM_SETTING_WIRELESS_SETTING_NAME,
+	                                                     NM_SETTING_WIRELESS_MODE,
+	                                                     "b", FALSE);
+	                      );
+	conn = nm_simple_connection_new_from_dbus (dict, &error);
+	g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY);
+	g_assert (g_str_has_prefix (error->message, "802-11-wireless.mode:"));
+	g_clear_error (&error);
+	g_variant_unref (dict);
+
+	dict = g_variant_ref (orig_dict);
+	NMTST_VARIANT_EDITOR (dict,
+	                      NMTST_VARIANT_CHANGE_PROPERTY (NM_SETTING_WIRELESS_SETTING_NAME,
+	                                                     NM_SETTING_WIRELESS_SSID,
+	                                                     "s", "fred");
+	                      );
+	conn = nm_simple_connection_new_from_dbus (dict, &error);
+	g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY);
+	g_assert (g_str_has_prefix (error->message, "802-11-wireless.ssid:"));
+	g_clear_error (&error);
+	g_variant_unref (dict);
+
+	dict = g_variant_ref (orig_dict);
+	NMTST_VARIANT_EDITOR (dict,
+	                      NMTST_VARIANT_CHANGE_PROPERTY (NM_SETTING_WIRELESS_SETTING_NAME,
+	                                                     NM_SETTING_WIRELESS_BSSID,
+	                                                     "i", 42);
+	                      );
+	conn = nm_simple_connection_new_from_dbus (dict, &error);
+	g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY);
+	g_assert (g_str_has_prefix (error->message, "802-11-wireless.bssid:"));
+	g_clear_error (&error);
+	g_variant_unref (dict);
+
+	dict = g_variant_ref (orig_dict);
+	NMTST_VARIANT_EDITOR (dict,
+	                      NMTST_VARIANT_CHANGE_PROPERTY (NM_SETTING_IP6_CONFIG_SETTING_NAME,
+	                                                     NM_SETTING_IP6_CONFIG_IP6_PRIVACY,
+	                                                     "s", "private");
+	                      );
+	conn = nm_simple_connection_new_from_dbus (dict, &error);
+	g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY);
+	g_assert (g_str_has_prefix (error->message, "ipv6.ip6-privacy:"));
+	g_clear_error (&error);
+	g_variant_unref (dict);
+
+	dict = g_variant_ref (orig_dict);
+	NMTST_VARIANT_EDITOR (dict,
+	                      NMTST_VARIANT_CHANGE_PROPERTY (NM_SETTING_IP6_CONFIG_SETTING_NAME,
+	                                                     NM_SETTING_IP_CONFIG_ADDRESSES,
+	                                                     "s", "1234::5678");
+	                      );
+	conn = nm_simple_connection_new_from_dbus (dict, &error);
+	g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY);
+	g_assert (g_str_has_prefix (error->message, "ipv6.addresses:"));
+	g_clear_error (&error);
+	g_variant_unref (dict);
+
+	g_variant_unref (orig_dict);
+}
+
 static NMConnection *
 new_test_connection (void)
 {
@@ -1374,6 +1552,7 @@ test_connection_replace_settings_bad (void)
 	connection = new_test_connection ();
 	success = nm_connection_replace_settings (connection, new_settings, &error);
 	g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_SETTING);
+	g_clear_error (&error);
 	g_assert (!success);
 
 	g_assert (nm_connection_verify (connection, NULL));
@@ -2211,7 +2390,7 @@ test_connection_bad_base_types (void)
 static void
 test_setting_compare_id (void)
 {
-	NMSetting *old, *new;
+	gs_unref_object NMSetting *old = NULL, *new = NULL;
 	gboolean success;
 
 	old = nm_setting_connection_new ();
@@ -2235,7 +2414,7 @@ test_setting_compare_id (void)
 static void
 test_setting_compare_timestamp (void)
 {
-	NMSetting *old, *new;
+	gs_unref_object NMSetting *old = NULL, *new = NULL;
 	gboolean success;
 
 	old = nm_setting_connection_new ();
@@ -2280,7 +2459,7 @@ static void
 test_setting_compare_secrets (gconstpointer test_data)
 {
 	const TestDataCompareSecrets *data = test_data;
-	NMSetting *old, *new;
+	gs_unref_object NMSetting *old = NULL, *new = NULL;
 	gboolean success;
 
 	/* Make sure that a connection with transient/unsaved secrets compares
@@ -2311,7 +2490,7 @@ static void
 test_setting_compare_vpn_secrets (gconstpointer test_data)
 {
 	const TestDataCompareSecrets *data = test_data;
-	NMSetting *old, *new;
+	gs_unref_object NMSetting *old = NULL, *new = NULL;
 	gboolean success;
 
 	/* Make sure that a connection with transient/unsaved secrets compares
@@ -2587,7 +2766,7 @@ test_setting_connection_changed_signal (void)
 	NMConnection *connection;
 	gboolean changed = FALSE;
 	NMSettingConnection *s_con;
-	char *uuid;
+	gs_free char *uuid = NULL;
 
 	connection = nm_simple_connection_new ();
 	g_signal_connect (connection,
@@ -2993,7 +3172,7 @@ test_setting_802_1x_changed_signal (void)
 static void
 test_setting_old_uuid (void)
 {
-	NMSetting *setting;
+	gs_unref_object NMSetting *setting = NULL;
 
 	/* NetworkManager-0.9.4.0 generated 40-character UUIDs with no dashes,
 	 * like this one. Test that we maintain compatibility. */
@@ -3702,6 +3881,7 @@ test_setting_ip6_gateway (void)
 	value = g_variant_lookup_value (ip6_dict, NM_SETTING_IP_CONFIG_GATEWAY, G_VARIANT_TYPE_STRING);
 	g_assert (value != NULL);
 	g_assert_cmpstr (g_variant_get_string (value, NULL), ==, "abcd::1");
+	g_variant_unref (value);
 
 	value = g_variant_lookup_value (ip6_dict, NM_SETTING_IP_CONFIG_ADDRESSES, G_VARIANT_TYPE ("a(ayuay)"));
 	g_assert (value != NULL);
@@ -3798,6 +3978,7 @@ test_hexstr2bin (void)
 			g_assert (b);
 			g_assert_cmpint (g_bytes_get_size (b), ==, items[i].expected_len);
 			g_assert (memcmp (g_bytes_get_data (b, NULL), items[i].expected, g_bytes_get_size (b)) == 0);
+			g_bytes_unref (b);
 		} else
 			g_assert (b == NULL);
 	}
@@ -3901,6 +4082,7 @@ int main (int argc, char **argv)
 	g_test_add_func ("/core/general/test_setting_new_from_dbus", test_setting_new_from_dbus);
 	g_test_add_func ("/core/general/test_setting_new_from_dbus_transform", test_setting_new_from_dbus_transform);
 	g_test_add_func ("/core/general/test_setting_new_from_dbus_enum", test_setting_new_from_dbus_enum);
+	g_test_add_func ("/core/general/test_setting_new_from_dbus_bad", test_setting_new_from_dbus_bad);
 	g_test_add_func ("/core/general/test_connection_replace_settings", test_connection_replace_settings);
 	g_test_add_func ("/core/general/test_connection_replace_settings_from_connection", test_connection_replace_settings_from_connection);
 	g_test_add_func ("/core/general/test_connection_replace_settings_bad", test_connection_replace_settings_bad);