@@ -549,13 +549,47 @@ func TestServerSentEventSender(t *testing.T) {
549
549
require .True (t ,<- successC )
550
550
})
551
551
552
- t .Run ("Cancels the entire connection if the request context cancels" ,func (t * testing.T ) {
553
- t .FailNow ()
554
- t .Parallel ()
555
- })
556
-
557
552
t .Run ("Sends a heartbeat to the client on a fixed internal of time to keep connections alive" ,func (t * testing.T ) {
558
- t .FailNow ()
559
553
t .Parallel ()
554
+
555
+ // Need add at least three heartbeats for something to be reliably
556
+ // counted as an interval, but also need some wiggle room
557
+ heartbeatCount := 3
558
+ hbDuration := time .Duration (heartbeatCount )* httpapi .HeartbeatInterval
559
+ timeout := hbDuration + (5 * time .Second )
560
+
561
+ ctx := testutil .Context (t ,timeout )
562
+ req := newBaseRequest (ctx )
563
+ writer := newServerSentWriter (t )
564
+ _ ,_ ,err := httpapi .ServerSentEventSender (writer ,req )
565
+ require .NoError (t ,err )
566
+
567
+ type Result struct {
568
+ Err error
569
+ Success bool
570
+ }
571
+ resultC := make (chan Result )
572
+ go func () {
573
+ err := writer .
574
+ clientConn .
575
+ SetReadDeadline (time .Now ().Add (timeout ))
576
+ if err != nil {
577
+ resultC <- Result {err ,false }
578
+ return
579
+ }
580
+ for range heartbeatCount {
581
+ pingBuffer := make ([]byte ,1 )
582
+ pingSize ,err := writer .clientConn .Read (pingBuffer )
583
+ if err != nil || pingSize != 1 {
584
+ resultC <- Result {err ,false }
585
+ return
586
+ }
587
+ }
588
+ resultC <- Result {nil ,true }
589
+ }()
590
+
591
+ result := <- resultC
592
+ require .NoError (t ,result .Err )
593
+ require .True (t ,result .Success )
560
594
})
561
595
}