[glib/tls-database] Add test of basic TLS client connecting to server and exchanging data.



commit 87468db86cb516d054826be173882dda23cc7b02
Author: Stef Walter <stefw collabora co uk>
Date:   Mon Jan 17 12:03:43 2011 -0800

    Add test of basic TLS client connecting to server and exchanging data.
    
    This will be developed into further tests later on with better
    coverage of the the tls stuff.

 gio/tests/.gitignore                   |    1 +
 gio/tests/Makefile.am                  |    4 +
 gio/tests/tls-tests/server-and-key.pem |   23 +++
 gio/tests/tls.c                        |  229 ++++++++++++++++++++++++++++++++
 4 files changed, 257 insertions(+), 0 deletions(-)
---
diff --git a/gio/tests/.gitignore b/gio/tests/.gitignore
index 7e201bb..d85bc92 100644
--- a/gio/tests/.gitignore
+++ b/gio/tests/.gitignore
@@ -73,6 +73,7 @@ socket-client
 socket-server
 srvtarget
 test.mo
+tls
 unix-fd
 unix-streams
 volumemonitor
diff --git a/gio/tests/Makefile.am b/gio/tests/Makefile.am
index 5f49e6c..d25a3bf 100644
--- a/gio/tests/Makefile.am
+++ b/gio/tests/Makefile.am
@@ -45,6 +45,7 @@ TEST_PROGS +=	 		\
 	gdbus-message		\
 	socket			\
 	pollable		\
+	tls				\
 	$(NULL)
 
 if OS_UNIX
@@ -188,6 +189,9 @@ socket_client_SOURCES	  = socket-client.c
 socket_client_LDADD	  = $(progs_ldadd) \
 	$(top_builddir)/gthread/libgthread-2.0.la
 
+tls_SOURCES	  = tls.c
+tls_LDADD	  = $(progs_ldadd)
+
 echo_server_SOURCES	  = echo-server.c
 echo_server_LDADD	  = $(progs_ldadd) \
 	$(top_builddir)/gthread/libgthread-2.0.la
