def test_analyze_directory(self, list_files_mock, rsync_factory_mock, tmpdir): """ Unit test for RsyncCopyController._analyze_directory's code """ # Build file list for ref ref_list = [ _FileItem( 'drwxrwxrwt', 69632, datetime(year=2015, month=2, day=9, hour=15, minute=1, second=0, tzinfo=dateutil.tz.tzlocal()), '.'), _FileItem( 'drwxrwxrwt', 69612, datetime(year=2015, month=2, day=19, hour=15, minute=1, second=22, tzinfo=dateutil.tz.tzlocal()), 'tmp'), _FileItem( '-rw-r--r--', 69632, datetime(year=2015, month=2, day=20, hour=18, minute=15, second=33, tzinfo=dateutil.tz.tzlocal()), 'tmp/safe'), _FileItem( '-rw-r--r--', 69612, datetime(year=2015, month=2, day=20, hour=19, minute=15, second=33, tzinfo=dateutil.tz.tzlocal()), 'tmp/check'), _FileItem( '-rw-r--r--', 69612, datetime(year=2015, month=2, day=20, hour=19, minute=15, second=33, tzinfo=dateutil.tz.tzlocal()), 'tmp/diff_time'), _FileItem( '-rw-r--r--', 69612, datetime(year=2015, month=2, day=20, hour=19, minute=15, second=33, tzinfo=dateutil.tz.tzlocal()), 'tmp/diff_size'), ] # Build the list for source adding a new file, ... src_list = ref_list + [ _FileItem( '-rw-r--r--', 69612, datetime(year=2015, month=2, day=20, hour=22, minute=15, second=33, tzinfo=dateutil.tz.tzlocal()), 'tmp/new'), ] # ... changing the timestamp one old file ... src_list[4] = _FileItem( '-rw-r--r--', 69612, datetime(year=2015, month=2, day=20, hour=20, minute=15, second=33, tzinfo=dateutil.tz.tzlocal()), 'tmp/diff_time') # ... and changing the size of another src_list[5] = _FileItem( '-rw-r--r--', 77777, datetime(year=2015, month=2, day=20, hour=19, minute=15, second=33, tzinfo=dateutil.tz.tzlocal()), 'tmp/diff_size') # Apply it to _list_files calls list_files_mock.side_effect = [ref_list, src_list] # Build the prerequisites server = build_real_server( global_conf={'barman_home': tmpdir.mkdir('home').strpath}) config = server.config executor = server.backup_manager.executor # Create the RsyncCopyController putting the safe_horizon between # the tmp/safe and tmp2/check timestamps rcc = RsyncCopyController( path=server.path, ssh_command=executor.ssh_command, ssh_options=executor.ssh_options, network_compression=config.network_compression, reuse_backup=None, safe_horizon=datetime(year=2015, month=2, day=20, hour=19, minute=0, second=0, tzinfo=dateutil.tz.tzlocal())) backup_info = build_test_backup_info( server=server, pgdata="/pg/data", config_file="/etc/postgresql.conf", hba_file="/pg/data/pg_hba.conf", ident_file="/pg/data/pg_ident.conf", begin_xlog="0/2000028", begin_wal="000000010000000000000002", begin_offset=28) backup_info.save() # This is to check that all the preparation is done correctly assert os.path.exists(backup_info.filename) # Add a temp dir (usually created by copy method rcc.temp_dir = tmpdir.mkdir('tmp').strpath # Create an item to inspect item = _RsyncCopyItem(label='pgdata', src=':/pg/data/', dst=backup_info.get_data_directory(), is_directory=True, item_class=rcc.PGDATA_CLASS, optional=False) # Then run the _analyze_directory method rcc._analyze_directory(item) # Verify that _rsync_factory has been called correctly assert rsync_factory_mock.mock_calls == [ mock.call(item), ] # Verify that _list_files has been called correctly assert list_files_mock.mock_calls == [ mock.call(rsync_factory_mock.return_value, backup_info.get_data_directory() + '/'), mock.call(rsync_factory_mock.return_value, ':/pg/data/') ] # Check the result # 1) The list of directories should be there and should contain all # the directories assert item.dir_file assert open(item.dir_file).read() == ('.\n' 'tmp\n') # The exclude_and_protect file should be populated correctly with all # the files in the source assert item.exclude_and_protect_file assert open( item.exclude_and_protect_file).read() == ('P tmp/safe\n' '- tmp/safe\n' 'P tmp/check\n' '- tmp/check\n' 'P tmp/diff_time\n' '- tmp/diff_time\n' 'P tmp/diff_size\n' '- tmp/diff_size\n' 'P tmp/new\n' '- tmp/new\n') # The check list must contain identical files after the safe_horizon assert len(item.check_list) == 1 assert item.check_list[0].path == 'tmp/check' # The safe list must contain every file that is not in check and is # present in the source assert len(item.safe_list) == 4 assert item.safe_list[0].path == 'tmp/safe' assert item.safe_list[1].path == 'tmp/diff_time' assert item.safe_list[2].path == 'tmp/diff_size' assert item.safe_list[3].path == 'tmp/new'
def _run_analyze_directory(self, list_files_mock, tmpdir, ref_list, src_list): # Apply it to _list_files calls list_files_mock.side_effect = [ref_list, src_list] # Build the prerequisites server = build_real_server( global_conf={"barman_home": tmpdir.mkdir("home").strpath}) config = server.config executor = server.backup_manager.executor # Create the RsyncCopyController putting the safe_horizon between # the tmp/safe and tmp2/check timestamps rcc = RsyncCopyController( path=server.path, ssh_command=executor.ssh_command, ssh_options=executor.ssh_options, network_compression=config.network_compression, reuse_backup=None, safe_horizon=datetime( year=2015, month=2, day=20, hour=19, minute=0, second=0, tzinfo=dateutil.tz.tzlocal(), ), ) backup_info = build_test_backup_info( server=server, pgdata="/pg/data", config_file="/etc/postgresql.conf", hba_file="/pg/data/pg_hba.conf", ident_file="/pg/data/pg_ident.conf", begin_xlog="0/2000028", begin_wal="000000010000000000000002", begin_offset=28, ) backup_info.save() # This is to check that all the preparation is done correctly assert os.path.exists(backup_info.filename) # Add a temp dir (usually created by copy method rcc.temp_dir = tmpdir.mkdir("tmp").strpath # Create an item to inspect item = _RsyncCopyItem( label="pgdata", src=":/pg/data/", dst=backup_info.get_data_directory(), is_directory=True, item_class=rcc.PGDATA_CLASS, optional=False, ) # Then run the _analyze_directory method rcc._analyze_directory(item) return item, backup_info