mirror of
https://github.com/gravitational/teleport.git
synced 2026-11-01 05:27:24 +08:00
* refactor(sqlserver): change to microsoft fork * chore(gomod): update mssqldb dep * test(sqlserver): add server on parsing PLP RPC packets * fix(db): change mssql import * chore(gomod): update go-mssqldb reference * test(protocol): use fuzz arguments * chore: code review suggestions * test(sqlserver): add missing protocols attribute
112 lines
3.3 KiB
Go
112 lines
3.3 KiB
Go
/*
|
|
Copyright 2022 Gravitational, Inc.
|
|
|
|
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 protocol
|
|
|
|
import (
|
|
"bytes"
|
|
"testing"
|
|
|
|
"github.com/gravitational/trace"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/gravitational/teleport/lib/srv/db/sqlserver/protocol/fixtures"
|
|
)
|
|
|
|
// TestReadPreLogin verifies Pre-Login packet parsing.
|
|
func TestReadPreLogin(t *testing.T) {
|
|
_, err := ReadPreLoginPacket(bytes.NewBuffer(fixtures.PreLogin))
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
// TestWritePreLoginResponse verifies Pre-Login response written to the client.
|
|
func TestWritePreLoginResponse(t *testing.T) {
|
|
b := &bytes.Buffer{}
|
|
|
|
err := WritePreLoginResponse(b)
|
|
require.NoError(t, err)
|
|
|
|
packet, err := ReadPacket(b)
|
|
require.NoError(t, err)
|
|
require.Equal(t, PacketTypeResponse, packet.Type())
|
|
}
|
|
|
|
// TestReadLogin7 verifies Login7 packet parsing.
|
|
func TestReadLogin7(t *testing.T) {
|
|
packet, err := ReadLogin7Packet(bytes.NewBuffer(fixtures.Login7))
|
|
require.NoError(t, err)
|
|
require.Equal(t, "sa", packet.Username())
|
|
require.Equal(t, "", packet.Database())
|
|
}
|
|
|
|
// TestErrorResponse verifies writing error response.
|
|
func TestErrorResponse(t *testing.T) {
|
|
b := &bytes.Buffer{}
|
|
|
|
err := WriteErrorResponse(b, trace.AccessDenied("access denied"))
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
// TestSQLBatch verifies SQLPatch packet parsing.
|
|
func TestSQLBatch(t *testing.T) {
|
|
packet, err := ReadPacket(bytes.NewReader(fixtures.SQLBatch))
|
|
require.NoError(t, err)
|
|
r, err := ToSQLPacket(packet)
|
|
require.NoError(t, err)
|
|
require.Equal(t, r.Type(), PacketTypeSQLBatch)
|
|
p, ok := r.(*SQLBatch)
|
|
require.True(t, ok)
|
|
require.Equal(t, "\nselect 'foo' as 'bar'\n ", p.SQLText)
|
|
}
|
|
|
|
// TestRPCClientRequestParam verifies RPC Request with param packet parsing.
|
|
func TestRPCClientRequestParam(t *testing.T) {
|
|
packet, err := ReadPacket(bytes.NewReader(fixtures.RPCClientRequestParam))
|
|
require.NoError(t, err)
|
|
require.Equal(t, packet.Type(), PacketTypeRPCRequest)
|
|
r, err := ToSQLPacket(packet)
|
|
require.NoError(t, err)
|
|
p, ok := r.(*RPCRequest)
|
|
require.True(t, ok)
|
|
require.Equal(t, "select @@version", p.Parameters[0])
|
|
}
|
|
|
|
// TestRPCClientRequest verifies rpc request packet parsing.
|
|
func TestRPCClientRequest(t *testing.T) {
|
|
packet, err := ReadPacket(bytes.NewReader(fixtures.RPCClientRequest))
|
|
require.NoError(t, err)
|
|
require.Equal(t, packet.Type(), PacketTypeRPCRequest)
|
|
r, err := ToSQLPacket(packet)
|
|
require.NoError(t, err)
|
|
p, ok := r.(*RPCRequest)
|
|
require.True(t, ok)
|
|
require.Equal(t, "foo3", p.ProcName)
|
|
}
|
|
|
|
func TestRPCClientRequestPartialLength(t *testing.T) {
|
|
packet, err := ReadPacket(bytes.NewReader(fixtures.RPCClientPartiallyLength(32, 4)))
|
|
require.NoError(t, err)
|
|
require.Equal(t, packet.Type(), PacketTypeRPCRequest)
|
|
|
|
r, err := ToSQLPacket(packet)
|
|
require.NoError(t, err)
|
|
|
|
p, ok := r.(*RPCRequest)
|
|
require.True(t, ok)
|
|
require.Equal(t, "foo3", p.ProcName)
|
|
require.NoError(t, err)
|
|
}
|