Skip to content

Commit 2ef8377

Browse files
authored
Merge branch 'staging' into fix/2472-offline_unittests
2 parents 63c92d3 + baac41b commit 2ef8377

File tree

3 files changed

+66
-7
lines changed

3 files changed

+66
-7
lines changed

bittensor/core/settings.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,18 @@
77
from munch import munchify
88

99

10+
READ_ONLY = os.getenv("READ_ONLY") == "1"
11+
1012
HOME_DIR = Path.home()
1113
USER_BITTENSOR_DIR = HOME_DIR / ".bittensor"
1214
WALLETS_DIR = USER_BITTENSOR_DIR / "wallets"
1315
MINERS_DIR = USER_BITTENSOR_DIR / "miners"
1416

1517

16-
# Create dirs if they don't exist
17-
WALLETS_DIR.mkdir(parents=True, exist_ok=True)
18-
MINERS_DIR.mkdir(parents=True, exist_ok=True)
18+
if not READ_ONLY:
19+
# Create dirs if they don't exist
20+
WALLETS_DIR.mkdir(parents=True, exist_ok=True)
21+
MINERS_DIR.mkdir(parents=True, exist_ok=True)
1922

2023
# Bittensor networks name
2124
NETWORKS = ["finney", "test", "archive", "local", "subvortex", "rao", "latent-lite"]

bittensor/utils/btlogging/loggingmachine.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
from statemachine import State, StateMachine
1818

19+
from bittensor.core.settings import READ_ONLY
1920
from bittensor.core.config import Config
2021
from bittensor.utils.btlogging.console import BittensorConsole
2122
from .defines import (
@@ -584,9 +585,12 @@ def add_args(cls, parser: argparse.ArgumentParser, prefix: str = None):
584585
default_logging_info = os.getenv("BT_LOGGING_INFO") or False
585586
default_logging_trace = os.getenv("BT_LOGGING_TRACE") or False
586587
default_logging_record_log = os.getenv("BT_LOGGING_RECORD_LOG") or False
587-
default_logging_logging_dir = os.getenv(
588-
"BT_LOGGING_LOGGING_DIR"
589-
) or os.path.join("~", ".bittensor", "miners")
588+
default_logging_logging_dir = (
589+
None
590+
if READ_ONLY
591+
else os.getenv("BT_LOGGING_LOGGING_DIR")
592+
or os.path.join("~", ".bittensor", "miners")
593+
)
590594
parser.add_argument(
591595
"--" + prefix_str + "logging.debug",
592596
action="store_true",

tests/unit_tests/test_axon.py

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
1+
import asyncio
2+
import contextlib
13
import re
4+
import threading
25
import time
36
from dataclasses import dataclass
47
from typing import Any, Optional, Tuple
58
from unittest import IsolatedAsyncioTestCase
69
from unittest.mock import AsyncMock, MagicMock, patch
710

11+
import aiohttp
812
import fastapi
913
import netaddr
1014
import pydantic
1115
import pytest
16+
import uvicorn
1217
from fastapi.testclient import TestClient
1318
from starlette.requests import Request
1419

15-
from bittensor.core.axon import AxonMiddleware, Axon
20+
from bittensor.core.axon import Axon, AxonMiddleware, FastAPIThreadedServer
1621
from bittensor.core.errors import RunException
1722
from bittensor.core.settings import version_as_int
1823
from bittensor.core.stream import StreamingSynapse
@@ -774,3 +779,50 @@ async def forward_fn(synapse: streaming_synapse_cls):
774779
"computed_body_hash": "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a",
775780
},
776781
)
782+
783+
784+
@pytest.mark.asyncio
785+
async def test_threaded_fastapi():
786+
server_started = threading.Event()
787+
server_stopped = threading.Event()
788+
789+
@contextlib.asynccontextmanager
790+
async def lifespan(app):
791+
server_started.set()
792+
yield
793+
server_stopped.set()
794+
795+
app = fastapi.FastAPI(
796+
lifespan=lifespan,
797+
)
798+
app.get("/")(lambda: "Hello World")
799+
800+
server = FastAPIThreadedServer(
801+
uvicorn.Config(app, loop="none"),
802+
)
803+
server.start()
804+
805+
server_started.wait(3.0)
806+
807+
async def wait_for_server():
808+
while not (server.started or server_stopped.is_set()):
809+
await asyncio.sleep(1.0)
810+
811+
await asyncio.wait_for(wait_for_server(), 7.0)
812+
813+
assert server.is_running is True
814+
815+
async with aiohttp.ClientSession(
816+
base_url="http://127.0.0.1:8000",
817+
) as session:
818+
async with session.get("/") as response:
819+
assert await response.text() == '"Hello World"'
820+
821+
server.stop()
822+
823+
assert server.should_exit is True
824+
825+
server_stopped.wait()
826+
827+
with pytest.raises(aiohttp.ClientConnectorError):
828+
await session.get("/")

0 commit comments

Comments
 (0)