mirror of
https://github.com/hanzoai/oxy.git
synced 2026-09-30 23:42:31 +00:00
220 lines
5.7 KiB
Go
220 lines
5.7 KiB
Go
package stickycookie
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
"path"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"github.com/vulcand/oxy/v2/internal/holsterv4/clock"
|
|
)
|
|
|
|
func TestFallbackValue_FindURL(t *testing.T) {
|
|
servers := []*url.URL{
|
|
{Scheme: "https", Host: "10.10.10.42", Path: "/"},
|
|
{Scheme: "http", Host: "10.10.10.10", Path: "/foo"},
|
|
{Scheme: "http", Host: "10.10.10.11", Path: "/", User: url.User("John Doe")},
|
|
{Scheme: "http", Host: "10.10.10.10", Path: "/"},
|
|
}
|
|
|
|
aesValue, err := NewAESValue([]byte("95Bx9JkKX3xbd7z3"), 5*clock.Second)
|
|
require.NoError(t, err)
|
|
|
|
values := []struct {
|
|
Name string
|
|
CookieValue CookieValue
|
|
}{
|
|
{Name: "rawValue", CookieValue: &RawValue{}},
|
|
{Name: "hashValue", CookieValue: &HashValue{Salt: "foo"}},
|
|
{Name: "aesValue", CookieValue: aesValue},
|
|
}
|
|
|
|
for _, from := range values {
|
|
for _, to := range values {
|
|
t.Run(fmt.Sprintf("From: %s, To %s", from.Name, to.Name), func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
value, err := NewFallbackValue(from.CookieValue, to.CookieValue)
|
|
if from.CookieValue == nil && to.CookieValue == nil {
|
|
require.Error(t, err)
|
|
return
|
|
}
|
|
|
|
require.NoError(t, err)
|
|
|
|
if from.CookieValue != nil {
|
|
// URL found From value
|
|
findURL, err := value.FindURL(from.CookieValue.Get(servers[0]), servers)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, servers[0], findURL)
|
|
|
|
// URL not found From value
|
|
findURL, _ = value.FindURL(from.CookieValue.Get(mustJoin(t, servers[0], "bar")), servers)
|
|
assert.Nil(t, findURL)
|
|
}
|
|
|
|
if to.CookieValue != nil {
|
|
// URL found To Value
|
|
findURL, err := value.FindURL(to.CookieValue.Get(servers[0]), servers)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, servers[0], findURL)
|
|
|
|
// URL not found To value
|
|
findURL, _ = value.FindURL(to.CookieValue.Get(mustJoin(t, servers[0], "bar")), servers)
|
|
assert.Nil(t, findURL)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestFallbackValue_FindURL_error(t *testing.T) {
|
|
servers := []*url.URL{
|
|
{Scheme: "http", Host: "10.10.10.10", Path: "/"},
|
|
{Scheme: "https", Host: "10.10.10.42", Path: "/"},
|
|
{Scheme: "http", Host: "10.10.10.10", Path: "/foo"},
|
|
{Scheme: "http", Host: "10.10.10.11", Path: "/", User: url.User("John Doe")},
|
|
}
|
|
|
|
hashValue := &HashValue{Salt: "foo"}
|
|
rawValue := &RawValue{}
|
|
aesValue, err := NewAESValue([]byte("95Bx9JkKX3xbd7z3"), 5*clock.Second)
|
|
require.NoError(t, err)
|
|
|
|
tests := []struct {
|
|
name string
|
|
From CookieValue
|
|
To CookieValue
|
|
rawValue string
|
|
want *url.URL
|
|
expectError bool
|
|
expectErrorOnNew bool
|
|
}{
|
|
{
|
|
name: "From RawValue To HashValue with RawValue value",
|
|
From: rawValue,
|
|
To: hashValue,
|
|
rawValue: "http://10.10.10.10/",
|
|
want: servers[0],
|
|
},
|
|
{
|
|
name: "From RawValue To HashValue with RawValue non matching value",
|
|
From: rawValue,
|
|
To: hashValue,
|
|
rawValue: "http://24.10.10.10/",
|
|
},
|
|
{
|
|
name: "From RawValue To HashValue with HashValue value",
|
|
From: rawValue,
|
|
To: hashValue,
|
|
rawValue: hashValue.Get(mustParse(t, "http://10.10.10.10/")),
|
|
want: servers[0],
|
|
},
|
|
{
|
|
name: "From RawValue To HashValue with HashValue non matching value",
|
|
From: rawValue,
|
|
To: hashValue,
|
|
rawValue: hashValue.Get(mustParse(t, "http://24.10.10.10/")),
|
|
},
|
|
{
|
|
name: "From HashValue To AESValue with AESValue value",
|
|
From: hashValue,
|
|
To: aesValue,
|
|
rawValue: aesValue.Get(mustParse(t, "http://10.10.10.10/")),
|
|
want: servers[0],
|
|
},
|
|
{
|
|
name: "From HashValue To AESValue with AESValue non matching value",
|
|
From: hashValue,
|
|
To: aesValue,
|
|
rawValue: aesValue.Get(mustParse(t, "http://24.10.10.10/")),
|
|
},
|
|
{
|
|
name: "From HashValue To AESValue with HashValue value",
|
|
From: hashValue,
|
|
To: aesValue,
|
|
rawValue: hashValue.Get(mustParse(t, "http://10.10.10.10/")),
|
|
want: servers[0],
|
|
},
|
|
{
|
|
name: "From HashValue To AESValue with AESValue non matching value",
|
|
From: hashValue,
|
|
To: aesValue,
|
|
rawValue: aesValue.Get(mustParse(t, "http://24.10.10.10/")),
|
|
},
|
|
{
|
|
name: "From AESValue To AESValue with AESValue value",
|
|
From: aesValue,
|
|
To: aesValue,
|
|
rawValue: aesValue.Get(mustParse(t, "http://10.10.10.10/")),
|
|
want: servers[0],
|
|
},
|
|
{
|
|
name: "From AESValue To AESValue with AESValue non matching value",
|
|
From: aesValue,
|
|
To: aesValue,
|
|
rawValue: aesValue.Get(mustParse(t, "http://24.10.10.10/")),
|
|
},
|
|
{
|
|
name: "From AESValue To HashValue with HashValue non matching value",
|
|
From: aesValue,
|
|
To: hashValue,
|
|
rawValue: hashValue.Get(mustParse(t, "http://24.10.10.10/")),
|
|
},
|
|
{
|
|
name: "From nil To RawValue",
|
|
To: hashValue,
|
|
rawValue: "http://24.10.10.10/",
|
|
expectErrorOnNew: true,
|
|
},
|
|
{
|
|
name: "From RawValue To nil",
|
|
From: rawValue,
|
|
rawValue: "http://24.10.10.10/",
|
|
expectErrorOnNew: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
value, err := NewFallbackValue(tt.From, tt.To)
|
|
if tt.expectErrorOnNew {
|
|
require.Error(t, err)
|
|
return
|
|
}
|
|
|
|
require.NoError(t, err)
|
|
|
|
findURL, err := value.FindURL(tt.rawValue, servers)
|
|
if tt.expectError {
|
|
require.Error(t, err)
|
|
return
|
|
}
|
|
|
|
require.NoError(t, err)
|
|
|
|
assert.Equal(t, tt.want, findURL)
|
|
})
|
|
}
|
|
}
|
|
|
|
func mustJoin(t *testing.T, u *url.URL, part string) *url.URL {
|
|
t.Helper()
|
|
|
|
nu, err := u.Parse(path.Join(u.Path, part))
|
|
require.NoError(t, err)
|
|
|
|
return nu
|
|
}
|
|
|
|
func mustParse(t *testing.T, raw string) *url.URL {
|
|
t.Helper()
|
|
|
|
u, err := url.Parse(raw)
|
|
require.NoError(t, err)
|
|
|
|
return u
|
|
}
|