Exemple #1
0
def test_validate_regex():
    assert Config().validate({Setting.DRIVE_IPV4: "192.168.1.1"}) == defaultAnd(
        {Setting.DRIVE_IPV4: "192.168.1.1"})
    with raises(InvalidConfigurationValue):
        Config().validate({Setting.DRIVE_IPV4: -1})
    with raises(InvalidConfigurationValue):
        Config().validate({Setting.DRIVE_IPV4: "192.168.1"})
def test_GenerationalConfig() -> None:
    assert Config().getGenerationalConfig() is None

    assert Config().override(Setting.GENERATIONAL_DAYS,
                             5).getGenerationalConfig() == GenConfig(days=5)
    assert Config().override(Setting.GENERATIONAL_WEEKS,
                             3).getGenerationalConfig() == GenConfig(days=1,
                                                                     weeks=3)
    assert Config().override(Setting.GENERATIONAL_MONTHS,
                             3).getGenerationalConfig() == GenConfig(days=1,
                                                                     months=3)
    assert Config().override(Setting.GENERATIONAL_YEARS,
                             3).getGenerationalConfig() == GenConfig(days=1,
                                                                     years=3)
    assert Config().override(Setting.GENERATIONAL_DELETE_EARLY, True).override(
        Setting.GENERATIONAL_DAYS,
        2).getGenerationalConfig() == GenConfig(days=2, aggressive=True)
    assert Config().override(Setting.GENERATIONAL_DAYS, 1).override(
        Setting.GENERATIONAL_DAY_OF_YEAR,
        3).getGenerationalConfig() == GenConfig(days=1, day_of_year=3)
    assert Config().override(Setting.GENERATIONAL_DAYS, 1).override(
        Setting.GENERATIONAL_DAY_OF_MONTH,
        3).getGenerationalConfig() == GenConfig(days=1, day_of_month=3)
    assert Config().override(Setting.GENERATIONAL_DAYS, 1).override(
        Setting.GENERATIONAL_DAY_OF_WEEK,
        "tue").getGenerationalConfig() == GenConfig(days=1, day_of_week="tue")

    assert Config().override(Setting.GENERATIONAL_DAY_OF_MONTH, 3).override(
        Setting.GENERATIONAL_DAY_OF_WEEK, "tue").override(
            Setting.GENERATIONAL_DAY_OF_YEAR,
            "4").getGenerationalConfig() is None
Exemple #3
0
def test_send_error_reports():
    assert Config().validate({Setting.SEND_ERROR_REPORTS: False}) == defaultAnd(
        {Setting.SEND_ERROR_REPORTS: False})
    assert Config().validate({Setting.SEND_ERROR_REPORTS: True}) == defaultAnd(
        {Setting.SEND_ERROR_REPORTS: True})
    assert Config().validate(
        {Setting.SEND_ERROR_REPORTS: None}) == defaultAnd()
def test_timeOfDay(estimator) -> None:
    time: FakeTime = FakeTime()
    info = GlobalInfo(time)

    config: Config = Config()
    model: Model = Model(config, time, default_source, default_source, info,
                         estimator)
    assert model.getTimeOfDay() is None

    config = Config().override(Setting.SNAPSHOT_TIME_OF_DAY, '00:00')
    model = Model(config, time, default_source, default_source, info,
                  estimator)
    assert model.getTimeOfDay() == (0, 0)

    config.override(Setting.SNAPSHOT_TIME_OF_DAY, '23:59')
    model = Model(config, time, default_source, default_source, info,
                  estimator)
    assert model.getTimeOfDay() == (23, 59)

    config.override(Setting.SNAPSHOT_TIME_OF_DAY, '24:59')
    model = Model(config, time, default_source, default_source, info,
                  estimator)
    assert model.getTimeOfDay() is None

    config.override(Setting.SNAPSHOT_TIME_OF_DAY, '24:60')
    model = Model(config, time, default_source, default_source, info,
                  estimator)
    assert model.getTimeOfDay() is None

    config.override(Setting.SNAPSHOT_TIME_OF_DAY, '-1:60')
    model = Model(config, time, default_source, default_source, info,
                  estimator)
    assert model.getTimeOfDay() is None

    config.override(Setting.SNAPSHOT_TIME_OF_DAY, '24:-1')
    model = Model(config, time, default_source, default_source, info,
                  estimator)
    assert model.getTimeOfDay() is None

    config.override(Setting.SNAPSHOT_TIME_OF_DAY, 'boop:60')
    model = Model(config, time, default_source, default_source, info,
                  estimator)
    assert model.getTimeOfDay() is None

    config.override(Setting.SNAPSHOT_TIME_OF_DAY, '24:boop')
    model = Model(config, time, default_source, default_source, info,
                  estimator)
    assert model.getTimeOfDay() is None

    config.override(Setting.SNAPSHOT_TIME_OF_DAY, '24:10:22')
    model = Model(config, time, default_source, default_source, info,
                  estimator)
    assert model.getTimeOfDay() is None

    config.override(Setting.SNAPSHOT_TIME_OF_DAY, '10')
    model = Model(config, time, default_source, default_source, info,
                  estimator)
    assert model.getTimeOfDay() is None
