@@ -11,7 +11,9 @@ import (
11
11
"io/ioutil"
12
12
"math/rand"
13
13
"os"
14
+ "runtime"
14
15
"strings"
16
+ "sync"
15
17
"testing"
16
18
"time"
17
19
@@ -57,6 +59,57 @@ func TestEncoder_EncodeAllSimple(t *testing.T) {
57
59
}
58
60
}
59
61
62
+ func TestEncoder_EncodeAllConcurrent (t * testing.T ) {
63
+ in , err := ioutil .ReadFile ("testdata/z000028" )
64
+ if err != nil {
65
+ t .Fatal (err )
66
+ }
67
+ in = append (in , in ... )
68
+
69
+ // When running race no more than 8k goroutines allowed.
70
+ n := 4000 / runtime .GOMAXPROCS (0 )
71
+ if testing .Short () {
72
+ n = 200 / runtime .GOMAXPROCS (0 )
73
+ }
74
+ dec , err := NewReader (nil )
75
+ if err != nil {
76
+ t .Fatal (err )
77
+ }
78
+ defer dec .Close ()
79
+ for level := EncoderLevel (speedNotSet + 1 ); level < speedLast ; level ++ {
80
+ t .Run (level .String (), func (t * testing.T ) {
81
+ rng := rand .New (rand .NewSource (0x1337 ))
82
+ e , err := NewWriter (nil , WithEncoderLevel (level ), WithZeroFrames (true ))
83
+ if err != nil {
84
+ t .Fatal (err )
85
+ }
86
+ defer e .Close ()
87
+ var wg sync.WaitGroup
88
+ wg .Add (n )
89
+ for i := 0 ; i < n ; i ++ {
90
+ in := in [rng .Int ()& 1023 :]
91
+ in = in [:rng .Intn (len (in ))]
92
+ go func () {
93
+ defer wg .Done ()
94
+ dst := e .EncodeAll (in , nil )
95
+ //t.Log("Simple Encoder len", len(in), "-> zstd len", len(dst))
96
+ decoded , err := dec .DecodeAll (dst , nil )
97
+ if err != nil {
98
+ t .Error (err , len (decoded ))
99
+ }
100
+ if ! bytes .Equal (decoded , in ) {
101
+ //ioutil.WriteFile("testdata/"+t.Name()+"-z000028.got", decoded, os.ModePerm)
102
+ //ioutil.WriteFile("testdata/"+t.Name()+"-z000028.want", in, os.ModePerm)
103
+ t .Fatal ("Decoded does not match" )
104
+ }
105
+ }()
106
+ }
107
+ wg .Wait ()
108
+ t .Log ("Encoded content matched." , n , "goroutines" )
109
+ })
110
+ }
111
+ }
112
+
60
113
func TestEncoder_EncodeAllEncodeXML (t * testing.T ) {
61
114
f , err := os .Open ("testdata/xml.zst" )
62
115
if err != nil {
0 commit comments