Parcourir la source

Remove SyncWrite

tags/v2.2.2^2^2
9seconds il y a 1 mois
Parent
révision
a23ae05f3b
2 fichiers modifiés avec 0 ajouts et 156 suppressions
  1. 0
    26
      mtglib/internal/doppel/conn.go
  2. 0
    130
      mtglib/internal/doppel/conn_test.go

+ 0
- 26
mtglib/internal/doppel/conn.go Voir le fichier

@@ -36,32 +36,6 @@ func (c Conn) Write(p []byte) (int, error) {
36 36
 	return len(p), context.Cause(c.p.ctx)
37 37
 }
38 38
 
39
-func (c Conn) SyncWrite(p []byte) (int, error) {
40
-	c.p.syncWriteLock.Lock()
41
-	defer c.p.syncWriteLock.Unlock()
42
-
43
-	c.p.writeCond.L.Lock()
44
-	// wait until buffer is exhausted
45
-	for c.p.writeStream.Len() != 0 && context.Cause(c.p.ctx) == nil {
46
-		c.p.writeCond.Wait()
47
-	}
48
-	c.p.writeStream.Write(p)
49
-	c.p.writeCond.L.Unlock()
50
-
51
-	if err := context.Cause(c.p.ctx); err != nil {
52
-		return len(p), err
53
-	}
54
-
55
-	c.p.writeCond.L.Lock()
56
-	// wait until data will be sent
57
-	for c.p.writeStream.Len() != 0 && context.Cause(c.p.ctx) == nil {
58
-		c.p.writeCond.Wait()
59
-	}
60
-	c.p.writeCond.L.Unlock()
61
-
62
-	return len(p), context.Cause(c.p.ctx)
63
-}
64
-
65 39
 func (c Conn) Start() {
66 40
 	c.p.wg.Go(func() {
67 41
 		c.start()

+ 0
- 130
mtglib/internal/doppel/conn_test.go Voir le fichier

@@ -157,136 +157,6 @@ func (suite *ConnTestSuite) TestStopOnUnderlyingWriteError() {
157 157
 	}, 2*time.Second, time.Millisecond)
158 158
 }
159 159
 
160
-func (suite *ConnTestSuite) TestSyncWriteDataSent() {
161
-	suite.connMock.
162
-		On("Write", mock.AnythingOfType("[]uint8")).
163
-		Return(0, nil).
164
-		Maybe()
165
-
166
-	c := suite.makeConn()
167
-	defer c.Stop()
168
-
169
-	payload := []byte("sync hello")
170
-	n, err := c.SyncWrite(payload)
171
-	suite.NoError(err)
172
-	suite.Equal(len(payload), n)
173
-
174
-	// SyncWrite returns only after data is flushed to the wire.
175
-	assembled := &bytes.Buffer{}
176
-	reader := bytes.NewReader(suite.connMock.Written())
177
-
178
-	for {
179
-		header := make([]byte, tls.SizeHeader)
180
-		if _, err := io.ReadFull(reader, header); err != nil {
181
-			break
182
-		}
183
-
184
-		suite.Equal(byte(tls.TypeApplicationData), header[0])
185
-
186
-		length := binary.BigEndian.Uint16(header[tls.SizeRecordType+tls.SizeVersion:])
187
-		rec := make([]byte, length)
188
-		_, err := io.ReadFull(reader, rec)
189
-		suite.NoError(err)
190
-
191
-		assembled.Write(rec)
192
-	}
193
-
194
-	suite.Equal(payload, assembled.Bytes())
195
-}
196
-
197
-func (suite *ConnTestSuite) TestSyncWriteDrainsBufferFirst() {
198
-	suite.connMock.
199
-		On("Write", mock.AnythingOfType("[]uint8")).
200
-		Return(0, nil).
201
-		Maybe()
202
-
203
-	c := suite.makeConn()
204
-	defer c.Stop()
205
-
206
-	// Buffer some data via async Write.
207
-	_, err := c.Write([]byte("first"))
208
-	suite.NoError(err)
209
-
210
-	// SyncWrite must drain "first" before sending "second".
211
-	n, err := c.SyncWrite([]byte("second"))
212
-	suite.NoError(err)
213
-	suite.Equal(6, n)
214
-
215
-	// All data should be on the wire now.
216
-	assembled := &bytes.Buffer{}
217
-	reader := bytes.NewReader(suite.connMock.Written())
218
-
219
-	for {
220
-		header := make([]byte, tls.SizeHeader)
221
-		if _, err := io.ReadFull(reader, header); err != nil {
222
-			break
223
-		}
224
-
225
-		length := binary.BigEndian.Uint16(header[tls.SizeRecordType+tls.SizeVersion:])
226
-		rec := make([]byte, length)
227
-		_, err := io.ReadFull(reader, rec)
228
-		suite.NoError(err)
229
-
230
-		assembled.Write(rec)
231
-	}
232
-
233
-	suite.Equal([]byte("firstsecond"), assembled.Bytes())
234
-}
235
-
236
-func (suite *ConnTestSuite) TestSyncWriteBlocksAsyncWrite() {
237
-	suite.connMock.
238
-		On("Write", mock.AnythingOfType("[]uint8")).
239
-		Return(0, nil).
240
-		Maybe()
241
-
242
-	c := suite.makeConn()
243
-	defer c.Stop()
244
-
245
-	// Start SyncWrite — it holds exclusive lock.
246
-	syncDone := make(chan struct{})
247
-
248
-	go func() {
249
-		defer close(syncDone)
250
-		c.SyncWrite([]byte("exclusive")) //nolint: errcheck
251
-	}()
252
-
253
-	// Give SyncWrite time to acquire the lock.
254
-	time.Sleep(10 * time.Millisecond)
255
-
256
-	// Async Write should block until SyncWrite completes.
257
-	writeDone := make(chan struct{})
258
-
259
-	go func() {
260
-		defer close(writeDone)
261
-		c.Write([]byte("blocked")) //nolint: errcheck
262
-	}()
263
-
264
-	// SyncWrite should finish first.
265
-	<-syncDone
266
-
267
-	select {
268
-	case <-writeDone:
269
-		// Write completed after SyncWrite — correct.
270
-	case <-time.After(2 * time.Second):
271
-		suite.Fail("async Write did not unblock after SyncWrite completed")
272
-	}
273
-}
274
-
275
-func (suite *ConnTestSuite) TestSyncWriteReturnsErrorAfterStop() {
276
-	suite.connMock.
277
-		On("Write", mock.AnythingOfType("[]uint8")).
278
-		Return(0, nil).
279
-		Maybe()
280
-
281
-	c := suite.makeConn()
282
-	c.Stop()
283
-
284
-	time.Sleep(10 * time.Millisecond)
285
-
286
-	_, err := c.SyncWrite([]byte("too late"))
287
-	suite.Error(err)
288
-}
289
-
290 160
 func TestConn(t *testing.T) {
291 161
 	t.Parallel()
292 162
 	suite.Run(t, &ConnTestSuite{})

Chargement…
Annuler
Enregistrer