readers_test.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package ioutils
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "strings"
  6. "testing"
  7. "time"
  8. "golang.org/x/net/context"
  9. )
  10. // Implement io.Reader
  11. type errorReader struct{}
  12. func (r *errorReader) Read(p []byte) (int, error) {
  13. return 0, fmt.Errorf("Error reader always fail.")
  14. }
  15. func TestReadCloserWrapperClose(t *testing.T) {
  16. reader := strings.NewReader("A string reader")
  17. wrapper := NewReadCloserWrapper(reader, func() error {
  18. return fmt.Errorf("This will be called when closing")
  19. })
  20. err := wrapper.Close()
  21. if err == nil || !strings.Contains(err.Error(), "This will be called when closing") {
  22. t.Fatalf("readCloserWrapper should have call the anonymous func and thus, fail.")
  23. }
  24. }
  25. func TestReaderErrWrapperReadOnError(t *testing.T) {
  26. called := false
  27. reader := &errorReader{}
  28. wrapper := NewReaderErrWrapper(reader, func() {
  29. called = true
  30. })
  31. _, err := wrapper.Read([]byte{})
  32. if err == nil || !strings.Contains(err.Error(), "Error reader always fail.") {
  33. t.Fatalf("readErrWrapper should returned an error")
  34. }
  35. if !called {
  36. t.Fatalf("readErrWrapper should have call the anonymous function on failure")
  37. }
  38. }
  39. func TestReaderErrWrapperRead(t *testing.T) {
  40. reader := strings.NewReader("a string reader.")
  41. wrapper := NewReaderErrWrapper(reader, func() {
  42. t.Fatalf("readErrWrapper should not have called the anonymous function")
  43. })
  44. // Read 20 byte (should be ok with the string above)
  45. num, err := wrapper.Read(make([]byte, 20))
  46. if err != nil {
  47. t.Fatal(err)
  48. }
  49. if num != 16 {
  50. t.Fatalf("readerErrWrapper should have read 16 byte, but read %d", num)
  51. }
  52. }
  53. func TestHashData(t *testing.T) {
  54. reader := strings.NewReader("hash-me")
  55. actual, err := HashData(reader)
  56. if err != nil {
  57. t.Fatal(err)
  58. }
  59. expected := "sha256:4d11186aed035cc624d553e10db358492c84a7cd6b9670d92123c144930450aa"
  60. if actual != expected {
  61. t.Fatalf("Expecting %s, got %s", expected, actual)
  62. }
  63. }
  64. type perpetualReader struct{}
  65. func (p *perpetualReader) Read(buf []byte) (n int, err error) {
  66. for i := 0; i != len(buf); i++ {
  67. buf[i] = 'a'
  68. }
  69. return len(buf), nil
  70. }
  71. func TestCancelReadCloser(t *testing.T) {
  72. ctx, _ := context.WithTimeout(context.Background(), 100*time.Millisecond)
  73. cancelReadCloser := NewCancelReadCloser(ctx, ioutil.NopCloser(&perpetualReader{}))
  74. for {
  75. var buf [128]byte
  76. _, err := cancelReadCloser.Read(buf[:])
  77. if err == context.DeadlineExceeded {
  78. break
  79. } else if err != nil {
  80. t.Fatalf("got unexpected error: %v", err)
  81. }
  82. }
  83. }