def test_create_backend_raises_error_if_etcd_is_unreachable(self) -> None:
        self._params.endpoint = "dummy:1234"

        with self.assertRaisesRegex(
                RendezvousConnectionError,
                r"^The connection to etcd has failed. See inner exception for details.$",
        ):
            create_backend(self._params)
    def test_create_backend_raises_error_if_read_timeout_is_invalid(
            self) -> None:
        for read_timeout in ["0", "-10"]:
            with self.subTest(read_timeout=read_timeout):
                self._params.config["read_timeout"] = read_timeout

                with self.assertRaisesRegex(
                        ValueError,
                        r"^The read timeout must be a positive integer.$"):
                    create_backend(self._params)
    def test_create_backend_returns_backend(self) -> None:
        backend, store = create_backend(self._params)

        self.assertEqual(backend.name, "etcd-v2")

        self.assertIsInstance(store, EtcdStore)

        etcd_store = cast(EtcdStore, store)

        self.assertEqual(
            etcd_store.client.read_timeout,
            self._expected_read_timeout)  # type: ignore[attr-defined]

        client = self._server.get_client()

        backend.set_state(b"dummy_state")

        result = client.get("/torch/elastic/rendezvous/" + self._params.run_id)

        self.assertEqual(result.value, b64encode(b"dummy_state").decode())
        self.assertLessEqual(result.ttl, 7200)

        store.set("dummy_key", "dummy_value")

        result = client.get("/torch/elastic/store/" +
                            b64encode(b"dummy_key").decode())

        self.assertEqual(result.value, b64encode(b"dummy_value").decode())
    def test_create_backend_returns_backend(self) -> None:
        backend = create_backend(self._params)

        self.assertEqual(backend.name, "etcd-experimental")
        self.assertEqual(backend.key,
                         "/torch/elastic/rendezvous/" + self._params.run_id)
        self.assertEqual(backend.ttl, 7200)
        self.assertEqual(backend.client.host, self._server.get_host())
        self.assertEqual(backend.client.port, self._server.get_port())
        self.assertEqual(backend.client.protocol, self._expected_protocol)
        self.assertEqual(backend.client.read_timeout,
                         self._expected_read_timeout)
    def test_create_backend_raises_error_if_protocol_is_invalid(self) -> None:
        self._params.config["protocol"] = "dummy"

        with self.assertRaisesRegex(ValueError,
                                    r"^The protocol must be HTTP or HTTPS.$"):
            create_backend(self._params)