test_event_stream.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import json
  2. import pytest
  3. from pytest import TempPathFactory
  4. from openhands.events import EventSource, EventStream
  5. from openhands.events.action import (
  6. NullAction,
  7. )
  8. from openhands.events.observation import NullObservation
  9. from openhands.storage import get_file_store
  10. @pytest.fixture
  11. def temp_dir(tmp_path_factory: TempPathFactory) -> str:
  12. return str(tmp_path_factory.mktemp('test_event_stream'))
  13. def collect_events(stream):
  14. return [event for event in stream.get_events()]
  15. def test_basic_flow(temp_dir: str):
  16. file_store = get_file_store('local', temp_dir)
  17. event_stream = EventStream('abc', file_store)
  18. event_stream.add_event(NullAction(), EventSource.AGENT)
  19. assert len(collect_events(event_stream)) == 1
  20. def test_stream_storage(temp_dir: str):
  21. file_store = get_file_store('local', temp_dir)
  22. event_stream = EventStream('abc', file_store)
  23. event_stream.add_event(NullObservation(''), EventSource.AGENT)
  24. assert len(collect_events(event_stream)) == 1
  25. content = event_stream.file_store.read('sessions/abc/events/0.json')
  26. assert content is not None
  27. data = json.loads(content)
  28. assert 'timestamp' in data
  29. del data['timestamp']
  30. assert data == {
  31. 'id': 0,
  32. 'source': 'agent',
  33. 'observation': 'null',
  34. 'content': '',
  35. 'extras': {},
  36. 'message': 'No observation',
  37. }
  38. def test_rehydration(temp_dir: str):
  39. file_store = get_file_store('local', temp_dir)
  40. event_stream = EventStream('abc', file_store)
  41. event_stream.add_event(NullObservation('obs1'), EventSource.AGENT)
  42. event_stream.add_event(NullObservation('obs2'), EventSource.AGENT)
  43. assert len(collect_events(event_stream)) == 2
  44. stream2 = EventStream('es2', file_store)
  45. assert len(collect_events(stream2)) == 0
  46. stream1rehydrated = EventStream('abc', file_store)
  47. events = collect_events(stream1rehydrated)
  48. assert len(events) == 2
  49. assert events[0].content == 'obs1'
  50. assert events[1].content == 'obs2'