file_version = int(file_version_line[0].split(" ")[-1])
    file_id_hex = file_id_line[0].split(" ")[-1]
    if len(file_id_hex) != 16:
        file_id_hex = ("0" * (16 - len(file_id_hex))) + file_id_hex

    file_id_hex_parts = []
    for i in xrange(0, 4):
        file_id_hex_parts.append( file_id_hex[4*i] + file_id_hex[4*i+1] + file_id_hex[4*i+2] + file_id_hex[4*i+3] )

    # expected built-in attr for cached file data
    gateway_info = testlib.read_gateway( config_dir, gateway_name )
    getxattr_gateway_info = testlib.read_gateway( config_dir, getxattr_gateway_name )
    gateway_coord_id = gateway_info['g_id']
    getxattr_gateway_id = getxattr_gateway_info['g_id']
    volume_info = testlib.read_volume( config_dir, volume_name )
    file_cache_path = os.path.join( testlib.cache_dir( config_dir, volume_info['volume_id'], getxattr_gateway_id ), "/".join(file_id_hex_parts)) + "." + file_id_hex + "." + str(file_version)
    builtin_xattr_expected_values["user.syndicate_coordinator"] = gateway_name
    builtin_xattr_expected_values["user.syndicate_cached_file_path"] = file_cache_path

    # leave this gateway running, so it can answer xattr queries 
    ug_proc, ug_out_path = testlib.start_gateway( config_dir, COORD_PATH, testconf.SYNDICATE_ADMIN, volume_name, gateway_name, path, valgrind=True ) 
    time.sleep(5)

    # get built-in xattrs, individually, with the getxattr gateway
    for builtin_xattr in builtin_xattrs:
        exitcode, out = testlib.run( GETXATTR_PATH, '-d2', '-f', '-c', os.path.join(config_dir, 'syndicate.conf'),
                                     '-u', testconf.SYNDICATE_ADMIN, '-v', volume_name, '-g', getxattr_gateway_name,
                                     path, builtin_xattr )

        testlib.save_output( output_dir, "syndicate-getxattr-%s" % builtin_xattr, out )
        if exitcode != 0:
        # try going back and forth a few times
        repl_cmd += "rename %s %s\n" % (input_path, output_path)
       
    for i in xrange(0, NUM_FILES):
        output_path_samedir = output_paths[i] + "-renamed"
        output_path_newdir = "/newdir/" + output_paths[i] + "-renamed"
        path = None
        
        # select the correct path to read, based on the above generation
        if i % 2 == 0:
            path = output_path_samedir
        else:
            path = output_path_newdir

        # clear cache
        read_cache_dir = testlib.cache_dir( config_dir, volume_id, cat_gateway_id )
        rg_cache_dir = testlib.cache_dir( config_dir, volume_id, rg_gateway_id )

        repl_cmd += "shell rm -rf %s\n" % read_cache_dir
        repl_cmd += "shell rm -rf %s\n" % rg_cache_dir

        # open and read in full
        repl_cmd += "open %s 2\n" % path
        repl_cmd += "read 0 0 %s\n" % len(expected_data)
        repl_cmd += "close 0\n"

    
    print "\n".join( ["< %s" % l[:min(80, len(l))] + "..."[:min(max(0, len(l)-80), 3)] for l in repl_cmd.split("\n")] )

    # open the syndicate REPL
    ug_proc, ug_out_path = testlib.start_gateway( config_dir, REPL_PATH, testconf.SYNDICATE_ADMIN, volume_name, gateway_name, valgrind=True, stdin=True)
        # try going back and forth a few times
        repl_cmd += "rename %s %s\n" % (input_path, output_path)

    for i in xrange(0, NUM_FILES):
        output_path_samedir = output_paths[i] + "-renamed"
        output_path_newdir = "/newdir/" + output_paths[i] + "-renamed"
        path = None

        # select the correct path to read, based on the above generation
        if i % 2 == 0:
            path = output_path_samedir
        else:
            path = output_path_newdir

        # clear cache
        read_cache_dir = testlib.cache_dir(config_dir, volume_id,
                                           cat_gateway_id)
        rg_cache_dir = testlib.cache_dir(config_dir, volume_id, rg_gateway_id)

        repl_cmd += "shell rm -rf %s\n" % read_cache_dir
        repl_cmd += "shell rm -rf %s\n" % rg_cache_dir

        # open and read in full
        repl_cmd += "open %s 2\n" % path
        repl_cmd += "read 0 0 %s\n" % len(expected_data)
        repl_cmd += "close 0\n"

    print "\n".join([
        "< %s" % l[:min(80, len(l))] + "..."[:min(max(0,
                                                      len(l) - 80), 3)]
        for l in repl_cmd.split("\n")
    ])
    file_id_hex_parts = []
    for i in xrange(0, 4):
        file_id_hex_parts.append(file_id_hex[4 * i] + file_id_hex[4 * i + 1] +
                                 file_id_hex[4 * i + 2] +
                                 file_id_hex[4 * i + 3])

    # expected built-in attr for cached file data
    gateway_info = testlib.read_gateway(config_dir, gateway_name)
    getxattr_gateway_info = testlib.read_gateway(config_dir,
                                                 getxattr_gateway_name)
    gateway_coord_id = gateway_info['g_id']
    getxattr_gateway_id = getxattr_gateway_info['g_id']
    volume_info = testlib.read_volume(config_dir, volume_name)
    file_cache_path = os.path.join(
        testlib.cache_dir(config_dir, volume_info['volume_id'],
                          getxattr_gateway_id), "/".join(file_id_hex_parts)
    ) + "." + file_id_hex + "." + str(file_version)
    builtin_xattr_expected_values["user.syndicate_coordinator"] = gateway_name
    builtin_xattr_expected_values[
        "user.syndicate_cached_file_path"] = file_cache_path

    # leave this gateway running, so it can answer xattr queries
    ug_proc, ug_out_path = testlib.start_gateway(config_dir,
                                                 COORD_PATH,
                                                 testconf.SYNDICATE_ADMIN,
                                                 volume_name,
                                                 gateway_name,
                                                 path,
                                                 valgrind=True)
    time.sleep(5)