@@ -378,3 +378,64 @@ func TestInterruptableReader_justRead(t *testing.T) {
378378 assert .Equal (t , buffer [0 ], byte (42 ))
379379 assert .Equal (t , len (buffer ), 7 )
380380}
381+
382+ func TestInterruptableReader_waitForReadReadyPipe (t * testing.T ) {
383+ // Make a pipe to read from and write to
384+ pipeReader , pipeWriter , err := os .Pipe ()
385+ assert .NilError (t , err )
386+
387+ t .Cleanup (func () {
388+ _ = pipeReader .Close ()
389+ _ = pipeWriter .Close ()
390+ })
391+
392+ // Make an interruptable reader
393+ testMe := newInterruptableReader (pipeReader )
394+
395+ // With no data available we should wait a bit, then report not ready.
396+ t0 := time .Now ()
397+ ready , err := testMe .waitForReadReady (time .Millisecond * 100 )
398+ duration := time .Since (t0 )
399+ assert .NilError (t , err )
400+ assert .Equal (t , ready , false )
401+ assert .Assert (t , duration > time .Millisecond * 100 )
402+
403+ // After writing, the pipe should become ready.
404+ n , err := pipeWriter .Write ([]byte {42 })
405+ assert .NilError (t , err )
406+ assert .Equal (t , n , 1 )
407+
408+ // With data available we should report ready immediately
409+ ready , err = testMe .waitForReadReady (time .Hour )
410+ assert .NilError (t , err )
411+ assert .Equal (t , ready , true )
412+ }
413+
414+ // On Unix, files are always ready (to return EOF if nothing else), but on
415+ // Windows they are non-ready if they have no data. So we just verify the
416+ // have-data case here, and let the no-data case be whatever.
417+ func TestInterruptableReader_waitForReadReadyFile (t * testing.T ) {
418+ tempFile , err := os .CreateTemp ("" , "moor-wait-for-read-ready-*.txt" )
419+ assert .NilError (t , err )
420+
421+ t .Cleanup (func () {
422+ _ = tempFile .Close ()
423+ _ = os .Remove (tempFile .Name ())
424+ })
425+
426+ // Put something in the file
427+ n , err := tempFile .Write ([]byte ("x" ))
428+ assert .NilError (t , err )
429+ assert .Equal (t , n , 1 )
430+
431+ // Rewind so we can see the "x"
432+ seek , err := tempFile .Seek (0 , 0 )
433+ assert .NilError (t , err )
434+ assert .Equal (t , seek , int64 (0 ))
435+
436+ // Expect read-ready immediately
437+ testMe := newInterruptableReader (tempFile )
438+ ready , err := testMe .waitForReadReady (time .Hour )
439+ assert .NilError (t , err )
440+ assert .Equal (t , ready , true )
441+ }
0 commit comments