Blame gdata/tests/youtube.c

Packit 4b6dd7
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
Packit 4b6dd7
/*
Packit 4b6dd7
 * GData Client
Packit 4b6dd7
 * Copyright (C) Philip Withnall 2008–2010, 2015 <philip@tecnocode.co.uk>
Packit 4b6dd7
 *
Packit 4b6dd7
 * GData Client is free software; you can redistribute it and/or
Packit 4b6dd7
 * modify it under the terms of the GNU Lesser General Public
Packit 4b6dd7
 * License as published by the Free Software Foundation; either
Packit 4b6dd7
 * version 2.1 of the License, or (at your option) any later version.
Packit 4b6dd7
 *
Packit 4b6dd7
 * GData Client is distributed in the hope that it will be useful,
Packit 4b6dd7
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 4b6dd7
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 4b6dd7
 * Lesser General Public License for more details.
Packit 4b6dd7
 *
Packit 4b6dd7
 * You should have received a copy of the GNU Lesser General Public
Packit 4b6dd7
 * License along with GData Client.  If not, see <http://www.gnu.org/licenses/>.
Packit 4b6dd7
 */
Packit 4b6dd7
Packit 4b6dd7
#include <glib.h>
Packit 4b6dd7
#include <string.h>
Packit 4b6dd7
#include <unistd.h>
Packit 4b6dd7
Packit 4b6dd7
#include "gdata.h"
Packit 4b6dd7
#include "common.h"
Packit 4b6dd7
#include "gdata-dummy-authorizer.h"
Packit 4b6dd7
Packit 4b6dd7
static UhmServer *mock_server = NULL;
Packit 4b6dd7
Packit 4b6dd7
#undef CLIENT_ID  /* from common.h */
Packit 4b6dd7
Packit 4b6dd7
#define DEVELOPER_KEY "AI39si7Me3Q7zYs6hmkFvpRBD2nrkVjYYsUO5lh_3HdOkGRc9g6Z4nzxZatk_aAo2EsA21k7vrda0OO6oFg2rnhMedZXPyXoEw"
Packit 4b6dd7
#define CLIENT_ID "352818697630-nqu2cmt5quqd6lr17ouoqmb684u84l1f.apps.googleusercontent.com"
Packit 4b6dd7
#define CLIENT_SECRET "-fA4pHQJxR3zJ-FyAMPQsikg"
Packit 4b6dd7
#define REDIRECT_URI "urn:ietf:wg:oauth:2.0:oob"
Packit 4b6dd7
Packit 4b6dd7
/* Effectively gdata_test_mock_server_start_trace() but calling uhm_server_run() instead of uhm_server_start_trace(). */
Packit 4b6dd7
static void
Packit 4b6dd7
gdata_test_mock_server_run (UhmServer *server)
Packit 4b6dd7
{
Packit 4b6dd7
	const gchar *ip_address;
Packit 4b6dd7
	UhmResolver *resolver;
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_run (server);
Packit 4b6dd7
	gdata_test_set_https_port (server);
Packit 4b6dd7
Packit 4b6dd7
	if (uhm_server_get_enable_online (server) == FALSE) {
Packit 4b6dd7
		/* Set up the expected domain names here. This should technically be split up between
Packit 4b6dd7
		 * the different unit test suites, but that's too much effort. */
Packit 4b6dd7
		ip_address = uhm_server_get_address (server);
Packit 4b6dd7
		resolver = uhm_server_get_resolver (server);
Packit 4b6dd7
Packit 4b6dd7
		uhm_resolver_add_A (resolver, "www.google.com", ip_address);
Packit 4b6dd7
		uhm_resolver_add_A (resolver, "gdata.youtube.com", ip_address);
Packit 4b6dd7
		uhm_resolver_add_A (resolver, "uploads.gdata.youtube.com", ip_address);
Packit 4b6dd7
	}
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_authentication (void)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataOAuth2Authorizer *authorizer = NULL;  /* owned */
Packit 4b6dd7
	gchar *authentication_uri, *authorisation_code;
Packit 4b6dd7
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "authentication");
Packit 4b6dd7
Packit 4b6dd7
	authorizer = gdata_oauth2_authorizer_new (CLIENT_ID, CLIENT_SECRET,
Packit 4b6dd7
	                                          REDIRECT_URI,
Packit 4b6dd7
	                                          GDATA_TYPE_YOUTUBE_SERVICE);
Packit 4b6dd7
Packit 4b6dd7
	/* Get an authentication URI. */
Packit 4b6dd7
	authentication_uri = gdata_oauth2_authorizer_build_authentication_uri (authorizer, NULL, FALSE);
Packit 4b6dd7
	g_assert (authentication_uri != NULL);
Packit 4b6dd7
Packit 4b6dd7
	/* Get the authorisation code off the user. */
