Blame gcr/test-parser.c

Packit b00eeb
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
Packit b00eeb
/* unit-test-pkix-parser.c: Test PKIX parser
Packit b00eeb
Packit b00eeb
   Copyright (C) 2007 Stefan Walter
Packit b00eeb
Packit b00eeb
   The Gnome Keyring Library is free software; you can redistribute it and/or
Packit b00eeb
   modify it under the terms of the GNU Library General Public License as
Packit b00eeb
   published by the Free Software Foundation; either version 2 of the
Packit b00eeb
   License, or (at your option) any later version.
Packit b00eeb
Packit b00eeb
   The Gnome Keyring Library is distributed in the hope that it will be useful,
Packit b00eeb
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit b00eeb
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit b00eeb
   Library General Public License for more details.
Packit b00eeb
Packit b00eeb
   You should have received a copy of the GNU Library General Public
Packit b00eeb
   License along with the Gnome Library; see the file COPYING.LIB.  If not,
Packit b00eeb
   see <http://www.gnu.org/licenses/>.
Packit b00eeb
Packit b00eeb
   Author: Stef Walter <stef@memberwebs.com>
Packit b00eeb
*/
Packit b00eeb
Packit b00eeb
#include "config.h"
Packit b00eeb
Packit b00eeb
#include "egg/egg-error.h"
Packit b00eeb
#include "egg/egg-secure-memory.h"
Packit b00eeb
#include "egg/egg-testing.h"
Packit b00eeb
Packit b00eeb
#include "gcr/gcr-base.h"
Packit b00eeb
#include "gcr/gcr-internal.h"
Packit b00eeb
Packit b00eeb
#include "gck/gck.h"
Packit b00eeb
Packit b00eeb
#include <glib.h>
Packit b00eeb
#include <gcrypt.h>
Packit b00eeb
Packit b00eeb
#include <errno.h>
Packit b00eeb
#include <stdlib.h>
Packit b00eeb
#include <stdio.h>
Packit b00eeb
#include <string.h>
Packit b00eeb
Packit b00eeb
/*
Packit b00eeb
 * Each test looks like (on one line):
Packit b00eeb
 *     void unit_test_xxxxx (CuTest* cu)
Packit b00eeb
 *
Packit b00eeb
 * Each setup looks like (on one line):
Packit b00eeb
 *     void unit_setup_xxxxx (void);
Packit b00eeb
 *
Packit b00eeb
 * Each teardown looks like (on one line):
Packit b00eeb
 *     void unit_teardown_xxxxx (void);
Packit b00eeb
 *
Packit b00eeb
 * Tests be run in the order specified here.
Packit b00eeb
 */
Packit b00eeb
Packit b00eeb
typedef struct {
Packit b00eeb
	GcrParser *parser;
Packit b00eeb
	const gchar* filedesc;
Packit b00eeb
} Test;
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
ensure_block_can_be_parsed (GcrDataFormat format,
Packit b00eeb
                            GBytes *block)
Packit b00eeb
{
Packit b00eeb
	GcrParser *parser;
Packit b00eeb
	gboolean result;
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
Packit b00eeb
	g_assert (block != NULL);
Packit b00eeb
Packit b00eeb
	parser = gcr_parser_new ();
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (parser), (gpointer *)&parser);
Packit b00eeb
	gcr_parser_format_disable (parser, -1);
Packit b00eeb
	gcr_parser_format_enable (parser, format);
Packit b00eeb
	result = gcr_parser_parse_bytes (parser, block, &error);
Packit b00eeb
Packit b00eeb
	if (!result) {
Packit b00eeb
		g_critical ("The data returned from gcr_parser_get_parsed_block() "
Packit b00eeb
		            "cannot be parsed: %s", error->message);
Packit b00eeb
		g_assert_not_reached ();
Packit b00eeb
	}
Packit b00eeb
Packit b00eeb
	g_object_unref (parser);
Packit b00eeb
	g_assert (parser == NULL);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