def test_validate_float():
    setting = Setting.DAYS_BETWEEN_SNAPSHOTS
    assert Config().validate({setting: 5}) == defaultAnd({setting: 5})
    assert Config().validate({setting.key(): 5}) == defaultAnd({setting: 5})
    assert Config().validate({setting: 5.0}) == defaultAnd({setting: 5})
    assert Config().validate({setting: "5"}) == defaultAnd({setting: 5})

    with raises(InvalidConfigurationValue):
        Config().validate({'days_between_snapshots': -1})
def test_validate_int():
    assert Config().validate({'max_snapshots_in_hassio': 5}) == defaultAnd(
        {Setting.MAX_SNAPSHOTS_IN_HASSIO: 5})
    assert Config().validate({'max_snapshots_in_hassio': 5.0}) == defaultAnd(
        {Setting.MAX_SNAPSHOTS_IN_HASSIO: 5})
    assert Config().validate({'max_snapshots_in_hassio': "5"}) == defaultAnd(
        {Setting.MAX_SNAPSHOTS_IN_HASSIO: 5})

    with raises(InvalidConfigurationValue):
        Config().validate({'max_snapshots_in_hassio': -1})
Exemple #7
0
def test_validate_bool():
    setting = Setting.SEND_ERROR_REPORTS
    assert Config().validate({setting: True}) == defaultAnd({setting: True})
    assert Config().validate({setting: False}) == defaultAnd({setting: False})
    assert Config().validate({setting: "true"}) == defaultAnd({setting: True})
    assert Config().validate({setting: "false"}) == defaultAnd({setting: False})
    assert Config().validate({setting: "1"}) == defaultAnd({setting: True})
    assert Config().validate({setting: "0"}) == defaultAnd({setting: False})
    assert Config().validate({setting: "yes"}) == defaultAnd({setting: True})
    assert Config().validate({setting: "no"}) == defaultAnd({setting: False})
    assert Config().validate({setting: "on"}) == defaultAnd({setting: True})
    assert Config().validate({setting: "off"}) == defaultAnd({setting: False})
def main() -> None:
    logging.getLogger('googleapiclient.discovery_cache').setLevel(
        logging.ERROR)

    time: Time = Time()

    if len(sys.argv) == 1:
        config: Config = Config([HASSIO_OPTIONS_FILE])
    else:
        config: Config = Config(sys.argv[1:])

    hassio: Hassio = Hassio(config)
    while True:
        try:
            hassio.loadInfo()
            break
        except Exception:
            LogBase().critical(
                "Unable to reach Hassio supervisor.  Please ensure the supervisor is running."
            )
            sleep(10)

    if config.warnIngress():
        LogBase().warn(
            "This add-on supports ingress but your verison of Home Assistant does not.  Please update to the latest verison of home Assistant."
        )

    drive: Drive = Drive(config)
    try:
        watcher: Watcher = Watcher(time, config)
        engine: engine = Engine(watcher, config, drive, hassio,
                                time)  # type: ignore
        server: Server = Server("www", engine, config)

        engine_thread: Thread = Thread(target=engine.run)  # type: ignore
        engine_thread.setName("Engine Thread")
        engine_thread.daemon = True
        engine_thread.start()

        server_thread: Thread = Thread(target=server.run)
        server_thread.daemon = True
        server_thread.setName("Server Thread")
        server_thread.start()

        while True:
            sleep(5)
    finally:
        if watcher:
            watcher.stop()
