import unittest
from gradio import networking
from gradio import inputs
from gradio import outputs
import socket
import tempfile
import os
import json


class TestGetAvailablePort(unittest.TestCase):
    def test_get_first_available_port_by_blocking_port(self):
        initial = 7000
        final = 8000
        port_found = False
        for port in range(initial, final):
            try:
                s = socket.socket()  # create a socket object
                s.bind((networking.LOCALHOST_NAME, port))  # Bind to the port
                s.close()
                port_found = True
                break
            except OSError:
                pass
        if port_found:
            s = socket.socket()  # create a socket object
            s.bind((networking.LOCALHOST_NAME, port))  # Bind to the port
            new_port = networking.get_first_available_port(initial, final)
            s.close()
        self.assertFalse(port == new_port)


# class TestSetSampleData(unittest.TestCase):
    # def test_set_sample_data(self):
    #     test_array = ["test1", "test2", "test3"]
    #     temp_dir = tempfile.mkdtemp()
    #     inp = inputs.Sketchpad()
    #     out = outputs.Label()
    #     networking.build_template(temp_dir, inp, out)
    #     networking.set_sample_data_in_config_file(temp_dir, test_array)
    #     # We need to come up with a better way so that the config file isn't invalid json unless
    #     # the following parameters are set... (TODO: abidlabs)
    #     networking.set_always_flagged_in_config_file(temp_dir, False)
    #     networking.set_disabled_in_config_file(temp_dir, False)
    #     config_file = os.path.join(temp_dir, 'static/config.json')
    #     with open(config_file) as json_file:
    #         data = json.load(json_file)
    #         self.assertTrue(test_array == data["sample_inputs"])

# class TestCopyFiles(unittest.TestCase):
#     def test_copy_files(self):
#         filename = "a.txt"
#         with tempfile.TemporaryDirectory() as temp_src:
#             with open(os.path.join(temp_src, "a.txt"), "w+") as f:
#                 f.write('Hi')
#             with tempfile.TemporaryDirectory() as temp_dest:
#                 self.assertFalse(os.path.exists(os.path.join(temp_dest, filename)))
#                 networking.copy_files(temp_src, temp_dest)
#                 self.assertTrue(os.path.exists(os.path.join(temp_dest, filename)))


if __name__ == '__main__':
    unittest.main()