parsed_item (GcrParser *par, gpointer user_data)
Packit b00eeb
{
Packit b00eeb
	GckAttributes *attrs;
Packit b00eeb
	const gchar *description;
Packit b00eeb
	const gchar *label;
Packit b00eeb
	Test *test = user_data;
Packit b00eeb
	GBytes *block;
Packit b00eeb
	GcrDataFormat format;
Packit b00eeb
Packit b00eeb
	g_assert (GCR_IS_PARSER (par));
Packit b00eeb
	g_assert (par == test->parser);
Packit b00eeb
Packit b00eeb
	attrs = gcr_parser_get_parsed_attributes (test->parser);
Packit b00eeb
	g_assert (attrs);
Packit b00eeb
Packit b00eeb
	description = gcr_parser_get_parsed_description (test->parser);
Packit b00eeb
	label = gcr_parser_get_parsed_label (test->parser);
Packit b00eeb
	block = gcr_parser_get_parsed_bytes (test->parser);
Packit b00eeb
	format = gcr_parser_get_parsed_format (test->parser);
Packit b00eeb
	ensure_block_can_be_parsed (format, block);
Packit b00eeb
Packit b00eeb
	if (g_test_verbose ())
Packit b00eeb
		g_print ("%s: '%s'\n", description, label);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static gboolean
Packit b00eeb
authenticate (GcrParser *par, gint state, gpointer user_data)
Packit b00eeb
{
Packit b00eeb
	Test *test = user_data;
Packit b00eeb
Packit b00eeb
	g_assert (GCR_IS_PARSER (par));
Packit b00eeb
	g_assert (par == test->parser);
Packit b00eeb
Packit b00eeb
	switch (state) {
Packit b00eeb
	case 0:
Packit b00eeb
		gcr_parser_add_password (test->parser, "booo");
Packit b00eeb
		return TRUE;
Packit b00eeb
	case 1:
Packit b00eeb
		gcr_parser_add_password (test->parser, "usr0052");
Packit b00eeb
		return TRUE;
Packit b00eeb
	default:
Packit b00eeb
		g_printerr ("decryption didn't work for: %s", test->filedesc);
Packit b00eeb
		g_assert_not_reached ();
Packit b00eeb
		return FALSE;
Packit b00eeb
	};
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
setup (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	test->parser = gcr_parser_new ();
Packit b00eeb
	g_signal_connect (test->parser, "parsed", G_CALLBACK (parsed_item), test);
Packit b00eeb
	g_signal_connect (test->parser, "authenticate", G_CALLBACK (authenticate), test);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
teardown (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	g_object_unref (test->parser);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_parse_one (Test *test,
Packit b00eeb
                gconstpointer user_data)
Packit b00eeb
{
Packit b00eeb
	const gchar *path = user_data;
Packit b00eeb
	gchar *contents;
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	gboolean result;
Packit b00eeb
	GBytes *bytes;
Packit b00eeb
	gsize len;
Packit b00eeb
Packit b00eeb
	if (!g_file_get_contents (path, &contents, &len, NULL))
Packit b00eeb
		g_assert_not_reached ();
Packit b00eeb
Packit b00eeb
	test->filedesc = path;
Packit b00eeb
	bytes = g_bytes_new_take (contents, len);
Packit b00eeb
	result = gcr_parser_parse_bytes (test->parser, bytes, &error);
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
	g_assert (result);
Packit b00eeb
Packit b00eeb
	g_bytes_unref (bytes);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
on_parsed_compare_bytes (GcrParser *parser,
Packit b00eeb
                         gpointer user_data)
Packit b00eeb
{
Packit b00eeb
	GBytes *original = user_data;
Packit b00eeb
	GBytes *bytes;
Packit b00eeb
	gconstpointer data;
Packit b00eeb
	gsize n_data;
Packit b00eeb
	GcrParsed *parsed;
Packit b00eeb
Packit b00eeb
	bytes = gcr_parser_get_parsed_bytes (parser);
Packit b00eeb
	g_assert (bytes != NULL);
Packit b00eeb
	g_assert (g_bytes_equal (original, bytes));
Packit b00eeb
Packit b00eeb
	data = gcr_parser_get_parsed_block (parser, &n_data);
Packit b00eeb
	g_assert (data != NULL);
Packit b00eeb
	g_assert_cmpint (n_data, ==, g_bytes_get_size (original));
Packit b00eeb
	g_assert (memcmp (data, g_bytes_get_data (original, NULL), n_data) == 0);
Packit b00eeb
Packit b00eeb
	parsed = gcr_parser_get_parsed (parser);
Packit b00eeb
	g_assert (parsed != NULL);
Packit b00eeb
	bytes = gcr_parsed_get_bytes (parsed);
Packit b00eeb
	g_assert (bytes != NULL);
Packit b00eeb
	g_assert (g_bytes_equal (original, bytes));
Packit b00eeb
Packit b00eeb
	data = gcr_parsed_get_data (parsed, &n_data);
Packit b00eeb
	g_assert (data != NULL);
Packit b00eeb
	g_assert_cmpint (n_data, ==, g_bytes_get_size (original));
Packit b00eeb
	g_assert (memcmp (data, g_bytes_get_data (original, NULL), n_data) == 0);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_parsed_bytes (void)
Packit b00eeb
{
Packit b00eeb
	GcrParser *parser = gcr_parser_new ();
Packit b00eeb
	gchar *contents;
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	gboolean result;
Packit b00eeb
	GBytes *bytes;
Packit b00eeb
	gsize len;
Packit b00eeb
Packit b00eeb
	if (!g_file_get_contents (SRCDIR "/gcr/fixtures/cacert.org.cer", &contents, &len, NULL))
Packit b00eeb
		g_assert_not_reached ();
Packit b00eeb
Packit b00eeb
	bytes = g_bytes_new_take (contents, len);
Packit b00eeb
	g_signal_connect (parser, "parsed", G_CALLBACK (on_parsed_compare_bytes), bytes);
Packit b00eeb
	result = gcr_parser_parse_bytes (parser, bytes, &error);
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
	g_assert (result);
Packit b00eeb
Packit b00eeb
	g_bytes_unref (bytes);
Packit b00eeb
	g_object_unref (parser);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_parse_null (void)
Packit b00eeb
{
Packit b00eeb
	GcrParser *parser = gcr_parser_new ();
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	gboolean result;
Packit b00eeb
Packit b00eeb
	result = gcr_parser_parse_data (parser, NULL, 0, &error);
Packit b00eeb
	g_assert_error (error, GCR_DATA_ERROR, GCR_ERROR_UNRECOGNIZED);
Packit b00eeb
	g_assert (!result);
Packit b00eeb
	g_error_free (error);
Packit b00eeb
Packit b00eeb
	g_object_unref (parser);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_parse_empty (void)
Packit b00eeb
{
Packit b00eeb
	GcrParser *parser = gcr_parser_new ();
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	gboolean result;
Packit b00eeb
Packit b00eeb
	result = gcr_parser_parse_data (parser, (const guchar *)"", 0, &error);
Packit b00eeb
	g_assert_error (error, GCR_DATA_ERROR, GCR_ERROR_UNRECOGNIZED);
Packit b00eeb
	g_assert (!result);
Packit b00eeb
	g_error_free (error);
Packit b00eeb
Packit b00eeb
	g_object_unref (parser);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_parse_stream (void)
Packit b00eeb
{
Packit b00eeb
	GcrParser *parser = gcr_parser_new ();
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	gboolean result;
Packit b00eeb
	GFile *file;
Packit b00eeb
	GFileInputStream *fis;
Packit b00eeb
	gchar *contents;
Packit b00eeb
	gsize len;
Packit b00eeb
	GBytes *bytes;
Packit b00eeb
Packit b00eeb
	file = g_file_new_for_path (SRCDIR "/gcr/fixtures/cacert.org.cer");
Packit b00eeb
	fis = g_file_read (file, NULL, &error);
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
Packit b00eeb
	if (!g_file_get_contents (SRCDIR "/gcr/fixtures/cacert.org.cer", &contents, &len, NULL))
Packit b00eeb
		g_assert_not_reached ();
Packit b00eeb
	bytes = g_bytes_new_take (contents, len);
Packit b00eeb
	g_signal_connect (parser, "parsed", G_CALLBACK (on_parsed_compare_bytes), bytes);
Packit b00eeb
Packit b00eeb
	result = gcr_parser_parse_stream (parser, G_INPUT_STREAM (fis), NULL, &error);
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
	g_assert (result);
Packit b00eeb
Packit b00eeb
	g_bytes_unref (bytes);
Packit b00eeb
	g_object_unref (fis);
Packit b00eeb
	g_object_unref (file);
Packit b00eeb
	g_object_unref (parser);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
on_parsed_ref (GcrParser *parser,
Packit b00eeb
               gpointer user_data)
Packit b00eeb
{
Packit b00eeb
	GcrParsed **parsed = user_data;
Packit b00eeb
	g_assert (parsed != NULL);
Packit b00eeb
	g_assert (*parsed == NULL);
Packit b00eeb
	*parsed = gcr_parsed_ref (gcr_parser_get_parsed (parser));
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_parse_filename (void)
Packit b00eeb
{
Packit b00eeb
	GcrParser *parser = gcr_parser_new ();
Packit b00eeb
	GcrParsed *parsed = NULL;
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	gboolean result;
Packit b00eeb
	gchar *contents;
Packit b00eeb
	gsize len;
Packit b00eeb
	GBytes *bytes;
Packit b00eeb
Packit b00eeb
	if (!g_file_get_contents (SRCDIR "/gcr/fixtures/cacert.org.cer", &contents, &len, NULL))
Packit b00eeb
		g_assert_not_reached ();
Packit b00eeb
Packit b00eeb
	bytes = g_bytes_new_take (contents, len);
Packit b00eeb
	gcr_parser_set_filename (parser, "cacert.org.cer");
Packit b00eeb
	g_signal_connect (parser, "parsed", G_CALLBACK (on_parsed_ref), &parsed);
Packit b00eeb
Packit b00eeb
	result = gcr_parser_parse_bytes (parser, bytes, &error);
Packit b00eeb
	g_assert_cmpstr (gcr_parser_get_filename (parser), ==, "cacert.org.cer");
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
	g_assert (result);
Packit b00eeb
Packit b00eeb
	g_bytes_unref (bytes);
Packit b00eeb
	g_object_unref (parser);
Packit b00eeb
Packit b00eeb
	g_assert (parsed != NULL);
Packit b00eeb
	g_assert_cmpstr (gcr_parsed_get_filename (parsed), ==, "cacert.org.cer");
Packit b00eeb
	gcr_parsed_unref (parsed);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
int
Packit b00eeb
main (int argc, char **argv)
Packit b00eeb
{
Packit b00eeb
	const gchar *filename;
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	GPtrArray *strings;
Packit b00eeb
	GDir *dir;
Packit b00eeb
	gchar *path;
Packit b00eeb
	gchar *lower;
Packit b00eeb
	gchar *test;
Packit b00eeb
	int ret;
Packit b00eeb
Packit b00eeb
	g_test_init (&argc, &argv, NULL);
Packit b00eeb
	g_set_prgname ("test-parser");
Packit b00eeb
Packit b00eeb
	strings = g_ptr_array_new_with_free_func (g_free);
Packit b00eeb
	dir = g_dir_open (SRCDIR "/gcr/fixtures", 0, &error);
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
Packit b00eeb
	for (;;) {
Packit b00eeb
		filename = g_dir_read_name (dir);
Packit b00eeb
		if (!filename)
Packit b00eeb
			break;
Packit b00eeb
		if (filename[0] == '.')
Packit b00eeb
			continue;
Packit b00eeb
Packit b00eeb
		path = g_build_filename (SRCDIR "/gcr/fixtures", filename, NULL);
Packit b00eeb
Packit b00eeb
		if (g_file_test (path, G_FILE_TEST_IS_DIR)) {
Packit b00eeb
			g_free (path);
Packit b00eeb
			continue;
Packit b00eeb
		}
Packit b00eeb
Packit b00eeb
		lower = g_ascii_strdown (filename, -1);
Packit b00eeb
		test = g_strdup_printf ("/gcr/parser/%s",
Packit b00eeb
		                        g_strcanon (lower, "abcdefghijklmnopqrstuvwxyz0123456789", '_'));
Packit b00eeb
		g_free (lower);
Packit b00eeb
Packit b00eeb
		g_test_add (test, Test, path, setup, test_parse_one, teardown);
Packit b00eeb
		g_ptr_array_add (strings, path);
Packit b00eeb
		g_ptr_array_add (strings, test);
Packit b00eeb
	}
Packit b00eeb
Packit b00eeb
	g_dir_close (dir);
Packit b00eeb
Packit b00eeb
	g_test_add_func ("/gcr/parser/parse_null", test_parse_null);
Packit b00eeb
	g_test_add_func ("/gcr/parser/parse_empty", test_parse_empty);
Packit b00eeb
	g_test_add_func ("/gcr/parser/parse_stream", test_parse_stream);
Packit b00eeb
	g_test_add_func ("/gcr/parser/parsed_bytes", test_parsed_bytes);
Packit b00eeb
	g_test_add_func ("/gcr/parser/filename", test_parse_filename);
Packit b00eeb
Packit b00eeb
	ret = g_test_run ();
Packit b00eeb
	g_ptr_array_free (strings, TRUE);
Packit b00eeb
	return ret;
Packit b00eeb
}