Exemple #9
0
def test_validate_string():
    assert Config().validate({Setting.SNAPSHOT_NAME: True}) == defaultAnd({Setting.SNAPSHOT_NAME: "True"})
    assert Config().validate({Setting.SNAPSHOT_NAME: False}) == defaultAnd({Setting.SNAPSHOT_NAME: "False"})
    assert Config().validate({Setting.SNAPSHOT_NAME: "true"}) == defaultAnd({Setting.SNAPSHOT_NAME: "true"})
    assert Config().validate({Setting.SNAPSHOT_NAME: "false"}) == defaultAnd({Setting.SNAPSHOT_NAME: "false"})
    assert Config().validate({Setting.SNAPSHOT_NAME: "1"}) == defaultAnd({Setting.SNAPSHOT_NAME: "1"})
    assert Config().validate({Setting.SNAPSHOT_NAME: "0"}) == defaultAnd({Setting.SNAPSHOT_NAME: "0"})
    assert Config().validate({Setting.SNAPSHOT_NAME: "yes"}) == defaultAnd({Setting.SNAPSHOT_NAME: "yes"})
    assert Config().validate({Setting.SNAPSHOT_NAME: "no"}) == defaultAnd({Setting.SNAPSHOT_NAME: "no"})
Exemple #10
0
def test_remove_ssl():
    assert Config().validate({Setting.USE_SSL: True}) == defaultAnd({Setting.USE_SSL: True})
    assert Config().validate({Setting.USE_SSL: False}) == defaultAnd(
        {Setting.USE_SSL: False})
    assert Config().validate({
        Setting.USE_SSL: False,
        Setting.CERTFILE: "removed",
        Setting.KEYFILE: 'removed'
    }) == defaultAnd({Setting.USE_SSL: False})
    assert Config().validate({
        Setting.USE_SSL: True,
        Setting.CERTFILE: "kept",
        Setting.KEYFILE: 'kept'
    }) == defaultAnd({
        Setting.USE_SSL: True,
        Setting.CERTFILE: "kept",
        Setting.KEYFILE: 'kept'
    })
def test_next_time(estimator):
    time: FakeTime = FakeTime()
    info = GlobalInfo(time)
    now: datetime = datetime(1985, 12, 6, 1, 0, 0).astimezone(timezone.utc)

    config: Config = Config().override(Setting.DAYS_BETWEEN_SNAPSHOTS, 0)
    model: Model = Model(config, time, default_source, default_source, info,
                         estimator)
    assert model._nextSnapshot(now=now, last_snapshot=None) is None
    assert model._nextSnapshot(now=now, last_snapshot=now) is None

    config: Config = Config().override(Setting.DAYS_BETWEEN_SNAPSHOTS, 1)
    model: Model = Model(config, time, default_source, default_source, info,
                         estimator)
    assert model._nextSnapshot(
        now=now, last_snapshot=None) == now - timedelta(minutes=1)
    assert model._nextSnapshot(now=now,
                               last_snapshot=now) == now + timedelta(days=1)
    assert model._nextSnapshot(now=now,
                               last_snapshot=now - timedelta(days=1)) == now
    assert model._nextSnapshot(now=now, last_snapshot=now +
                               timedelta(days=1)) == now + timedelta(days=2)
def test_validate_url():
    assert Config().validate({Setting.HASSIO_URL: True
                              }) == defaultAnd({Setting.HASSIO_URL: "True"})
    assert Config().validate({Setting.HASSIO_URL: False
                              }) == defaultAnd({Setting.HASSIO_URL: "False"})
    assert Config().validate({Setting.HASSIO_URL: "true"
                              }) == defaultAnd({Setting.HASSIO_URL: "true"})
    assert Config().validate({Setting.HASSIO_URL: "false"
                              }) == defaultAnd({Setting.HASSIO_URL: "false"})
    assert Config().validate({Setting.HASSIO_URL:
                              "1"}) == defaultAnd({Setting.HASSIO_URL: "1"})
    assert Config().validate({Setting.HASSIO_URL:
                              "0"}) == defaultAnd({Setting.HASSIO_URL: "0"})
    assert Config().validate({Setting.HASSIO_URL: "yes"
                              }) == defaultAnd({Setting.HASSIO_URL: "yes"})
    assert Config().validate({Setting.HASSIO_URL:
                              "no"}) == defaultAnd({Setting.HASSIO_URL: "no"})
