test_basic.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. #!/usr/bin/env python3
  2. """
  3. Basic tests for the Trixy Event System.
  4. This file provides basic functionality tests to ensure the event system
  5. works correctly in production scenarios.
  6. """
  7. import sys
  8. import os
  9. import time
  10. from typing import Any
  11. # Add the source directory to path for imports
  12. sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
  13. from trixy_core.events import (
  14. EventHandler, TrixyEvent, EventType, EventDataFactory,
  15. SatelliteInfo, SpeakerInfo, SystemStartupEventData
  16. )
  17. class TestEventHandler:
  18. """Test component for basic event handling."""
  19. def __init__(self):
  20. self.events_received = []
  21. @TrixyEvent(["system_startup", "wakeword_received"])
  22. def handle_test_events(self, event_name: str, event_data: Any):
  23. """Handle test events."""
  24. self.events_received.append((event_name, event_data))
  25. print(f"✓ Received event: {event_name}")
  26. def test_basic_functionality():
  27. """Test basic event system functionality."""
  28. print("=== Basic Event System Tests ===\n")
  29. # Test 1: EventHandler creation and configuration
  30. print("1. Testing EventHandler creation...")
  31. event_handler = EventHandler(max_history_size=100)
  32. event_handler.enable_debug_mode(False) # Disable debug for cleaner output
  33. print("✓ EventHandler created successfully")
  34. # Test 2: Event handler registration
  35. print("\n2. Testing event handler registration...")
  36. test_handler = TestEventHandler()
  37. event_handler.register_handler_object(test_handler)
  38. print("✓ Event handlers registered successfully")
  39. # Test 3: Basic event triggering
  40. print("\n3. Testing basic event triggering...")
  41. event_id = event_handler.trigger_event(
  42. EventType.SYSTEM_STARTUP,
  43. mode="test",
  44. version="1.0.0",
  45. config_file="test_config.json"
  46. )
  47. print(f"✓ Event triggered with ID: {event_id}")
  48. # Test 4: Event data factory
  49. print("\n4. Testing event data factory...")
  50. satellite_info = SatelliteInfo(
  51. satellite_id="test_sat",
  52. mac_address="00:11:22:33:44:55",
  53. room_id="test_room",
  54. alias="Test Satellite",
  55. version="1.0.0"
  56. )
  57. speaker_info = SpeakerInfo(
  58. speaker_id="test_speaker",
  59. speaker_name="Test User",
  60. confidence=0.95
  61. )
  62. wakeword_data = EventDataFactory.create_event_data(
  63. EventType.WAKEWORD_RECEIVED,
  64. wakeword_id="trixy",
  65. speaker_info=speaker_info,
  66. satellite_info=satellite_info,
  67. volume=0.8
  68. )
  69. event_id2 = event_handler.trigger_event(
  70. EventType.WAKEWORD_RECEIVED,
  71. wakeword_data
  72. )
  73. print(f"✓ Event created with factory, triggered with ID: {event_id2}")
  74. # Test 5: Event history
  75. print("\n5. Testing event history...")
  76. history = event_handler.get_event_history(limit=5)
  77. print(f"✓ Retrieved {len(history)} events from history")
  78. # Test 6: Event statistics
  79. print("\n6. Testing event statistics...")
  80. stats = event_handler.get_event_statistics()
  81. print(f"✓ Retrieved statistics for {len(stats)} event types")
  82. # Test 7: Async events
  83. print("\n7. Testing async events...")
  84. async_event_id = event_handler.trigger_event_async(
  85. EventType.SYSTEM_STARTUP,
  86. mode="async_test",
  87. version="1.0.0",
  88. config_file="async_test_config.json"
  89. )
  90. # Wait for async event to complete
  91. result = event_handler.wait_for_event(async_event_id, timeout=5.0)
  92. if result:
  93. print(f"✓ Async event completed successfully in {result.execution_time_ms:.1f}ms")
  94. else:
  95. print("✗ Async event timed out")
  96. # Test 8: Verify events were received
  97. print("\n8. Verifying event reception...")
  98. expected_events = 3 # 2 system_startup + 1 wakeword_received
  99. if len(test_handler.events_received) == expected_events:
  100. print(f"✓ All {expected_events} events received correctly")
  101. else:
  102. print(f"✗ Expected {expected_events} events, got {len(test_handler.events_received)}")
  103. # Test 9: Event filtering
  104. print("\n9. Testing event filtering...")
  105. event_handler.disable_event_type("system_startup")
  106. # This should be ignored
  107. ignored_event_id = event_handler.trigger_event(
  108. EventType.SYSTEM_STARTUP,
  109. mode="ignored",
  110. version="1.0.0",
  111. config_file="ignored.json"
  112. )
  113. if ignored_event_id == "":
  114. print("✓ Disabled event type correctly ignored")
  115. else:
  116. print("✗ Disabled event type was not ignored")
  117. # Re-enable for cleanup
  118. event_handler.enable_event_type("system_startup")
  119. # Test 10: Cleanup
  120. print("\n10. Testing cleanup...")
  121. event_handler.unregister_handler_object(test_handler)
  122. event_handler.shutdown()
  123. print("✓ Event system cleaned up successfully")
  124. print("\n=== All Tests Completed ===")
  125. return True
  126. def test_event_data_structures():
  127. """Test event data structures."""
  128. print("\n=== Event Data Structure Tests ===\n")
  129. # Test all supported event types
  130. supported_events = EventDataFactory.get_supported_events()
  131. print(f"Testing {len(supported_events)} supported event types...")
  132. success_count = 0
  133. for event_type in supported_events:
  134. try:
  135. # Create minimal event data for each type
  136. if event_type == EventType.SATELLITE_CONNECTED:
  137. satellite_info = SatelliteInfo("test", "00:00:00:00:00:00", "test", "test", "1.0")
  138. data = EventDataFactory.create_event_data(event_type, satellite_info=satellite_info)
  139. elif event_type == EventType.WAKEWORD_RECEIVED:
  140. satellite_info = SatelliteInfo("test", "00:00:00:00:00:00", "test", "test", "1.0")
  141. speaker_info = SpeakerInfo("test", "test")
  142. data = EventDataFactory.create_event_data(
  143. event_type,
  144. satellite_info=satellite_info,
  145. speaker_info=speaker_info
  146. )
  147. else:
  148. # Use default values for other event types
  149. data = EventDataFactory.create_event_data(event_type)
  150. # Test serialization
  151. data_dict = data.to_dict()
  152. print(f"✓ {event_type.value}")
  153. success_count += 1
  154. except Exception as e:
  155. print(f"✗ {event_type.value}: {e}")
  156. print(f"\n✓ {success_count}/{len(supported_events)} event data structures tested successfully")
  157. return success_count == len(supported_events)
  158. def main():
  159. """Run all tests."""
  160. print("Trixy Event System - Basic Tests")
  161. print("=" * 40)
  162. try:
  163. # Run basic functionality tests
  164. basic_success = test_basic_functionality()
  165. # Run event data structure tests
  166. data_success = test_event_data_structures()
  167. if basic_success and data_success:
  168. print("\n🎉 All tests passed successfully!")
  169. return 0
  170. else:
  171. print("\n❌ Some tests failed!")
  172. return 1
  173. except Exception as e:
  174. print(f"\n💥 Test execution failed: {e}")
  175. import traceback
  176. traceback.print_exc()
  177. return 1
  178. if __name__ == "__main__":
  179. exit(main())