def test_oadr_event(): event = objects.Event( event_descriptor=objects.EventDescriptor( event_id=1, modification_number=0, market_context='MarketContext1', event_status=enums.EVENT_STATUS.NEAR), active_period=objects.ActivePeriod(dtstart=datetime.now(), duration=timedelta(minutes=10)), event_signals=[ objects.EventSignal(intervals=[ objects.Interval(dtstart=datetime.now(), duration=timedelta(minutes=5), uid=0, signal_payload=1), objects.Interval(dtstart=datetime.now(), duration=timedelta(minutes=5), uid=1, signal_payload=2) ], targets=[objects.Target(ven_id='1234')], signal_name=enums.SIGNAL_NAME.LOAD_CONTROL, signal_type=enums.SIGNAL_TYPE.LEVEL, signal_id=1, current_value=0) ], targets=[objects.Target(ven_id='1234')]) response = objects.Response(response_code=200, response_description='OK', request_id='1234') msg = create_message('oadrDistributeEvent', response=response, events=[event]) message_type, message_payload = parse_message(msg)
async def on_poll(ven_id, future=None): if future and not future.done(): future.set_result(True) return objects.Event( event_descriptor=objects.EventDescriptor( event_id='event001', modification_number=0, event_status='far', market_context='http://marketcontext01'), event_signals=[ objects.EventSignal( signal_id='signal001', signal_type='level', signal_name='simple', intervals=[ objects.Interval( dtstart=now, duration=datetime.timedelta(minutes=10), signal_payload=1) ]), objects.EventSignal( signal_id='signal002', signal_type='price', signal_name='ELECTRICITY_PRICE', intervals=[ objects.Interval( dtstart=now, duration=datetime.timedelta(minutes=10), signal_payload=1) ]) ], targets=[objects.Target(ven_id=ven_id)]) else: print("Returning None") return None
def test_oadr_event_targets_and_targets_by_type(): event = objects.Event( event_descriptor=objects.EventDescriptor( event_id=1, modification_number=0, market_context='MarketContext1', event_status=enums.EVENT_STATUS.NEAR), active_period=objects.ActivePeriod(dtstart=datetime.now(), duration=timedelta(minutes=10)), event_signals=[ objects.EventSignal(intervals=[ objects.Interval(dtstart=datetime.now(), duration=timedelta(minutes=5), uid=0, signal_payload=1), objects.Interval(dtstart=datetime.now(), duration=timedelta(minutes=5), uid=1, signal_payload=2) ], targets=[objects.Target(ven_id='1234')], signal_name=enums.SIGNAL_NAME.LOAD_CONTROL, signal_type=enums.SIGNAL_TYPE.LEVEL, signal_id=1, current_value=0) ], targets=[{ 'ven_id': 'ven123' }], targets_by_type={'ven_id': ['ven123']}) msg = create_message('oadrDistributeEvent', events=[event]) validate_xml_schema(ensure_bytes(msg)) message_type, message_payload = parse_message(msg)
def test_get_active_period_from_intervals(): now = datetime.now(timezone.utc) intervals = [{ 'dtstart': now, 'duration': timedelta(seconds=5) }, { 'dtstart': now + timedelta(seconds=5), 'duration': timedelta(seconds=5) }] assert utils.get_active_period_from_intervals(intervals) == { 'dtstart': now, 'duration': timedelta(seconds=10) } intervals = [ objects.Interval(dtstart=now, duration=timedelta(seconds=5), signal_payload=1), objects.Interval(dtstart=now + timedelta(seconds=5), duration=timedelta(seconds=5), signal_payload=2) ] assert utils.get_active_period_from_intervals(intervals) == { 'dtstart': now, 'duration': timedelta(seconds=10) } assert utils.get_active_period_from_intervals( intervals, False) == objects.ActivePeriod(dtstart=now, duration=timedelta(seconds=10))
def test_oadr_event_no_targets(): with pytest.raises(ValueError): event = objects.Event( event_descriptor=objects.EventDescriptor( event_id=1, modification_number=0, market_context='MarketContext1', event_status=enums.EVENT_STATUS.NEAR), active_period=objects.ActivePeriod(dtstart=datetime.now(), duration=timedelta(minutes=10)), event_signals=[ objects.EventSignal(intervals=[ objects.Interval(dtstart=datetime.now(), duration=timedelta(minutes=5), uid=0, signal_payload=1), objects.Interval(dtstart=datetime.now(), duration=timedelta(minutes=5), uid=1, signal_payload=2) ], targets=[objects.Target(ven_id='1234')], signal_name=enums.SIGNAL_NAME.LOAD_CONTROL, signal_type=enums.SIGNAL_TYPE.LEVEL, signal_id=1, current_value=0) ])
async def test_raw_event(): now = datetime.datetime.now(datetime.timezone.utc) server = OpenADRServer(vtn_id='myvtn') server.add_handler('on_create_party_registration', on_create_party_registration) event = objects.Event( event_descriptor=objects.EventDescriptor( event_id='event001', modification_number=0, event_status='far', market_context='http://marketcontext01'), event_signals=[ objects.EventSignal( signal_id='signal001', signal_type='level', signal_name='simple', intervals=[ objects.Interval(dtstart=now, duration=datetime.timedelta(minutes=10), signal_payload=1) ]), objects.EventSignal( signal_id='signal002', signal_type='price', signal_name='ELECTRICITY_PRICE', intervals=[ objects.Interval(dtstart=now, duration=datetime.timedelta(minutes=10), signal_payload=1) ]) ], targets=[objects.Target(ven_id='ven123')]) loop = asyncio.get_event_loop() event_callback_future = loop.create_future() server.add_raw_event(ven_id='ven123', event=event, callback=partial(event_callback, future=event_callback_future)) on_event_future = loop.create_future() client = OpenADRClient( ven_name='myven', vtn_url='http://localhost:8080/OpenADR2/Simple/2.0b') client.add_handler('on_event', partial(on_event_opt_in, future=on_event_future)) await server.run_async() await client.run() event = await on_event_future assert len(event['event_signals']) == 2 result = await event_callback_future assert result == 'optIn' await client.stop() await server.stop()
async def test_client_event_cleanup(): now = datetime.datetime.now(datetime.timezone.utc) server = OpenADRServer(vtn_id='myvtn') server.add_handler('on_create_party_registration', on_create_party_registration) loop = asyncio.get_event_loop() event_1_callback_future = loop.create_future() event_2_callback_future = loop.create_future() server.add_event(ven_id='ven123', signal_name='simple', signal_type='level', intervals=[ objects.Interval( dtstart=now, duration=datetime.timedelta(seconds=1), signal_payload=1) ], callback=event_1_callback_future) await server.run() client = OpenADRClient( ven_name='ven123', vtn_url='http://localhost:8080/OpenADR2/Simple/2.0b') client.add_handler('on_event', on_event_opt_in) await client.run() await asyncio.sleep(0.5) assert len(client.received_events) == 1 await asyncio.sleep(0.5) await client._event_cleanup() assert len(client.received_events) == 0 await server.stop() await client.stop()
def test_increment_modification_number(): now = datetime.now(timezone.utc) event = objects.Event( event_descriptor=objects.EventDescriptor( event_id='event001', modification_number=0, created_date_time=now, event_status='far', priority=1, market_context='http://context01'), active_period=objects.ActivePeriod(dtstart=now - timedelta(minutes=5), duration=timedelta(minutes=10)), event_signals=[ objects.EventSignal(intervals=[ objects.Interval(dtstart=now, duration=timedelta(minutes=10), signal_payload=1) ], signal_name='simple', signal_type='level', signal_id='signal001') ], targets=[{ 'ven_id': 'ven001' }]) utils.increment_event_modification_number(event) assert utils.getmember(event, 'event_descriptor.modification_number') == 1 utils.increment_event_modification_number(event) assert utils.getmember(event, 'event_descriptor.modification_number') == 2
async def test_cancel_event(): async def opt_in_to_event(event, future=None): if future: future.set_result(True) return 'optIn' async def on_update_event(event, future=None): if future: future.set_result(event) return 'optIn' now = datetime.datetime.now(datetime.timezone.utc) server = OpenADRServer(vtn_id='myvtn', requested_poll_freq=datetime.timedelta(seconds=1)) server.add_handler('on_create_party_registration', on_create_party_registration) loop = asyncio.get_event_loop() event_1_callback_future = loop.create_future() event_id = server.add_event( ven_id='ven123', signal_name='simple', signal_type='level', intervals=[ objects.Interval(dtstart=now, duration=datetime.timedelta(seconds=60), signal_payload=1) ], callback=event_1_callback_future, response_required='always') await server.run() client = OpenADRClient( ven_name='ven123', vtn_url='http://localhost:8080/OpenADR2/Simple/2.0b') client.add_handler('on_event', opt_in_to_event) cancel_future = loop.create_future() client.add_handler('on_update_event', partial(on_update_event, future=cancel_future)) await client.run() await event_1_callback_future server.cancel_event('ven123', event_id) result = await cancel_future assert utils.getmember(result, 'event_descriptor.event_status') == 'cancelled' response_type, response_payload = await client.request_event() assert response_type == 'oadrResponse' await client._event_cleanup() assert len(client.responded_events) == 0 assert len(client.received_events) == 0 await server.stop() await client.stop()
def test_server_add_event_with_custom_signal_name(): server = OpenADRServer(vtn_id='myvtn') server.add_event(ven_id='ven123', signal_name='x-invalid', signal_type='x-loadControlCapacity', intervals=[ objects.Interval(dtstart=datetime.now(timezone.utc), duration=timedelta(seconds=10), signal_payload=1.0) ]) assert len(server.events['ven123']) == 1
def test_server_add_event_with_invalid_signal_name(): server = OpenADRServer(vtn_id='myvtn') with pytest.raises(ValueError): server.add_event(ven_id='ven123', signal_name='invalid', signal_type='x-loadControlCapacity', intervals=[ objects.Interval(dtstart=datetime.now( timezone.utc), duration=timedelta(seconds=10), signal_payload=1.0) ])
def test_event_signal_with_incongruent_targets(): with pytest.raises(ValueError): event_signal = objects.EventSignal( intervals=[ objects.Interval(dtstart=datetime.now(timezone.utc), duration=timedelta(minutes=10), signal_payload=1) ], signal_name='simple', signal_type='level', signal_id='signal123', targets=[objects.Target(ven_id='ven123')], targets_by_type={'ven_id': ['ven123', 'ven456']})
def test_event_signal_with_grouped_targets(): event_signal = objects.EventSignal( intervals=[ objects.Interval(dtstart=datetime.now(timezone.utc), duration=timedelta(minutes=10), signal_payload=1) ], signal_name='simple', signal_type='level', signal_id='signal123', targets_by_type={'ven_id': ['ven123', 'ven456']}) assert event_signal.targets == [ objects.Target(ven_id='ven123'), objects.Target(ven_id='ven456') ]
return message_type, message_payload event = objects.Event(event_descriptor=objects.EventDescriptor( event_id='event123', event_status='far', modification_number='1', market_context='http://marketcontext01'), event_signals=[ objects.EventSignal( signal_name='simple', signal_type='level', signal_id=utils.generate_id(), intervals=[ objects.Interval( dtstart=datetime.now(timezone.utc), duration=timedelta(minutes=10), signal_payload=1) ]) ], targets=[{ 'ven_id': 'ven123' }]) poll_responses = [('oadrResponse', {}), ('oadrDistributeEvent', { 'events': [asdict(event)] }), ('oadrCreateReport', { 'report_requests': [{ 'report_request_id': 'req123', 'report_specifier': {
async def test_multiple_events_in_queue(): now = datetime.datetime.now(datetime.timezone.utc) server = OpenADRServer(vtn_id='myvtn') server.add_handler('on_create_party_registration', on_create_party_registration) loop = asyncio.get_event_loop() event_1_callback_future = loop.create_future() event_2_callback_future = loop.create_future() server.add_event(ven_id='ven123', signal_name='simple', signal_type='level', intervals=[ objects.Interval( dtstart=now, duration=datetime.timedelta(seconds=1), signal_payload=1) ], callback=event_1_callback_future) await server.run() on_event_future = loop.create_future() client = OpenADRClient( ven_name='ven123', vtn_url='http://localhost:8080/OpenADR2/Simple/2.0b') await client.create_party_registration() response_type, response_payload = await client.request_event() assert response_type == 'oadrDistributeEvent' events = response_payload['events'] assert len(events) == 1 event_id = events[0]['event_descriptor']['event_id'] request_id = response_payload['request_id'] await client.created_event(request_id=request_id, event_id=event_id, opt_type='optIn', modification_number=0) server.add_event(ven_id='ven123', signal_name='simple', signal_type='level', intervals=[ objects.Interval( dtstart=now + datetime.timedelta(seconds=1), duration=datetime.timedelta(seconds=1), signal_payload=1) ], callback=event_2_callback_future) response_type, response_payload = await client.request_event() assert response_type == 'oadrDistributeEvent' events = response_payload['events'] # Assert that we still have two events in the response assert len(events) == 2 # Wait one second and retrieve the events again await asyncio.sleep(1) response_type, response_payload = await client.request_event() assert response_type == 'oadrDistributeEvent' events = response_payload['events'] assert len(events) == 2 assert events[1]['event_descriptor']['event_status'] == 'completed' response_type, response_payload = await client.request_event() assert response_type == 'oadrDistributeEvent' events = response_payload['events'] assert len(events) == 1 await asyncio.sleep(1) response_type, response_payload = await client.request_event() assert response_type == 'oadrDistributeEvent' response_type, response_payload = await client.request_event() assert response_type == 'oadrResponse' await server.stop()
def test_order_events(): now = datetime.now(timezone.utc) event_1_active_high_prio = objects.Event( event_descriptor=objects.EventDescriptor( event_id='event001', modification_number=0, created_date_time=now, event_status='far', priority=1, market_context='http://context01'), active_period=objects.ActivePeriod(dtstart=now - timedelta(minutes=5), duration=timedelta(minutes=10)), event_signals=[ objects.EventSignal(intervals=[ objects.Interval(dtstart=now, duration=timedelta(minutes=10), signal_payload=1) ], signal_name='simple', signal_type='level', signal_id='signal001') ], targets=[{ 'ven_id': 'ven001' }]) event_2_active_low_prio = objects.Event( event_descriptor=objects.EventDescriptor( event_id='event001', modification_number=0, created_date_time=now, event_status='far', priority=2, market_context='http://context01'), active_period=objects.ActivePeriod(dtstart=now - timedelta(minutes=5), duration=timedelta(minutes=10)), event_signals=[ objects.EventSignal(intervals=[ objects.Interval(dtstart=now, duration=timedelta(minutes=10), signal_payload=1) ], signal_name='simple', signal_type='level', signal_id='signal001') ], targets=[{ 'ven_id': 'ven001' }]) event_3_active_no_prio = objects.Event( event_descriptor=objects.EventDescriptor( event_id='event001', modification_number=0, created_date_time=now, event_status='far', market_context='http://context01'), active_period=objects.ActivePeriod(dtstart=now - timedelta(minutes=5), duration=timedelta(minutes=10)), event_signals=[ objects.EventSignal(intervals=[ objects.Interval(dtstart=now, duration=timedelta(minutes=10), signal_payload=1) ], signal_name='simple', signal_type='level', signal_id='signal001') ], targets=[{ 'ven_id': 'ven001' }]) event_4_far_early = objects.Event( event_descriptor=objects.EventDescriptor( event_id='event001', modification_number=0, created_date_time=now, event_status='far', market_context='http://context01'), active_period=objects.ActivePeriod(dtstart=now + timedelta(minutes=5), duration=timedelta(minutes=10)), event_signals=[ objects.EventSignal(intervals=[ objects.Interval(dtstart=now, duration=timedelta(minutes=10), signal_payload=1) ], signal_name='simple', signal_type='level', signal_id='signal001') ], targets=[{ 'ven_id': 'ven001' }]) event_5_far_later = objects.Event( event_descriptor=objects.EventDescriptor( event_id='event001', modification_number=0, created_date_time=now, event_status='far', market_context='http://context01'), active_period=objects.ActivePeriod(dtstart=now + timedelta(minutes=10), duration=timedelta(minutes=10)), event_signals=[ objects.EventSignal(intervals=[ objects.Interval(dtstart=now, duration=timedelta(minutes=10), signal_payload=1) ], signal_name='simple', signal_type='level', signal_id='signal001') ], targets=[{ 'ven_id': 'ven001' }]) events = [ event_5_far_later, event_4_far_early, event_3_active_no_prio, event_2_active_low_prio, event_1_active_high_prio ] ordered_events = utils.order_events(events) assert ordered_events == [ event_1_active_high_prio, event_2_active_low_prio, event_3_active_no_prio, event_4_far_early, event_5_far_later ] ordered_events = utils.order_events(event_1_active_high_prio) assert ordered_events == [event_1_active_high_prio] event_1_as_dict = asdict(event_1_active_high_prio) ordered_events = utils.order_events(event_1_as_dict) assert ordered_events == [event_1_as_dict]