/*
 *
 * Copyright 2021 gRPC authors.
 *
 * 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 grpc

import (
	"context"
	"net"
	"testing"

	"google.golang.org/grpc/credentials"
	"google.golang.org/grpc/credentials/insecure"
	"google.golang.org/grpc/testdata"
)

func (s) TestClientConnAuthority(t *testing.T) {
	serverNameOverride := "over.write.server.name"
	creds, err := credentials.NewClientTLSFromFile(testdata.Path("x509/server_ca_cert.pem"), serverNameOverride)
	if err != nil {
		t.Fatalf("credentials.NewClientTLSFromFile(_, %q) failed: %v", err, serverNameOverride)
	}

	tests := []struct {
		name          string
		target        string
		opts          []DialOption
		wantAuthority string
	}{
		{
			name:          "default",
			target:        "Non-Existent.Server:8080",
			opts:          []DialOption{WithTransportCredentials(insecure.NewCredentials())},
			wantAuthority: "Non-Existent.Server:8080",
		},
		{
			name:          "override-via-creds",
			target:        "Non-Existent.Server:8080",
			opts:          []DialOption{WithTransportCredentials(creds)},
			wantAuthority: serverNameOverride,
		},
		{
			name:          "override-via-WithAuthority",
			target:        "Non-Existent.Server:8080",
			opts:          []DialOption{WithTransportCredentials(insecure.NewCredentials()), WithAuthority("authority-override")},
			wantAuthority: "authority-override",
		},
		{
			name:          "override-via-creds-and-WithAuthority",
			target:        "Non-Existent.Server:8080",
			opts:          []DialOption{WithTransportCredentials(creds), WithAuthority(serverNameOverride)},
			wantAuthority: serverNameOverride,
		},
		{
			name:          "unix relative",
			target:        "unix:sock.sock",
			opts:          []DialOption{WithTransportCredentials(insecure.NewCredentials())},
			wantAuthority: "localhost",
		},
		{
			name:   "unix relative with custom dialer",
			target: "unix:sock.sock",
			opts: []DialOption{WithTransportCredentials(insecure.NewCredentials()), WithContextDialer(func(ctx context.Context, addr string) (net.Conn, error) {
				return (&net.Dialer{}).DialContext(ctx, "", addr)
			})},
			wantAuthority: "localhost",
		},
		{
			name:          "unix absolute",
			target:        "unix:/sock.sock",
			opts:          []DialOption{WithTransportCredentials(insecure.NewCredentials())},
			wantAuthority: "localhost",
		},
		{
			name:   "unix absolute with custom dialer",
			target: "unix:///sock.sock",
			opts: []DialOption{WithTransportCredentials(insecure.NewCredentials()), WithContextDialer(func(ctx context.Context, addr string) (net.Conn, error) {
				return (&net.Dialer{}).DialContext(ctx, "", addr)
			})},
			wantAuthority: "localhost",
		},
		{
			name:          "localhost colon port",
			target:        "localhost:50051",
			opts:          []DialOption{WithTransportCredentials(insecure.NewCredentials())},
			wantAuthority: "localhost:50051",
		},
		{
			name:          "colon port",
			target:        ":50051",
			opts:          []DialOption{WithTransportCredentials(insecure.NewCredentials())},
			wantAuthority: "localhost:50051",
		},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			cc, err := Dial(test.target, test.opts...)
			if err != nil {
				t.Fatalf("Dial(%q) failed: %v", test.target, err)
			}
			defer cc.Close()
			if cc.authority != test.wantAuthority {
				t.Fatalf("cc.authority = %q, want %q", cc.authority, test.wantAuthority)
			}
		})
	}
}

func (s) TestClientConnAuthority_CredsAndDialOptionMismatch(t *testing.T) {
	serverNameOverride := "over.write.server.name"
	creds, err := credentials.NewClientTLSFromFile(testdata.Path("x509/server_ca_cert.pem"), serverNameOverride)
	if err != nil {
		t.Fatalf("credentials.NewClientTLSFromFile(_, %q) failed: %v", err, serverNameOverride)
	}
	opts := []DialOption{WithTransportCredentials(creds), WithAuthority("authority-override")}
	if cc, err := Dial("Non-Existent.Server:8000", opts...); err == nil {
		cc.Close()
		t.Fatal("grpc.Dial() succeeded when expected to fail")
	}
}
