mirror of
https://github.com/alibaba/higress.git
synced 2026-02-06 23:21:08 +08:00
200 lines
6.2 KiB
Go
200 lines
6.2 KiB
Go
// Copyright (c) 2022 Alibaba Group Holding Ltd.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package main
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/higress-group/proxy-wasm-go-sdk/proxywasm/types"
|
|
"github.com/higress-group/wasm-go/pkg/test"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestOnHttpRequestBody(t *testing.T) {
|
|
test.RunTest(t, func(t *testing.T) {
|
|
host, status := test.NewTestHost(nil)
|
|
defer host.Reset()
|
|
require.Equal(t, types.OnPluginStartStatusOK, status)
|
|
|
|
// 先调用请求头处理
|
|
action := host.CallOnHttpRequestHeaders([][2]string{
|
|
{":authority", "example.com"},
|
|
{":path", "/test"},
|
|
{":method", "POST"},
|
|
})
|
|
require.Equal(t, types.ActionContinue, action)
|
|
|
|
// 测试单个请求体块
|
|
t.Run("single chunk", func(t *testing.T) {
|
|
chunk := []byte("Hello, World!")
|
|
action := host.CallOnHttpStreamingRequestBody(chunk, false)
|
|
require.Equal(t, types.ActionContinue, action)
|
|
|
|
modifiedChunk := host.GetRequestBody()
|
|
// 验证返回的内容是固定的 "test\n"
|
|
expected := []byte("test\n")
|
|
require.Equal(t, expected, modifiedChunk)
|
|
})
|
|
|
|
// 测试多个请求体块
|
|
t.Run("multiple chunks", func(t *testing.T) {
|
|
chunk1 := []byte("First chunk")
|
|
chunk2 := []byte("Second chunk")
|
|
chunk3 := []byte("Third chunk")
|
|
|
|
// 处理第一个块(不是最后一个)
|
|
action := host.CallOnHttpStreamingRequestBody(chunk1, false)
|
|
require.Equal(t, types.ActionContinue, action)
|
|
|
|
modifiedChunk1 := host.GetRequestBody()
|
|
require.Equal(t, []byte("test\n"), modifiedChunk1)
|
|
|
|
// 处理第二个块(不是最后一个)
|
|
action = host.CallOnHttpStreamingRequestBody(chunk2, false)
|
|
require.Equal(t, types.ActionContinue, action)
|
|
|
|
modifiedChunk2 := host.GetRequestBody()
|
|
require.Equal(t, []byte("test\n"), modifiedChunk2)
|
|
|
|
// 处理最后一个块
|
|
action = host.CallOnHttpStreamingRequestBody(chunk3, true)
|
|
require.Equal(t, types.ActionContinue, action)
|
|
|
|
modifiedChunk3 := host.GetRequestBody()
|
|
require.Equal(t, []byte("test\n"), modifiedChunk3)
|
|
})
|
|
|
|
// 测试空请求体
|
|
t.Run("empty chunk", func(t *testing.T) {
|
|
emptyChunk := []byte("")
|
|
action := host.CallOnHttpStreamingRequestBody(emptyChunk, true)
|
|
require.Equal(t, types.ActionContinue, action)
|
|
|
|
modifiedChunk := host.GetRequestBody()
|
|
// 即使输入为空,也应该返回固定的 "test\n"
|
|
expected := []byte("test\n")
|
|
require.Equal(t, expected, modifiedChunk)
|
|
})
|
|
|
|
// 测试大请求体块
|
|
t.Run("large chunk", func(t *testing.T) {
|
|
largeChunk := make([]byte, 1000)
|
|
for i := range largeChunk {
|
|
largeChunk[i] = byte(i % 256)
|
|
}
|
|
|
|
action := host.CallOnHttpStreamingRequestBody(largeChunk, false)
|
|
require.Equal(t, types.ActionContinue, action)
|
|
modifiedChunk := host.GetRequestBody()
|
|
|
|
// 无论输入多大,都应该返回固定的 "test\n"
|
|
expected := []byte("test\n")
|
|
require.Equal(t, expected, modifiedChunk)
|
|
})
|
|
|
|
host.CompleteHttp()
|
|
})
|
|
}
|
|
|
|
func TestOnHttpResponseBody(t *testing.T) {
|
|
test.RunTest(t, func(t *testing.T) {
|
|
host, status := test.NewTestHost(nil)
|
|
defer host.Reset()
|
|
require.Equal(t, types.OnPluginStartStatusOK, status)
|
|
|
|
// 先调用请求头处理
|
|
action := host.CallOnHttpRequestHeaders([][2]string{
|
|
{":authority", "example.com"},
|
|
{":path", "/test"},
|
|
{":method", "GET"},
|
|
})
|
|
require.Equal(t, types.ActionContinue, action)
|
|
|
|
// 再调用响应头处理
|
|
action = host.CallOnHttpResponseHeaders([][2]string{
|
|
{":status", "200"},
|
|
{"content-type", "text/plain"},
|
|
})
|
|
require.Equal(t, types.ActionContinue, action)
|
|
|
|
// 测试单个响应体块
|
|
t.Run("single chunk", func(t *testing.T) {
|
|
chunk := []byte("Original response content")
|
|
action := host.CallOnHttpStreamingResponseBody(chunk, false)
|
|
require.Equal(t, types.ActionContinue, action)
|
|
modifiedChunk := host.GetResponseBody()
|
|
|
|
// 验证返回的内容是固定的 "test\n"
|
|
expected := []byte("test\n")
|
|
require.Equal(t, expected, modifiedChunk)
|
|
})
|
|
|
|
// 测试多个响应体块
|
|
t.Run("multiple chunks", func(t *testing.T) {
|
|
chunk1 := []byte("Response chunk 1")
|
|
chunk2 := []byte("Response chunk 2")
|
|
chunk3 := []byte("Response chunk 3")
|
|
|
|
// 处理第一个块(不是最后一个)
|
|
action := host.CallOnHttpStreamingResponseBody(chunk1, false)
|
|
require.Equal(t, types.ActionContinue, action)
|
|
modifiedChunk1 := host.GetResponseBody()
|
|
require.Equal(t, []byte("test\n"), modifiedChunk1)
|
|
|
|
// 处理第二个块(不是最后一个)
|
|
action = host.CallOnHttpStreamingResponseBody(chunk2, false)
|
|
require.Equal(t, types.ActionContinue, action)
|
|
modifiedChunk2 := host.GetResponseBody()
|
|
require.Equal(t, []byte("test\n"), modifiedChunk2)
|
|
|
|
// 处理最后一个块
|
|
action = host.CallOnHttpStreamingResponseBody(chunk3, true)
|
|
require.Equal(t, types.ActionContinue, action)
|
|
modifiedChunk3 := host.GetResponseBody()
|
|
require.Equal(t, []byte("test\n"), modifiedChunk3)
|
|
})
|
|
|
|
// 测试空响应体
|
|
t.Run("empty chunk", func(t *testing.T) {
|
|
emptyChunk := []byte("")
|
|
action := host.CallOnHttpStreamingResponseBody(emptyChunk, true)
|
|
require.Equal(t, types.ActionContinue, action)
|
|
modifiedChunk := host.GetResponseBody()
|
|
|
|
// 即使输入为空,也应该返回固定的 "test\n"
|
|
expected := []byte("test\n")
|
|
require.Equal(t, expected, modifiedChunk)
|
|
})
|
|
|
|
// 测试大响应体块
|
|
t.Run("large chunk", func(t *testing.T) {
|
|
largeChunk := make([]byte, 2000)
|
|
for i := range largeChunk {
|
|
largeChunk[i] = byte(i % 256)
|
|
}
|
|
|
|
action := host.CallOnHttpStreamingResponseBody(largeChunk, false)
|
|
require.Equal(t, types.ActionContinue, action)
|
|
modifiedChunk := host.GetResponseBody()
|
|
|
|
// 无论输入多大,都应该返回固定的 "test\n"
|
|
expected := []byte("test\n")
|
|
require.Equal(t, expected, modifiedChunk)
|
|
})
|
|
|
|
host.CompleteHttp()
|
|
})
|
|
}
|