/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */
/* vim: set sw=2 ts=2 sts=2 et: */
/*
* ephy-sqlite-statement.c
* This file is part of Epiphany
*
* Copyright © 2010, 2011, 2012 Igalia S.L.
*
* Epiphany 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.
*
* Epiphany 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 Epiphany; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
#include "config.h"
#include "ephy-history-service.h"
#include <glib/gstdio.h>
#include <gtk/gtk.h>
static EphyHistoryService *
ensure_empty_history (const char* filename)
{
if (g_file_test (filename, G_FILE_TEST_IS_REGULAR))
g_unlink (filename);
return ephy_history_service_new (filename);
}
static void
test_create_history_service (void)
{
gchar *temporary_file = g_build_filename (g_get_tmp_dir (), "epiphany-history-test.db", NULL);
EphyHistoryService *service = ensure_empty_history (temporary_file);
g_free (temporary_file);
g_object_unref (service);
}
static gboolean
destroy_history_service_and_end_main_loop (EphyHistoryService *service)
{
g_object_unref (service);
g_assert (TRUE);
gtk_main_quit ();
return FALSE;
}
static void
test_create_history_service_and_destroy_later (void)
{
gchar *temporary_file = g_build_filename (g_get_tmp_dir (), "epiphany-history-test.db", NULL);
EphyHistoryService *service = ensure_empty_history (temporary_file);
g_free (temporary_file);
g_timeout_add (100, (GSourceFunc) destroy_history_service_and_end_main_loop, service);
gtk_main ();
}
static void
page_vist_created (EphyHistoryService *service, gboolean success, gpointer result_data, gpointer user_data)
{
g_object_unref (service);
g_assert (result_data == NULL);
g_assert (user_data == NULL);
g_assert (success);
gtk_main_quit ();
}
static void
test_create_history_entry (void)
{
gchar *temporary_file = g_build_filename (g_get_tmp_dir (), "epiphany-history-test.db", NULL);
EphyHistoryService *service = ensure_empty_history (temporary_file);
EphyHistoryPageVisit *visit = ephy_history_page_visit_new ("http://www.gnome.org", 0, EPHY_PAGE_VISIT_TYPED);
ephy_history_service_add_visit (service, visit, NULL, page_vist_created, NULL);
ephy_history_page_visit_free (visit);
g_free (temporary_file);
gtk_main ();
}
static GList *
create_test_page_visit_list (void)
{
GList *visits = NULL;
int i;
for (i = 0; i < 100; i++) {
visits = g_list_append (visits, ephy_history_page_visit_new ("http://www.gnome.org", 3, EPHY_PAGE_VISIT_TYPED));
visits = g_list_append (visits, ephy_history_page_visit_new ("http://www.gnome.org", 5, EPHY_PAGE_VISIT_TYPED));
visits = g_list_append (visits, ephy_history_page_visit_new ("http://www.cuteoverload.com", 7, EPHY_PAGE_VISIT_TYPED));
visits = g_list_append (visits, ephy_history_page_visit_new ("http://www.cuteoverload.com", 8, EPHY_PAGE_VISIT_TYPED));
}
return visits;
}
static void
verify_create_history_entry_cb (EphyHistoryService *service, gboolean success, gpointer result_data, gpointer user_data)
{
GList *visits = (GList *) result_data;
GList *baseline_visits = create_test_page_visit_list ();
GList *current = visits;
GList *current_baseline = baseline_visits;
g_assert (user_data == NULL);
g_assert (success);
g_assert (visits != NULL);
g_assert_cmpint (g_list_length (visits), ==, g_list_length (baseline_visits));
while (current_baseline) {
EphyHistoryPageVisit *visit, *baseline_visit;
g_assert (current);
visit = (EphyHistoryPageVisit *) current->data;
baseline_visit = (EphyHistoryPageVisit *) current_baseline->data;
g_assert_cmpstr (visit->url->url, ==, baseline_visit->url->url);
g_assert_cmpstr (visit->url->title, ==, baseline_visit->url->title);
g_assert_cmpint (visit->visit_time, ==, baseline_visit->visit_time);
g_assert_cmpint (visit->visit_type, ==, baseline_visit->visit_type);
current = current->next;
current_baseline = current_baseline->next;
}
ephy_history_page_visit_list_free (visits);
ephy_history_page_visit_list_free (baseline_visits);
g_object_unref (service);
gtk_main_quit ();
}
static void
verify_create_history_entry (EphyHistoryService *service, gboolean success, gpointer result_data, gpointer user_data)
{
g_assert (result_data == NULL);
g_assert_cmpint (42, ==, GPOINTER_TO_INT(user_data));
g_assert (success);
ephy_history_service_find_visits_in_time (service, 0, 8, NULL, verify_create_history_entry_cb, NULL);
}
static void
test_create_history_entries (void)
{
gchar *temporary_file = g_build_filename (g_get_tmp_dir (), "epiphany-history-test.db", NULL);
EphyHistoryService *service = ensure_empty_history (temporary_file);
GList *visits = create_test_page_visit_list ();
/* We use 42 here just to verify that user_data is passed properly to the callback */
ephy_history_service_add_visits (service, visits, NULL, verify_create_history_entry, GINT_TO_POINTER(42));
ephy_history_page_visit_list_free (visits);
g_free (temporary_file);
gtk_main ();
}
static void
get_url (EphyHistoryService *service, gboolean success, gpointer result_data, gpointer user_data)
{
EphyHistoryURL *url = (EphyHistoryURL *) result_data;
g_assert (success == TRUE);
g_assert (url != NULL);
g_assert_cmpstr (url->title, ==, "GNOME");
ephy_history_url_free (url);
g_object_unref (service);
gtk_main_quit();
}
static void
set_url_title (EphyHistoryService *service, gboolean success, gpointer result_data, gpointer user_data)
{
gboolean test_result = GPOINTER_TO_INT (user_data);
g_assert (success == TRUE);
if (test_result == FALSE) {
g_object_unref (service);
gtk_main_quit ();
} else
ephy_history_service_get_url (service, "http://www.gnome.org", NULL, get_url, NULL);
}
static void
set_url_title_visit_created (EphyHistoryService *service, gboolean success, gpointer result_data, gpointer user_data)
{
ephy_history_service_set_url_title (service, "http://www.gnome.org", "GNOME", NULL, set_url_title, user_data);
}
static void
test_set_url_title_helper (gboolean test_results)
{
gchar *temporary_file = g_build_filename (g_get_tmp_dir (), "epiphany-history-test.db", NULL);
EphyHistoryService *service = ensure_empty_history (temporary_file);
EphyHistoryPageVisit *visit = ephy_history_page_visit_new ("http://www.gnome.org", 0, EPHY_PAGE_VISIT_TYPED);
ephy_history_service_add_visit (service, visit, NULL, set_url_title_visit_created, GINT_TO_POINTER (test_results));
ephy_history_page_visit_free (visit);
g_free (temporary_file);
gtk_main ();
}
static void
test_set_url_title (void)
{
test_set_url_title_helper (FALSE);
}
static void
test_set_url_title_is_correct (void)
{
test_set_url_title_helper (TRUE);
}
static void
set_url_title_url_not_existent (EphyHistoryService *service, gboolean success, gpointer result_data, gpointer user_data)
{
g_assert (success == FALSE);
g_object_unref (service);
gtk_main_quit ();
}
static void
test_set_url_title_url_not_existent (void)
{
gchar *temporary_file = g_build_filename (g_get_tmp_dir (), "epiphany-history-test.db", NULL);
EphyHistoryService *service = ensure_empty_history (temporary_file);
g_free (temporary_file);
ephy_history_service_set_url_title (service, "http://www.gnome.org", "GNOME", NULL, set_url_title_url_not_existent, NULL);
gtk_main();
}
static void
test_get_url_done (EphyHistoryService *service, gboolean success, gpointer result_data, gpointer user_data)
{
EphyHistoryURL *url;
gboolean expected_success = GPOINTER_TO_INT (user_data);
url = (EphyHistoryURL *)result_data;
g_assert (success == expected_success);
if (expected_success == TRUE) {
g_assert (url != NULL);
g_assert_cmpstr (url->url, ==, "http://www.gnome.org");
g_assert_cmpint (url->id, !=, -1);
ephy_history_url_free (url);
} else
g_assert (url == NULL);
g_object_unref (service);
gtk_main_quit ();
}
static void
test_get_url_visit_added (EphyHistoryService *service, gboolean success, gpointer result_data, gpointer user_data)
{
g_assert (success == TRUE);
ephy_history_service_get_url (service, "http://www.gnome.org", NULL, test_get_url_done, user_data);
}
static void
test_get_url_helper (gboolean add_entry)
{
gchar *temporary_file = g_build_filename (g_get_tmp_dir (), "epiphany-history-test.db", NULL);
EphyHistoryService *service = ensure_empty_history (temporary_file);
g_free (temporary_file);
if (add_entry == TRUE) {
EphyHistoryPageVisit *visit = ephy_history_page_visit_new ("http://www.gnome.org", 0, EPHY_PAGE_VISIT_TYPED);
ephy_history_service_add_visit (service, visit, NULL, test_get_url_visit_added, GINT_TO_POINTER (add_entry));
ephy_history_page_visit_free (visit);
} else
ephy_history_service_get_url (service, "http://www.gnome.org", NULL, test_get_url_done, GINT_TO_POINTER (add_entry));
gtk_main();
}
static void
test_get_url (void)
{
test_get_url_helper (TRUE);
}
static void
test_get_url_not_existent (void)
{
test_get_url_helper (FALSE);
}
static GList *
create_visits_for_complex_tests (void)
{
int i;
GList *visits = NULL;
for (i = 0; i < 10; i++)
visits = g_list_append (visits, ephy_history_page_visit_new ("http://www.gnome.org", 10 * i, EPHY_PAGE_VISIT_TYPED));
for (i = 0; i < 30; i++)
visits = g_list_append (visits, ephy_history_page_visit_new ("http://www.wikipedia.org", 10 * i, EPHY_PAGE_VISIT_TYPED));
for (i = 0; i < 20; i++)
visits = g_list_append (visits, ephy_history_page_visit_new ("http://www.freedesktop.org", 10 * i, EPHY_PAGE_VISIT_TYPED));
for (i = 0; i < 5; i++)
visits = g_list_append (visits, ephy_history_page_visit_new ("http://www.musicbrainz.org", 10 * i, EPHY_PAGE_VISIT_TYPED));
for (i = 0; i < 2; i++)
visits = g_list_append (visits, ephy_history_page_visit_new ("http://www.webkitgtk.org", 1000 * i, EPHY_PAGE_VISIT_TYPED));
return visits;
}
static void
verify_complex_url_query (EphyHistoryService *service,
gboolean success,
gpointer result_data,
gpointer user_data)
{
EphyHistoryURL *url, *baseline;
GList *urls = (GList*) result_data;
/* Only one result expected. */
g_assert_cmpint (g_list_length (urls), ==, 1);
url = (EphyHistoryURL *) urls->data;
baseline = (EphyHistoryURL *) user_data;
g_assert_cmpstr (url->url, ==, baseline->url);
g_assert_cmpuint (url->visit_count, ==, baseline->visit_count);
g_object_unref (service);
gtk_main_quit();
}
static void
perform_complex_url_query (EphyHistoryService *service,
gboolean success,
gpointer result_data,
gpointer user_data)
{
EphyHistoryQuery *query;
EphyHistoryURL *url;
g_assert (success == TRUE);
/* Get the most visited site that contains 'k'. */
query = ephy_history_query_new ();
query->substring_list = g_list_prepend (query->substring_list, "k");
query->limit = 1;
query->sort_type = EPHY_HISTORY_SORT_MV;
/* The expected result. */
url = ephy_history_url_new ("http://www.wikipedia.org",
"Wikipedia",
30, 30, 0);
ephy_history_service_query_urls (service, query, NULL, verify_complex_url_query, url);
}
static void
test_complex_url_query (void)
{
gchar *temporary_file = g_build_filename (g_get_tmp_dir (), "epiphany-history-test.db", NULL);
EphyHistoryService *service = ensure_empty_history (temporary_file);
GList *visits;
visits = create_visits_for_complex_tests ();
ephy_history_service_add_visits (service, visits, NULL, perform_complex_url_query, NULL);
gtk_main ();
}
static void
perform_complex_url_query_with_time_range (EphyHistoryService *service,
gboolean success,
gpointer result_data,
gpointer user_data)
{
EphyHistoryQuery *query;
EphyHistoryURL *url;
g_assert (success == TRUE);
/* Get the most visited site that contains 'k' that was visited since timestamp 500. */
query = ephy_history_query_new ();
query->substring_list = g_list_prepend (query->substring_list, "k");
query->limit = 1;
query->sort_type = EPHY_HISTORY_SORT_MV;
query->from = 500;
/* The expected result. */
url = ephy_history_url_new ("http://www.webkitgtk.org",
"WebKitGTK+",
2, 2, 0);
ephy_history_service_query_urls (service, query, NULL, verify_complex_url_query, url);
}
static void
test_complex_url_query_with_time_range (void)
{
gchar *temporary_file = g_build_filename (g_get_tmp_dir (), "epiphany-history-test.db", NULL);
EphyHistoryService *service = ensure_empty_history (temporary_file);
GList *visits;
visits = create_visits_for_complex_tests ();
ephy_history_service_add_visits (service, visits, NULL, perform_complex_url_query_with_time_range, NULL);
gtk_main ();
}
static void
verify_query_after_clear (EphyHistoryService *service,
gboolean success,
gpointer result_data,
gpointer user_data)
{
GList *urls = (GList*)result_data;
/* No results expected. */
g_assert_cmpint (g_list_length (urls), ==, 0);
g_object_unref (service);
gtk_main_quit();
}
static void
perform_query_after_clear (EphyHistoryService *service,
gboolean success,
gpointer result_data,
gpointer user_data)
{
EphyHistoryQuery *query;
g_assert (success == TRUE);
/* Get 10 random sites, the query should fail. */
query = ephy_history_query_new ();
query->substring_list = g_list_prepend (query->substring_list, "gnome");
query->limit = 10;
query->sort_type = EPHY_HISTORY_SORT_MV;
ephy_history_service_query_urls (service, query, NULL, verify_query_after_clear, NULL);
}
static void
test_clear (void)
{
gchar *temporary_file = g_build_filename (g_get_tmp_dir (), "epiphany-history-test.db", NULL);
EphyHistoryService *service = ensure_empty_history (temporary_file);
GList *visits = create_test_page_visit_list ();
ephy_history_service_add_visits (service, visits, NULL, NULL, NULL);
ephy_history_service_clear (service, NULL, perform_query_after_clear, NULL);
gtk_main ();
}
int
main (int argc, char *argv[])
{
gtk_test_init (&argc, &argv);
g_test_add_func ("/embed/history/test_create_history_service", test_create_history_service);
g_test_add_func ("/embed/history/test_create_history_service_and_destroy_later", test_create_history_service_and_destroy_later);
g_test_add_func ("/embed/history/test_create_history_entry", test_create_history_entry);
g_test_add_func ("/embed/history/test_create_history_entries", test_create_history_entries);
g_test_add_func ("/embed/history/test_set_url_title", test_set_url_title);
g_test_add_func ("/embed/history/test_set_url_title_is_correct", test_set_url_title_is_correct);
g_test_add_func ("/embed/history/test_set_url_title_url_not_existent", test_set_url_title_url_not_existent);
g_test_add_func ("/embed/history/test_get_url", test_get_url);
g_test_add_func ("/embed/history/test_get_url_not_existent", test_get_url_not_existent);
g_test_add_func ("/embed/history/test_complex_url_query", test_complex_url_query);
g_test_add_func ("/embed/history/test_complex_url_query_with_time_range", test_complex_url_query_with_time_range);
g_test_add_func ("/embed/history/test_clear", test_clear);
return g_test_run ();
}