|
@@ -3,13 +3,13 @@ package sarama
|
|
|
import (
|
|
|
"errors"
|
|
|
"fmt"
|
|
|
- "gopkg.in/jcmturner/gokrb5.v7/krberror"
|
|
|
"net"
|
|
|
"reflect"
|
|
|
"testing"
|
|
|
"time"
|
|
|
|
|
|
"github.com/rcrowley/go-metrics"
|
|
|
+ "gopkg.in/jcmturner/gokrb5.v7/krberror"
|
|
|
)
|
|
|
|
|
|
func ExampleBroker() {
|
|
@@ -132,42 +132,66 @@ func newTokenProvider(token *AccessToken, err error) *TokenProvider {
|
|
|
func TestSASLOAuthBearer(t *testing.T) {
|
|
|
|
|
|
testTable := []struct {
|
|
|
- name string
|
|
|
- mockAuthErr KError
|
|
|
- mockHandshakeErr KError
|
|
|
- expectClientErr bool
|
|
|
- tokProvider *TokenProvider
|
|
|
+ name string
|
|
|
+ mockSASLHandshakeResponse MockResponse
|
|
|
+ mockSASLAuthResponse MockResponse
|
|
|
+ expectClientErr bool
|
|
|
+ expectedBrokerError KError
|
|
|
+ tokProvider *TokenProvider
|
|
|
}{
|
|
|
{
|
|
|
- name: "SASL/OAUTHBEARER OK server response",
|
|
|
- mockAuthErr: ErrNoError,
|
|
|
- mockHandshakeErr: ErrNoError,
|
|
|
- tokProvider: newTokenProvider(&AccessToken{Token: "access-token-123"}, nil),
|
|
|
+ name: "SASL/OAUTHBEARER OK server response",
|
|
|
+ mockSASLHandshakeResponse: NewMockSaslHandshakeResponse(t).
|
|
|
+ SetEnabledMechanisms([]string{SASLTypeOAuth}),
|
|
|
+ mockSASLAuthResponse: NewMockSaslAuthenticateResponse(t),
|
|
|
+ expectClientErr: false,
|
|
|
+ expectedBrokerError: ErrNoError,
|
|
|
+ tokProvider: newTokenProvider(&AccessToken{Token: "access-token-123"}, nil),
|
|
|
},
|
|
|
{
|
|
|
- name: "SASL/OAUTHBEARER authentication failure response",
|
|
|
- mockAuthErr: ErrSASLAuthenticationFailed,
|
|
|
- mockHandshakeErr: ErrNoError,
|
|
|
- tokProvider: newTokenProvider(&AccessToken{Token: "access-token-123"}, nil),
|
|
|
+ name: "SASL/OAUTHBEARER authentication failure response",
|
|
|
+ mockSASLHandshakeResponse: NewMockSaslHandshakeResponse(t).
|
|
|
+ SetEnabledMechanisms([]string{SASLTypeOAuth}),
|
|
|
+ mockSASLAuthResponse: NewMockSequence(
|
|
|
+
|
|
|
+ NewMockSaslAuthenticateResponse(t).
|
|
|
+ SetAuthBytes([]byte(`{"status":"invalid_request1"}`)),
|
|
|
+
|
|
|
+
|
|
|
+ NewMockSaslAuthenticateResponse(t).
|
|
|
+ SetAuthBytes([]byte(`{"status":"invalid_request2"}`)).
|
|
|
+ SetError(ErrSASLAuthenticationFailed),
|
|
|
+ ),
|
|
|
+ expectClientErr: true,
|
|
|
+ expectedBrokerError: ErrSASLAuthenticationFailed,
|
|
|
+ tokProvider: newTokenProvider(&AccessToken{Token: "access-token-123"}, nil),
|
|
|
},
|
|
|
{
|
|
|
- name: "SASL/OAUTHBEARER handshake failure response",
|
|
|
- mockAuthErr: ErrNoError,
|
|
|
- mockHandshakeErr: ErrSASLAuthenticationFailed,
|
|
|
- tokProvider: newTokenProvider(&AccessToken{Token: "access-token-123"}, nil),
|
|
|
+ name: "SASL/OAUTHBEARER handshake failure response",
|
|
|
+ mockSASLHandshakeResponse: NewMockSaslHandshakeResponse(t).
|
|
|
+ SetEnabledMechanisms([]string{SASLTypeOAuth}).
|
|
|
+ SetError(ErrSASLAuthenticationFailed),
|
|
|
+ mockSASLAuthResponse: NewMockSaslAuthenticateResponse(t),
|
|
|
+ expectClientErr: true,
|
|
|
+ expectedBrokerError: ErrSASLAuthenticationFailed,
|
|
|
+ tokProvider: newTokenProvider(&AccessToken{Token: "access-token-123"}, nil),
|
|
|
},
|
|
|
{
|
|
|
- name: "SASL/OAUTHBEARER token generation error",
|
|
|
- mockAuthErr: ErrNoError,
|
|
|
- mockHandshakeErr: ErrNoError,
|
|
|
- expectClientErr: true,
|
|
|
- tokProvider: newTokenProvider(&AccessToken{Token: "access-token-123"}, ErrTokenFailure),
|
|
|
+ name: "SASL/OAUTHBEARER token generation error",
|
|
|
+ mockSASLHandshakeResponse: NewMockSaslHandshakeResponse(t).
|
|
|
+ SetEnabledMechanisms([]string{SASLTypeOAuth}),
|
|
|
+ mockSASLAuthResponse: NewMockSaslAuthenticateResponse(t),
|
|
|
+ expectClientErr: true,
|
|
|
+ expectedBrokerError: ErrNoError,
|
|
|
+ tokProvider: newTokenProvider(&AccessToken{Token: "access-token-123"}, ErrTokenFailure),
|
|
|
},
|
|
|
{
|
|
|
- name: "SASL/OAUTHBEARER invalid extension",
|
|
|
- mockAuthErr: ErrNoError,
|
|
|
- mockHandshakeErr: ErrNoError,
|
|
|
- expectClientErr: true,
|
|
|
+ name: "SASL/OAUTHBEARER invalid extension",
|
|
|
+ mockSASLHandshakeResponse: NewMockSaslHandshakeResponse(t).
|
|
|
+ SetEnabledMechanisms([]string{SASLTypeOAuth}),
|
|
|
+ mockSASLAuthResponse: NewMockSaslAuthenticateResponse(t),
|
|
|
+ expectClientErr: true,
|
|
|
+ expectedBrokerError: ErrNoError,
|
|
|
tokProvider: newTokenProvider(&AccessToken{
|
|
|
Token: "access-token-123",
|
|
|
Extensions: map[string]string{"auth": "auth-value"},
|
|
@@ -180,19 +204,9 @@ func TestSASLOAuthBearer(t *testing.T) {
|
|
|
|
|
|
mockBroker := NewMockBroker(t, 0)
|
|
|
|
|
|
- mockSASLAuthResponse := NewMockSaslAuthenticateResponse(t).SetAuthBytes([]byte("response_payload"))
|
|
|
- if test.mockAuthErr != ErrNoError {
|
|
|
- mockSASLAuthResponse = mockSASLAuthResponse.SetError(test.mockAuthErr)
|
|
|
- }
|
|
|
-
|
|
|
- mockSASLHandshakeResponse := NewMockSaslHandshakeResponse(t).SetEnabledMechanisms([]string{SASLTypeOAuth})
|
|
|
- if test.mockHandshakeErr != ErrNoError {
|
|
|
- mockSASLHandshakeResponse = mockSASLHandshakeResponse.SetError(test.mockHandshakeErr)
|
|
|
- }
|
|
|
-
|
|
|
mockBroker.SetHandlerByMap(map[string]MockResponse{
|
|
|
- "SaslAuthenticateRequest": mockSASLAuthResponse,
|
|
|
- "SaslHandshakeRequest": mockSASLHandshakeResponse,
|
|
|
+ "SaslAuthenticateRequest": test.mockSASLAuthResponse,
|
|
|
+ "SaslHandshakeRequest": test.mockSASLHandshakeResponse,
|
|
|
})
|
|
|
|
|
|
|
|
@@ -227,13 +241,13 @@ func TestSASLOAuthBearer(t *testing.T) {
|
|
|
|
|
|
err = broker.authenticateViaSASL()
|
|
|
|
|
|
- if test.mockAuthErr != ErrNoError {
|
|
|
- if test.mockAuthErr != err {
|
|
|
- t.Errorf("[%d]:[%s] Expected %s auth error, got %s\n", i, test.name, test.mockAuthErr, err)
|
|
|
+ if test.expectedBrokerError != ErrNoError {
|
|
|
+ if test.expectedBrokerError != err {
|
|
|
+ t.Errorf("[%d]:[%s] Expected %s auth error, got %s\n", i, test.name, test.expectedBrokerError, err)
|
|
|
}
|
|
|
- } else if test.mockHandshakeErr != ErrNoError {
|
|
|
- if test.mockHandshakeErr != err {
|
|
|
- t.Errorf("[%d]:[%s] Expected %s handshake error, got %s\n", i, test.name, test.mockHandshakeErr, err)
|
|
|
+ } else if test.expectedBrokerError != ErrNoError {
|
|
|
+ if test.expectedBrokerError != err {
|
|
|
+ t.Errorf("[%d]:[%s] Expected %s handshake error, got %s\n", i, test.name, test.expectedBrokerError, err)
|
|
|
}
|
|
|
} else if test.expectClientErr && err == nil {
|
|
|
t.Errorf("[%d]:[%s] Expected a client error and got none\n", i, test.name)
|
|
@@ -599,7 +613,7 @@ func TestGSSAPIKerberosAuth_Authorize(t *testing.T) {
|
|
|
|
|
|
}
|
|
|
|
|
|
-func TestBuildClientInitialResponse(t *testing.T) {
|
|
|
+func TestBuildClientFirstMessage(t *testing.T) {
|
|
|
|
|
|
testTable := []struct {
|
|
|
name string
|
|
@@ -638,7 +652,7 @@ func TestBuildClientInitialResponse(t *testing.T) {
|
|
|
|
|
|
for i, test := range testTable {
|
|
|
|
|
|
- actual, err := buildClientInitialResponse(test.token)
|
|
|
+ actual, err := buildClientFirstMessage(test.token)
|
|
|
|
|
|
if !reflect.DeepEqual(test.expected, actual) {
|
|
|
t.Errorf("Expected %s, got %s\n", test.expected, actual)
|