Packit 4b6dd7
	if (uhm_server_get_enable_online (mock_server)) {
Packit 4b6dd7
		authorisation_code = gdata_test_query_user_for_verifier (authentication_uri);
Packit 4b6dd7
	} else {
Packit 4b6dd7
		/* Hard coded, extracted from the trace file. */
Packit 4b6dd7
		authorisation_code = g_strdup ("4/9qV_LanNEOUOL4sftMwUp4cfa_yeF"
Packit 4b6dd7
		                               "assB6-ys5EkA5o.4rgOzrZMXgcboiIB"
Packit 4b6dd7
		                               "eO6P2m-GWLMXmgI");
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	g_free (authentication_uri);
Packit 4b6dd7
Packit 4b6dd7
	if (authorisation_code == NULL) {
Packit 4b6dd7
		/* Skip tests. */
Packit 4b6dd7
		goto skip_test;
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	/* Authorise the token */
Packit 4b6dd7
	g_assert (gdata_oauth2_authorizer_request_authorization (authorizer, authorisation_code, NULL, NULL) == TRUE);
Packit 4b6dd7
Packit 4b6dd7
	/* Check all is as it should be */
Packit 4b6dd7
	g_assert (gdata_authorizer_is_authorized_for_domain (GDATA_AUTHORIZER (authorizer),
Packit 4b6dd7
	                                                     gdata_youtube_service_get_primary_authorization_domain ()) == TRUE);
Packit 4b6dd7
Packit 4b6dd7
skip_test:
Packit 4b6dd7
	g_free (authorisation_code);
Packit 4b6dd7
	g_object_unref (authorizer);
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_service_properties (void)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataService *service;
Packit 4b6dd7
Packit 4b6dd7
	/* Create a service */
Packit 4b6dd7
	service = GDATA_SERVICE (gdata_youtube_service_new (DEVELOPER_KEY, NULL));
Packit 4b6dd7
Packit 4b6dd7
	g_assert (service != NULL);
Packit 4b6dd7
	g_assert (GDATA_IS_SERVICE (service));
Packit 4b6dd7
	g_assert_cmpstr (gdata_youtube_service_get_developer_key (GDATA_YOUTUBE_SERVICE (service)), ==, DEVELOPER_KEY);
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (service);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_query_standard_feeds (gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataFeed *feed;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
	guint i;
Packit 4b6dd7
	gulong filter_id;
Packit 4b6dd7
	GDataYouTubeStandardFeedType feeds[] = {
Packit 4b6dd7
		/* This must be kept up-to-date with GDataYouTubeStandardFeedType. */
Packit 4b6dd7
		GDATA_YOUTUBE_TOP_RATED_FEED,
Packit 4b6dd7
		GDATA_YOUTUBE_TOP_FAVORITES_FEED,
Packit 4b6dd7
		GDATA_YOUTUBE_MOST_VIEWED_FEED,
Packit 4b6dd7
		GDATA_YOUTUBE_MOST_POPULAR_FEED,
Packit 4b6dd7
		GDATA_YOUTUBE_MOST_RECENT_FEED,
Packit 4b6dd7
		GDATA_YOUTUBE_MOST_DISCUSSED_FEED,
Packit 4b6dd7
		GDATA_YOUTUBE_MOST_LINKED_FEED,
Packit 4b6dd7
		GDATA_YOUTUBE_MOST_RESPONDED_FEED,
Packit 4b6dd7
		GDATA_YOUTUBE_RECENTLY_FEATURED_FEED,
Packit 4b6dd7
		GDATA_YOUTUBE_WATCH_ON_MOBILE_FEED,
Packit 4b6dd7
	};
Packit 4b6dd7
	const gchar *ignore_query_param_values[] = {
Packit 4b6dd7
		"publishedAfter",
Packit 4b6dd7
		NULL,
Packit 4b6dd7
	};
Packit 4b6dd7
Packit 4b6dd7
	filter_id = uhm_server_filter_ignore_parameter_values (mock_server,
Packit 4b6dd7
	                                                       ignore_query_param_values);
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "query-standard-feeds");
Packit 4b6dd7
Packit 4b6dd7
	for (i = 0; i < G_N_ELEMENTS (feeds); i++) {
Packit 4b6dd7
		feed = gdata_youtube_service_query_standard_feed (GDATA_YOUTUBE_SERVICE (service), feeds[i], NULL, NULL, NULL, NULL, &error);
Packit 4b6dd7
		g_assert_no_error (error);
Packit 4b6dd7
		g_assert (GDATA_IS_FEED (feed));
Packit 4b6dd7
		g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
		g_assert_cmpuint (g_list_length (gdata_feed_get_entries (feed)), >, 0);
Packit 4b6dd7
Packit 4b6dd7
		g_object_unref (feed);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
	uhm_server_compare_messages_remove_filter (mock_server, filter_id);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_query_standard_feed (gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataFeed *feed;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
	gulong filter_id;
Packit 4b6dd7
	const gchar *ignore_query_param_values[] = {
Packit 4b6dd7
		"publishedAfter",
Packit 4b6dd7
		NULL,
Packit 4b6dd7
	};
Packit 4b6dd7
Packit 4b6dd7
	filter_id = uhm_server_filter_ignore_parameter_values (mock_server,
Packit 4b6dd7
	                                                       ignore_query_param_values);
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "query-standard-feed");
Packit 4b6dd7
Packit 4b6dd7
	feed = gdata_youtube_service_query_standard_feed (GDATA_YOUTUBE_SERVICE (service), GDATA_YOUTUBE_TOP_RATED_FEED, NULL, NULL, NULL, NULL, &error);
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (GDATA_IS_FEED (feed));
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	g_assert_cmpuint (g_list_length (gdata_feed_get_entries (feed)), >, 0);
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (feed);
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
	uhm_server_compare_messages_remove_filter (mock_server, filter_id);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_query_standard_feed_with_query (gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataYouTubeQuery *query;
Packit 4b6dd7
	GDataFeed *feed;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
	gulong filter_id;
Packit 4b6dd7
	const gchar *ignore_query_param_values[] = {
Packit 4b6dd7
		"publishedAfter",
Packit 4b6dd7
		NULL,
Packit 4b6dd7
	};
Packit 4b6dd7
Packit 4b6dd7
	filter_id = uhm_server_filter_ignore_parameter_values (mock_server,
Packit 4b6dd7
	                                                       ignore_query_param_values);
Packit 4b6dd7
Packit 4b6dd7
	G_GNUC_BEGIN_IGNORE_DEPRECATIONS
Packit 4b6dd7
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "query-standard-feed-with-query");
Packit 4b6dd7
Packit 4b6dd7
	query = gdata_youtube_query_new (NULL);
Packit 4b6dd7
	gdata_youtube_query_set_language (query, "fr");
Packit 4b6dd7
Packit 4b6dd7
	feed = gdata_youtube_service_query_standard_feed (GDATA_YOUTUBE_SERVICE (service), GDATA_YOUTUBE_TOP_RATED_FEED, GDATA_QUERY (query), NULL, NULL, NULL, &error);
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (GDATA_IS_FEED (feed));
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	g_assert_cmpuint (g_list_length (gdata_feed_get_entries (feed)), >, 0);
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (query);
Packit 4b6dd7
	g_object_unref (feed);
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
	uhm_server_compare_messages_remove_filter (mock_server, filter_id);
Packit 4b6dd7
Packit 4b6dd7
	G_GNUC_END_IGNORE_DEPRECATIONS
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/* HTTP message responses and the expected associated GData error domain/code. */
Packit 4b6dd7
static const GDataTestRequestErrorData query_standard_feed_errors[] = {
Packit 4b6dd7
	/* Generic network errors. */
Packit 4b6dd7
	{ SOUP_STATUS_BAD_REQUEST, "Bad Request", "Invalid parameter ‘foobar’.",
Packit 4b6dd7
	  gdata_service_error_quark, GDATA_SERVICE_ERROR_PROTOCOL_ERROR },
Packit 4b6dd7
	{ SOUP_STATUS_NOT_FOUND, "Not Found", "Login page wasn't found for no good reason at all.",
Packit 4b6dd7
	  gdata_service_error_quark, GDATA_SERVICE_ERROR_NOT_FOUND },
Packit 4b6dd7
	{ SOUP_STATUS_PRECONDITION_FAILED, "Precondition Failed", "Not allowed to log in at this time, possibly.",
Packit 4b6dd7
	  gdata_service_error_quark, GDATA_SERVICE_ERROR_CONFLICT },
Packit 4b6dd7
	{ SOUP_STATUS_INTERNAL_SERVER_ERROR, "Internal Server Error", "Whoops.",
Packit 4b6dd7
	  gdata_service_error_quark, GDATA_SERVICE_ERROR_PROTOCOL_ERROR },
Packit 4b6dd7
#if 0
Packit 4b6dd7
FIXME
Packit 4b6dd7
	/* Specific query errors. */
Packit 4b6dd7
	{ SOUP_STATUS_FORBIDDEN, "Too Many Calls",
Packit 4b6dd7
	  "<errors><error><domain>yt:quota</domain>too_many_recent_calls</error></errors>",
Packit 4b6dd7
	  gdata_youtube_service_error_quark, GDATA_YOUTUBE_SERVICE_ERROR_API_QUOTA_EXCEEDED },
Packit 4b6dd7
	{ SOUP_STATUS_FORBIDDEN, "Too Many Entries",
Packit 4b6dd7
	  "<errors><error><domain>yt:quota</domain>too_many_entries</error></errors>",
Packit 4b6dd7
	  gdata_youtube_service_error_quark, GDATA_YOUTUBE_SERVICE_ERROR_ENTRY_QUOTA_EXCEEDED },
Packit 4b6dd7
	{ SOUP_STATUS_SERVICE_UNAVAILABLE, "Maintenance",
Packit 4b6dd7
	  "<errors><error><domain>yt:service</domain>disabled_in_maintenance_mode</error></errors>",
Packit 4b6dd7
	  gdata_service_error_quark, GDATA_SERVICE_ERROR_UNAVAILABLE },
Packit 4b6dd7
	{ SOUP_STATUS_FORBIDDEN, "YouTube Signup Required",
Packit 4b6dd7
	  "<errors><error><domain>yt:service</domain>youtube_signup_required</error></errors>",
Packit 4b6dd7
	  gdata_youtube_service_error_quark, GDATA_YOUTUBE_SERVICE_ERROR_CHANNEL_REQUIRED },
Packit 4b6dd7
	{ SOUP_STATUS_FORBIDDEN, "Forbidden",
Packit 4b6dd7
	  "<errors><error><domain>yt:authentication</domain>TokenExpired"
Packit 4b6dd7
	  "<location type='header'>Authorization: GoogleLogin</location></error></errors>",
Packit 4b6dd7
	  gdata_service_error_quark, GDATA_SERVICE_ERROR_AUTHENTICATION_REQUIRED },
Packit 4b6dd7
	/* Malformed YouTube errors to test parser error handling. */
Packit 4b6dd7
	{ SOUP_STATUS_INTERNAL_SERVER_ERROR, "Malformed XML",
Packit 4b6dd7
	  "<errors>",
Packit 4b6dd7
	  gdata_service_error_quark, GDATA_SERVICE_ERROR_PROTOCOL_ERROR },
Packit 4b6dd7
	{ SOUP_STATUS_FORBIDDEN, "Empty Response", "",
Packit 4b6dd7
	  gdata_service_error_quark, GDATA_SERVICE_ERROR_AUTHENTICATION_REQUIRED },
Packit 4b6dd7
	{ SOUP_STATUS_INTERNAL_SERVER_ERROR, "Unknown Element",
Packit 4b6dd7
	  "<errors> <error> <foobar /> </error> </errors>",
Packit 4b6dd7
	  gdata_service_error_quark, GDATA_SERVICE_ERROR_PROTOCOL_ERROR },
Packit 4b6dd7
	{ SOUP_STATUS_INTERNAL_SERVER_ERROR, "Wrong Top-Level Element",
Packit 4b6dd7
	  "<nonerrors></nonerrors>",
Packit 4b6dd7
	  gdata_service_error_quark, GDATA_SERVICE_ERROR_PROTOCOL_ERROR },
Packit 4b6dd7
	{ SOUP_STATUS_FORBIDDEN, "Unknown Error Code (Service)",
Packit 4b6dd7
	  "<errors><error><domain>yt:service</domain>UnknownCode</error></errors>",
Packit 4b6dd7
	  gdata_service_error_quark, GDATA_SERVICE_ERROR_PROTOCOL_ERROR },
Packit 4b6dd7
	{ SOUP_STATUS_FORBIDDEN, "Unknown Error Code (Quota)",
Packit 4b6dd7
	  "<errors><error><domain>yt:quota</domain>UnknownCode</error></errors>",
Packit 4b6dd7
	  gdata_service_error_quark, GDATA_SERVICE_ERROR_PROTOCOL_ERROR },
Packit 4b6dd7
	{ SOUP_STATUS_FORBIDDEN, "Unknown Error Domain",
Packit 4b6dd7
	  "<errors><error><domain>yt:foobaz</domain>TokenExpired</error></errors>",
Packit 4b6dd7
	  gdata_service_error_quark, GDATA_SERVICE_ERROR_PROTOCOL_ERROR },
Packit 4b6dd7
#endif
Packit 4b6dd7
};
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_query_standard_feed_error (gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataFeed *feed;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
	gulong handler_id, filter_id;
Packit 4b6dd7
	guint i;
Packit 4b6dd7
	const gchar *ignore_query_param_values[] = {
Packit 4b6dd7
		"publishedAfter",
Packit 4b6dd7
		NULL,
Packit 4b6dd7
	};
Packit 4b6dd7
Packit 4b6dd7
	if (uhm_server_get_enable_logging (mock_server) == TRUE) {
Packit 4b6dd7
		g_test_message ("Ignoring test due to logging being enabled.");
Packit 4b6dd7
		return;
Packit 4b6dd7
	} else if (uhm_server_get_enable_online (mock_server) == TRUE) {
Packit 4b6dd7
		g_test_message ("Ignoring test due to running online and test not being reproducible.");
Packit 4b6dd7
		return;
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	filter_id = uhm_server_filter_ignore_parameter_values (mock_server,
Packit 4b6dd7
	                                                       ignore_query_param_values);
Packit 4b6dd7
Packit 4b6dd7
	for (i = 0; i < G_N_ELEMENTS (query_standard_feed_errors); i++) {
Packit 4b6dd7
		const GDataTestRequestErrorData *data = &query_standard_feed_errors[i];
Packit 4b6dd7
Packit 4b6dd7
		handler_id = g_signal_connect (mock_server, "handle-message", (GCallback) gdata_test_mock_server_handle_message_error, (gpointer) data);
Packit 4b6dd7
		gdata_test_mock_server_run (mock_server);
Packit 4b6dd7
Packit 4b6dd7
		/* Query the feed. */
Packit 4b6dd7
		feed = gdata_youtube_service_query_standard_feed (GDATA_YOUTUBE_SERVICE (service), GDATA_YOUTUBE_TOP_RATED_FEED, NULL, NULL, NULL, NULL, &error);
Packit 4b6dd7
		g_assert_error (error, data->error_domain_func (), data->error_code);
Packit 4b6dd7
		g_assert (feed == NULL);
Packit 4b6dd7
		g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
		uhm_server_stop (mock_server);
Packit 4b6dd7
		g_signal_handler_disconnect (mock_server, handler_id);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_compare_messages_remove_filter (mock_server, filter_id);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_query_standard_feed_timeout (gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataFeed *feed;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
	gulong handler_id, filter_id;
Packit 4b6dd7
	const gchar *ignore_query_param_values[] = {
Packit 4b6dd7
		"publishedAfter",
Packit 4b6dd7
		NULL,
Packit 4b6dd7
	};
Packit 4b6dd7
Packit 4b6dd7
	if (uhm_server_get_enable_logging (mock_server) == TRUE) {
Packit 4b6dd7
		g_test_message ("Ignoring test due to logging being enabled.");
Packit 4b6dd7
		return;
Packit 4b6dd7
	} else if (uhm_server_get_enable_online (mock_server) == TRUE) {
Packit 4b6dd7
		g_test_message ("Ignoring test due to running online and test not being reproducible.");
Packit 4b6dd7
		return;
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	filter_id = uhm_server_filter_ignore_parameter_values (mock_server,
Packit 4b6dd7
	                                                       ignore_query_param_values);
Packit 4b6dd7
	handler_id = g_signal_connect (mock_server, "handle-message", (GCallback) gdata_test_mock_server_handle_message_timeout, NULL);
Packit 4b6dd7
	gdata_test_mock_server_run (mock_server);
Packit 4b6dd7
Packit 4b6dd7
	/* Set the service's timeout as low as possible (1 second). */
Packit 4b6dd7
	gdata_service_set_timeout (GDATA_SERVICE (service), 1);
Packit 4b6dd7
Packit 4b6dd7
	/* Query the feed. */
Packit 4b6dd7
	feed = gdata_youtube_service_query_standard_feed (GDATA_YOUTUBE_SERVICE (service), GDATA_YOUTUBE_TOP_RATED_FEED, NULL, NULL, NULL, NULL, &error);
Packit 4b6dd7
	g_assert_error (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_NETWORK_ERROR);
Packit 4b6dd7
	g_assert (feed == NULL);
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_stop (mock_server);
Packit 4b6dd7
	g_signal_handler_disconnect (mock_server, handler_id);
Packit 4b6dd7
	uhm_server_compare_messages_remove_filter (mock_server, filter_id);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
typedef struct {
Packit 4b6dd7
	GDataAsyncTestData async_data;
Packit 4b6dd7
	gulong filter_id;
Packit 4b6dd7
} StandardFeedData;
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
set_up_standard_feed_async (StandardFeedData *standard_feed_data,
Packit 4b6dd7
                            gconstpointer test_data)
Packit 4b6dd7
{
Packit 4b6dd7
	const gchar *ignore_query_param_values[] = {
Packit 4b6dd7
		"publishedAfter",
Packit 4b6dd7
		NULL,
Packit 4b6dd7
	};
Packit 4b6dd7
Packit 4b6dd7
	gdata_set_up_async_test_data (&standard_feed_data->async_data,
Packit 4b6dd7
	                              test_data);
Packit 4b6dd7
	standard_feed_data->filter_id =
Packit 4b6dd7
		uhm_server_filter_ignore_parameter_values (mock_server,
Packit 4b6dd7
		                                           ignore_query_param_values);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
tear_down_standard_feed_async (StandardFeedData *standard_feed_data,
Packit 4b6dd7
                               gconstpointer test_data)
Packit 4b6dd7
{
Packit 4b6dd7
	uhm_server_compare_messages_remove_filter (mock_server,
Packit 4b6dd7
	                                           standard_feed_data->filter_id);
Packit 4b6dd7
	gdata_tear_down_async_test_data (&standard_feed_data->async_data,
Packit 4b6dd7
	                                 test_data);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
GDATA_ASYNC_TEST_FUNCTIONS (query_standard_feed, void,
Packit 4b6dd7
G_STMT_START {
Packit 4b6dd7
	gdata_youtube_service_query_standard_feed_async (GDATA_YOUTUBE_SERVICE (service), GDATA_YOUTUBE_TOP_RATED_FEED, NULL, cancellable,
Packit 4b6dd7
	                                                 NULL, NULL, NULL, async_ready_callback, async_data);
Packit 4b6dd7
} G_STMT_END,
Packit 4b6dd7
G_STMT_START {
Packit 4b6dd7
	GDataFeed *feed;
Packit 4b6dd7
Packit 4b6dd7
	feed = gdata_service_query_finish (GDATA_SERVICE (obj), async_result, &error);
Packit 4b6dd7
Packit 4b6dd7
	if (error == NULL) {
Packit 4b6dd7
		g_assert (GDATA_IS_FEED (feed));
Packit 4b6dd7
Packit 4b6dd7
		g_assert_cmpuint (g_list_length (gdata_feed_get_entries (feed)), >, 0);
Packit 4b6dd7
Packit 4b6dd7
		g_object_unref (feed);
Packit 4b6dd7
	} else {
Packit 4b6dd7
		g_assert (feed == NULL);
Packit 4b6dd7
	}
Packit 4b6dd7
} G_STMT_END);
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_query_standard_feed_async_progress_closure (gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataAsyncProgressClosure *data = g_slice_new0 (GDataAsyncProgressClosure);
Packit 4b6dd7
	gulong filter_id;
Packit 4b6dd7
	const gchar *ignore_query_param_values[] = {
Packit 4b6dd7
		"publishedAfter",
Packit 4b6dd7
		NULL,
Packit 4b6dd7
	};
Packit 4b6dd7
Packit 4b6dd7
	g_assert (service != NULL);
Packit 4b6dd7
Packit 4b6dd7
	filter_id = uhm_server_filter_ignore_parameter_values (mock_server,
Packit 4b6dd7
	                                                       ignore_query_param_values);
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "query-standard-feed-async-progress-closure");
Packit 4b6dd7
Packit 4b6dd7
	data->main_loop = g_main_loop_new (NULL, TRUE);
Packit 4b6dd7
Packit 4b6dd7
	gdata_youtube_service_query_standard_feed_async (GDATA_YOUTUBE_SERVICE (service), GDATA_YOUTUBE_TOP_RATED_FEED, NULL, NULL,
Packit 4b6dd7
	                                                 (GDataQueryProgressCallback) gdata_test_async_progress_callback,
Packit 4b6dd7
	                                                 data, (GDestroyNotify) gdata_test_async_progress_closure_free,
Packit 4b6dd7
	                                                 (GAsyncReadyCallback) gdata_test_async_progress_finish_callback, data);
Packit 4b6dd7
	g_main_loop_run (data->main_loop);
Packit 4b6dd7
	g_main_loop_unref (data->main_loop);
Packit 4b6dd7
Packit 4b6dd7
	/* Check that both callbacks were called exactly once */
Packit 4b6dd7
	g_assert_cmpuint (data->progress_destroy_notify_count, ==, 1);
Packit 4b6dd7
	g_assert_cmpuint (data->async_ready_notify_count, ==, 1);
Packit 4b6dd7
Packit 4b6dd7
	g_slice_free (GDataAsyncProgressClosure, data);
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
	uhm_server_compare_messages_remove_filter (mock_server, filter_id);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static GDataYouTubeVideo *
Packit 4b6dd7
get_video_for_related (void)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataYouTubeVideo *video;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	video = GDATA_YOUTUBE_VIDEO (gdata_parsable_new_from_json (GDATA_TYPE_YOUTUBE_VIDEO,
Packit 4b6dd7
		"{"
Packit 4b6dd7
			"'kind': 'youtube#video',"
Packit 4b6dd7
			"'id': 'q1UPMEmCqZo'"
Packit 4b6dd7
		"}", -1, &error));
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (GDATA_IS_YOUTUBE_VIDEO (video));
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	return video;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_query_related (gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataFeed *feed;
Packit 4b6dd7
	GDataYouTubeVideo *video;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "query-related");
Packit 4b6dd7
Packit 4b6dd7
	video = get_video_for_related ();
Packit 4b6dd7
	feed = gdata_youtube_service_query_related (GDATA_YOUTUBE_SERVICE (service), video, NULL, NULL, NULL, NULL, &error);
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (GDATA_IS_FEED (feed));
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	/* TODO: check entries and feed properties */
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (video);
Packit 4b6dd7
	g_object_unref (feed);
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
GDATA_ASYNC_TEST_FUNCTIONS (query_related, void,
Packit 4b6dd7
G_STMT_START {
Packit 4b6dd7
	GDataYouTubeVideo *video;
Packit 4b6dd7
Packit 4b6dd7
	video = get_video_for_related ();
Packit 4b6dd7
	gdata_youtube_service_query_related_async (GDATA_YOUTUBE_SERVICE (service), video, NULL, cancellable, NULL,
Packit 4b6dd7
	                                           NULL, NULL, async_ready_callback, async_data);
Packit 4b6dd7
	g_object_unref (video);
Packit 4b6dd7
} G_STMT_END,
Packit 4b6dd7
G_STMT_START {
Packit 4b6dd7
	GDataFeed *feed;
Packit 4b6dd7
Packit 4b6dd7
	feed = gdata_service_query_finish (GDATA_SERVICE (obj), async_result, &error);
Packit 4b6dd7
Packit 4b6dd7
	if (error == NULL) {
Packit 4b6dd7
		g_assert (GDATA_IS_FEED (feed));
Packit 4b6dd7
		/* TODO: Tests? */
Packit 4b6dd7
Packit 4b6dd7
		g_object_unref (feed);
Packit 4b6dd7
	} else {
Packit 4b6dd7
		g_assert (feed == NULL);
Packit 4b6dd7
	}
Packit 4b6dd7
} G_STMT_END);
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_query_related_async_progress_closure (gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataAsyncProgressClosure *data = g_slice_new0 (GDataAsyncProgressClosure);
Packit 4b6dd7
	GDataYouTubeVideo *video;
Packit 4b6dd7
Packit 4b6dd7
	g_assert (service != NULL);
Packit 4b6dd7
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "query-related-async-progress-closure");
Packit 4b6dd7
Packit 4b6dd7
	data->main_loop = g_main_loop_new (NULL, TRUE);
Packit 4b6dd7
	video = get_video_for_related ();
Packit 4b6dd7
Packit 4b6dd7
	gdata_youtube_service_query_related_async (GDATA_YOUTUBE_SERVICE (service), video, NULL, NULL,
Packit 4b6dd7
	                                           (GDataQueryProgressCallback) gdata_test_async_progress_callback,
Packit 4b6dd7
	                                           data, (GDestroyNotify) gdata_test_async_progress_closure_free,
Packit 4b6dd7
	                                           (GAsyncReadyCallback) gdata_test_async_progress_finish_callback, data);
Packit 4b6dd7
	g_object_unref (video);
Packit 4b6dd7
Packit 4b6dd7
	g_main_loop_run (data->main_loop);
Packit 4b6dd7
	g_main_loop_unref (data->main_loop);
Packit 4b6dd7
Packit 4b6dd7
	/* Check that both callbacks were called exactly once */
Packit 4b6dd7
	g_assert_cmpuint (data->progress_destroy_notify_count, ==, 1);
Packit 4b6dd7
	g_assert_cmpuint (data->async_ready_notify_count, ==, 1);
Packit 4b6dd7
Packit 4b6dd7
	g_slice_free (GDataAsyncProgressClosure, data);
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
typedef struct {
Packit 4b6dd7
	GDataYouTubeService *service;
Packit 4b6dd7
	GDataYouTubeVideo *video;
Packit 4b6dd7
	GDataYouTubeVideo *updated_video;
Packit 4b6dd7
	GFile *video_file;
Packit 4b6dd7
	gchar *slug;
Packit 4b6dd7
	gchar *content_type;
Packit 4b6dd7
} UploadData;
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
set_up_upload (UploadData *data, gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataMediaCategory *category;
Packit 4b6dd7
	GFileInfo *file_info;
Packit 4b6dd7
	const gchar * const tags[] = { "toast", "wedding", NULL };
Packit 4b6dd7
	gchar *path = NULL;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	data->service = g_object_ref ((gpointer) service);
Packit 4b6dd7
Packit 4b6dd7
	/* Create the metadata for the video being uploaded */
Packit 4b6dd7
	data->video = gdata_youtube_video_new (NULL);
Packit 4b6dd7
Packit 4b6dd7
	gdata_entry_set_title (GDATA_ENTRY (data->video), "Bad Wedding Toast");
Packit 4b6dd7
	gdata_youtube_video_set_description (data->video, "I gave a bad toast at my friend's wedding.");
Packit 4b6dd7
	category = gdata_media_category_new ("22", NULL, NULL);
Packit 4b6dd7
	gdata_youtube_video_set_category (data->video, category);
Packit 4b6dd7
	g_object_unref (category);
Packit 4b6dd7
	gdata_youtube_video_set_keywords (data->video, tags);
Packit 4b6dd7
Packit 4b6dd7
	/* Get a file to upload */
Packit 4b6dd7
	/* TODO: fix the path */
Packit 4b6dd7
	path = g_test_build_filename (G_TEST_DIST, "sample.ogg", NULL);
Packit 4b6dd7
	data->video_file = g_file_new_for_path (path);
Packit 4b6dd7
	g_free (path);
Packit 4b6dd7
Packit 4b6dd7
	/* Get the file's info */
Packit 4b6dd7
	file_info = g_file_query_info (data->video_file, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME "," G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
Packit 4b6dd7
	                               G_FILE_QUERY_INFO_NONE, NULL, &error);
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (G_IS_FILE_INFO (file_info));
Packit 4b6dd7
Packit 4b6dd7
	data->slug = g_strdup (g_file_info_get_display_name (file_info));
Packit 4b6dd7
	data->content_type = g_strdup (g_file_info_get_content_type (file_info));
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (file_info);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
tear_down_upload (UploadData *data, gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "teardown-upload");
Packit 4b6dd7
Packit 4b6dd7
	/* Delete the uploaded video, if possible */
Packit 4b6dd7
	if (data->updated_video != NULL) {
Packit 4b6dd7
		gdata_service_delete_entry (GDATA_SERVICE (service), gdata_youtube_service_get_primary_authorization_domain (),
Packit 4b6dd7
		                            GDATA_ENTRY (data->updated_video), NULL, NULL);
Packit 4b6dd7
		g_object_unref (data->updated_video);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (data->video);
Packit 4b6dd7
	g_object_unref (data->video_file);
Packit 4b6dd7
	g_free (data->slug);
Packit 4b6dd7
	g_free (data->content_type);
Packit 4b6dd7
	g_object_unref (data->service);
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_upload_simple (UploadData *data, gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataUploadStream *upload_stream;
Packit 4b6dd7
	GFileInputStream *file_stream;
Packit 4b6dd7
	const gchar * const *tags, * const *tags2;
Packit 4b6dd7
	gssize transfer_size;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "upload-simple");
Packit 4b6dd7
Packit 4b6dd7
	/* Prepare the upload stream */
Packit 4b6dd7
	upload_stream = gdata_youtube_service_upload_video (GDATA_YOUTUBE_SERVICE (service), data->video, data->slug, data->content_type, NULL,
Packit 4b6dd7
	                                                    &error);
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (GDATA_IS_UPLOAD_STREAM (upload_stream));
Packit 4b6dd7
Packit 4b6dd7
	/* Get an input stream for the file */
Packit 4b6dd7
	file_stream = g_file_read (data->video_file, NULL, &error);
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (G_IS_FILE_INPUT_STREAM (file_stream));
Packit 4b6dd7
Packit 4b6dd7
	/* Upload the video */
Packit 4b6dd7
	transfer_size = g_output_stream_splice (G_OUTPUT_STREAM (upload_stream), G_INPUT_STREAM (file_stream),
Packit 4b6dd7
	                                        G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE | G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET, NULL, &error);
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert_cmpint (transfer_size, >, 0);
Packit 4b6dd7
Packit 4b6dd7
	/* Finish off the upload */
Packit 4b6dd7
	data->updated_video = gdata_youtube_service_finish_video_upload (GDATA_YOUTUBE_SERVICE (service), upload_stream, &error);
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (GDATA_IS_YOUTUBE_VIDEO (data->updated_video));
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (file_stream);
Packit 4b6dd7
	g_object_unref (upload_stream);
Packit 4b6dd7
Packit 4b6dd7
	/* Check the video's properties */
Packit 4b6dd7
	g_assert (gdata_entry_is_inserted (GDATA_ENTRY (data->updated_video)));
Packit 4b6dd7
	g_assert_cmpstr (gdata_entry_get_title (GDATA_ENTRY (data->updated_video)), ==, gdata_entry_get_title (GDATA_ENTRY (data->video)));
Packit 4b6dd7
	g_assert_cmpstr (gdata_youtube_video_get_description (data->updated_video), ==, gdata_youtube_video_get_description (data->video));
Packit 4b6dd7
	g_assert_cmpstr (gdata_media_category_get_category (gdata_youtube_video_get_category (data->updated_video)), ==,
Packit 4b6dd7
	                 gdata_media_category_get_category (gdata_youtube_video_get_category (data->video)));
Packit 4b6dd7
Packit 4b6dd7
	tags = gdata_youtube_video_get_keywords (data->video);
Packit 4b6dd7
	tags2 = gdata_youtube_video_get_keywords (data->updated_video);
Packit 4b6dd7
	g_assert_cmpuint (g_strv_length ((gchar**) tags2), ==, g_strv_length ((gchar**) tags));
Packit 4b6dd7
	g_assert_cmpstr (tags2[0], ==, tags[0]);
Packit 4b6dd7
	g_assert_cmpstr (tags2[1], ==, tags[1]);
Packit 4b6dd7
	g_assert_cmpstr (tags2[2], ==, tags[2]);
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
GDATA_ASYNC_CLOSURE_FUNCTIONS (upload, UploadData);
Packit 4b6dd7
Packit 4b6dd7
GDATA_ASYNC_TEST_FUNCTIONS (upload, UploadData,
Packit 4b6dd7
G_STMT_START {
Packit 4b6dd7
	GDataUploadStream *upload_stream;
Packit 4b6dd7
	GFileInputStream *file_stream;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	/* Prepare the upload stream */
Packit 4b6dd7
	upload_stream = gdata_youtube_service_upload_video (GDATA_YOUTUBE_SERVICE (service), data->video, data->slug,
Packit 4b6dd7
	                                                    data->content_type, cancellable, &error);
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (GDATA_IS_UPLOAD_STREAM (upload_stream));
Packit 4b6dd7
Packit 4b6dd7
	/* Get an input stream for the file */
Packit 4b6dd7
	file_stream = g_file_read (data->video_file, NULL, &error);
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (G_IS_FILE_INPUT_STREAM (file_stream));
Packit 4b6dd7
Packit 4b6dd7
	/* Upload the video asynchronously */
Packit 4b6dd7
	g_output_stream_splice_async (G_OUTPUT_STREAM (upload_stream), G_INPUT_STREAM (file_stream),
Packit 4b6dd7
	                              G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET, G_PRIORITY_DEFAULT, NULL,
Packit 4b6dd7
	                              async_ready_callback, async_data);
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (file_stream);
Packit 4b6dd7
	g_object_unref (upload_stream);
Packit 4b6dd7
} G_STMT_END,
Packit 4b6dd7
G_STMT_START {
Packit 4b6dd7
	GOutputStream *stream = G_OUTPUT_STREAM (obj);
Packit 4b6dd7
	const gchar * const *tags;
Packit 4b6dd7
	const gchar * const *tags2;
Packit 4b6dd7
	gssize transfer_size;
Packit 4b6dd7
	GError *upload_error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	/* Finish off the transfer */
Packit 4b6dd7
	transfer_size = g_output_stream_splice_finish (stream, async_result, &error);
Packit 4b6dd7
Packit 4b6dd7
	if (error == NULL) {
Packit 4b6dd7
		g_assert_cmpint (transfer_size, >, 0);
Packit 4b6dd7
Packit 4b6dd7
		/* Finish off the upload */
Packit 4b6dd7
		data->updated_video = gdata_youtube_service_finish_video_upload (data->service, GDATA_UPLOAD_STREAM (stream), &upload_error);
Packit 4b6dd7
		g_assert_no_error (upload_error);
Packit 4b6dd7
		g_assert (GDATA_IS_YOUTUBE_VIDEO (data->updated_video));
Packit 4b6dd7
Packit 4b6dd7
		/* Check the video's properties */
Packit 4b6dd7
		g_assert (gdata_entry_is_inserted (GDATA_ENTRY (data->updated_video)));
Packit 4b6dd7
		g_assert_cmpstr (gdata_entry_get_title (GDATA_ENTRY (data->updated_video)), ==, gdata_entry_get_title (GDATA_ENTRY (data->video)));
Packit 4b6dd7
		g_assert_cmpstr (gdata_youtube_video_get_description (data->updated_video), ==, gdata_youtube_video_get_description (data->video));
Packit 4b6dd7
		g_assert_cmpstr (gdata_media_category_get_category (gdata_youtube_video_get_category (data->updated_video)), ==,
Packit 4b6dd7
		                 gdata_media_category_get_category (gdata_youtube_video_get_category (data->video)));
Packit 4b6dd7
Packit 4b6dd7
		tags = gdata_youtube_video_get_keywords (data->video);
Packit 4b6dd7
		tags2 = gdata_youtube_video_get_keywords (data->updated_video);
Packit 4b6dd7
		g_assert_cmpuint (g_strv_length ((gchar**) tags2), ==, g_strv_length ((gchar**) tags));
Packit 4b6dd7
		g_assert_cmpstr (tags2[0], ==, tags[0]);
Packit 4b6dd7
		g_assert_cmpstr (tags2[1], ==, tags[1]);
Packit 4b6dd7
		g_assert_cmpstr (tags2[2], ==, tags[2]);
Packit 4b6dd7
	} else {
Packit 4b6dd7
		g_assert_cmpint (transfer_size, ==, -1);
Packit 4b6dd7
Packit 4b6dd7
		/* Finish off the upload */
Packit 4b6dd7
		data->updated_video = gdata_youtube_service_finish_video_upload (data->service, GDATA_UPLOAD_STREAM (stream), &upload_error);
Packit 4b6dd7
		g_assert_no_error (upload_error);
Packit 4b6dd7
		g_assert (data->updated_video == NULL);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	g_clear_error (&upload_error);
Packit 4b6dd7
} G_STMT_END);
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_parsing_app_control (void)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataYouTubeVideo *video;
Packit 4b6dd7
	GDataYouTubeState *state;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	video = GDATA_YOUTUBE_VIDEO (gdata_parsable_new_from_json (GDATA_TYPE_YOUTUBE_VIDEO,
Packit 4b6dd7
		"{"
Packit 4b6dd7
			"'kind': 'youtube#video',"
Packit 4b6dd7
			"'etag': '\"tbWC5XrSXxe1WOAx6MK9z4hHSU8/X_byq2BdOVgHzCA-ScpZbTWmgfQ\"',"
Packit 4b6dd7
			"'id': 'JAagedeKdcQ',"
Packit 4b6dd7
			"'snippet': {"
Packit 4b6dd7
				"'publishedAt': '2006-05-16T14:06:37.000Z',"
Packit 4b6dd7
				"'channelId': 'UCCS6UQvicRHyn1whEUDEMUQ',"
Packit 4b6dd7
				"'title': 'Judas Priest - Painkiller',"
Packit 4b6dd7
				"'description': 'Videoclip de Judas Priest',"
Packit 4b6dd7
				"'thumbnails': {"
Packit 4b6dd7
					"'default': {"
Packit 4b6dd7
						"'url': 'https://i.ytimg.com/vi/JAagedeKdcQ/default.jpg',"
Packit 4b6dd7
						"'width': 120,"
Packit 4b6dd7
						"'height': 90"
Packit 4b6dd7
					"},"
Packit 4b6dd7
					"'medium': {"
Packit 4b6dd7
						"'url': 'https://i.ytimg.com/vi/JAagedeKdcQ/mqdefault.jpg',"
Packit 4b6dd7
						"'width': 320,"
Packit 4b6dd7
						"'height': 180"
Packit 4b6dd7
					"},"
Packit 4b6dd7
					"'high': {"
Packit 4b6dd7
						"'url': 'https://i.ytimg.com/vi/JAagedeKdcQ/hqdefault.jpg',"
Packit 4b6dd7
						"'width': 480,"
Packit 4b6dd7
						"'height': 360"
Packit 4b6dd7
					"}"
Packit 4b6dd7
				"},"
Packit 4b6dd7
				"'channelTitle': 'eluves',"
Packit 4b6dd7
				"'categoryId': '10',"
Packit 4b6dd7
				"'liveBroadcastContent': 'none',"
Packit 4b6dd7
				"'localized': {"
Packit 4b6dd7
					"'title': 'Judas Priest - Painkiller',"
Packit 4b6dd7
					"'description': 'Videoclip de Judas Priest'"
Packit 4b6dd7
				"}"
Packit 4b6dd7
			"},"
Packit 4b6dd7
			"'contentDetails': {"
Packit 4b6dd7
				"'duration': 'PT6M',"
Packit 4b6dd7
				"'dimension': '2d',"
Packit 4b6dd7
				"'definition': 'sd',"
Packit 4b6dd7
				"'caption': 'false',"
Packit 4b6dd7
				"'licensedContent': false,"
Packit 4b6dd7
				"'regionRestriction': {"
Packit 4b6dd7
					"'blocked': ["
Packit 4b6dd7
						"'RU',"
Packit 4b6dd7
						"'RW',"
Packit 4b6dd7
						"'RS',"
Packit 4b6dd7
						"'RO',"
Packit 4b6dd7
						"'RE',"
Packit 4b6dd7
						"'BL',"
Packit 4b6dd7
						"'BM',"
Packit 4b6dd7
						"'BN',"
Packit 4b6dd7
						"'BO',"
Packit 4b6dd7
						"'JP',"
Packit 4b6dd7
						"'BI',"
Packit 4b6dd7
						"'BJ',"
Packit 4b6dd7
						"'BD',"
Packit 4b6dd7
						"'BE',"
Packit 4b6dd7
						"'BF',"
Packit 4b6dd7
						"'BG',"
Packit 4b6dd7
						"'YT',"
Packit 4b6dd7
						"'BB',"
Packit 4b6dd7
						"'CX',"
Packit 4b6dd7
						"'JE',"
Packit 4b6dd7
						"'BY',"
Packit 4b6dd7
						"'BZ',"
Packit 4b6dd7
						"'BT',"
Packit 4b6dd7
						"'JM',"
Packit 4b6dd7
						"'BV',"
Packit 4b6dd7
						"'BW',"
Packit 4b6dd7
						"'YE',"
Packit 4b6dd7
						"'BQ',"
Packit 4b6dd7
						"'BR',"
Packit 4b6dd7
						"'BS',"
Packit 4b6dd7
						"'IM',"
Packit 4b6dd7
						"'IL',"
Packit 4b6dd7
						"'IO',"
Packit 4b6dd7
						"'IN',"
Packit 4b6dd7
						"'IE',"
Packit 4b6dd7
						"'ID',"
Packit 4b6dd7
						"'QA',"
Packit 4b6dd7
						"'TM',"
Packit 4b6dd7
						"'IQ',"
Packit 4b6dd7
						"'IS',"
Packit 4b6dd7
						"'IR',"
Packit 4b6dd7
						"'IT',"
Packit 4b6dd7
						"'TK',"
Packit 4b6dd7
						"'AE',"
Packit 4b6dd7
						"'AD',"
Packit 4b6dd7
						"'AG',"
Packit 4b6dd7
						"'AF',"
Packit 4b6dd7
						"'AI',"
Packit 4b6dd7
						"'AM',"
Packit 4b6dd7
						"'AL',"
Packit 4b6dd7
						"'AO',"
Packit 4b6dd7
						"'AQ',"
Packit 4b6dd7
						"'AS',"
Packit 4b6dd7
						"'AR',"
Packit 4b6dd7
						"'AU',"
Packit 4b6dd7
						"'AT',"
Packit 4b6dd7
						"'AW',"
Packit 4b6dd7
						"'TG',"
Packit 4b6dd7
						"'AX',"
Packit 4b6dd7
						"'AZ',"
Packit 4b6dd7
						"'PR',"
Packit 4b6dd7
						"'HK',"
Packit 4b6dd7
						"'HN',"
Packit 4b6dd7
						"'PW',"
Packit 4b6dd7
						"'PT',"
Packit 4b6dd7
						"'HM',"
Packit 4b6dd7
						"'PY',"
Packit 4b6dd7
						"'PA',"
Packit 4b6dd7
						"'PF',"
Packit 4b6dd7
						"'PG',"
Packit 4b6dd7
						"'PE',"
Packit 4b6dd7
						"'HR',"
Packit 4b6dd7
						"'PK',"
Packit 4b6dd7
						"'PH',"
Packit 4b6dd7
						"'PN',"
Packit 4b6dd7
						"'HT',"
Packit 4b6dd7
						"'HU',"
Packit 4b6dd7
						"'OM',"
Packit 4b6dd7
						"'WS',"
Packit 4b6dd7
						"'WF',"
Packit 4b6dd7
						"'BH',"
Packit 4b6dd7
						"'KP',"
Packit 4b6dd7
						"'TT',"
Packit 4b6dd7
						"'GG',"
Packit 4b6dd7
						"'GF',"
Packit 4b6dd7
						"'GE',"
Packit 4b6dd7
						"'GD',"
Packit 4b6dd7
						"'GB',"
Packit 4b6dd7
						"'VN',"
Packit 4b6dd7
						"'VA',"
Packit 4b6dd7
						"'GM',"
Packit 4b6dd7
						"'VC',"
Packit 4b6dd7
						"'VE',"
Packit 4b6dd7
						"'GI',"
Packit 4b6dd7
						"'VG',"
Packit 4b6dd7
						"'GW',"
Packit 4b6dd7
						"'GU',"
Packit 4b6dd7
						"'GT',"
Packit 4b6dd7
						"'GS',"
Packit 4b6dd7
						"'GR',"
Packit 4b6dd7
						"'GQ',"
Packit 4b6dd7
						"'GP',"
Packit 4b6dd7
						"'VU',"
Packit 4b6dd7
						"'GY',"
Packit 4b6dd7
						"'NA',"
Packit 4b6dd7
						"'NC',"
Packit 4b6dd7
						"'NE',"
Packit 4b6dd7
						"'NF',"
Packit 4b6dd7
						"'NG',"
Packit 4b6dd7
						"'NI',"
Packit 4b6dd7
						"'NL',"
Packit 4b6dd7
						"'BA',"
Packit 4b6dd7
						"'NO',"
Packit 4b6dd7
						"'NP',"
Packit 4b6dd7
						"'NR',"
Packit 4b6dd7
						"'NU',"
Packit 4b6dd7
						"'NZ',"
Packit 4b6dd7
						"'PM',"
Packit 4b6dd7
						"'UM',"
Packit 4b6dd7
						"'TV',"
Packit 4b6dd7
						"'UG',"
Packit 4b6dd7
						"'UA',"
Packit 4b6dd7
						"'FI',"
Packit 4b6dd7
						"'FJ',"
Packit 4b6dd7
						"'FK',"
Packit 4b6dd7
						"'UY',"
Packit 4b6dd7
						"'FM',"
Packit 4b6dd7
						"'CN',"
Packit 4b6dd7
						"'UZ',"
Packit 4b6dd7
						"'US',"
Packit 4b6dd7
						"'ME',"
Packit 4b6dd7
						"'MD',"
Packit 4b6dd7
						"'MG',"
Packit 4b6dd7
						"'MF',"
Packit 4b6dd7
						"'MA',"
Packit 4b6dd7
						"'MC',"
Packit 4b6dd7
						"'VI',"
Packit 4b6dd7
						"'MM',"
Packit 4b6dd7
						"'ML',"
Packit 4b6dd7
						"'MO',"
Packit 4b6dd7
						"'FO',"
Packit 4b6dd7
						"'MH',"
Packit 4b6dd7
						"'MK',"
Packit 4b6dd7
						"'MU',"
Packit 4b6dd7
						"'MT',"
Packit 4b6dd7
						"'MW',"
Packit 4b6dd7
						"'MV',"
Packit 4b6dd7
						"'MQ',"
Packit 4b6dd7
						"'MP',"
Packit 4b6dd7
						"'MS',"
Packit 4b6dd7
						"'MR',"
Packit 4b6dd7
						"'CO',"
Packit 4b6dd7
						"'CV',"
Packit 4b6dd7
						"'MY',"
Packit 4b6dd7
						"'MX',"
Packit 4b6dd7
						"'MZ',"
Packit 4b6dd7
						"'TN',"
Packit 4b6dd7
						"'TO',"
Packit 4b6dd7
						"'TL',"
Packit 4b6dd7
						"'JO',"
Packit 4b6dd7
						"'TJ',"
Packit 4b6dd7
						"'GA',"
Packit 4b6dd7
						"'TH',"
Packit 4b6dd7
						"'TF',"
Packit 4b6dd7
						"'ET',"
Packit 4b6dd7
						"'TD',"
Packit 4b6dd7
						"'TC',"
Packit 4b6dd7
						"'ES',"
Packit 4b6dd7
						"'ER',"
Packit 4b6dd7
						"'TZ',"
Packit 4b6dd7
						"'EH',"
Packit 4b6dd7
						"'GN',"
Packit 4b6dd7
						"'EE',"
Packit 4b6dd7
						"'TW',"
Packit 4b6dd7
						"'EG',"
Packit 4b6dd7
						"'TR',"
Packit 4b6dd7
						"'CA',"
Packit 4b6dd7
						"'EC',"
Packit 4b6dd7
						"'GL',"
Packit 4b6dd7
						"'LB',"
Packit 4b6dd7
						"'LC',"
Packit 4b6dd7
						"'LA',"
Packit 4b6dd7
						"'MN',"
Packit 4b6dd7
						"'LK',"
Packit 4b6dd7
						"'LI',"
Packit 4b6dd7
						"'LV',"
Packit 4b6dd7
						"'LT',"
Packit 4b6dd7
						"'LU',"
Packit 4b6dd7
						"'LR',"
Packit 4b6dd7
						"'LS',"
Packit 4b6dd7
						"'PS',"
Packit 4b6dd7
						"'KZ',"
Packit 4b6dd7
						"'GH',"
Packit 4b6dd7
						"'LY',"
Packit 4b6dd7
						"'DZ',"
Packit 4b6dd7
						"'DO',"
Packit 4b6dd7
						"'DM',"
Packit 4b6dd7
						"'DJ',"
Packit 4b6dd7
						"'PL',"
Packit 4b6dd7
						"'DK',"
Packit 4b6dd7
						"'DE',"
Packit 4b6dd7
						"'SZ',"
Packit 4b6dd7
						"'SY',"
Packit 4b6dd7
						"'SX',"
Packit 4b6dd7
						"'SS',"
Packit 4b6dd7
						"'SR',"
Packit 4b6dd7
						"'SV',"
Packit 4b6dd7
						"'ST',"
Packit 4b6dd7
						"'SK',"
Packit 4b6dd7
						"'SJ',"
Packit 4b6dd7
						"'SI',"
Packit 4b6dd7
						"'SH',"
Packit 4b6dd7
						"'SO',"
Packit 4b6dd7
						"'SN',"
Packit 4b6dd7
						"'SM',"
Packit 4b6dd7
						"'SL',"
Packit 4b6dd7
						"'SC',"
Packit 4b6dd7
						"'SB',"
Packit 4b6dd7
						"'SA',"
Packit 4b6dd7
						"'FR',"
Packit 4b6dd7
						"'SG',"
Packit 4b6dd7
						"'SE',"
Packit 4b6dd7
						"'SD',"
Packit 4b6dd7
						"'CK',"
Packit 4b6dd7
						"'KR',"
Packit 4b6dd7
						"'CI',"
Packit 4b6dd7
						"'CH',"
Packit 4b6dd7
						"'KW',"
Packit 4b6dd7
						"'ZA',"
Packit 4b6dd7
						"'CM',"
Packit 4b6dd7
						"'CL',"
Packit 4b6dd7
						"'CC',"
Packit 4b6dd7
						"'ZM',"
Packit 4b6dd7
						"'KY',"
Packit 4b6dd7
						"'CG',"
Packit 4b6dd7
						"'CF',"
Packit 4b6dd7
						"'CD',"
Packit 4b6dd7
						"'CZ',"
Packit 4b6dd7
						"'CY',"
Packit 4b6dd7
						"'ZW',"
Packit 4b6dd7
						"'KG',"
Packit 4b6dd7
						"'CU',"
Packit 4b6dd7
						"'KE',"
Packit 4b6dd7
						"'CR',"
Packit 4b6dd7
						"'KI',"
Packit 4b6dd7
						"'KH',"
Packit 4b6dd7
						"'CW',"
Packit 4b6dd7
						"'KN',"
Packit 4b6dd7
						"'KM'"
Packit 4b6dd7
					"]"
Packit 4b6dd7
				"}"
Packit 4b6dd7
			"},"
Packit 4b6dd7
			"'status': {"
Packit 4b6dd7
				"'uploadStatus': 'processed',"
Packit 4b6dd7
				"'privacyStatus': 'private',"
Packit 4b6dd7
				"'license': 'youtube',"
Packit 4b6dd7
				"'embeddable': true,"
Packit 4b6dd7
				"'publicStatsViewable': true"
Packit 4b6dd7
			"},"
Packit 4b6dd7
			"'statistics': {"
Packit 4b6dd7
				"'viewCount': '4369107',"
Packit 4b6dd7
				"'likeCount': '13619',"
Packit 4b6dd7
				"'dislikeCount': '440',"
Packit 4b6dd7
				"'favoriteCount': '0',"
Packit 4b6dd7
				"'commentCount': '11181'"
Packit 4b6dd7
			"}"
Packit 4b6dd7
		"}", -1, &error));
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (GDATA_IS_YOUTUBE_VIDEO (video));
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	/* Test the app:control values */
Packit 4b6dd7
	G_GNUC_BEGIN_IGNORE_DEPRECATIONS
Packit 4b6dd7
	g_assert (gdata_youtube_video_is_draft (video) == TRUE);
Packit 4b6dd7
	G_GNUC_END_IGNORE_DEPRECATIONS
Packit 4b6dd7
Packit 4b6dd7
	state = gdata_youtube_video_get_state (video);
Packit 4b6dd7
	g_assert_cmpstr (gdata_youtube_state_get_name (state), ==, NULL);
Packit 4b6dd7
	g_assert_cmpstr (gdata_youtube_state_get_message (state), ==, NULL);
Packit 4b6dd7
	g_assert (gdata_youtube_state_get_reason_code (state) == NULL);
Packit 4b6dd7
	g_assert (gdata_youtube_state_get_help_uri (state) == NULL);
Packit 4b6dd7
Packit 4b6dd7
	/* TODO: more tests on entry properties */
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (video);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_parsing_yt_recorded (void)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataYouTubeVideo *video;
Packit 4b6dd7
	gint64 recorded;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	video = GDATA_YOUTUBE_VIDEO (gdata_parsable_new_from_json (GDATA_TYPE_YOUTUBE_VIDEO,
Packit 4b6dd7
		"{"
Packit 4b6dd7
			"'kind': 'youtube#video',"
Packit 4b6dd7
			"'etag': '\"tbWC5XrSXxe1WOAx6MK9z4hHSU8/X_byq2BdOVgHzCA-ScpZbTWmgfQ\"',"
Packit 4b6dd7
			"'id': 'JAagedeKdcQ',"
Packit 4b6dd7
			"'snippet': {"
Packit 4b6dd7
				"'publishedAt': '2006-05-16T14:06:37.000Z',"
Packit 4b6dd7
				"'channelId': 'UCCS6UQvicRHyn1whEUDEMUQ',"
Packit 4b6dd7
				"'title': 'Judas Priest - Painkiller',"
Packit 4b6dd7
				"'description': 'Videoclip de Judas Priest',"
Packit 4b6dd7
				"'channelTitle': 'eluves',"
Packit 4b6dd7
				"'categoryId': '10',"
Packit 4b6dd7
				"'liveBroadcastContent': 'none',"
Packit 4b6dd7
				"'localized': {"
Packit 4b6dd7
					"'title': 'Judas Priest - Painkiller',"
Packit 4b6dd7
					"'description': 'Videoclip de Judas Priest'"
Packit 4b6dd7
				"}"
Packit 4b6dd7
			"},"
Packit 4b6dd7
			"'recordingDetails': {"
Packit 4b6dd7
				"'recordingDate': '2003-08-03'"
Packit 4b6dd7
			"}"
Packit 4b6dd7
		"}", -1, &error));
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (GDATA_IS_YOUTUBE_VIDEO (video));
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	/* Test the recorded date */
Packit 4b6dd7
	recorded = gdata_youtube_video_get_recorded (video);
Packit 4b6dd7
	g_assert_cmpint (recorded, ==, 1059868800);
Packit 4b6dd7
Packit 4b6dd7
	/* Update the state and see if the XML's written out OK */
Packit 4b6dd7
	recorded = 1128229200;
Packit 4b6dd7
	gdata_youtube_video_set_recorded (video, recorded);
Packit 4b6dd7
Packit 4b6dd7
	/* Check the XML */
Packit 4b6dd7
	gdata_test_assert_json (video,
Packit 4b6dd7
		"{"
Packit 4b6dd7
			"'kind': 'youtube#video',"
Packit 4b6dd7
			"'etag': '\"tbWC5XrSXxe1WOAx6MK9z4hHSU8/X_byq2BdOVgHzCA-ScpZbTWmgfQ\"',"
Packit 4b6dd7
			"'id': 'JAagedeKdcQ',"
Packit 4b6dd7
			"'selfLink': 'https://www.googleapis.com/youtube/v3/videos?id=JAagedeKdcQ',"
Packit 4b6dd7
			"'title': 'Judas Priest - Painkiller',"
Packit 4b6dd7
			"'description': 'Videoclip de Judas Priest',"
Packit 4b6dd7
			"'snippet': {"
Packit 4b6dd7
				"'title': 'Judas Priest - Painkiller',"
Packit 4b6dd7
				"'description': 'Videoclip de Judas Priest',"
Packit 4b6dd7
				"'categoryId': '10'"
Packit 4b6dd7
			"},"
Packit 4b6dd7
			"'status': {"
Packit 4b6dd7
				"'privacyStatus': 'public'"
Packit 4b6dd7
			"},"
Packit 4b6dd7
			"'recordingDetails': {"
Packit 4b6dd7
				"'recordingDate': '2005-10-02'"
Packit 4b6dd7
			"}"
Packit 4b6dd7
		"}");
Packit 4b6dd7
Packit 4b6dd7
	/* TODO: more tests on entry properties */
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (video);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_parsing_yt_access_control (void)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataYouTubeVideo *video;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	video = GDATA_YOUTUBE_VIDEO (gdata_parsable_new_from_json (GDATA_TYPE_YOUTUBE_VIDEO,
Packit 4b6dd7
		"{"
Packit 4b6dd7
			"'kind': 'youtube#video',"
Packit 4b6dd7
			"'id': 'JAagedeKdcQ',"
Packit 4b6dd7
			"'status': {"
Packit 4b6dd7
				"'privacyStatus': 'public',"
Packit 4b6dd7
				"'embeddable': false"
Packit 4b6dd7
			"}"
Packit 4b6dd7
		"}", -1, &error));
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (GDATA_IS_YOUTUBE_VIDEO (video));
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	/* Test the access controls */
Packit 4b6dd7
	g_assert_cmpint (gdata_youtube_video_get_access_control (video, GDATA_YOUTUBE_ACTION_RATE), ==, GDATA_YOUTUBE_PERMISSION_DENIED);
Packit 4b6dd7
	g_assert_cmpint (gdata_youtube_video_get_access_control (video, GDATA_YOUTUBE_ACTION_COMMENT), ==, GDATA_YOUTUBE_PERMISSION_DENIED);
Packit 4b6dd7
	g_assert_cmpint (gdata_youtube_video_get_access_control (video, GDATA_YOUTUBE_ACTION_COMMENT_VOTE), ==, GDATA_YOUTUBE_PERMISSION_DENIED);
Packit 4b6dd7
	g_assert_cmpint (gdata_youtube_video_get_access_control (video, GDATA_YOUTUBE_ACTION_VIDEO_RESPOND), ==, GDATA_YOUTUBE_PERMISSION_DENIED);
Packit 4b6dd7
	g_assert_cmpint (gdata_youtube_video_get_access_control (video, GDATA_YOUTUBE_ACTION_EMBED), ==, GDATA_YOUTUBE_PERMISSION_DENIED);
Packit 4b6dd7
	g_assert_cmpint (gdata_youtube_video_get_access_control (video, GDATA_YOUTUBE_ACTION_SYNDICATE), ==, GDATA_YOUTUBE_PERMISSION_DENIED);
Packit 4b6dd7
	g_assert_cmpint (gdata_youtube_video_get_access_control (video, "list"), ==, GDATA_YOUTUBE_PERMISSION_ALLOWED);
Packit 4b6dd7
Packit 4b6dd7
	/* Update some of them and see if the JSON’s written out OK */
Packit 4b6dd7
	gdata_youtube_video_set_access_control (video, "list", GDATA_YOUTUBE_PERMISSION_DENIED);
Packit 4b6dd7
	gdata_youtube_video_set_access_control (video, GDATA_YOUTUBE_ACTION_EMBED, GDATA_YOUTUBE_PERMISSION_ALLOWED);
Packit 4b6dd7
Packit 4b6dd7
	/* Check the JSON */
Packit 4b6dd7
	gdata_test_assert_json (video,
Packit 4b6dd7
		"{"
Packit 4b6dd7
			"'kind': 'youtube#video',"
Packit 4b6dd7
			"'id': 'JAagedeKdcQ',"
Packit 4b6dd7
			"'selfLink': 'https://www.googleapis.com/youtube/v3/videos?id=JAagedeKdcQ',"
Packit 4b6dd7
			"'title': null,"
Packit 4b6dd7
			"'snippet': {},"
Packit 4b6dd7
			"'status': {"
Packit 4b6dd7
				"'privacyStatus': 'unlisted',"
Packit 4b6dd7
				"'embeddable': true"
Packit 4b6dd7
			"},"
Packit 4b6dd7
			"'recordingDetails': {}"
Packit 4b6dd7
		"}");
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (video);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_parsing_yt_category (void)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataYouTubeCategory *category;
Packit 4b6dd7
	gboolean assignable, deprecated;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	/* Test a non-deprecated category */
Packit 4b6dd7
	category = GDATA_YOUTUBE_CATEGORY (gdata_parsable_new_from_xml (GDATA_TYPE_YOUTUBE_CATEGORY,
Packit 4b6dd7
		"
Packit 4b6dd7
			"scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#video'>"
Packit 4b6dd7
			"<yt:assignable/>"
Packit 4b6dd7
			"<yt:browsable regions='CZ AU HK'/>"
Packit 4b6dd7
		"</category>", -1, &error));
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (GDATA_IS_YOUTUBE_CATEGORY (category));
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	/* Test the category's properties */
Packit 4b6dd7
	g_assert (gdata_youtube_category_is_assignable (category) == TRUE);
Packit 4b6dd7
	g_assert (gdata_youtube_category_is_browsable (category, "CZ") == TRUE);
Packit 4b6dd7
	g_assert (gdata_youtube_category_is_browsable (category, "AU") == TRUE);
Packit 4b6dd7
	g_assert (gdata_youtube_category_is_browsable (category, "HK") == TRUE);
Packit 4b6dd7
	g_assert (gdata_youtube_category_is_browsable (category, "GB") == FALSE);
Packit 4b6dd7
	g_assert (gdata_youtube_category_is_deprecated (category) == FALSE);
Packit 4b6dd7
Packit 4b6dd7
	/* Test the properties the other way */
Packit 4b6dd7
	g_object_get (category, "is-assignable", &assignable, "is-deprecated", &deprecated, NULL);
Packit 4b6dd7
	g_assert (assignable == TRUE);
Packit 4b6dd7
	g_assert (deprecated == FALSE);
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (category);
Packit 4b6dd7
Packit 4b6dd7
	/* Test a deprecated category */
Packit 4b6dd7
	category = GDATA_YOUTUBE_CATEGORY (gdata_parsable_new_from_xml (GDATA_TYPE_YOUTUBE_CATEGORY,
Packit 4b6dd7
		"
Packit 4b6dd7
			"scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#video'>"
Packit 4b6dd7
			"<yt:deprecated/>"
Packit 4b6dd7
		"</category>", -1, &error));
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (GDATA_IS_YOUTUBE_CATEGORY (category));
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	/* Test the category's properties */
Packit 4b6dd7
	g_assert (gdata_youtube_category_is_assignable (category) == FALSE);
Packit 4b6dd7
	g_assert (gdata_youtube_category_is_browsable (category, "CZ") == FALSE);
Packit 4b6dd7
	g_assert (gdata_youtube_category_is_browsable (category, "AU") == FALSE);
Packit 4b6dd7
	g_assert (gdata_youtube_category_is_browsable (category, "HK") == FALSE);
Packit 4b6dd7
	g_assert (gdata_youtube_category_is_browsable (category, "GB") == FALSE);
Packit 4b6dd7
	g_assert (gdata_youtube_category_is_deprecated (category) == TRUE);
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (category);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_parsing_georss_where (void)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataYouTubeVideo *video;
Packit 4b6dd7
	gdouble latitude, longitude;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	video = GDATA_YOUTUBE_VIDEO (gdata_parsable_new_from_json (GDATA_TYPE_YOUTUBE_VIDEO,
Packit 4b6dd7
		"{"
Packit 4b6dd7
			"'kind': 'youtube#video',"
Packit 4b6dd7
			"'id': 'JAagedeKdcQ',"
Packit 4b6dd7
			"'recordingDetails': {"
Packit 4b6dd7
				"'location': {"
Packit 4b6dd7
					"'latitude': 41.14556884765625,"
Packit 4b6dd7
					"'longitude': -8.63525390625"
Packit 4b6dd7
				"}"
Packit 4b6dd7
			"}"
Packit 4b6dd7
		"}", -1, &error));
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (GDATA_IS_YOUTUBE_VIDEO (video));
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	/* Test the coordinates */
Packit 4b6dd7
	gdata_youtube_video_get_coordinates (video, &latitude, &longitude);
Packit 4b6dd7
	g_assert_cmpfloat (latitude, ==, 41.14556884765625);
Packit 4b6dd7
	g_assert_cmpfloat (longitude, ==, -8.63525390625);
Packit 4b6dd7
Packit 4b6dd7
	/* Update them and see if they're set OK and the JSON’s written out OK */
Packit 4b6dd7
	gdata_youtube_video_set_coordinates (video, 5.5, 6.5);
Packit 4b6dd7
Packit 4b6dd7
	g_object_get (G_OBJECT (video),
Packit 4b6dd7
	              "latitude", &latitude,
Packit 4b6dd7
	              "longitude", &longitude,
Packit 4b6dd7
	              NULL);
Packit 4b6dd7
Packit 4b6dd7
	g_assert_cmpfloat (latitude, ==, 5.5);
Packit 4b6dd7
	g_assert_cmpfloat (longitude, ==, 6.5);
Packit 4b6dd7
Packit 4b6dd7
	/* Check the JSON */
Packit 4b6dd7
	gdata_test_assert_json (video,
Packit 4b6dd7
		"{"
Packit 4b6dd7
			"'kind': 'youtube#video',"
Packit 4b6dd7
			"'id': 'JAagedeKdcQ',"
Packit 4b6dd7
			"'selfLink': 'https://www.googleapis.com/youtube/v3/videos?id=JAagedeKdcQ',"
Packit 4b6dd7
			"'title': null,"
Packit 4b6dd7
			"'snippet': {},"
Packit 4b6dd7
			"'status': {"
Packit 4b6dd7
				"'privacyStatus': 'public'"
Packit 4b6dd7
			"},"
Packit 4b6dd7
			"'recordingDetails': {"
Packit 4b6dd7
				"'location': {"
Packit 4b6dd7
					"'latitude': 5.5,"
Packit 4b6dd7
					"'longitude': 6.5"
Packit 4b6dd7
				"}"
Packit 4b6dd7
			"}"
Packit 4b6dd7
		"}");
Packit 4b6dd7
Packit 4b6dd7
	/* Unset the properties and ensure they’re removed from the JSON */
Packit 4b6dd7
	gdata_youtube_video_set_coordinates (video, G_MAXDOUBLE, G_MAXDOUBLE);
Packit 4b6dd7
Packit 4b6dd7
	gdata_youtube_video_get_coordinates (video, &latitude, &longitude);
Packit 4b6dd7
	g_assert_cmpfloat (latitude, ==, G_MAXDOUBLE);
Packit 4b6dd7
	g_assert_cmpfloat (longitude, ==, G_MAXDOUBLE);
Packit 4b6dd7
Packit 4b6dd7
	/* Check the JSON */
Packit 4b6dd7
	gdata_test_assert_json (video,
Packit 4b6dd7
		"{"
Packit 4b6dd7
			"'kind': 'youtube#video',"
Packit 4b6dd7
			"'id': 'JAagedeKdcQ',"
Packit 4b6dd7
			"'selfLink': 'https://www.googleapis.com/youtube/v3/videos?id=JAagedeKdcQ',"
Packit 4b6dd7
			"'title': null,"
Packit 4b6dd7
			"'snippet': {},"
Packit 4b6dd7
			"'status': {"
Packit 4b6dd7
				"'privacyStatus': 'public'"
Packit 4b6dd7
			"},"
Packit 4b6dd7
			"'recordingDetails': {}"
Packit 4b6dd7
		"}");
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (video);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_parsing_ratings (void)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataYouTubeVideo *video;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	/* Parse all ratings */
Packit 4b6dd7
	video = GDATA_YOUTUBE_VIDEO (gdata_parsable_new_from_json (GDATA_TYPE_YOUTUBE_VIDEO,
Packit 4b6dd7
		"{"
Packit 4b6dd7
			"'kind': 'youtube#video',"
Packit 4b6dd7
			"'id': 'JAagedeKdcQ',"
Packit 4b6dd7
			"'contentDetails': {"
Packit 4b6dd7
				"'contentRating': {"
Packit 4b6dd7
					"'mpaaRating': 'mpaaPg',"
Packit 4b6dd7
					"'tvpgRating': 'tvpgPg'"
Packit 4b6dd7
				"}"
Packit 4b6dd7
			"}"
Packit 4b6dd7
		"}", -1, &error));
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (GDATA_IS_YOUTUBE_VIDEO (video));
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	/* Check the ratings, and check that we haven't ended up with a country restriction */
Packit 4b6dd7
	g_assert_cmpstr (gdata_youtube_video_get_media_rating (video, GDATA_YOUTUBE_RATING_TYPE_MPAA), ==, "pg");
Packit 4b6dd7
	g_assert_cmpstr (gdata_youtube_video_get_media_rating (video, GDATA_YOUTUBE_RATING_TYPE_V_CHIP), ==, "tv-pg");
Packit 4b6dd7
Packit 4b6dd7
	g_assert (gdata_youtube_video_is_restricted_in_country (video, "US") == FALSE);
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (video);
Packit 4b6dd7
Packit 4b6dd7
	/* Parse a video with one rating missing and see what happens */
Packit 4b6dd7
	video = GDATA_YOUTUBE_VIDEO (gdata_parsable_new_from_json (GDATA_TYPE_YOUTUBE_VIDEO,
Packit 4b6dd7
		"{"
Packit 4b6dd7
			"'kind': 'youtube#video',"
Packit 4b6dd7
			"'id': 'JAagedeKdcQ',"
Packit 4b6dd7
			"'contentDetails': {"
Packit 4b6dd7
				"'contentRating': {"
Packit 4b6dd7
					"'tvpgRating': 'tvpgY7Fv'"
Packit 4b6dd7
				"}"
Packit 4b6dd7
			"}"
Packit 4b6dd7
		"}", -1, &error));
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (GDATA_IS_YOUTUBE_VIDEO (video));
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	/* Check the ratings again */
Packit 4b6dd7
	g_assert_cmpstr (gdata_youtube_video_get_media_rating (video, GDATA_YOUTUBE_RATING_TYPE_MPAA), ==, NULL);
Packit 4b6dd7
	g_assert_cmpstr (gdata_youtube_video_get_media_rating (video, GDATA_YOUTUBE_RATING_TYPE_V_CHIP), ==, "tv-y7-fv");
Packit 4b6dd7
Packit 4b6dd7
	/* Check that calling with an arbitrary rating type returns NULL.
Packit 4b6dd7
	 * %GDATA_YOUTUBE_RATING_TYPE_SIMPLE is no longer supported. */
Packit 4b6dd7
	g_assert_cmpstr (gdata_youtube_video_get_media_rating (video, "fooish bar"), ==, NULL);
Packit 4b6dd7
	g_assert_cmpstr (gdata_youtube_video_get_media_rating (video, GDATA_YOUTUBE_RATING_TYPE_SIMPLE), ==, NULL);
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (video);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_video_escaping (void)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataYouTubeVideo *video;
Packit 4b6dd7
	const gchar * const keywords[] = { "<keyword1>", "keyword2 & stuff, things", NULL };
Packit 4b6dd7
Packit 4b6dd7
	video = gdata_youtube_video_new (NULL);
Packit 4b6dd7
	gdata_youtube_video_set_location (video, "\"Here\" & 'there'");
Packit 4b6dd7
	gdata_youtube_video_set_access_control (video, "<action>", GDATA_YOUTUBE_PERMISSION_ALLOWED);
Packit 4b6dd7
	gdata_youtube_video_set_keywords (video, keywords);
Packit 4b6dd7
	gdata_youtube_video_set_description (video, "Description & 'stuff'.");
Packit 4b6dd7
	gdata_youtube_video_set_aspect_ratio (video, "4 & 3");
Packit 4b6dd7
Packit 4b6dd7
	/* Check the outputted JSON is escaped properly */
Packit 4b6dd7
	gdata_test_assert_json (video,
Packit 4b6dd7
		"{"
Packit 4b6dd7
			"'kind': 'youtube#video',"
Packit 4b6dd7
			"'title': null,"
Packit 4b6dd7
			"'description': \"Description & 'stuff'.\","
Packit 4b6dd7
			"'snippet': {"
Packit 4b6dd7
				"'description': \"Description & 'stuff'.\","
Packit 4b6dd7
				"'tags': ["
Packit 4b6dd7
					"'<keyword1>',"
Packit 4b6dd7
					"'keyword2 & stuff, things'"
Packit 4b6dd7
				"]"
Packit 4b6dd7
			"},"
Packit 4b6dd7
			"'status': {"
Packit 4b6dd7
				"'privacyStatus': 'public'"
Packit 4b6dd7
			"},"
Packit 4b6dd7
			"'recordingDetails': {"
Packit 4b6dd7
				"'locationDescription': \"\\\"Here\\\" & 'there'\""
Packit 4b6dd7
			"}"
Packit 4b6dd7
		"}");
Packit 4b6dd7
	g_object_unref (video);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/* Check that a newly-constructed video does not output a location in its
Packit 4b6dd7
 * JSON or properties. */
Packit 4b6dd7
static void
Packit 4b6dd7
test_video_location (void)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataYouTubeVideo *video;
Packit 4b6dd7
	gdouble latitude, longitude;
Packit 4b6dd7
Packit 4b6dd7
	video = gdata_youtube_video_new (NULL);
Packit 4b6dd7
Packit 4b6dd7
	g_assert_null (gdata_youtube_video_get_location (video));
Packit 4b6dd7
Packit 4b6dd7
	/* Latitude and longitude should be outside the valid ranges. */
Packit 4b6dd7
	gdata_youtube_video_get_coordinates (video, &latitude, &longitude);
Packit 4b6dd7
	g_assert (latitude < -90.0 || latitude > 90.0);
Packit 4b6dd7
	g_assert (longitude < -180.0 || longitude > 180.0);
Packit 4b6dd7
Packit 4b6dd7
	/* Check the outputted JSON is escaped properly */
Packit 4b6dd7
	gdata_test_assert_json (video,
Packit 4b6dd7
		"{"
Packit 4b6dd7
			"'title': null,"
Packit 4b6dd7
			"'kind': 'youtube#video',"
Packit 4b6dd7
			"'snippet': {},"
Packit 4b6dd7
			"'status': {"
Packit 4b6dd7
				"'privacyStatus': 'public'"
Packit 4b6dd7
			"},"
Packit 4b6dd7
			"'recordingDetails': {}"
Packit 4b6dd7
		"}");
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (video);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_comment_get_json (void)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataYouTubeComment *comment_;
Packit 4b6dd7
Packit 4b6dd7
	comment_ = gdata_youtube_comment_new (NULL);
Packit 4b6dd7
	gdata_entry_set_content (GDATA_ENTRY (comment_),
Packit 4b6dd7
	                         "This is a comment with <markup> & 'stüff'.");
Packit 4b6dd7
	gdata_youtube_comment_set_parent_comment_uri (comment_,
Packit 4b6dd7
	                                              "http://example.com/?foo=bar&baz=shizzle");
Packit 4b6dd7
Packit 4b6dd7
	/* Check the outputted JSON is OK */
Packit 4b6dd7
	gdata_test_assert_json (comment_,
Packit 4b6dd7
		"{"
Packit 4b6dd7
			"'kind': 'youtube#commentThread',"
Packit 4b6dd7
			"'snippet' : {"
Packit 4b6dd7
				"'topLevelComment': {"
Packit 4b6dd7
					"'kind': 'youtube#comment',"
Packit 4b6dd7
					"'snippet': {"
Packit 4b6dd7
						"'textOriginal': \"This is a comment with <markup> & 'stüff'.\","
Packit 4b6dd7
						"'parentId': 'http://example.com/?foo=bar&baz=shizzle'"
Packit 4b6dd7
					"}"
Packit 4b6dd7
				"}"
Packit 4b6dd7
			"}"
Packit 4b6dd7
		"}");
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (comment_);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
notify_cb (GDataYouTubeComment *comment_, GParamSpec *pspec, guint *notification_count)
Packit 4b6dd7
{
Packit 4b6dd7
	*notification_count = *notification_count + 1;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_comment_properties_parent_comment_uri (void)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataYouTubeComment *comment_;
Packit 4b6dd7
	guint notification_count = 0;
Packit 4b6dd7
	gchar *parent_comment_uri;
Packit 4b6dd7
Packit 4b6dd7
	comment_ = gdata_youtube_comment_new (NULL);
Packit 4b6dd7
	g_signal_connect (comment_, "notify::parent-comment-uri", (GCallback) notify_cb, &notification_count);
Packit 4b6dd7
Packit 4b6dd7
	/* Default. */
Packit 4b6dd7
	g_assert (gdata_youtube_comment_get_parent_comment_uri (comment_) == NULL);
Packit 4b6dd7
Packit 4b6dd7
	/* Set the property. */
Packit 4b6dd7
	gdata_youtube_comment_set_parent_comment_uri (comment_, "foo");
Packit 4b6dd7
	g_assert_cmpuint (notification_count, ==, 1);
Packit 4b6dd7
Packit 4b6dd7
	g_assert_cmpstr (gdata_youtube_comment_get_parent_comment_uri (comment_), ==, "foo");
Packit 4b6dd7
Packit 4b6dd7
	/* Get the property a different way. */
Packit 4b6dd7
	g_object_get (G_OBJECT (comment_),
Packit 4b6dd7
	              "parent-comment-uri", &parent_comment_uri,
Packit 4b6dd7
	              NULL);
Packit 4b6dd7
Packit 4b6dd7
	g_assert_cmpstr (parent_comment_uri, ==, "foo");
Packit 4b6dd7
Packit 4b6dd7
	g_free (parent_comment_uri);
Packit 4b6dd7
Packit 4b6dd7
	/* Set the property a different way. */
Packit 4b6dd7
	g_object_set (G_OBJECT (comment_),
Packit 4b6dd7
	              "parent-comment-uri", "bar",
Packit 4b6dd7
	              NULL);
Packit 4b6dd7
	g_assert_cmpuint (notification_count, ==, 2);
Packit 4b6dd7
Packit 4b6dd7
	/* Set the property to the same value. */
Packit 4b6dd7
	gdata_youtube_comment_set_parent_comment_uri (comment_, "bar");
Packit 4b6dd7
	g_assert_cmpuint (notification_count, ==, 2);
Packit 4b6dd7
Packit 4b6dd7
	/* Set the property back to NULL. */
Packit 4b6dd7
	gdata_youtube_comment_set_parent_comment_uri (comment_, NULL);
Packit 4b6dd7
	g_assert_cmpuint (notification_count, ==, 3);
Packit 4b6dd7
Packit 4b6dd7
	g_assert (gdata_youtube_comment_get_parent_comment_uri (comment_) == NULL);
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (comment_);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static gchar *
Packit 4b6dd7
build_this_week_date_str (void)
Packit 4b6dd7
{
Packit 4b6dd7
	GTimeVal tv;
Packit 4b6dd7
Packit 4b6dd7
	g_get_current_time (&tv;;
Packit 4b6dd7
	tv.tv_sec -= 7 * 24 * 60 * 60;  /* this week */
Packit 4b6dd7
	tv.tv_usec = 0;  /* pointless accuracy */
Packit 4b6dd7
Packit 4b6dd7
	return g_time_val_to_iso8601 (&tv;;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_query_uri (void)
Packit 4b6dd7
{
Packit 4b6dd7
	gdouble latitude, longitude, radius;
Packit 4b6dd7
	gboolean has_location;
Packit 4b6dd7
	gchar *query_uri;
Packit 4b6dd7
	GDataYouTubeQuery *query = gdata_youtube_query_new ("q");
Packit 4b6dd7
	gchar *this_week_date_str, *expected_uri;
Packit 4b6dd7
Packit 4b6dd7
	G_GNUC_BEGIN_IGNORE_DEPRECATIONS
Packit 4b6dd7
Packit 4b6dd7
	/* This should not appear in the query because it is deprecated. */
Packit 4b6dd7
	gdata_youtube_query_set_format (query, GDATA_YOUTUBE_FORMAT_RTSP_H263_AMR);
Packit 4b6dd7
	g_assert_cmpuint (gdata_youtube_query_get_format (query), ==, 1);
Packit 4b6dd7
Packit 4b6dd7
	/* Location */
Packit 4b6dd7
	gdata_youtube_query_set_location (query, 45.01364, -97.12356, 112.5, TRUE);
Packit 4b6dd7
	gdata_youtube_query_get_location (query, &latitude, &longitude, &radius, &has_location);
Packit 4b6dd7
Packit 4b6dd7
	g_assert_cmpfloat (latitude, ==, 45.01364);
Packit 4b6dd7
	g_assert_cmpfloat (longitude, ==, -97.12356);
Packit 4b6dd7
	g_assert_cmpfloat (radius, ==, 112.5);
Packit 4b6dd7
	g_assert (has_location == TRUE);
Packit 4b6dd7
Packit 4b6dd7
	query_uri = gdata_query_get_query_uri (GDATA_QUERY (query), "http://example.com");
Packit 4b6dd7
	g_assert_cmpstr (query_uri, ==, "http://example.com?q=q&safeSearch=none&location=45.013640000000002,-97.123559999999998&locationRadius=112.5m");
Packit 4b6dd7
	g_free (query_uri);
Packit 4b6dd7
Packit 4b6dd7
	/* This used to set the has-location parameter in the query, but that’s
Packit 4b6dd7
	 * no longer supported by Google, so it should be the same as the
Packit 4b6dd7
	 * following query. */
Packit 4b6dd7
	gdata_youtube_query_set_location (query, G_MAXDOUBLE, 0.6672, 52.8, TRUE);
Packit 4b6dd7
Packit 4b6dd7
	query_uri = gdata_query_get_query_uri (GDATA_QUERY (query), "http://example.com");
Packit 4b6dd7
	g_assert_cmpstr (query_uri, ==, "http://example.com?q=q&safeSearch=none");
Packit 4b6dd7
	g_free (query_uri);
Packit 4b6dd7
Packit 4b6dd7
	gdata_youtube_query_set_location (query, G_MAXDOUBLE, G_MAXDOUBLE, 0.0, FALSE);
Packit 4b6dd7
Packit 4b6dd7
	query_uri = gdata_query_get_query_uri (GDATA_QUERY (query), "http://example.com");
Packit 4b6dd7
	g_assert_cmpstr (query_uri, ==, "http://example.com?q=q&safeSearch=none");
Packit 4b6dd7
	g_free (query_uri);
Packit 4b6dd7
Packit 4b6dd7
	/* Language; this should not appear in the query as it is no longer
Packit 4b6dd7
	 * supported. */
Packit 4b6dd7
	gdata_youtube_query_set_language (query, "fr");
Packit 4b6dd7
	g_assert_cmpstr (gdata_youtube_query_get_language (query), ==, "fr");
Packit 4b6dd7
Packit 4b6dd7
	gdata_youtube_query_set_order_by (query, "relevance_lang_fr");
Packit 4b6dd7
	g_assert_cmpstr (gdata_youtube_query_get_order_by (query), ==, "relevance_lang_fr");
Packit 4b6dd7
Packit 4b6dd7
	gdata_youtube_query_set_restriction (query, "192.168.0.1");
Packit 4b6dd7
	g_assert_cmpstr (gdata_youtube_query_get_restriction (query), ==, "192.168.0.1");
Packit 4b6dd7
Packit 4b6dd7
	query_uri = gdata_query_get_query_uri (GDATA_QUERY (query), "http://example.com");
Packit 4b6dd7
	g_assert_cmpstr (query_uri, ==, "http://example.com?q=q&safeSearch=none&order=relevance&regionCode=192.168.0.1");
Packit 4b6dd7
	g_free (query_uri);
Packit 4b6dd7
Packit 4b6dd7
	gdata_youtube_query_set_safe_search (query, GDATA_YOUTUBE_SAFE_SEARCH_STRICT);
Packit 4b6dd7
	g_assert_cmpuint (gdata_youtube_query_get_safe_search (query), ==, GDATA_YOUTUBE_SAFE_SEARCH_STRICT);
Packit 4b6dd7
Packit 4b6dd7
	query_uri = gdata_query_get_query_uri (GDATA_QUERY (query), "http://example.com");
Packit 4b6dd7
	g_assert_cmpstr (query_uri, ==, "http://example.com?q=q&safeSearch=strict&order=relevance&regionCode=192.168.0.1");
Packit 4b6dd7
	g_free (query_uri);
Packit 4b6dd7
Packit 4b6dd7
	/* Deprecated and unused: */
Packit 4b6dd7
	gdata_youtube_query_set_sort_order (query, GDATA_YOUTUBE_SORT_ASCENDING);
Packit 4b6dd7
	g_assert_cmpuint (gdata_youtube_query_get_sort_order (query), ==, GDATA_YOUTUBE_SORT_ASCENDING);
Packit 4b6dd7
Packit 4b6dd7
	gdata_youtube_query_set_age (query, GDATA_YOUTUBE_AGE_THIS_WEEK);
Packit 4b6dd7
	g_assert_cmpuint (gdata_youtube_query_get_age (query), ==, GDATA_YOUTUBE_AGE_THIS_WEEK);
Packit 4b6dd7
Packit 4b6dd7
	/* Deprecated and unused: */
Packit 4b6dd7
	gdata_youtube_query_set_uploader (query, GDATA_YOUTUBE_UPLOADER_PARTNER);
Packit 4b6dd7
	g_assert_cmpuint (gdata_youtube_query_get_uploader (query), ==, GDATA_YOUTUBE_UPLOADER_PARTNER);
Packit 4b6dd7
Packit 4b6dd7
	gdata_youtube_query_set_license (query, GDATA_YOUTUBE_LICENSE_CC);
Packit 4b6dd7
	g_assert_cmpstr (gdata_youtube_query_get_license (query), ==, GDATA_YOUTUBE_LICENSE_CC);
Packit 4b6dd7
Packit 4b6dd7
	/* Check the built URI with a normal feed URI */
Packit 4b6dd7
	query_uri = gdata_query_get_query_uri (GDATA_QUERY (query), "http://example.com");
Packit 4b6dd7
	this_week_date_str = build_this_week_date_str ();
Packit 4b6dd7
	expected_uri = g_strdup_printf ("http://example.com?q=q&publishedAfter=%s&safeSearch=strict&order=relevance&regionCode=192.168.0.1&videoLicense=creativeCommon", this_week_date_str);
Packit 4b6dd7
	g_assert_cmpstr (query_uri, ==, expected_uri);
Packit 4b6dd7
Packit 4b6dd7
	g_free (this_week_date_str);
Packit 4b6dd7
	g_free (expected_uri);
Packit 4b6dd7
	g_free (query_uri);
Packit 4b6dd7
Packit 4b6dd7
	/* …and with a feed URI with pre-existing arguments */
Packit 4b6dd7
	query_uri = gdata_query_get_query_uri (GDATA_QUERY (query), "http://example.com?foobar=shizzle");
Packit 4b6dd7
	this_week_date_str = build_this_week_date_str ();
Packit 4b6dd7
	expected_uri = g_strdup_printf ("http://example.com?foobar=shizzle&q=q&publishedAfter=%s&safeSearch=strict&order=relevance&regionCode=192.168.0.1&videoLicense=creativeCommon", this_week_date_str);
Packit 4b6dd7
	g_assert_cmpstr (query_uri, ==, expected_uri);
Packit 4b6dd7
Packit 4b6dd7
	g_free (this_week_date_str);
Packit 4b6dd7
	g_free (expected_uri);
Packit 4b6dd7
	g_free (query_uri);
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (query);
Packit 4b6dd7
Packit 4b6dd7
	G_GNUC_END_IGNORE_DEPRECATIONS
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_query_etag (void)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataYouTubeQuery *query = gdata_youtube_query_new (NULL);
Packit 4b6dd7
Packit 4b6dd7
	/* Test that setting any property will unset the ETag */
Packit 4b6dd7
	g_test_bug ("613529");
Packit 4b6dd7
Packit 4b6dd7
	G_GNUC_BEGIN_IGNORE_DEPRECATIONS
Packit 4b6dd7
Packit 4b6dd7
#define CHECK_ETAG(C) \
Packit 4b6dd7
	gdata_query_set_etag (GDATA_QUERY (query), "foobar");		\
Packit 4b6dd7
	(C);								\
Packit 4b6dd7
	g_assert (gdata_query_get_etag (GDATA_QUERY (query)) == NULL);
Packit 4b6dd7
Packit 4b6dd7
	CHECK_ETAG (gdata_youtube_query_set_format (query, GDATA_YOUTUBE_FORMAT_RTSP_H263_AMR))
Packit 4b6dd7
	CHECK_ETAG (gdata_youtube_query_set_location (query, 0.0, 65.0, 15.0, TRUE))
Packit 4b6dd7
	CHECK_ETAG (gdata_youtube_query_set_language (query, "British English"))
Packit 4b6dd7
	CHECK_ETAG (gdata_youtube_query_set_order_by (query, "shizzle"))
Packit 4b6dd7
	CHECK_ETAG (gdata_youtube_query_set_restriction (query, "restriction"))
Packit 4b6dd7
	CHECK_ETAG (gdata_youtube_query_set_safe_search (query, GDATA_YOUTUBE_SAFE_SEARCH_MODERATE))
Packit 4b6dd7
	CHECK_ETAG (gdata_youtube_query_set_sort_order (query, GDATA_YOUTUBE_SORT_DESCENDING))
Packit 4b6dd7
	CHECK_ETAG (gdata_youtube_query_set_age (query, GDATA_YOUTUBE_AGE_THIS_WEEK))
Packit 4b6dd7
	CHECK_ETAG (gdata_youtube_query_set_uploader (query, GDATA_YOUTUBE_UPLOADER_PARTNER))
Packit 4b6dd7
	CHECK_ETAG (gdata_youtube_query_set_license (query, GDATA_YOUTUBE_LICENSE_STANDARD))
Packit 4b6dd7
Packit 4b6dd7
#undef CHECK_ETAG
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (query);
Packit 4b6dd7
Packit 4b6dd7
	G_GNUC_END_IGNORE_DEPRECATIONS
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_query_single (gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataYouTubeVideo *video;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "query-single");
Packit 4b6dd7
Packit 4b6dd7
	video = GDATA_YOUTUBE_VIDEO (gdata_service_query_single_entry (GDATA_SERVICE (service),
Packit 4b6dd7
	                                                               gdata_youtube_service_get_primary_authorization_domain (),
Packit 4b6dd7
	                                                               "tag:youtube.com,2008:video:_LeQuMpwbW4", NULL,
Packit 4b6dd7
	                                                               GDATA_TYPE_YOUTUBE_VIDEO, NULL, &error));
Packit 4b6dd7
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (video != NULL);
Packit 4b6dd7
	g_assert (GDATA_IS_YOUTUBE_VIDEO (video));
Packit 4b6dd7
Packit 4b6dd7
	G_GNUC_BEGIN_IGNORE_DEPRECATIONS
Packit 4b6dd7
	g_assert_cmpstr (gdata_youtube_video_get_video_id (video), ==, "_LeQuMpwbW4");
Packit 4b6dd7
	g_assert_cmpstr (gdata_entry_get_id (GDATA_ENTRY (video)), ==, "_LeQuMpwbW4");
Packit 4b6dd7
	G_GNUC_END_IGNORE_DEPRECATIONS
Packit 4b6dd7
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (video);
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
GDATA_ASYNC_TEST_FUNCTIONS (query_single, void,
Packit 4b6dd7
G_STMT_START {
Packit 4b6dd7
	gdata_service_query_single_entry_async (GDATA_SERVICE (service), gdata_youtube_service_get_primary_authorization_domain (),
Packit 4b6dd7
	                                        "tag:youtube.com,2008:video:_LeQuMpwbW4", NULL, GDATA_TYPE_YOUTUBE_VIDEO,
Packit 4b6dd7
	                                        cancellable, async_ready_callback, async_data);
Packit 4b6dd7
} G_STMT_END,
Packit 4b6dd7
G_STMT_START {
Packit 4b6dd7
	GDataYouTubeVideo *video;
Packit 4b6dd7
Packit 4b6dd7
	video = GDATA_YOUTUBE_VIDEO (gdata_service_query_single_entry_finish (GDATA_SERVICE (obj), async_result, &error));
Packit 4b6dd7
Packit 4b6dd7
	if (error == NULL) {
Packit 4b6dd7
		G_GNUC_BEGIN_IGNORE_DEPRECATIONS
Packit 4b6dd7
		g_assert (GDATA_IS_YOUTUBE_VIDEO (video));
Packit 4b6dd7
		g_assert_cmpstr (gdata_youtube_video_get_video_id (video), ==, "_LeQuMpwbW4");
Packit 4b6dd7
		g_assert_cmpstr (gdata_entry_get_id (GDATA_ENTRY (video)), ==, "_LeQuMpwbW4");
Packit 4b6dd7
		G_GNUC_END_IGNORE_DEPRECATIONS
Packit 4b6dd7
Packit 4b6dd7
		g_object_unref (video);
Packit 4b6dd7
	} else {
Packit 4b6dd7
		g_assert (video == NULL);
Packit 4b6dd7
	}
Packit 4b6dd7
} G_STMT_END);
Packit 4b6dd7
Packit 4b6dd7
typedef struct {
Packit 4b6dd7
	GDataYouTubeVideo *video;
Packit 4b6dd7
} CommentData;
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
set_up_comment (CommentData *data, gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "setup-comment");
Packit 4b6dd7
Packit 4b6dd7
	/* Get a video known to have comments on it. */
Packit 4b6dd7
	data->video = GDATA_YOUTUBE_VIDEO (gdata_service_query_single_entry (GDATA_SERVICE (service),
Packit 4b6dd7
	                                                                     gdata_youtube_service_get_primary_authorization_domain (),
Packit 4b6dd7
	                                                                     "tag:youtube.com,2008:video:RzR2k8yo4NY", NULL,
Packit 4b6dd7
	                                                                     GDATA_TYPE_YOUTUBE_VIDEO, NULL, NULL));
Packit 4b6dd7
	g_assert (GDATA_IS_YOUTUBE_VIDEO (data->video));
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
tear_down_comment (CommentData *data, gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	g_object_unref (data->video);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
assert_comments_feed (GDataFeed *comments_feed)
Packit 4b6dd7
{
Packit 4b6dd7
	GList *comments;
Packit 4b6dd7
Packit 4b6dd7
	g_assert (GDATA_IS_FEED (comments_feed));
Packit 4b6dd7
Packit 4b6dd7
	for (comments = gdata_feed_get_entries (comments_feed); comments != NULL; comments = comments->next) {
Packit 4b6dd7
		GList *authors;
Packit 4b6dd7
		GDataYouTubeComment *comment_ = GDATA_YOUTUBE_COMMENT (comments->data);
Packit 4b6dd7
Packit 4b6dd7
		/* We can't do much more than this, since we can't reasonably add test comments to public videos, and can't upload a new video
Packit 4b6dd7
		 * for each test since it has to go through moderation. */
Packit 4b6dd7
		g_assert_cmpstr (gdata_entry_get_content (GDATA_ENTRY (comment_)), !=, NULL);
Packit 4b6dd7
Packit 4b6dd7
		g_assert_cmpuint (g_list_length (gdata_entry_get_authors (GDATA_ENTRY (comment_))), >, 0);
Packit 4b6dd7
Packit 4b6dd7
		for (authors = gdata_entry_get_authors (GDATA_ENTRY (comment_)); authors != NULL; authors = authors->next) {
Packit 4b6dd7
			GDataAuthor *author = GDATA_AUTHOR (authors->data);
Packit 4b6dd7
Packit 4b6dd7
			/* Again, we can't test these much. */
Packit 4b6dd7
			g_assert_cmpstr (gdata_author_get_name (author), !=, NULL);
Packit 4b6dd7
			g_assert_cmpstr (gdata_author_get_uri (author), !=, NULL);
Packit 4b6dd7
		}
Packit 4b6dd7
	}
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_comment_query (CommentData *data, gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataFeed *comments_feed;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "comment-query");
Packit 4b6dd7
Packit 4b6dd7
	/* Get the comments feed for the video */
Packit 4b6dd7
	comments_feed = gdata_commentable_query_comments (GDATA_COMMENTABLE (data->video), GDATA_SERVICE (service), NULL, NULL, NULL, NULL, &error);
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	assert_comments_feed (comments_feed);
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (comments_feed);
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
GDATA_ASYNC_CLOSURE_FUNCTIONS (comment, CommentData);
Packit 4b6dd7
Packit 4b6dd7
GDATA_ASYNC_TEST_FUNCTIONS (comment_query, CommentData,
Packit 4b6dd7
G_STMT_START {
Packit 4b6dd7
	gdata_commentable_query_comments_async (GDATA_COMMENTABLE (data->video), GDATA_SERVICE (service), NULL, cancellable, NULL, NULL, NULL,
Packit 4b6dd7
	                                        async_ready_callback, async_data);
Packit 4b6dd7
} G_STMT_END,
Packit 4b6dd7
G_STMT_START {
Packit 4b6dd7
	GDataFeed *comments_feed;
Packit 4b6dd7
Packit 4b6dd7
	comments_feed = gdata_commentable_query_comments_finish (GDATA_COMMENTABLE (obj), async_result, &error);
Packit 4b6dd7
Packit 4b6dd7
	if (error == NULL) {
Packit 4b6dd7
		assert_comments_feed (comments_feed);
Packit 4b6dd7
Packit 4b6dd7
		g_object_unref (comments_feed);
Packit 4b6dd7
	} else {
Packit 4b6dd7
		g_assert (comments_feed == NULL);
Packit 4b6dd7
	}
Packit 4b6dd7
} G_STMT_END);
Packit 4b6dd7
Packit 4b6dd7
/* Test that the progress callbacks from gdata_commentable_query_comments_async() are called correctly.
Packit 4b6dd7
 * We take a CommentData so that we can guarantee the video exists, but we don't use it much as we don't actually care about the specific
Packit 4b6dd7
 * video. */
Packit 4b6dd7
static void
Packit 4b6dd7
test_comment_query_async_progress_closure (CommentData *query_data, gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataAsyncProgressClosure *data = g_slice_new0 (GDataAsyncProgressClosure);
Packit 4b6dd7
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "comment-query-async-progress-closure");
Packit 4b6dd7
Packit 4b6dd7
	data->main_loop = g_main_loop_new (NULL, TRUE);
Packit 4b6dd7
Packit 4b6dd7
	gdata_commentable_query_comments_async (GDATA_COMMENTABLE (query_data->video), GDATA_SERVICE (service), NULL, NULL,
Packit 4b6dd7
	                                        (GDataQueryProgressCallback) gdata_test_async_progress_callback,
Packit 4b6dd7
	                                        data, (GDestroyNotify) gdata_test_async_progress_closure_free,
Packit 4b6dd7
	                                        (GAsyncReadyCallback) gdata_test_async_progress_finish_callback, data);
Packit 4b6dd7
Packit 4b6dd7
	g_main_loop_run (data->main_loop);
Packit 4b6dd7
	g_main_loop_unref (data->main_loop);
Packit 4b6dd7
Packit 4b6dd7
	/* Check that both callbacks were called exactly once */
Packit 4b6dd7
	g_assert_cmpuint (data->progress_destroy_notify_count, ==, 1);
Packit 4b6dd7
	g_assert_cmpuint (data->async_ready_notify_count, ==, 1);
Packit 4b6dd7
Packit 4b6dd7
	g_slice_free (GDataAsyncProgressClosure, data);
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
typedef struct {
Packit 4b6dd7
	CommentData parent;
Packit 4b6dd7
	GDataYouTubeComment *comment;
Packit 4b6dd7
} InsertCommentData;
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
set_up_insert_comment (InsertCommentData *data, gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	set_up_comment ((CommentData*) data, service);
Packit 4b6dd7
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "setup-insert-comment");
Packit 4b6dd7
Packit 4b6dd7
	/* Create a test comment to be inserted. */
Packit 4b6dd7
	data->comment = gdata_youtube_comment_new (NULL);
Packit 4b6dd7
	g_assert (GDATA_IS_YOUTUBE_COMMENT (data->comment));
Packit 4b6dd7
Packit 4b6dd7
	gdata_entry_set_content (GDATA_ENTRY (data->comment), "This is a test comment.");
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
tear_down_insert_comment (InsertCommentData *data, gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "teardown-insert-comment");
Packit 4b6dd7
Packit 4b6dd7
	if (data->comment != NULL) {
Packit 4b6dd7
		g_object_unref (data->comment);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	tear_down_comment ((CommentData*) data, service);
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
assert_comments_equal (GDataComment *new_comment,
Packit 4b6dd7
                       GDataYouTubeComment *original_comment,
Packit 4b6dd7
                       gboolean allow_empty)
Packit 4b6dd7
{
Packit 4b6dd7
	GList *authors;
Packit 4b6dd7
	GDataAuthor *author;
Packit 4b6dd7
Packit 4b6dd7
	g_assert (GDATA_IS_YOUTUBE_COMMENT (new_comment));
Packit 4b6dd7
	g_assert (GDATA_IS_YOUTUBE_COMMENT (original_comment));
Packit 4b6dd7
	g_assert (GDATA_YOUTUBE_COMMENT (new_comment) != original_comment);
Packit 4b6dd7
Packit 4b6dd7
	/* Comments can be "" if they’ve just been inserted and are pending
Packit 4b6dd7
	 * moderation. Not much we can do about that without waiting a few
Packit 4b6dd7
	 * minutes, which would suck in a unit test. */
Packit 4b6dd7
	if (g_strcmp0 (gdata_entry_get_content (GDATA_ENTRY (new_comment)), "") != 0) {
Packit 4b6dd7
		g_assert_cmpstr (gdata_entry_get_content (GDATA_ENTRY (new_comment)), ==,
Packit 4b6dd7
		                 gdata_entry_get_content (GDATA_ENTRY (original_comment)));
Packit 4b6dd7
	} else {
Packit 4b6dd7
		g_assert (allow_empty);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	g_assert_cmpstr (gdata_youtube_comment_get_parent_comment_uri (GDATA_YOUTUBE_COMMENT (new_comment)), ==,
Packit 4b6dd7
	                 gdata_youtube_comment_get_parent_comment_uri (original_comment));
Packit 4b6dd7
Packit 4b6dd7
	/* Check the author of the new comment. */
Packit 4b6dd7
	authors = gdata_entry_get_authors (GDATA_ENTRY (new_comment));
Packit 4b6dd7
	g_assert_cmpuint (g_list_length (authors), ==, 1);
Packit 4b6dd7
Packit 4b6dd7
	author = GDATA_AUTHOR (authors->data);
Packit 4b6dd7
Packit 4b6dd7
	g_assert_cmpstr (gdata_author_get_name (author), ==, "GDataTest");
Packit 4b6dd7
	g_assert_cmpstr (gdata_author_get_uri (author), ==, "http://www.youtube.com/user/GDataTest");
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_comment_insert (InsertCommentData *data, gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataComment *new_comment;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "comment-insert");
Packit 4b6dd7
Packit 4b6dd7
	new_comment = gdata_commentable_insert_comment (GDATA_COMMENTABLE (data->parent.video), GDATA_SERVICE (service), GDATA_COMMENT (data->comment),
Packit 4b6dd7
	                                                NULL, &error);
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	assert_comments_equal (new_comment, data->comment, TRUE);
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (new_comment);
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
GDATA_ASYNC_CLOSURE_FUNCTIONS (insert_comment, InsertCommentData);
Packit 4b6dd7
Packit 4b6dd7
GDATA_ASYNC_TEST_FUNCTIONS (comment_insert, InsertCommentData,
Packit 4b6dd7
G_STMT_START {
Packit 4b6dd7
	gdata_commentable_insert_comment_async (GDATA_COMMENTABLE (data->parent.video), GDATA_SERVICE (service),
Packit 4b6dd7
	                                        GDATA_COMMENT (data->comment), cancellable, async_ready_callback, async_data);
Packit 4b6dd7
} G_STMT_END,
Packit 4b6dd7
G_STMT_START {
Packit 4b6dd7
	GDataComment *new_comment;
Packit 4b6dd7
Packit 4b6dd7
	new_comment = gdata_commentable_insert_comment_finish (GDATA_COMMENTABLE (obj), async_result, &error);
Packit 4b6dd7
Packit 4b6dd7
	if (error == NULL) {
Packit 4b6dd7
		assert_comments_equal (new_comment, data->comment, TRUE);
Packit 4b6dd7
Packit 4b6dd7
		g_object_unref (new_comment);
Packit 4b6dd7
	} else {
Packit 4b6dd7
		g_assert (new_comment == NULL);
Packit 4b6dd7
	}
Packit 4b6dd7
} G_STMT_END);
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_comment_delete (InsertCommentData *data, gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	gboolean success;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "comment-delete");
Packit 4b6dd7
Packit 4b6dd7
	/* We attempt to delete a comment which hasn't been inserted here, but that doesn't matter as the function should always immediately
Packit 4b6dd7
	 * return an error because deleting YouTube comments isn't allowed. */
Packit 4b6dd7
	success = gdata_commentable_delete_comment (GDATA_COMMENTABLE (data->parent.video), GDATA_SERVICE (service), GDATA_COMMENT (data->comment),
Packit 4b6dd7
	                                            NULL, &error);
Packit 4b6dd7
	g_assert_error (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_FORBIDDEN);
Packit 4b6dd7
	g_assert (success == FALSE);
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
GDATA_ASYNC_TEST_FUNCTIONS (comment_delete, InsertCommentData,
Packit 4b6dd7
G_STMT_START {
Packit 4b6dd7
	gdata_commentable_delete_comment_async (GDATA_COMMENTABLE (data->parent.video), GDATA_SERVICE (service),
Packit 4b6dd7
	                                        GDATA_COMMENT (data->comment), cancellable, async_ready_callback, async_data);
Packit 4b6dd7
} G_STMT_END,
Packit 4b6dd7
G_STMT_START {
Packit 4b6dd7
	gboolean success;
Packit 4b6dd7
Packit 4b6dd7
	success = gdata_commentable_delete_comment_finish (GDATA_COMMENTABLE (obj), async_result, &error);
Packit 4b6dd7
Packit 4b6dd7
	g_assert (error != NULL);
Packit 4b6dd7
	g_assert (success == FALSE);
Packit 4b6dd7
Packit 4b6dd7
	/* See the note above in test_comment_delete(). */
Packit 4b6dd7
	if (g_error_matches (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_FORBIDDEN) == TRUE) {
Packit 4b6dd7
		/* Pretend no error happened so that the test succeeds. */
Packit 4b6dd7
		g_clear_error (&error);
Packit 4b6dd7
		async_data->cancellation_timeout = 13;
Packit 4b6dd7
	}
Packit 4b6dd7
} G_STMT_END);
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_parsing_video_id_from_uri (void)
Packit 4b6dd7
{
Packit 4b6dd7
	gchar *video_id;
Packit 4b6dd7
Packit 4b6dd7
	video_id = gdata_youtube_video_get_video_id_from_uri ("http://www.youtube.com/watch?v=BH_vwsyCrTc&feature=featured");
Packit 4b6dd7
	g_assert_cmpstr (video_id, ==, "BH_vwsyCrTc");
Packit 4b6dd7
	g_free (video_id);
Packit 4b6dd7
Packit 4b6dd7
	video_id = gdata_youtube_video_get_video_id_from_uri ("http://www.youtube.es/watch?v=foo");
Packit 4b6dd7
	g_assert_cmpstr (video_id, ==, "foo");
Packit 4b6dd7
	g_free (video_id);
Packit 4b6dd7
Packit 4b6dd7
	video_id = gdata_youtube_video_get_video_id_from_uri ("http://foobar.com/watch?v=foo");
Packit 4b6dd7
	g_assert (video_id == NULL);
Packit 4b6dd7
Packit 4b6dd7
	video_id = gdata_youtube_video_get_video_id_from_uri ("http://foobar.com/not/real");
Packit 4b6dd7
	g_assert (video_id == NULL);
Packit 4b6dd7
Packit 4b6dd7
	video_id = gdata_youtube_video_get_video_id_from_uri ("http://www.youtube.com/watch#!v=ylLzyHk54Z0");
Packit 4b6dd7
	g_assert_cmpstr (video_id, ==, "ylLzyHk54Z0");
Packit 4b6dd7
	g_free (video_id);
Packit 4b6dd7
Packit 4b6dd7
	video_id = gdata_youtube_video_get_video_id_from_uri ("http://www.youtube.com/watch#!foo=bar!v=ylLzyHk54Z0");
Packit 4b6dd7
	g_assert_cmpstr (video_id, ==, "ylLzyHk54Z0");
Packit 4b6dd7
	g_free (video_id);
Packit 4b6dd7
Packit 4b6dd7
	video_id = gdata_youtube_video_get_video_id_from_uri ("http://www.youtube.com/watch#!foo=bar");
Packit 4b6dd7
	g_assert (video_id == NULL);
Packit 4b6dd7
Packit 4b6dd7
	video_id = gdata_youtube_video_get_video_id_from_uri ("http://www.youtube.com/watch#random-fragment");
Packit 4b6dd7
	g_assert (video_id == NULL);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_categories (gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataAPPCategories *app_categories;
Packit 4b6dd7
	GList *categories;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
	gchar *old_locale;
Packit 4b6dd7
	guint old_n_results;
Packit 4b6dd7
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "categories");
Packit 4b6dd7
Packit 4b6dd7
	app_categories = gdata_youtube_service_get_categories (GDATA_YOUTUBE_SERVICE (service), NULL, &error);
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (GDATA_IS_APP_CATEGORIES (app_categories));
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	categories = gdata_app_categories_get_categories (app_categories);
Packit 4b6dd7
	g_assert_cmpint (g_list_length (categories), >, 0);
Packit 4b6dd7
	g_assert (GDATA_IS_YOUTUBE_CATEGORY (categories->data));
Packit 4b6dd7
Packit 4b6dd7
	/* Save the number of results for comparison against a different locale */
Packit 4b6dd7
	old_n_results = g_list_length (categories);
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (app_categories);
Packit 4b6dd7
Packit 4b6dd7
	/* Test with a different locale */
Packit 4b6dd7
	old_locale = g_strdup (gdata_service_get_locale (GDATA_SERVICE (service)));
Packit 4b6dd7
	gdata_service_set_locale (GDATA_SERVICE (service), "TR");
Packit 4b6dd7
Packit 4b6dd7
	app_categories = gdata_youtube_service_get_categories (GDATA_YOUTUBE_SERVICE (service), NULL, &error);
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (GDATA_IS_APP_CATEGORIES (app_categories));
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	categories = gdata_app_categories_get_categories (app_categories);
Packit 4b6dd7
	g_assert_cmpint (g_list_length (categories), >, 0);
Packit 4b6dd7
	g_assert (GDATA_IS_YOUTUBE_CATEGORY (categories->data));
Packit 4b6dd7
Packit 4b6dd7
	/* Compare the number of results */
Packit 4b6dd7
	g_assert_cmpuint (old_n_results, !=, g_list_length (categories));
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (app_categories);
Packit 4b6dd7
Packit 4b6dd7
	/* Reset the locale */
Packit 4b6dd7
	gdata_service_set_locale (GDATA_SERVICE (service), old_locale);
Packit 4b6dd7
	g_free (old_locale);
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
GDATA_ASYNC_TEST_FUNCTIONS (categories, void,
Packit 4b6dd7
G_STMT_START {
Packit 4b6dd7
	gdata_youtube_service_get_categories_async (GDATA_YOUTUBE_SERVICE (service), cancellable, async_ready_callback, async_data);
Packit 4b6dd7
} G_STMT_END,
Packit 4b6dd7
G_STMT_START {
Packit 4b6dd7
	GDataAPPCategories *app_categories;
Packit 4b6dd7
	GList *categories;
Packit 4b6dd7
Packit 4b6dd7
	app_categories = gdata_youtube_service_get_categories_finish (GDATA_YOUTUBE_SERVICE (obj), async_result, &error);
Packit 4b6dd7
Packit 4b6dd7
	if (error == NULL) {
Packit 4b6dd7
		g_assert (GDATA_IS_APP_CATEGORIES (app_categories));
Packit 4b6dd7
Packit 4b6dd7
		categories = gdata_app_categories_get_categories (app_categories);
Packit 4b6dd7
		g_assert_cmpint (g_list_length (categories), >, 0);
Packit 4b6dd7
		g_assert (GDATA_IS_YOUTUBE_CATEGORY (categories->data));
Packit 4b6dd7
Packit 4b6dd7
		g_object_unref (app_categories);
Packit 4b6dd7
	} else {
Packit 4b6dd7
		g_assert (app_categories == NULL);
Packit 4b6dd7
	}
Packit 4b6dd7
} G_STMT_END);
Packit 4b6dd7
Packit 4b6dd7
typedef struct {
Packit 4b6dd7
	GDataEntry *new_video;
Packit 4b6dd7
	GDataEntry *new_video2;
Packit 4b6dd7
} BatchData;
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
setup_batch (BatchData *data, gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataEntry *video;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "setup-batch");
Packit 4b6dd7
Packit 4b6dd7
	/* We can't insert new videos as they'd just hit the moderation queue and cause tests to fail. Instead, we rely on two videos already existing
Packit 4b6dd7
	 * on the server with the given IDs. */
Packit 4b6dd7
	video = gdata_service_query_single_entry (GDATA_SERVICE (service), gdata_youtube_service_get_primary_authorization_domain (),
Packit 4b6dd7
	                                          "tag:youtube.com,2008:video:RzR2k8yo4NY", NULL, GDATA_TYPE_YOUTUBE_VIDEO,
Packit 4b6dd7
	                                          NULL, &error);
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (GDATA_IS_YOUTUBE_VIDEO (video));
Packit 4b6dd7
Packit 4b6dd7
	data->new_video = video;
Packit 4b6dd7
Packit 4b6dd7
	video = gdata_service_query_single_entry (GDATA_SERVICE (service), gdata_youtube_service_get_primary_authorization_domain (),
Packit 4b6dd7
	                                          "tag:youtube.com,2008:video:VppEcVz8qaI", NULL, GDATA_TYPE_YOUTUBE_VIDEO,
Packit 4b6dd7
	                                          NULL, &error);
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
	g_assert (GDATA_IS_YOUTUBE_VIDEO (video));
Packit 4b6dd7
Packit 4b6dd7
	data->new_video2 = video;
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_batch (BatchData *data, gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataBatchOperation *operation;
Packit 4b6dd7
	GDataService *service2;
Packit 4b6dd7
	gchar *feed_uri;
Packit 4b6dd7
	guint op_id, op_id2;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "batch");
Packit 4b6dd7
Packit 4b6dd7
	/* Here we hardcode the feed URI, but it should really be extracted from a video feed, as the GDATA_LINK_BATCH link.
Packit 4b6dd7
	 * It looks like this feed is read-only, so we can only test querying. */
Packit 4b6dd7
	operation = gdata_batchable_create_operation (GDATA_BATCHABLE (service), gdata_youtube_service_get_primary_authorization_domain (),
Packit 4b6dd7
	                                              "https://gdata.youtube.com/feeds/api/videos/batch");
Packit 4b6dd7
Packit 4b6dd7
	/* Check the properties of the operation */
Packit 4b6dd7
	g_assert (gdata_batch_operation_get_service (operation) == service);
Packit 4b6dd7
	g_assert_cmpstr (gdata_batch_operation_get_feed_uri (operation), ==, "https://gdata.youtube.com/feeds/api/videos/batch");
Packit 4b6dd7
Packit 4b6dd7
	g_object_get (operation,
Packit 4b6dd7
	              "service", &service2,
Packit 4b6dd7
	              "feed-uri", &feed_uri,
Packit 4b6dd7
	              NULL);
Packit 4b6dd7
Packit 4b6dd7
	g_assert (service2 == service);
Packit 4b6dd7
	g_assert_cmpstr (feed_uri, ==, "https://gdata.youtube.com/feeds/api/videos/batch");
Packit 4b6dd7
Packit 4b6dd7
	g_object_unref (service2);
Packit 4b6dd7
	g_free (feed_uri);
Packit 4b6dd7
Packit 4b6dd7
	/* Run a singleton batch operation to query one of the entries. This
Packit 4b6dd7
	 * should now always fail, as batch operations were deprecated by v3
Packit 4b6dd7
	 * of the YouTube API. */
Packit 4b6dd7
	gdata_test_batch_operation_query (operation, gdata_entry_get_id (data->new_video), GDATA_TYPE_YOUTUBE_VIDEO, data->new_video, NULL, NULL);
Packit 4b6dd7
Packit 4b6dd7
	g_assert (!gdata_batch_operation_run (operation, NULL, &error));
Packit 4b6dd7
	g_assert_error (error, GDATA_SERVICE_ERROR,
Packit 4b6dd7
	                GDATA_SERVICE_ERROR_WITH_BATCH_OPERATION);
Packit 4b6dd7
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
	g_object_unref (operation);
Packit 4b6dd7
Packit 4b6dd7
	/* Run another batch operation to query the two entries */
Packit 4b6dd7
	operation = gdata_batchable_create_operation (GDATA_BATCHABLE (service), gdata_youtube_service_get_primary_authorization_domain (),
Packit 4b6dd7
	                                              "https://gdata.youtube.com/feeds/api/videos/batch");
Packit 4b6dd7
	op_id = gdata_test_batch_operation_query (operation, gdata_entry_get_id (data->new_video), GDATA_TYPE_YOUTUBE_VIDEO, data->new_video, NULL,
Packit 4b6dd7
	                                          NULL);
Packit 4b6dd7
	op_id2 = gdata_test_batch_operation_query (operation, gdata_entry_get_id (data->new_video2), GDATA_TYPE_YOUTUBE_VIDEO, data->new_video2, NULL,
Packit 4b6dd7
	                                           NULL);
Packit 4b6dd7
	g_assert_cmpuint (op_id, !=, op_id2);
Packit 4b6dd7
Packit 4b6dd7
	g_assert (!gdata_batch_operation_run (operation, NULL, &error));
Packit 4b6dd7
	g_assert_error (error, GDATA_SERVICE_ERROR,
Packit 4b6dd7
	                GDATA_SERVICE_ERROR_WITH_BATCH_OPERATION);
Packit 4b6dd7
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
	g_object_unref (operation);
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_batch_async_cb (GDataBatchOperation *operation, GAsyncResult *async_result, GMainLoop *main_loop)
Packit 4b6dd7
{
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	g_assert (!gdata_batch_operation_run_finish (operation, async_result, &error));
Packit 4b6dd7
	g_assert_error (error, GDATA_SERVICE_ERROR,
Packit 4b6dd7
	                GDATA_SERVICE_ERROR_WITH_BATCH_OPERATION);
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	g_main_loop_quit (main_loop);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_batch_async (BatchData *data, gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataBatchOperation *operation;
Packit 4b6dd7
	GMainLoop *main_loop;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "batch-async");
Packit 4b6dd7
Packit 4b6dd7
	/* Run an async query operation on the video */
Packit 4b6dd7
	operation = gdata_batchable_create_operation (GDATA_BATCHABLE (service), gdata_youtube_service_get_primary_authorization_domain (),
Packit 4b6dd7
	                                              "https://gdata.youtube.com/feeds/api/videos/batch");
Packit 4b6dd7
	gdata_test_batch_operation_query (operation, gdata_entry_get_id (data->new_video), GDATA_TYPE_YOUTUBE_VIDEO, data->new_video, NULL, &error);
Packit 4b6dd7
Packit 4b6dd7
	main_loop = g_main_loop_new (NULL, TRUE);
Packit 4b6dd7
Packit 4b6dd7
	gdata_batch_operation_run_async (operation, NULL, (GAsyncReadyCallback) test_batch_async_cb, main_loop);
Packit 4b6dd7
Packit 4b6dd7
	g_main_loop_run (main_loop);
Packit 4b6dd7
	g_main_loop_unref (main_loop);
Packit 4b6dd7
Packit 4b6dd7
	g_assert_error (error, GDATA_SERVICE_ERROR,
Packit 4b6dd7
	                GDATA_SERVICE_ERROR_WITH_BATCH_OPERATION);
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_batch_async_cancellation_cb (GDataBatchOperation *operation, GAsyncResult *async_result, GMainLoop *main_loop)
Packit 4b6dd7
{
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	g_assert (gdata_batch_operation_run_finish (operation, async_result, &error) == FALSE);
Packit 4b6dd7
	g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED);
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	g_main_loop_quit (main_loop);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
test_batch_async_cancellation (BatchData *data, gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataBatchOperation *operation;
Packit 4b6dd7
	GMainLoop *main_loop;
Packit 4b6dd7
	GCancellable *cancellable;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "batch-async-cancellation");
Packit 4b6dd7
Packit 4b6dd7
	/* Run an async query operation on the video */
Packit 4b6dd7
	operation = gdata_batchable_create_operation (GDATA_BATCHABLE (service), gdata_youtube_service_get_primary_authorization_domain (),
Packit 4b6dd7
	                                              "https://gdata.youtube.com/feeds/api/videos/batch");
Packit 4b6dd7
	gdata_test_batch_operation_query (operation, gdata_entry_get_id (data->new_video), GDATA_TYPE_YOUTUBE_VIDEO, data->new_video, NULL, &error);
Packit 4b6dd7
Packit 4b6dd7
	main_loop = g_main_loop_new (NULL, TRUE);
Packit 4b6dd7
	cancellable = g_cancellable_new ();
Packit 4b6dd7
Packit 4b6dd7
	gdata_batch_operation_run_async (operation, cancellable, (GAsyncReadyCallback) test_batch_async_cancellation_cb, main_loop);
Packit 4b6dd7
	g_cancellable_cancel (cancellable); /* this should cancel the operation before it even starts, as we haven't run the main loop yet */
Packit 4b6dd7
Packit 4b6dd7
	g_main_loop_run (main_loop);
Packit 4b6dd7
Packit 4b6dd7
	g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED);
Packit 4b6dd7
	g_clear_error (&error);
Packit 4b6dd7
Packit 4b6dd7
	g_main_loop_unref (main_loop);
Packit 4b6dd7
	g_object_unref (cancellable);
Packit 4b6dd7
	g_object_unref (operation);
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
teardown_batch (BatchData *data, gconstpointer service)
Packit 4b6dd7
{
Packit 4b6dd7
	g_object_unref (data->new_video);
Packit 4b6dd7
	g_object_unref (data->new_video2);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
mock_server_notify_resolver_cb (GObject *object, GParamSpec *pspec, gpointer user_data)
Packit 4b6dd7
{
Packit 4b6dd7
	UhmServer *server;
Packit 4b6dd7
	UhmResolver *resolver;
Packit 4b6dd7
Packit 4b6dd7
	server = UHM_SERVER (object);
Packit 4b6dd7
Packit 4b6dd7
	/* Set up the expected domain names here. This should technically be split up between
Packit 4b6dd7
	 * the different unit test suites, but that's too much effort. */
Packit 4b6dd7
	resolver = uhm_server_get_resolver (server);
Packit 4b6dd7
Packit 4b6dd7
	if (resolver != NULL) {
Packit 4b6dd7
		const gchar *ip_address = uhm_server_get_address (server);
Packit 4b6dd7
Packit 4b6dd7
		uhm_resolver_add_A (resolver, "www.google.com", ip_address);
Packit 4b6dd7
		uhm_resolver_add_A (resolver, "www.googleapis.com", ip_address);
Packit 4b6dd7
		uhm_resolver_add_A (resolver, "accounts.google.com",
Packit 4b6dd7
		                    ip_address);
Packit 4b6dd7
	}
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/* Set up a global GDataAuthorizer to be used for all the tests. Unfortunately,
Packit 4b6dd7
 * the YouTube API is limited to OAuth2 authorisation, so this requires user
Packit 4b6dd7
 * interaction when online.
Packit 4b6dd7
 *
Packit 4b6dd7
 * If not online, use a dummy authoriser. */
Packit 4b6dd7
static GDataAuthorizer *
Packit 4b6dd7
create_global_authorizer (void)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataOAuth2Authorizer *authorizer = NULL;  /* owned */
Packit 4b6dd7
	gchar *authentication_uri, *authorisation_code;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	/* If not online, just return a dummy authoriser. */
Packit 4b6dd7
	if (!uhm_server_get_enable_online (mock_server)) {
Packit 4b6dd7
		return GDATA_AUTHORIZER (gdata_dummy_authorizer_new (GDATA_TYPE_YOUTUBE_SERVICE));
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	/* Otherwise, go through the interactive OAuth dance. */
Packit 4b6dd7
	gdata_test_mock_server_start_trace (mock_server, "global-authentication");
Packit 4b6dd7
	authorizer = gdata_oauth2_authorizer_new (CLIENT_ID, CLIENT_SECRET,
Packit 4b6dd7
	                                          REDIRECT_URI,
Packit 4b6dd7
	                                          GDATA_TYPE_YOUTUBE_SERVICE);
Packit 4b6dd7
Packit 4b6dd7
	/* Get an authentication URI */
Packit 4b6dd7
	authentication_uri = gdata_oauth2_authorizer_build_authentication_uri (authorizer, NULL, FALSE);
Packit 4b6dd7
	g_assert (authentication_uri != NULL);
Packit 4b6dd7
Packit 4b6dd7
	/* Get the authorisation code off the user. */
Packit 4b6dd7
	authorisation_code = gdata_test_query_user_for_verifier (authentication_uri);
Packit 4b6dd7
Packit 4b6dd7
	g_free (authentication_uri);
Packit 4b6dd7
Packit 4b6dd7
	if (authorisation_code == NULL) {
Packit 4b6dd7
		/* Skip tests. */
Packit 4b6dd7
		g_object_unref (authorizer);
Packit 4b6dd7
		authorizer = NULL;
Packit 4b6dd7
		goto skip_test;
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	/* Authorise the token */
Packit 4b6dd7
	g_assert (gdata_oauth2_authorizer_request_authorization (authorizer,
Packit 4b6dd7
	                                                         authorisation_code,
Packit 4b6dd7
	                                                         NULL, &error));
Packit 4b6dd7
	g_assert_no_error (error);
Packit 4b6dd7
Packit 4b6dd7
skip_test:
Packit 4b6dd7
	g_free (authorisation_code);
Packit 4b6dd7
Packit 4b6dd7
	uhm_server_end_trace (mock_server);
Packit 4b6dd7
Packit 4b6dd7
	return GDATA_AUTHORIZER (authorizer);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
int
Packit 4b6dd7
main (int argc, char *argv[])
Packit 4b6dd7
{
Packit 4b6dd7
	gint retval;
Packit 4b6dd7
	GDataAuthorizer *authorizer = NULL;  /* owned */
Packit 4b6dd7
	GDataService *service = NULL;  /* owned */
Packit 4b6dd7
	GFile *trace_directory = NULL;  /* owned */
Packit 4b6dd7
	gchar *path = NULL;
Packit 4b6dd7
Packit 4b6dd7
	gdata_test_init (argc, argv);
Packit 4b6dd7
Packit 4b6dd7
	mock_server = gdata_test_get_mock_server ();
Packit 4b6dd7
	g_signal_connect (G_OBJECT (mock_server), "notify::resolver",
Packit 4b6dd7
	                  (GCallback) mock_server_notify_resolver_cb, NULL);
Packit 4b6dd7
	path = g_test_build_filename (G_TEST_DIST, "traces/youtube", NULL);
Packit 4b6dd7
	trace_directory = g_file_new_for_path (path);
Packit 4b6dd7
	g_free (path);
Packit 4b6dd7
	uhm_server_set_trace_directory (mock_server, trace_directory);
Packit 4b6dd7
	g_object_unref (trace_directory);
Packit 4b6dd7
Packit 4b6dd7
	authorizer = create_global_authorizer ();
Packit 4b6dd7
	service = GDATA_SERVICE (gdata_youtube_service_new (DEVELOPER_KEY,
Packit 4b6dd7
	                                                    authorizer));
Packit 4b6dd7
Packit 4b6dd7
	g_test_add_func ("/youtube/authentication", test_authentication);
Packit 4b6dd7
Packit 4b6dd7
	g_test_add_data_func ("/youtube/query/standard_feeds", service, test_query_standard_feeds);
Packit 4b6dd7
	g_test_add_data_func ("/youtube/query/standard_feed", service, test_query_standard_feed);
Packit 4b6dd7
	g_test_add_data_func ("/youtube/query/standard_feed/with_query", service, test_query_standard_feed_with_query);
Packit 4b6dd7
	g_test_add_data_func ("/youtube/query/standard_feed/error", service, test_query_standard_feed_error);
Packit 4b6dd7
	g_test_add_data_func ("/youtube/query/standard_feed/timeout", service, test_query_standard_feed_timeout);
Packit 4b6dd7
	g_test_add ("/youtube/query/standard_feed/async", StandardFeedData,
Packit 4b6dd7
	            service, set_up_standard_feed_async,
Packit 4b6dd7
	            (void (*)(StandardFeedData *, const void *)) test_query_standard_feed_async,
Packit 4b6dd7
	            tear_down_standard_feed_async);
Packit 4b6dd7
	g_test_add_data_func ("/youtube/query/standard_feed/async/progress_closure", service, test_query_standard_feed_async_progress_closure);
Packit 4b6dd7
	g_test_add ("/youtube/query/standard_feed/async/cancellation",
Packit 4b6dd7
	            StandardFeedData, service, set_up_standard_feed_async,
Packit 4b6dd7
	            (void (*)(StandardFeedData *, const void *)) test_query_standard_feed_async_cancellation,
Packit 4b6dd7
	            tear_down_standard_feed_async);
Packit 4b6dd7
Packit 4b6dd7
	g_test_add_data_func ("/youtube/query/related", service, test_query_related);
Packit 4b6dd7
	g_test_add ("/youtube/query/related/async", GDataAsyncTestData, service, gdata_set_up_async_test_data, test_query_related_async,
Packit 4b6dd7
	            gdata_tear_down_async_test_data);
Packit 4b6dd7
	g_test_add_data_func ("/youtube/query/related/async/progress_closure", service, test_query_related_async_progress_closure);
Packit 4b6dd7
	g_test_add ("/youtube/query/related/async/cancellation", GDataAsyncTestData, service, gdata_set_up_async_test_data,
Packit 4b6dd7
	            test_query_related_async_cancellation, gdata_tear_down_async_test_data);
Packit 4b6dd7
Packit 4b6dd7
	g_test_add ("/youtube/upload/simple", UploadData, service, set_up_upload, test_upload_simple, tear_down_upload);
Packit 4b6dd7
	g_test_add ("/youtube/upload/async", GDataAsyncTestData, service, set_up_upload_async, test_upload_async, tear_down_upload_async);
Packit 4b6dd7
	g_test_add ("/youtube/upload/async/cancellation", GDataAsyncTestData, service, set_up_upload_async, test_upload_async_cancellation,
Packit 4b6dd7
	            tear_down_upload_async);
Packit 4b6dd7
Packit 4b6dd7
	g_test_add_data_func ("/youtube/query/single", service, test_query_single);
Packit 4b6dd7
	g_test_add ("/youtube/query/single/async", GDataAsyncTestData, service, gdata_set_up_async_test_data, test_query_single_async,
Packit 4b6dd7
	            gdata_tear_down_async_test_data);
Packit 4b6dd7
	g_test_add ("/youtube/query/single/async/cancellation", GDataAsyncTestData, service, gdata_set_up_async_test_data,
Packit 4b6dd7
	            test_query_single_async_cancellation, gdata_tear_down_async_test_data);
Packit 4b6dd7
Packit 4b6dd7
	g_test_add ("/youtube/comment/query", CommentData, service, set_up_comment, test_comment_query, tear_down_comment);
Packit 4b6dd7
	g_test_add ("/youtube/comment/query/async", GDataAsyncTestData, service, set_up_comment_async, test_comment_query_async,
Packit 4b6dd7
	            tear_down_comment_async);
Packit 4b6dd7
	g_test_add ("/youtube/comment/query/async/cancellation", GDataAsyncTestData, service, set_up_comment_async,
Packit 4b6dd7
	            test_comment_query_async_cancellation, tear_down_comment_async);
Packit 4b6dd7
	g_test_add ("/youtube/comment/query/async/progress_closure", CommentData, service, set_up_comment,
Packit 4b6dd7
	            test_comment_query_async_progress_closure, tear_down_comment);
Packit 4b6dd7
Packit 4b6dd7
	g_test_add ("/youtube/comment/insert", InsertCommentData, service, set_up_insert_comment, test_comment_insert,
Packit 4b6dd7
	            tear_down_insert_comment);
Packit 4b6dd7
	g_test_add ("/youtube/comment/insert/async", GDataAsyncTestData, service, set_up_insert_comment_async, test_comment_insert_async,
Packit 4b6dd7
	            tear_down_insert_comment_async);
Packit 4b6dd7
	g_test_add ("/youtube/comment/insert/async/cancellation", GDataAsyncTestData, service, set_up_insert_comment_async,
Packit 4b6dd7
	            test_comment_insert_async_cancellation, tear_down_insert_comment_async);
Packit 4b6dd7
Packit 4b6dd7
	g_test_add ("/youtube/comment/delete", InsertCommentData, service, set_up_insert_comment, test_comment_delete,
Packit 4b6dd7
	            tear_down_insert_comment);
Packit 4b6dd7
	g_test_add ("/youtube/comment/delete/async", GDataAsyncTestData, service, set_up_insert_comment_async, test_comment_delete_async,
Packit 4b6dd7
	            tear_down_insert_comment_async);
Packit 4b6dd7
	g_test_add ("/youtube/comment/delete/async/cancellation", GDataAsyncTestData, service, set_up_insert_comment_async,
Packit 4b6dd7
	            test_comment_delete_async_cancellation, tear_down_insert_comment_async);
Packit 4b6dd7
Packit 4b6dd7
	g_test_add_data_func ("/youtube/categories", service, test_categories);
Packit 4b6dd7
	g_test_add ("/youtube/categories/async", GDataAsyncTestData, service, gdata_set_up_async_test_data, test_categories_async,
Packit 4b6dd7
	            gdata_tear_down_async_test_data);
Packit 4b6dd7
	g_test_add ("/youtube/categories/async/cancellation", GDataAsyncTestData, service, gdata_set_up_async_test_data,
Packit 4b6dd7
	            test_categories_async_cancellation, gdata_tear_down_async_test_data);
Packit 4b6dd7
Packit 4b6dd7
	g_test_add ("/youtube/batch", BatchData, service, setup_batch, test_batch, teardown_batch);
Packit 4b6dd7
	g_test_add ("/youtube/batch/async", BatchData, service, setup_batch, test_batch_async, teardown_batch);
Packit 4b6dd7
	g_test_add ("/youtube/batch/async/cancellation", BatchData, service, setup_batch, test_batch_async_cancellation, teardown_batch);
Packit 4b6dd7
Packit 4b6dd7
	g_test_add_func ("/youtube/service/properties", test_service_properties);
Packit 4b6dd7
Packit 4b6dd7
	g_test_add_func ("/youtube/parsing/app:control", test_parsing_app_control);
Packit 4b6dd7
	g_test_add_func ("/youtube/parsing/yt:recorded", test_parsing_yt_recorded);
Packit 4b6dd7
	g_test_add_func ("/youtube/parsing/yt:accessControl", test_parsing_yt_access_control);
Packit 4b6dd7
	g_test_add_func ("/youtube/parsing/yt:category", test_parsing_yt_category);
Packit 4b6dd7
	g_test_add_func ("/youtube/parsing/video_id_from_uri", test_parsing_video_id_from_uri);
Packit 4b6dd7
	g_test_add_func ("/youtube/parsing/georss:where", test_parsing_georss_where);
Packit 4b6dd7
	g_test_add_func ("/youtube/parsing/ratings", test_parsing_ratings);
Packit 4b6dd7
Packit 4b6dd7
	g_test_add_func ("/youtube/video/escaping", test_video_escaping);
Packit 4b6dd7
	g_test_add_func ("/youtube/video/location", test_video_location);
Packit 4b6dd7
Packit 4b6dd7
	g_test_add_func ("/youtube/comment/get_json", test_comment_get_json);
Packit 4b6dd7
	g_test_add_func ("/youtube/comment/properties/parent-comment-id", test_comment_properties_parent_comment_uri);
Packit 4b6dd7
Packit 4b6dd7
	g_test_add_func ("/youtube/query/uri", test_query_uri);
Packit 4b6dd7
	g_test_add_func ("/youtube/query/etag", test_query_etag);
Packit 4b6dd7
Packit 4b6dd7
	retval = g_test_run ();
Packit 4b6dd7
Packit 4b6dd7
	g_clear_object (&service);
Packit 4b6dd7
	g_clear_object (&authorizer);
Packit 4b6dd7
Packit 4b6dd7
	return retval;
Packit 4b6dd7
}