- 新增 managed/external/nested 三种传输保护模式 - 新增 peer attach 显式认证、抗重放、channel binding 和可选前向保密协商 - 明确单连接注入与可重拨连接源的语义边界 - 禁止 ConnectByConn 场景下 dedicated bulk 走 sidecar,auto 模式自动回退 shared - 修正 dedicated attach 在 bootstrap/steady profile 切换下的处理逻辑 - 优化 shared bulk super-batch 与批量 framed write 路径 - 降低 stream/bulk fast path 的复制和分发损耗 - 补齐 benchmark、回归测试、运行时快照和 README 文档
86 lines
2.3 KiB
Go
86 lines
2.3 KiB
Go
package notify
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestStreamOwnedChunkReleaseAfterRead(t *testing.T) {
|
|
stream := newStreamHandle(context.Background(), newStreamRuntime("stream-buffer-release-read"), clientFileScope(), StreamOpenRequest{
|
|
StreamID: "stream-buffer-release-read",
|
|
DataID: 1,
|
|
}, 0, nil, nil, 0, nil, nil, nil, streamConfig{})
|
|
|
|
released := 0
|
|
if err := stream.pushOwnedChunkWithRelease([]byte("hello"), func() {
|
|
released++
|
|
}); err != nil {
|
|
t.Fatalf("pushOwnedChunkWithRelease failed: %v", err)
|
|
}
|
|
|
|
buf := make([]byte, 5)
|
|
n, err := stream.Read(buf)
|
|
if err != nil {
|
|
t.Fatalf("Read failed: %v", err)
|
|
}
|
|
if n != 5 || string(buf[:n]) != "hello" {
|
|
t.Fatalf("Read = %d %q, want 5 hello", n, string(buf[:n]))
|
|
}
|
|
if released != 1 {
|
|
t.Fatalf("release count = %d, want 1", released)
|
|
}
|
|
}
|
|
|
|
func TestStreamOwnedChunkReleaseOnReset(t *testing.T) {
|
|
stream := newStreamHandle(context.Background(), newStreamRuntime("stream-buffer-release-reset"), clientFileScope(), StreamOpenRequest{
|
|
StreamID: "stream-buffer-release-reset",
|
|
DataID: 1,
|
|
}, 0, nil, nil, 0, nil, nil, nil, streamConfig{})
|
|
|
|
released := 0
|
|
if err := stream.pushOwnedChunkWithRelease([]byte("hello"), func() {
|
|
released++
|
|
}); err != nil {
|
|
t.Fatalf("pushOwnedChunkWithRelease failed: %v", err)
|
|
}
|
|
|
|
stream.markReset(errors.New("boom"))
|
|
if released != 1 {
|
|
t.Fatalf("release count = %d, want 1", released)
|
|
}
|
|
}
|
|
|
|
func TestClientDispatchFastStreamDataWithOwnerReleasesAfterRead(t *testing.T) {
|
|
client := NewClient().(*ClientCommon)
|
|
runtime := client.getStreamRuntime()
|
|
if runtime == nil {
|
|
t.Fatal("client stream runtime should not be nil")
|
|
}
|
|
stream := newStreamHandle(context.Background(), runtime, clientFileScope(), StreamOpenRequest{
|
|
StreamID: "stream-owner",
|
|
DataID: 23,
|
|
Channel: StreamDataChannel,
|
|
}, 0, nil, nil, 0, nil, nil, nil, runtime.configSnapshot())
|
|
if err := runtime.register(clientFileScope(), stream); err != nil {
|
|
t.Fatalf("register stream failed: %v", err)
|
|
}
|
|
|
|
released := 0
|
|
owner := newStreamReadPayloadOwner(func() {
|
|
released++
|
|
})
|
|
client.dispatchFastStreamDataWithOwner(streamFastDataFrame{
|
|
DataID: 23,
|
|
Seq: 1,
|
|
Payload: []byte("fast-owner"),
|
|
}, owner)
|
|
owner.done()
|
|
|
|
readStreamExactly(t, stream, "fast-owner", 2*time.Second)
|
|
if released != 1 {
|
|
t.Fatalf("release count = %d, want 1", released)
|
|
}
|
|
}
|