#!/usr/bin/env python3

from test_framework.test_framework import TestFramework
from utility.utils import wait_until

class AutoSyncHistoricalTest(TestFramework):
    def setup_params(self):
        self.num_nodes = 4

        # Enable auto sync
        for i in range(self.num_nodes):
            self.zgs_node_configs[i] = {
                "sync": {
                    "auto_sync_enabled": True
                }
            }

    def run_test(self):
        # Stop the last node to verify historical file sync
        self.stop_storage_node(self.num_nodes - 1)

        # Submit and upload files on node 0
        data_root_1 = self.__upload_file__(0, 256 * 1024)
        data_root_2 = self.__upload_file__(0, 256 * 1024)

        # Files should be available on other nodes via auto sync
        for i in range(1, self.num_nodes - 1):
            wait_until(lambda: self.nodes[i].zgs_get_file_info(data_root_1) is not None)
            wait_until(lambda: self.nodes[i].zgs_get_file_info(data_root_1)["finalized"])
            wait_until(lambda: self.nodes[i].zgs_get_file_info(data_root_2) is not None)
            wait_until(lambda: self.nodes[i].zgs_get_file_info(data_root_2)["finalized"])

        # Start the last node to verify historical file sync
        self.start_storage_node(self.num_nodes - 1)
        self.nodes[self.num_nodes - 1].wait_for_rpc_connection()
        wait_until(lambda: self.nodes[self.num_nodes - 1].zgs_get_file_info(data_root_1) is not None)
        wait_until(lambda: self.nodes[self.num_nodes - 1].zgs_get_file_info(data_root_1)["finalized"])
        wait_until(lambda: self.nodes[self.num_nodes - 1].zgs_get_file_info(data_root_2) is not None)
        wait_until(lambda: self.nodes[self.num_nodes - 1].zgs_get_file_info(data_root_2)["finalized"])

if __name__ == "__main__":
    AutoSyncHistoricalTest().main()