def test_next_time_of_day(estimator):
    time: FakeTime = FakeTime()
    info = GlobalInfo(time)
    now: datetime = datetime(1985, 12, 6, 1, 0, 0).astimezone(timezone.utc)

    config: Config = Config().override(Setting.DAYS_BETWEEN_SNAPSHOTS,
                                       1).override(
                                           Setting.SNAPSHOT_TIME_OF_DAY,
                                           '08:00')
    model: Model = Model(config, time, default_source, default_source, info,
                         estimator)

    assert model._nextSnapshot(
        now=now, last_snapshot=None) == now - timedelta(minutes=1)
    assert model._nextSnapshot(now=now, last_snapshot=now -
                               timedelta(days=1)) == datetime(1985,
                                                              12,
                                                              5,
                                                              8,
                                                              0,
                                                              tzinfo=test_tz)
    assert model._nextSnapshot(now=now,
                               last_snapshot=now) == datetime(1985,
                                                              12,
                                                              6,
                                                              8,
                                                              0,
                                                              tzinfo=test_tz)
    assert model._nextSnapshot(now=now,
                               last_snapshot=datetime(
                                   1985, 12, 6, 8, 0,
                                   tzinfo=test_tz)) == datetime(1985,
                                                                12,
                                                                7,
                                                                8,
                                                                0,
                                                                tzinfo=test_tz)
    assert model._nextSnapshot(
        now=datetime(1985, 12, 6, 8, 0, tzinfo=test_tz),
        last_snapshot=datetime(1985, 12, 6, 8, 0,
                               tzinfo=test_tz)) == datetime(1985,
                                                            12,
                                                            7,
                                                            8,
                                                            0,
                                                            tzinfo=test_tz)
Exemple #14
0
    def getConfig(self) -> Config:
        alt_config = None
        index = 1
        for arg in sys.argv[1:]:
            if arg == "--config":
                alt_config = sys.argv[index + 1]
                break
            index += 1

        if alt_config:
            config = Config.withFileOverrides(alt_config)
        elif "PYTEST_CURRENT_TEST" in os.environ:
            config = Config()
        else:
            config = Config.fromFile(Setting.CONFIG_FILE_PATH.default())
        logger.overrideLevel(config.get(Setting.CONSOLE_LOG_LEVEL),
                             config.get(Setting.LOG_LEVEL))
        return config
def test_validate_empty():
    config = Config()
    assert config.validate({}) == defaultAnd()
from time import sleep
from sys import argv
from os.path import join, abspath

logger = getLogger(__name__)


async def main(config):
    await Injector([BaseModule(config), MainModule()]).get(Starter).startup()
    while True:
        await asyncio.sleep(1)


if __name__ == '__main__':
    config = Config()

    if len(argv) > 1:
        # Needed to load a different config for dev environments.
        config = Config.withFileOverrides(
            abspath(join(__file__, "../../dev/data",
                         argv[1] + "_options.json")))
    else:
        config = Config.fromFile(Setting.CONFIG_FILE_PATH.default())

    logger.overrideLevel(config.get(Setting.CONSOLE_LOG_LEVEL),
                         config.get(Setting.LOG_LEVEL))
    if config.get(Setting.DEBUGGER_PORT) is not None:
        port = config.get(Setting.DEBUGGER_PORT)
        logger.info("Starting debugger on port {}".format(port))
        ptvsd.enable_attach(('0.0.0.0', port))
Exemple #17
0
def createConfig() -> Config:
    return Config().override(Setting.SNAPSHOT_STARTUP_DELAY_MINUTES, 0)
def test_unrecognized_values_filter():
    assert Config().validate({'blah': "bloo"}) == defaultAnd()
def test_removes_defaults():
    assert Config().validate({Setting.SNAPSHOT_TIME_OF_DAY:
                              ""}) == defaultAnd()
def simple_config():
    config = Config()
    return config
Exemple #21
0
async def test_bootstarp_requirements():
    # This just verifies we're able to satisfy starter's injector requirements.
    injector = Injector([BaseModule(Config()), MainModule()])
    injector.get(Starter)
def simple_config():
    config = Config()
    config.override(Setting.SNAPSHOT_STARTUP_DELAY_MINUTES, 0)
    return config