7
7
NodeMovingEvent ,
8
8
NodeMigratingEvent ,
9
9
NodeMigratedEvent ,
10
+ NodeFailingOverEvent ,
11
+ NodeFailedOverEvent ,
10
12
MaintenanceEventsConfig ,
11
13
MaintenanceEventPoolHandler ,
12
14
MaintenanceEventConnectionHandler ,
15
+ MaintenanceState ,
13
16
)
14
17
15
18
@@ -281,6 +284,84 @@ def test_equality_and_hash(self):
281
284
assert hash (event1 ) != hash (event3 )
282
285
283
286
287
+ class TestNodeFailingOverEvent :
288
+ """Test the NodeFailingOverEvent class."""
289
+
290
+ def test_init (self ):
291
+ """Test NodeFailingOverEvent initialization."""
292
+ with patch ("time.monotonic" , return_value = 1000 ):
293
+ event = NodeFailingOverEvent (id = 1 , ttl = 5 )
294
+ assert event .id == 1
295
+ assert event .ttl == 5
296
+ assert event .creation_time == 1000
297
+
298
+ def test_repr (self ):
299
+ """Test NodeFailingOverEvent string representation."""
300
+ with patch ("time.monotonic" , return_value = 1000 ):
301
+ event = NodeFailingOverEvent (id = 1 , ttl = 5 )
302
+
303
+ with patch ("time.monotonic" , return_value = 1002 ): # 2 seconds later
304
+ repr_str = repr (event )
305
+ assert "NodeFailingOverEvent" in repr_str
306
+ assert "id=1" in repr_str
307
+ assert "ttl=5" in repr_str
308
+ assert "remaining=3.0s" in repr_str
309
+ assert "expired=False" in repr_str
310
+
311
+ def test_equality_and_hash (self ):
312
+ """Test equality and hash for NodeFailingOverEvent."""
313
+ event1 = NodeFailingOverEvent (id = 1 , ttl = 5 )
314
+ event2 = NodeFailingOverEvent (id = 1 , ttl = 10 ) # Same id, different ttl
315
+ event3 = NodeFailingOverEvent (id = 2 , ttl = 5 ) # Different id
316
+
317
+ assert event1 == event2
318
+ assert event1 != event3
319
+ assert hash (event1 ) == hash (event2 )
320
+ assert hash (event1 ) != hash (event3 )
321
+
322
+
323
+ class TestNodeFailedOverEvent :
324
+ """Test the NodeFailedOverEvent class."""
325
+
326
+ def test_init (self ):
327
+ """Test NodeFailedOverEvent initialization."""
328
+ with patch ("time.monotonic" , return_value = 1000 ):
329
+ event = NodeFailedOverEvent (id = 1 )
330
+ assert event .id == 1
331
+ assert event .ttl == NodeFailedOverEvent .DEFAULT_TTL
332
+ assert event .creation_time == 1000
333
+
334
+ def test_default_ttl (self ):
335
+ """Test that DEFAULT_TTL is used correctly."""
336
+ assert NodeFailedOverEvent .DEFAULT_TTL == 5
337
+ event = NodeFailedOverEvent (id = 1 )
338
+ assert event .ttl == 5
339
+
340
+ def test_repr (self ):
341
+ """Test NodeFailedOverEvent string representation."""
342
+ with patch ("time.monotonic" , return_value = 1000 ):
343
+ event = NodeFailedOverEvent (id = 1 )
344
+
345
+ with patch ("time.monotonic" , return_value = 1001 ): # 1 second later
346
+ repr_str = repr (event )
347
+ assert "NodeFailedOverEvent" in repr_str
348
+ assert "id=1" in repr_str
349
+ assert "ttl=5" in repr_str
350
+ assert "remaining=4.0s" in repr_str
351
+ assert "expired=False" in repr_str
352
+
353
+ def test_equality_and_hash (self ):
354
+ """Test equality and hash for NodeFailedOverEvent."""
355
+ event1 = NodeFailedOverEvent (id = 1 )
356
+ event2 = NodeFailedOverEvent (id = 1 ) # Same id
357
+ event3 = NodeFailedOverEvent (id = 2 ) # Different id
358
+
359
+ assert event1 == event2
360
+ assert event1 != event3
361
+ assert hash (event1 ) == hash (event2 )
362
+ assert hash (event1 ) != hash (event3 )
363
+
364
+
284
365
class TestMaintenanceEventsConfig :
285
366
"""Test the MaintenanceEventsConfig class."""
286
367
@@ -477,19 +558,41 @@ def test_handle_event_migrating(self):
477
558
"""Test handling of NodeMigratingEvent."""
478
559
event = NodeMigratingEvent (id = 1 , ttl = 5 )
479
560
480
- with patch .object (self .handler , "handle_migrating_event" ) as mock_handle :
561
+ with patch .object (
562
+ self .handler , "handle_maintenance_start_event"
563
+ ) as mock_handle :
481
564
self .handler .handle_event (event )
482
- mock_handle .assert_called_once_with (event )
565
+ mock_handle .assert_called_once_with (MaintenanceState . MIGRATING )
483
566
484
567
def test_handle_event_migrated (self ):
485
568
"""Test handling of NodeMigratedEvent."""
486
569
event = NodeMigratedEvent (id = 1 )
487
570
488
571
with patch .object (
489
- self .handler , "handle_migration_completed_event "
572
+ self .handler , "handle_maintenance_completed_event "
490
573
) as mock_handle :
491
574
self .handler .handle_event (event )
492
- mock_handle .assert_called_once_with (event )
575
+ mock_handle .assert_called_once_with ()
576
+
577
+ def test_handle_event_failing_over (self ):
578
+ """Test handling of NodeFailingOverEvent."""
579
+ event = NodeFailingOverEvent (id = 1 , ttl = 5 )
580
+
581
+ with patch .object (
582
+ self .handler , "handle_maintenance_start_event"
583
+ ) as mock_handle :
584
+ self .handler .handle_event (event )
585
+ mock_handle .assert_called_once_with (MaintenanceState .FAILING_OVER )
586
+
587
+ def test_handle_event_failed_over (self ):
588
+ """Test handling of NodeFailedOverEvent."""
589
+ event = NodeFailedOverEvent (id = 1 )
590
+
591
+ with patch .object (
592
+ self .handler , "handle_maintenance_completed_event"
593
+ ) as mock_handle :
594
+ self .handler .handle_event (event )
595
+ mock_handle .assert_called_once_with ()
493
596
494
597
def test_handle_event_unknown_type (self ):
495
598
"""Test handling of unknown event type."""
@@ -500,43 +603,71 @@ def test_handle_event_unknown_type(self):
500
603
result = self .handler .handle_event (event )
501
604
assert result is None
502
605
503
- def test_handle_migrating_event_disabled (self ):
504
- """Test migrating event handling when relax timeouts are disabled."""
606
+ def test_handle_maintenance_start_event_disabled (self ):
607
+ """Test maintenance start event handling when relax timeouts are disabled."""
505
608
config = MaintenanceEventsConfig (relax_timeout = - 1 )
506
609
handler = MaintenanceEventConnectionHandler (self .mock_connection , config )
507
- event = NodeMigratingEvent (id = 1 , ttl = 5 )
508
610
509
- result = handler .handle_migrating_event ( event )
611
+ result = handler .handle_maintenance_start_event ( MaintenanceState . MIGRATING )
510
612
assert result is None
511
613
self .mock_connection .update_current_socket_timeout .assert_not_called ()
512
614
513
- def test_handle_migrating_event_success (self ):
514
- """Test successful migrating event handling."""
515
- event = NodeMigratingEvent ( id = 1 , ttl = 5 )
615
+ def test_handle_maintenance_start_event_moving_state (self ):
616
+ """Test maintenance start event handling when connection is in MOVING state ."""
617
+ self . mock_connection . maintenance_state = MaintenanceState . MOVING
516
618
517
- self .handler .handle_migrating_event (event )
619
+ result = self .handler .handle_maintenance_start_event (MaintenanceState .MIGRATING )
620
+ assert result is None
621
+ self .mock_connection .update_current_socket_timeout .assert_not_called ()
518
622
623
+ def test_handle_maintenance_start_event_migrating_success (self ):
624
+ """Test successful maintenance start event handling for migrating."""
625
+ self .mock_connection .maintenance_state = MaintenanceState .NONE
626
+
627
+ self .handler .handle_maintenance_start_event (MaintenanceState .MIGRATING )
628
+
629
+ assert self .mock_connection .maintenance_state == MaintenanceState .MIGRATING
519
630
self .mock_connection .update_current_socket_timeout .assert_called_once_with (20 )
520
631
self .mock_connection .set_tmp_settings .assert_called_once_with (
521
632
tmp_relax_timeout = 20
522
633
)
523
634
524
- def test_handle_migration_completed_event_disabled (self ):
525
- """Test migration completed event handling when relax timeouts are disabled."""
635
+ def test_handle_maintenance_start_event_failing_over_success (self ):
636
+ """Test successful maintenance start event handling for failing over."""
637
+ self .mock_connection .maintenance_state = MaintenanceState .NONE
638
+
639
+ self .handler .handle_maintenance_start_event (MaintenanceState .FAILING_OVER )
640
+
641
+ assert self .mock_connection .maintenance_state == MaintenanceState .FAILING_OVER
642
+ self .mock_connection .update_current_socket_timeout .assert_called_once_with (20 )
643
+ self .mock_connection .set_tmp_settings .assert_called_once_with (
644
+ tmp_relax_timeout = 20
645
+ )
646
+
647
+ def test_handle_maintenance_completed_event_disabled (self ):
648
+ """Test maintenance completed event handling when relax timeouts are disabled."""
526
649
config = MaintenanceEventsConfig (relax_timeout = - 1 )
527
650
handler = MaintenanceEventConnectionHandler (self .mock_connection , config )
528
- event = NodeMigratedEvent (id = 1 )
529
651
530
- result = handler .handle_migration_completed_event ( event )
652
+ result = handler .handle_maintenance_completed_event ( )
531
653
assert result is None
532
654
self .mock_connection .update_current_socket_timeout .assert_not_called ()
533
655
534
- def test_handle_migration_completed_event_success (self ):
535
- """Test successful migration completed event handling."""
536
- event = NodeMigratedEvent (id = 1 )
656
+ def test_handle_maintenance_completed_event_moving_state (self ):
657
+ """Test maintenance completed event handling when connection is in MOVING state."""
658
+ self .mock_connection .maintenance_state = MaintenanceState .MOVING
659
+
660
+ result = self .handler .handle_maintenance_completed_event ()
661
+ assert result is None
662
+ self .mock_connection .update_current_socket_timeout .assert_not_called ()
663
+
664
+ def test_handle_maintenance_completed_event_success (self ):
665
+ """Test successful maintenance completed event handling."""
666
+ self .mock_connection .maintenance_state = MaintenanceState .MIGRATING
537
667
538
- self .handler .handle_migration_completed_event ( event )
668
+ self .handler .handle_maintenance_completed_event ( )
539
669
670
+ assert self .mock_connection .maintenance_state == MaintenanceState .NONE
540
671
self .mock_connection .update_current_socket_timeout .assert_called_once_with (- 1 )
541
672
self .mock_connection .reset_tmp_settings .assert_called_once_with (
542
673
reset_relax_timeout = True
0 commit comments