blob: 089d5867af923edf33ba39d3ee6b2078b1666698 [file] [log] [blame]
// Copyright 2017 Google LLC.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package option
import (
"testing"
"crypto/tls"
"math/big"
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
"golang.org/x/oauth2/google"
"google.golang.org/api/internal"
"google.golang.org/grpc"
)
// Below is a dummy certificate/key pair taken from
// https://golang.org/src/crypto/tls/tls_test.go
const certPEM = `-----BEGIN CERTIFICATE-----
MIIB0zCCAX2gAwIBAgIJAI/M7BYjwB+uMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
aWRnaXRzIFB0eSBMdGQwHhcNMTIwOTEyMjE1MjAyWhcNMTUwOTEyMjE1MjAyWjBF
MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANLJ
hPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wok/4xIA+ui35/MmNa
rtNuC+BdZ1tMuVCPFZcCAwEAAaNQME4wHQYDVR0OBBYEFJvKs8RfJaXTH08W+SGv
zQyKn0H8MB8GA1UdIwQYMBaAFJvKs8RfJaXTH08W+SGvzQyKn0H8MAwGA1UdEwQF
MAMBAf8wDQYJKoZIhvcNAQEFBQADQQBJlffJHybjDGxRMqaRmDhX0+6v02TUKZsW
r5QuVbpQhH6u+0UgcW0jp9QwpxoPTLTWGXEWBBBurxFwiCBhkQ+V
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIIBOwIBAAJBANLJhPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wo
k/4xIA+ui35/MmNartNuC+BdZ1tMuVCPFZcCAwEAAQJAEJ2N+zsR0Xn8/Q6twa4G
6OB1M1WO+k+ztnX/1SvNeWu8D6GImtupLTYgjZcHufykj09jiHmjHx8u8ZZB/o1N
MQIhAPW+eyZo7ay3lMz1V01WVjNKK9QSn1MJlb06h/LuYv9FAiEA25WPedKgVyCW
SmUwbPw8fnTcpqDWE3yTO3vKcebqMSsCIBF3UmVue8YU3jybC3NxuXq3wNm34R8T
xVLHwDXh/6NJAiEAl2oHGGLz64BuAfjKrqwz7qMYr9HCLIe/YsoWq/olzScCIQDi
D2lWusoe2/nEqfDVVWGWlyJ7yOmqaVm/iNUN9B2N2g==
-----END PRIVATE KEY-----
`
// Check that the slice passed into WithScopes is copied.
func TestCopyScopes(t *testing.T) {
o := &internal.DialSettings{}
scopes := []string{"a", "b"}
WithScopes(scopes...).Apply(o)
// Modify after using.
scopes[1] = "c"
if o.Scopes[0] != "a" || o.Scopes[1] != "b" {
t.Errorf("want ['a', 'b'], got %+v", o.Scopes)
}
}
func TestApply(t *testing.T) {
conn := &grpc.ClientConn{}
opts := []ClientOption{
WithEndpoint("https://example.com:443"),
WithScopes("a"), // the next WithScopes should overwrite this one
WithScopes("https://example.com/auth/helloworld", "https://example.com/auth/otherthing"),
WithGRPCConn(conn),
WithUserAgent("ua"),
WithCredentialsFile("service-account.json"),
WithCredentialsJSON([]byte(`{some: "json"}`)),
WithCredentials(&google.DefaultCredentials{ProjectID: "p"}),
WithAPIKey("api-key"),
WithAudiences("https://example.com/"),
WithQuotaProject("user-project"),
WithRequestReason("Request Reason"),
WithTelemetryDisabled(),
}
var got internal.DialSettings
for _, opt := range opts {
opt.Apply(&got)
}
want := internal.DialSettings{
Scopes: []string{"https://example.com/auth/helloworld", "https://example.com/auth/otherthing"},
UserAgent: "ua",
Endpoint: "https://example.com:443",
GRPCConn: conn,
Credentials: &google.DefaultCredentials{ProjectID: "p"},
CredentialsFile: "service-account.json",
CredentialsJSON: []byte(`{some: "json"}`),
APIKey: "api-key",
Audiences: []string{"https://example.com/"},
QuotaProject: "user-project",
RequestReason: "Request Reason",
TelemetryDisabled: true,
}
if !cmp.Equal(got, want, cmpopts.IgnoreUnexported(grpc.ClientConn{})) {
t.Errorf(cmp.Diff(got, want, cmpopts.IgnoreUnexported(grpc.ClientConn{})))
}
}
func mockClientCertSource(info *tls.CertificateRequestInfo) (*tls.Certificate, error) {
cert, _ := tls.X509KeyPair([]byte(certPEM), []byte(certPEM))
return &cert, nil
}
func TestApplyClientCertSource(t *testing.T) {
opts := []ClientOption{
WithClientCertSource(mockClientCertSource),
}
var got internal.DialSettings
for _, opt := range opts {
opt.Apply(&got)
}
want := internal.DialSettings{
ClientCertSource: mockClientCertSource,
}
// Functions cannot be compared in Golang for equality, so we will compare the output of the functions instead.
certGot, err := got.ClientCertSource(nil)
if err != nil {
t.Error(err)
}
certWant, err := want.ClientCertSource(nil)
if err != nil {
t.Error(err)
}
if !cmp.Equal(certGot, certWant, cmpopts.IgnoreUnexported(big.Int{}), cmpopts.IgnoreFields(tls.Certificate{}, "Leaf")) {
t.Errorf(cmp.Diff(certGot, certWant, cmpopts.IgnoreUnexported(big.Int{}), cmpopts.IgnoreFields(tls.Certificate{}, "Leaf")))
}
}