2017-09-22 14:49:30 +03:00
/*
2017-09-21 22:22:09 +03:00
* Copyright © 2017 Endless Mobile , Inc .
*
2018-01-30 22:26:26 +03:00
* SPDX - License - Identifier : LGPL - 2.0 +
*
2017-09-21 22:22:09 +03:00
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
* version 2 of the License , or ( at your option ) any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library ; if not , write to the
* Free Software Foundation , Inc . , 59 Temple Place - Suite 330 ,
* Boston , MA 02111 - 1307 , USA .
*
* Authors :
* - Philip Withnall < withnall @ endlessm . com >
*/
# include "config.h"
# include <gio/gio.h>
# include <glib.h>
# include <glib-object.h>
# include <libglnx.h>
# include <locale.h>
# include "ostree-autocleanups.h"
# include "ostree-types.h"
/* Test fixture. Creates a temporary directory. */
typedef struct
{
GLnxTmpDir tmpdir ; /* (owned) */
} Fixture ;
static void
setup ( Fixture * fixture ,
gconstpointer test_data )
{
g_autoptr ( GError ) error = NULL ;
( void ) glnx_mkdtemp ( " test-repo-XXXXXX " , 0700 , & fixture - > tmpdir , & error ) ;
g_assert_no_error ( error ) ;
g_test_message ( " Using temporary directory: %s " , fixture - > tmpdir . path ) ;
}
static void
teardown ( Fixture * fixture ,
gconstpointer test_data )
{
/* Recursively remove the temporary directory. */
( void ) glnx_tmpdir_delete ( & fixture - > tmpdir , NULL , NULL ) ;
}
/* Test that the hash values for two #OstreeRepo instances pointing at the same
* repository are equal . We can ’ t test anything else , since hash collisions are
* always a possibility . */
static void
test_repo_hash ( Fixture * fixture ,
gconstpointer test_data )
{
g_autoptr ( GError ) error = NULL ;
g_autoptr ( OstreeRepo ) repo1 = ostree_repo_create_at ( fixture - > tmpdir . fd , " . " ,
2017-09-22 14:08:01 +03:00
OSTREE_REPO_MODE_ARCHIVE ,
2017-09-21 22:22:09 +03:00
NULL ,
NULL , & error ) ;
g_assert_no_error ( error ) ;
g_autoptr ( OstreeRepo ) repo2 = ostree_repo_open_at ( fixture - > tmpdir . fd , " . " ,
NULL , & error ) ;
g_assert_no_error ( error ) ;
g_assert_cmpuint ( ostree_repo_hash ( repo1 ) , = = , ostree_repo_hash ( repo2 ) ) ;
}
/* Test that trying to hash a closed repo results in an assertion failure. */
static void
test_repo_hash_closed ( Fixture * fixture ,
gconstpointer test_data )
{
if ( g_test_subprocess ( ) )
{
g_autoptr ( GFile ) repo_path = g_file_new_for_path ( fixture - > tmpdir . path ) ;
g_autoptr ( OstreeRepo ) repo = ostree_repo_new ( repo_path ) ;
ostree_repo_hash ( repo ) ;
return ;
}
g_test_trap_subprocess ( NULL , 0 , 0 ) ;
g_test_trap_assert_failed ( ) ;
g_test_trap_assert_stderr ( " *ERROR*ostree_repo_hash: assertion failed:* " ) ;
}
/* Test that various repositories test equal (or not) with each other. */
static void
test_repo_equal ( Fixture * fixture ,
gconstpointer test_data )
{
g_autoptr ( GError ) error = NULL ;
/* Create a few separate repos and some #OstreeRepo objects for them. */
glnx_ensure_dir ( fixture - > tmpdir . fd , " repo1 " , 0755 , & error ) ;
g_assert_no_error ( error ) ;
glnx_ensure_dir ( fixture - > tmpdir . fd , " repo2 " , 0755 , & error ) ;
g_assert_no_error ( error ) ;
g_autoptr ( OstreeRepo ) repo1 = ostree_repo_create_at ( fixture - > tmpdir . fd , " repo1 " ,
2017-09-22 14:08:01 +03:00
OSTREE_REPO_MODE_ARCHIVE ,
2017-09-21 22:22:09 +03:00
NULL ,
NULL , & error ) ;
g_assert_no_error ( error ) ;
g_autoptr ( OstreeRepo ) repo1_alias = ostree_repo_open_at ( fixture - > tmpdir . fd , " repo1 " ,
NULL , & error ) ;
g_assert_no_error ( error ) ;
g_autoptr ( OstreeRepo ) repo2 = ostree_repo_create_at ( fixture - > tmpdir . fd , " repo2 " ,
2017-09-22 14:08:01 +03:00
OSTREE_REPO_MODE_ARCHIVE ,
2017-09-21 22:22:09 +03:00
NULL ,
NULL , & error ) ;
g_assert_no_error ( error ) ;
g_autoptr ( GFile ) closed_repo_path = g_file_new_for_path ( fixture - > tmpdir . path ) ;
g_autoptr ( OstreeRepo ) closed_repo = ostree_repo_new ( closed_repo_path ) ;
/* Test various equalities. */
g_assert_true ( ostree_repo_equal ( repo1 , repo1 ) ) ;
g_assert_true ( ostree_repo_equal ( repo1_alias , repo1_alias ) ) ;
g_assert_true ( ostree_repo_equal ( repo1 , repo1_alias ) ) ;
g_assert_true ( ostree_repo_equal ( repo1_alias , repo1 ) ) ;
g_assert_true ( ostree_repo_equal ( repo2 , repo2 ) ) ;
g_assert_false ( ostree_repo_equal ( repo1 , repo2 ) ) ;
g_assert_false ( ostree_repo_equal ( repo1_alias , repo2 ) ) ;
g_assert_false ( ostree_repo_equal ( repo2 , repo1 ) ) ;
g_assert_false ( ostree_repo_equal ( repo2 , repo1_alias ) ) ;
g_assert_false ( ostree_repo_equal ( repo1 , closed_repo ) ) ;
g_assert_false ( ostree_repo_equal ( repo1_alias , closed_repo ) ) ;
g_assert_false ( ostree_repo_equal ( closed_repo , repo1 ) ) ;
g_assert_false ( ostree_repo_equal ( closed_repo , repo1_alias ) ) ;
g_assert_false ( ostree_repo_equal ( repo2 , closed_repo ) ) ;
g_assert_false ( ostree_repo_equal ( closed_repo , repo2 ) ) ;
g_assert_false ( ostree_repo_equal ( closed_repo , closed_repo ) ) ;
}
2018-08-31 17:50:23 +03:00
static void
test_repo_get_min_free_space ( Fixture * fixture ,
gconstpointer test_data )
{
g_autoptr ( GKeyFile ) config = NULL ;
g_autoptr ( GError ) error = NULL ;
2018-09-14 17:52:37 +03:00
guint64 bytes = 0 ;
2018-08-31 17:50:23 +03:00
typedef struct
{
const char * val ;
gboolean should_succeed ;
} min_free_space_value ;
g_autoptr ( OstreeRepo ) repo = ostree_repo_create_at ( fixture - > tmpdir . fd , " . " ,
OSTREE_REPO_MODE_ARCHIVE ,
NULL ,
NULL , & error ) ;
g_assert_no_error ( error ) ;
min_free_space_value values_to_test [ ] = {
{ " 500MB " , TRUE } ,
{ " 0MB " , TRUE } ,
{ " 17179869185GB " , FALSE } , /* Overflow parameter: bytes > G_MAXUINT64 */
{ NULL , FALSE }
} ;
config = ostree_repo_copy_config ( repo ) ;
for ( guint i = 0 ; values_to_test [ i ] . val ! = NULL ; i + + )
{
g_key_file_remove_key ( config , " core " , " min-free-space-size " , NULL ) ;
g_key_file_set_string ( config , " core " , " min-free-space-size " , values_to_test [ i ] . val ) ;
ostree_repo_write_config ( repo , config , & error ) ;
g_assert_no_error ( error ) ;
ostree_repo_reload_config ( repo , NULL , & error ) ;
g_assert_no_error ( error ) ;
2018-09-14 17:52:37 +03:00
ostree_repo_get_min_free_space_bytes ( repo , & bytes , & error ) ;
2018-08-31 17:50:23 +03:00
if ( values_to_test [ i ] . should_succeed )
g_assert_no_error ( error ) ;
else
continue ;
}
}
2017-09-21 22:22:09 +03:00
int
main ( int argc ,
char * * argv )
{
setlocale ( LC_ALL , " " ) ;
g_test_init ( & argc , & argv , NULL ) ;
g_test_add ( " /repo/hash " , Fixture , NULL , setup ,
test_repo_hash , teardown ) ;
g_test_add ( " /repo/hash/closed " , Fixture , NULL , setup ,
test_repo_hash_closed , teardown ) ;
g_test_add ( " /repo/equal " , Fixture , NULL , setup ,
test_repo_equal , teardown ) ;
2018-08-31 17:50:23 +03:00
g_test_add ( " /repo/get_min_free_space " , Fixture , NULL , setup ,
test_repo_get_min_free_space , teardown ) ;
2017-09-21 22:22:09 +03:00
return g_test_run ( ) ;
}