@@ -125,6 +125,40 @@ func TestDeflate(t *testing.T) {
125
125
}
126
126
}
127
127
128
+ func TestWriterClose (t * testing.T ) {
129
+ b := new (bytes.Buffer )
130
+ zw , err := NewWriter (b , 6 )
131
+ if err != nil {
132
+ t .Fatalf ("NewWriter: %v" , err )
133
+ }
134
+
135
+ if c , err := zw .Write ([]byte ("Test" )); err != nil || c != 4 {
136
+ t .Fatalf ("Write to not closed writer: %s, %d" , err , c )
137
+ }
138
+
139
+ if err := zw .Close (); err != nil {
140
+ t .Fatalf ("Close: %v" , err )
141
+ }
142
+
143
+ afterClose := b .Len ()
144
+
145
+ if c , err := zw .Write ([]byte ("Test" )); err == nil || c != 0 {
146
+ t .Fatalf ("Write to closed writer: %s, %d" , err , c )
147
+ }
148
+
149
+ if err := zw .Flush (); err == nil {
150
+ t .Fatalf ("Flush to closed writer: %s" , err )
151
+ }
152
+
153
+ if err := zw .Close (); err != nil {
154
+ t .Fatalf ("Close: %v" , err )
155
+ }
156
+
157
+ if afterClose != b .Len () {
158
+ t .Fatalf ("Writer wrote data after close. After close: %d. After writes on closed stream: %d" , afterClose , b .Len ())
159
+ }
160
+ }
161
+
128
162
// A sparseReader returns a stream consisting of 0s followed by 1<<16 1s.
129
163
// This tests missing hash references in a very large input.
130
164
type sparseReader struct {
@@ -683,7 +717,7 @@ func (w *failWriter) Write(b []byte) (int, error) {
683
717
return len (b ), nil
684
718
}
685
719
686
- func TestWriterPersistentError (t * testing.T ) {
720
+ func TestWriterPersistentWriteError (t * testing.T ) {
687
721
t .Parallel ()
688
722
d , err := os .ReadFile ("../../testdata/Isaac.Newton-Opticks.txt" )
689
723
if err != nil {
@@ -706,19 +740,71 @@ func TestWriterPersistentError(t *testing.T) {
706
740
707
741
_ , werr := zw .Write (d )
708
742
cerr := zw .Close ()
743
+ ferr := zw .Flush ()
709
744
if werr != errIO && werr != nil {
710
745
t .Errorf ("test %d, mismatching Write error: got %v, want %v" , i , werr , errIO )
711
746
}
712
747
if cerr != errIO && fw .n < 0 {
713
748
t .Errorf ("test %d, mismatching Close error: got %v, want %v" , i , cerr , errIO )
714
749
}
750
+ if ferr != errIO && fw .n < 0 {
751
+ t .Errorf ("test %d, mismatching Flush error: got %v, want %v" , i , ferr , errIO )
752
+ }
715
753
if fw .n >= 0 {
716
754
// At this point, the failure threshold was sufficiently high enough
717
755
// that we wrote the whole stream without any errors.
718
756
return
719
757
}
720
758
}
721
759
}
760
+ func TestWriterPersistentFlushError (t * testing.T ) {
761
+ zw , err := NewWriter (& failWriter {0 }, DefaultCompression )
762
+ if err != nil {
763
+ t .Fatalf ("NewWriter: %v" , err )
764
+ }
765
+ flushErr := zw .Flush ()
766
+ closeErr := zw .Close ()
767
+ _ , writeErr := zw .Write ([]byte ("Test" ))
768
+ checkErrors ([]error {closeErr , flushErr , writeErr }, errIO , t )
769
+ }
770
+
771
+ func TestWriterPersistentCloseError (t * testing.T ) {
772
+ // If underlying writer return error on closing stream we should persistent this error across all writer calls.
773
+ zw , err := NewWriter (& failWriter {0 }, DefaultCompression )
774
+ if err != nil {
775
+ t .Fatalf ("NewWriter: %v" , err )
776
+ }
777
+ closeErr := zw .Close ()
778
+ flushErr := zw .Flush ()
779
+ _ , writeErr := zw .Write ([]byte ("Test" ))
780
+ checkErrors ([]error {closeErr , flushErr , writeErr }, errIO , t )
781
+
782
+ // After closing writer we should persistent "write after close" error across Flush and Write calls, but return nil
783
+ // on next Close calls.
784
+ var b bytes.Buffer
785
+ zw .Reset (& b )
786
+ err = zw .Close ()
787
+ if err != nil {
788
+ t .Fatalf ("First call to close returned error: %s" , err )
789
+ }
790
+ err = zw .Close ()
791
+ if err != nil {
792
+ t .Fatalf ("Second call to close returned error: %s" , err )
793
+ }
794
+
795
+ flushErr = zw .Flush ()
796
+ _ , writeErr = zw .Write ([]byte ("Test" ))
797
+ checkErrors ([]error {flushErr , writeErr }, errWriteAfterClose , t )
798
+ }
799
+
800
+ func checkErrors (got []error , want error , t * testing.T ) {
801
+ t .Helper ()
802
+ for _ , err := range got {
803
+ if err != want {
804
+ t .Errorf ("Errors dosn't match\n Want: %s\n Got: %s" , want , got )
805
+ }
806
+ }
807
+ }
722
808
723
809
func TestBestSpeedMatch (t * testing.T ) {
724
810
t .Parallel ()
0 commit comments