1
1
package routine
2
2
3
3
import (
4
+ "fmt"
4
5
"io"
5
6
"os"
6
- "path"
7
- "strconv"
8
7
"strings"
9
8
"sync"
10
9
"testing"
@@ -138,8 +137,9 @@ func TestWrapTask_HasContext(t *testing.T) {
138
137
}
139
138
140
139
func TestWrapTask_Complete_ThenFail (t * testing.T ) {
141
- newStdout , oldStdout := captureStdout ()
142
- defer restoreStdout (newStdout , oldStdout )
140
+ tracker := NewFileTracker (& os .Stdout )
141
+ tracker .Begin ()
142
+ defer tracker .End ()
143
143
//
144
144
run := false
145
145
wg := & sync.WaitGroup {}
@@ -167,8 +167,7 @@ func TestWrapTask_Complete_ThenFail(t *testing.T) {
167
167
assert .True (t , run )
168
168
//
169
169
time .Sleep (10 * time .Millisecond )
170
- output := readAll (newStdout )
171
- assert .Equal (t , "" , output )
170
+ assert .Equal (t , "" , tracker .Value ())
172
171
}
173
172
174
173
func TestWrapWaitTask_NoContext (t * testing.T ) {
@@ -344,8 +343,9 @@ func TestWrapWaitTask_HasContext_Cancel(t *testing.T) {
344
343
}
345
344
346
345
func TestWrapWaitTask_Complete_ThenFail (t * testing.T ) {
347
- newStdout , oldStdout := captureStdout ()
348
- defer restoreStdout (newStdout , oldStdout )
346
+ tracker := NewFileTracker (& os .Stdout )
347
+ tracker .Begin ()
348
+ defer tracker .End ()
349
349
//
350
350
run := false
351
351
wg := & sync.WaitGroup {}
@@ -373,8 +373,7 @@ func TestWrapWaitTask_Complete_ThenFail(t *testing.T) {
373
373
assert .True (t , run )
374
374
//
375
375
time .Sleep (10 * time .Millisecond )
376
- output := readAll (newStdout )
377
- assert .Equal (t , "" , output )
376
+ assert .Equal (t , "" , tracker .Value ())
378
377
}
379
378
380
379
func TestWrapWaitResultTask_NoContext (t * testing.T ) {
@@ -554,8 +553,9 @@ func TestWrapWaitResultTask_HasContext_Cancel(t *testing.T) {
554
553
}
555
554
556
555
func TestWrapWaitResultTask_Complete_ThenFail (t * testing.T ) {
557
- newStdout , oldStdout := captureStdout ()
558
- defer restoreStdout (newStdout , oldStdout )
556
+ tracker := NewFileTracker (& os .Stdout )
557
+ tracker .Begin ()
558
+ defer tracker .End ()
559
559
//
560
560
run := false
561
561
wg := & sync.WaitGroup {}
@@ -583,13 +583,13 @@ func TestWrapWaitResultTask_Complete_ThenFail(t *testing.T) {
583
583
assert .True (t , run )
584
584
//
585
585
time .Sleep (10 * time .Millisecond )
586
- output := readAll (newStdout )
587
- assert .Equal (t , "" , output )
586
+ assert .Equal (t , "" , tracker .Value ())
588
587
}
589
588
590
589
func TestGo_Error (t * testing.T ) {
591
- newStdout , oldStdout := captureStdout ()
592
- defer restoreStdout (newStdout , oldStdout )
590
+ tracker := NewFileTracker (& os .Stdout )
591
+ tracker .Begin ()
592
+ defer tracker .End ()
593
593
//
594
594
run := false
595
595
assert .NotPanics (t , func () {
@@ -605,8 +605,7 @@ func TestGo_Error(t *testing.T) {
605
605
assert .True (t , run )
606
606
//
607
607
time .Sleep (10 * time .Millisecond )
608
- output := readAll (newStdout )
609
- lines := strings .Split (output , newLine )
608
+ lines := strings .Split (tracker .Value (), newLine )
610
609
assert .Equal (t , 7 , len (lines ))
611
610
//
612
611
line := lines [0 ]
@@ -728,7 +727,7 @@ func TestGoWait_Error(t *testing.T) {
728
727
//
729
728
line = lines [1 ]
730
729
assert .True (t , strings .HasPrefix (line , " at github.com/timandy/routine.TestGoWait_Error." ))
731
- assert .True (t , strings .HasSuffix (line , "api_routine_test.go:711 " ))
730
+ assert .True (t , strings .HasSuffix (line , "api_routine_test.go:710 " ))
732
731
//
733
732
line = lines [2 ]
734
733
assert .True (t , strings .HasPrefix (line , " at github.com/timandy/routine.inheritedWaitTask.run()" ))
@@ -834,7 +833,7 @@ func TestGoWaitResult_Error(t *testing.T) {
834
833
//
835
834
line = lines [1 ]
836
835
assert .True (t , strings .HasPrefix (line , " at github.com/timandy/routine.TestGoWaitResult_Error." ))
837
- assert .True (t , strings .HasSuffix (line , "api_routine_test.go:815 " ))
836
+ assert .True (t , strings .HasSuffix (line , "api_routine_test.go:814 " ))
838
837
//
839
838
line = lines [2 ]
840
839
assert .True (t , strings .HasPrefix (line , " at github.com/timandy/routine.inheritedWaitResultTask[...].run()" ))
@@ -925,44 +924,54 @@ func TestGoWaitResult_Cross(t *testing.T) {
925
924
assert .Equal (t , "" , result )
926
925
}
927
926
928
- func captureStdout () (newStdout , oldStdout * os.File ) {
929
- oldStdout = os .Stdout
930
- fileName := path .Join (os .TempDir (), "go_test_" + strconv .FormatInt (time .Now ().UnixNano (), 10 )+ ".txt" )
931
- file , err := os .Create (fileName )
927
+ //===
928
+
929
+ type FileTracker struct {
930
+ target * * os.File
931
+ oldValue * os.File
932
+ tempValue * os.File
933
+ }
934
+
935
+ func NewFileTracker (target * * os.File ) * FileTracker {
936
+ return & FileTracker {target : target , oldValue : * target }
937
+ }
938
+
939
+ func (f * FileTracker ) Begin () {
940
+ file , err := os .CreateTemp ("" , "go_test_*.txt" )
932
941
if err != nil {
933
942
panic (err )
934
943
}
935
- os .Stdout = file
936
- newStdout = file
937
- return
944
+ * f .target = file
945
+ f .tempValue = file
938
946
}
939
947
940
- func restoreStdout ( newStdout , oldStdout * os. File ) {
941
- os . Stdout = oldStdout
942
- if err := newStdout .Close (); err != nil {
948
+ func ( f * FileTracker ) End ( ) {
949
+ * f . target = f . oldValue
950
+ if err := f . tempValue .Close (); err != nil {
943
951
panic (err )
944
952
}
945
- if err := os .Remove (newStdout .Name ()); err != nil {
953
+ if err := os .Remove (f . tempValue .Name ()); err != nil {
946
954
panic (err )
947
955
}
948
956
}
949
957
950
- func readAll ( rs io. ReadSeeker ) string {
951
- if _ , err := rs .Seek (0 , io .SeekStart ); err != nil {
958
+ func ( f * FileTracker ) Value ( ) string {
959
+ if _ , err := f . tempValue .Seek (0 , io .SeekStart ); err != nil {
952
960
panic (err )
953
961
}
954
- b := make ([]byte , 0 , 512 )
955
- for {
956
- if len (b ) == cap (b ) {
957
- b = append (b , 0 )[:len (b )]
958
- }
959
- n , err := rs .Read (b [len (b ):cap (b )])
960
- b = b [:len (b )+ n ]
961
- if err != nil {
962
- if err == io .EOF {
963
- return string (b )
964
- }
965
- panic (err )
966
- }
962
+ buff , err := io .ReadAll (f .tempValue )
963
+ if err != nil {
964
+ panic (err )
967
965
}
966
+ return string (buff )
967
+ }
968
+
969
+ func TestFileTracker (t * testing.T ) {
970
+ origin := os .Stdout
971
+ tracker := NewFileTracker (& os .Stdout )
972
+ tracker .Begin ()
973
+ fmt .Println ("hello world" )
974
+ assert .Equal (t , "hello world\n " , tracker .Value ())
975
+ tracker .End ()
976
+ assert .Same (t , origin , os .Stdout )
968
977
}
0 commit comments