def test_65_cancellation_time_randomization(tmpdir):
    """
    VEN, EiEvent Service, oadrDistributeEvent, oadrCreatedEvent Payload
    When an event containing a randomization value in the startafter element is
    cancelled, either explicitly or implicitly, the VEN MUST randomize its
    termination of the event. The randomization window should be between 0
    and a duration equal to the value specified in startafter.
    """
    test_event = AdrEvent(
        id="FooEvent",
        start=datetime.utcnow() - timedelta(minutes=5),
        signals=[dict(index=0, duration=timedelta(minutes=10), level=1.0)],
        status=AdrEventStatus.ACTIVE, start_after=timedelta(minutes=2)
    )
    event_handler = event.EventHandler("VEN_ID", db_path=TEST_DB_ADDR % tmpdir)
    event_controller = controller.EventController(event_handler)

    event_handler.handle_payload(generate_payload([test_event]))

    with freeze_time():
        test_event.mod_number += 1
        test_event.status = AdrEventStatus.CANCELLED

        event_handler.handle_payload(generate_payload([test_event]))

        active_event = event_handler.get_active_events()[0]

        assert active_event.end != datetime.utcnow()
        assert (active_event.start - datetime.utcnow()) < timedelta(minutes=2)
def test_59_event_cancellation(tmpdir):
    """
    VEN, EiEvent Service, oadrDistributeEvent Payload
    If the VTN sends an oadrEvent with the eventStatus set to cancelled and
    has an eventID that the VEN is aware of then the VEN should cancel the
    existing event and delete it from its list of known events.
    """
    test_event = AdrEvent(
        id="FooEvent",
        start=datetime.utcnow() + timedelta(seconds=60),
        signals=[dict(index=0, duration=timedelta(minutes=10), level=1.0)],
        status=AdrEventStatus.PENDING, mod_number=1
    )

    event_handler = event.EventHandler("VEN_ID", db_path=TEST_DB_ADDR % tmpdir)
    event_controller = controller.EventController(event_handler)

    event_handler.handle_payload(generate_payload([test_event]))

    active_event = event_handler.get_active_events()[0]
    assert active_event == test_event.to_obj()

    with freeze_time():
        test_event.status = AdrEventStatus.CANCELLED
        test_event.mod_number += 1
        test_event.end = datetime.utcnow()

        event_handler.handle_payload(generate_payload([test_event]))

        active_event = event_handler.get_active_events()[0]
        assert active_event == test_event.to_obj()

    signal_level, evt_id, remove_events = event_controller._calculate_current_event_status([test_event.to_obj()])
    assert (signal_level, evt_id, remove_events) == (0, None, ["FooEvent"])
def test_57_modified_event(tmpdir):
    """
    VEN/VTN, EiEvent Service, oadrDistributeEvent Payload
    If the VTN sends an oadrEvent with an eventID that the VEN is already
    aware of, but with a higher modification number then the VEN should
    replace the previous event with the new one In its list of known events.
    """
    test_event = AdrEvent(
        id="FooEvent",
        start=datetime.utcnow() + timedelta(seconds=60),
        signals=[dict(index=0, duration=timedelta(minutes=10), level=1.0)],
        status=AdrEventStatus.PENDING
    )
    event_handler = event.EventHandler("VEN_ID", db_path=TEST_DB_ADDR % tmpdir)

    event_handler.handle_payload(generate_payload([test_event]))

    active_event = event_handler.get_active_events()[0]
    expected_event = test_event.to_obj()
    assert active_event == expected_event

    test_event.mod_number = 1
    test_event.status = AdrEventStatus.ACTIVE

    event_handler.handle_payload(generate_payload([test_event]))

    active_event = event_handler.get_active_events()[0]
    expected_event = test_event.to_obj()
    assert active_event == expected_event
def test_47_unending_event(tmpdir):
    """
    VEN/VTN, EiEvent Service, oadrDistributeEvent Payload
    An event with an overall duration of 0 indicates an event with no defined
    end time and will remain active until explicitly cancelled.
    """
    test_event = AdrEvent(
        id="FooEvent",
        start=datetime.utcnow() + timedelta(seconds=60),
        signals=[dict(index=0, duration=timedelta(minutes=0), level=1.0)],
        status=AdrEventStatus.ACTIVE
    )
    event_handler = event.EventHandler("VEN_ID", db_path=TEST_DB_ADDR % tmpdir)
    event_controller = controller.EventController(event_handler)

    event_handler.handle_payload(generate_payload([test_event]))

    active_event = event_handler.get_active_events()[0]

    signal_level, evt_id, remove_events = event_controller._calculate_current_event_status([active_event])
    assert (signal_level, evt_id, remove_events) == (0, None, [])

    with freeze_time(datetime.utcnow() + timedelta(seconds=70)):
        signal_level, evt_id, remove_events = event_controller._calculate_current_event_status([active_event])
        assert (signal_level, evt_id, remove_events) == (1.0, "FooEvent", [])

    with freeze_time(datetime.utcnow() + timedelta(minutes=70)):
        signal_level, evt_id, remove_events = event_controller._calculate_current_event_status([active_event])
        assert (signal_level, evt_id, remove_events) == (1.0, "FooEvent", [])

    with freeze_time(datetime.utcnow() + timedelta(hours=70)):
        signal_level, evt_id, remove_events = event_controller._calculate_current_event_status([active_event])
        assert (signal_level, evt_id, remove_events) == (1.0, "FooEvent", [])

    test_event.status = AdrEventStatus.CANCELLED
    test_event.mod_number += 1

    event_handler.handle_payload(generate_payload([test_event]))
    active_event = event_handler.get_active_events()[0]

    signal_level, evt_id, remove_events = event_controller._calculate_current_event_status([active_event])
    assert (signal_level, evt_id, remove_events) == (0, None, ["FooEvent"])
Example #5
0
def test_explicite_cancellation(tmpdir):
    test_event = AdrEvent(
        id="FooEvent",
        start=datetime.utcnow()-timedelta(seconds=60),
        signals=[dict(index=0, duration=timedelta(minutes=10), level=2.0)],
        status=AdrEventStatus.ACTIVE,
    )

    event_handler = event.EventHandler("VEN_ID", db_path=TEST_DB_ADDR % tmpdir)

    event_handler.handle_payload(generate_payload([test_event]))

    active_events = event_handler.get_active_events()

    assert [test_event.to_obj()] == active_events

    with freeze_time():
        test_event.mod_number += 1
        test_event.status = AdrEventStatus.CANCELLED
        test_event.end = datetime.utcnow()

        event_handler.handle_payload(generate_payload([test_event]))
        active_events = event_handler.get_active_events()

        assert [test_event.to_obj()] == active_events

        # test second cancellation
        event_handler.handle_payload(generate_payload([test_event]))
        active_events = event_handler.get_active_events()

        assert [test_event.to_obj()] == active_events

    # test subsequent cancellation
    event_handler.handle_payload(generate_payload([test_event]))
    active_events = event_handler.get_active_events()

    assert [test_event.to_obj()] == active_events