progressreader_test.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package progress
  2. import (
  3. "bytes"
  4. "io"
  5. "io/ioutil"
  6. "testing"
  7. )
  8. func TestOutputOnPrematureClose(t *testing.T) {
  9. content := []byte("TESTING")
  10. reader := ioutil.NopCloser(bytes.NewReader(content))
  11. progressChan := make(chan Progress, 10)
  12. pr := NewProgressReader(reader, ChanOutput(progressChan), int64(len(content)), "Test", "Read")
  13. part := make([]byte, 4)
  14. _, err := io.ReadFull(pr, part)
  15. if err != nil {
  16. pr.Close()
  17. t.Fatal(err)
  18. }
  19. drainLoop:
  20. for {
  21. select {
  22. case <-progressChan:
  23. default:
  24. break drainLoop
  25. }
  26. }
  27. pr.Close()
  28. select {
  29. case <-progressChan:
  30. default:
  31. t.Fatalf("Expected some output when closing prematurely")
  32. }
  33. }
  34. func TestCompleteSilently(t *testing.T) {
  35. content := []byte("TESTING")
  36. reader := ioutil.NopCloser(bytes.NewReader(content))
  37. progressChan := make(chan Progress, 10)
  38. pr := NewProgressReader(reader, ChanOutput(progressChan), int64(len(content)), "Test", "Read")
  39. out, err := ioutil.ReadAll(pr)
  40. if err != nil {
  41. pr.Close()
  42. t.Fatal(err)
  43. }
  44. if string(out) != "TESTING" {
  45. pr.Close()
  46. t.Fatalf("Unexpected output %q from reader", string(out))
  47. }
  48. drainLoop:
  49. for {
  50. select {
  51. case <-progressChan:
  52. default:
  53. break drainLoop
  54. }
  55. }
  56. pr.Close()
  57. select {
  58. case <-progressChan:
  59. t.Fatalf("Should have closed silently when read is complete")
  60. default:
  61. }
  62. }