diff --git a/gio/tests/tls-tests/server-and-key.pem b/gio/tests/tls-tests/server-and-key.pem
new file mode 100644
index 0000000..7bf1cff
--- /dev/null
+++ b/gio/tests/tls-tests/server-and-key.pem
@@ -0,0 +1,23 @@
+-----BEGIN CERTIFICATE-----
+MIICJjCCAY+gAwIBAgIBBzANBgkqhkiG9w0BAQUFADCBhjETMBEGCgmSJomT8ixk
+ARkWA0NPTTEXMBUGCgmSJomT8ixkARkWB0VYQU1QTEUxHjAcBgNVBAsTFUNlcnRp
+ZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAxMOY2EuZXhhbXBsZS5jb20xHTAbBgkq
+hkiG9w0BCQEWDmNhQGV4YW1wbGUuY29tMB4XDTExMDExNzE5NDcxN1oXDTIxMDEx
+NDE5NDcxN1owSzETMBEGCgmSJomT8ixkARkWA0NPTTEXMBUGCgmSJomT8ixkARkW
+B0VYQU1QTEUxGzAZBgNVBAMTEnNlcnZlci5leGFtcGxlLmNvbTBcMA0GCSqGSIb3
+DQEBAQUAA0sAMEgCQQDYScTxk55XBmbDM9zzwO+grVySE4rudWuzH2PpObIonqbf
+hRoAalKVluG9jvbHI81eXxCdSObv1KBP1sbN5RzpAgMBAAGjIjAgMAkGA1UdEwQC
+MAAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQEFBQADgYEAYx6fMqT1
+Gvo0jq88E8mc+bmp4LfXD4wJ7KxYeadQxt75HFRpj4FhFO3DOpVRFgzHlOEo3Fwk
+PZOKjvkT0cbcoEq5whLH25dHoQxGoVQgFyAP5s+7Vp5AlHh8Y/vAoXeEVyy/RCIH
+QkhUlAflfDMcrrYjsmwoOPSjhx6Mm/AopX4=
+-----END CERTIFICATE-----
+-----BEGIN RSA PRIVATE KEY-----
+MIIBOgIBAAJBANhJxPGTnlcGZsMz3PPA76CtXJITiu51a7MfY+k5siiept+FGgBq
+UpWW4b2O9scjzV5fEJ1I5u/UoE/Wxs3lHOkCAwEAAQJAURSWd9lW6ljD/TlcAyS4
+sAtNQJWC55GtJiEGW0/9savXVHPRllN5IlcOJS/L//rD47UzwmGHcxxzsg3p+s51
+YQIhAPaiU+wbUL0cQrxqwIa/TEtNtrU3T21vNvQaFLSHh+uHAiEA4IBuYuPL+xz2
+nDwSB9UWklYV5fKhwqUA96qyMNxTMA8CIGvD6h+Un+bB3nctvgoitFeDEX6FOHN8
+0OpAKyPmxIEpAiEAiwNb1wYhN9QebG3R6GGtQV3m32VXftR3feSHxDOZm0cCIEpA
+7kMFeeQQZb1qYd1PMFSDCG+BkrWh/Fud+VvFAWxI
+-----END RSA PRIVATE KEY-----
diff --git a/gio/tests/tls.c b/gio/tests/tls.c
new file mode 100644
index 0000000..f91200c
--- /dev/null
+++ b/gio/tests/tls.c
@@ -0,0 +1,229 @@
+/* GIO TLS tests
+ *
+ * Copyright (C) 2011 Collabora, Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Author: Stef Walter <stefw collabora co uk>
+ */
+
+#include <gio/gio.h>
+
+#include <sys/types.h>
+
+#define TEST_DATA "You win again, gravity!\n"
+#define TEST_DATA_LENGTH 24
+
+typedef struct {
+  GMainLoop *loop;
+  GSocketService *service;
+  GIOStream *server_connection;
+  GIOStream *client_connection;
+  guint16 port;
+} Test;
+
+static GSocketAddress*
+build_socket_address (Test *test)
+{
+  GInetAddress *inet;
+  GSocketAddress *address;
+
+  if (!test->port)
+    test->port = g_random_int_range (50000, 65000);
+
+  inet = g_inet_address_new_from_string ("127.0.0.1");
+  address = g_inet_socket_address_new (inet, test->port);
+  g_object_unref (inet);
+
+  return address;
+}
+
+static void
+on_output_close_finish (GObject        *object,
+                        GAsyncResult   *res,
+                        gpointer        user_data)
+{
+  GError *error = NULL;
+  g_output_stream_close_finish (G_OUTPUT_STREAM (object), res, &error);
+  g_assert_no_error (error);
+}
+
+static void
+on_output_write_finish (GObject        *object,
+                        GAsyncResult   *res,
+                        gpointer        user_data)
+{
+  Test *test = user_data;
+  GError *error = NULL;
+  g_output_stream_write_finish (G_OUTPUT_STREAM (object), res, &error);
+  g_assert_no_error (error);
+
+  g_output_stream_close_async (G_OUTPUT_STREAM (object), G_PRIORITY_DEFAULT, NULL,
+                               on_output_close_finish, test);
+}
+
+static gboolean
+on_incoming_connection (GSocketService     *service,
+                        GSocketConnection  *connection,
+                        GObject            *source_object,
+                        gpointer            user_data)
+{
+  Test *test = user_data;
+  GOutputStream *stream;
+  GTlsCertificate *cert;
+  GError *error = NULL;
+  gchar *path;
+
+  path = g_build_filename (SRCDIR, "tls-tests", "server-and-key.pem", NULL);
+  cert = g_tls_certificate_new_from_file (path, &error);
+  g_assert_no_error (error);
+  g_free (path);
+
+  test->server_connection = g_tls_server_connection_new (G_IO_STREAM (connection),
+                                                         cert, &error);
+  g_assert_no_error (error);
+  g_object_unref (cert);
+
+  stream = g_io_stream_get_output_stream (test->server_connection);
+
+  g_output_stream_write_async (stream, TEST_DATA, TEST_DATA_LENGTH,
+                               G_PRIORITY_DEFAULT, NULL,
+                               on_output_write_finish, test);
+  return FALSE;
+}
+
+static void
+start_server_service (Test *test)
+{
+  GSocketAddress *address;
+  GError *error = NULL;
+
+  address = build_socket_address (test);
+  g_assert (address);
+
+  test->service = g_socket_service_new ();
+  g_socket_listener_add_address (G_SOCKET_LISTENER (test->service), address,
+                                 G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_TCP,
+                                 NULL, NULL, &error);
+  g_assert_no_error (error);
+  g_object_unref (address);
+
+  g_signal_connect (test->service, "incoming", G_CALLBACK (on_incoming_connection), test);
+}
+
+static void
+on_input_read_finish (GObject        *object,
+                      GAsyncResult   *res,
+                      gpointer        user_data)
+{
+  Test *test = user_data;
+  GError *error = NULL;
+  gchar *line, *check;
+
+  line = g_data_input_stream_read_line_finish (G_DATA_INPUT_STREAM (object), res,
+                                               NULL, &error);
+  g_assert_no_error (error);
+  g_assert (line);
+
+  check = g_strdup (TEST_DATA);
+  g_strstrip (check);
+  g_assert_cmpstr (line, ==, check);
+  g_free (check);
+  g_free (line);
+
+  g_main_loop_quit (test->loop);
+}
+
+static void
+start_client_connection (Test *test)
+{
+  GSocketAddress *address;
+  GSocketClient *client;
+  GSocketConnection *connection;
+  GDataInputStream *stream;
+  GError *error = NULL;
+
+  address = build_socket_address (test);
+  g_assert (address);
+
+  client = g_socket_client_new ();
+  connection = g_socket_client_connect (client, G_SOCKET_CONNECTABLE (address), NULL, &error);
+  g_assert_no_error (error);
+  g_object_unref (client);
+
+  test->client_connection = g_tls_client_connection_new (G_IO_STREAM (connection),
+                                                         G_SOCKET_CONNECTABLE (address),
+                                                         &error);
+  g_assert_no_error (error);
+  g_object_unref (address);
+
+  g_tls_client_connection_set_validation_flags (G_TLS_CLIENT_CONNECTION (test->client_connection),
+                                                0);
+  /* G_TLS_CERTIFICATE_VALIDATE_ALL & ~G_TLS_CERTIFICATE_UNKNOWN_CA */
+  stream = g_data_input_stream_new (g_io_stream_get_input_stream (test->client_connection));
+  g_assert (stream);
+
+  g_data_input_stream_read_line_async (stream, G_PRIORITY_DEFAULT, NULL,
+                                       on_input_read_finish, test);
+
+  g_object_unref (stream);
+}
+
+static void
+test_basic_connection (Test *test, gconstpointer data)
+{
+  start_server_service (test);
+  start_client_connection (test);
+  g_main_loop_run (test->loop);
+}
+
+static void
+setup (Test *test, gconstpointer data)
+{
+  test->loop = g_main_loop_new (NULL, FALSE);
+}
+
+static void
+teardown (Test *test, gconstpointer data)
+{
+  if (test->service)
+    g_object_unref (test->service);
+  test->service = NULL;
+
+  if (test->server_connection)
+    g_object_unref (test->server_connection);
+  test->server_connection = NULL;
+
+  if (test->client_connection)
+    g_object_unref (test->client_connection);
+  test->client_connection = NULL;
+
+  g_main_loop_unref (test->loop);
+  test->loop = NULL;
+}
+
+int
+main (int   argc,
+      char *argv[])
+{
+  g_type_init ();
+  g_test_init (&argc, &argv, NULL);
+
+  g_test_add ("/tls/basic-connection", Test, NULL,
+              setup, test_basic_connection, teardown);
+
+  return g_test_run();
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]