/*
Copyright 2017 Google 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 mock

import (
	"bytes"
	"crypto/x509"
	"encoding/json"
	"encoding/pem"
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"testing"

	"github.com/SermoDigital/jose/jws"
	"github.com/apid/istioApigeeAdapter/common"
)

var testMockServer *MockServer

func TestMain(m *testing.M) {
	var err error
	testMockServer, err = StartMockServer(0)
	if err != nil {
		panic(err.Error())
	}

	result := m.Run()
	testMockServer.Stop()
	os.Exit(result)
}

func TestServerSanity(t *testing.T) {
	if mockKeyPEM == nil {
		t.Fatal("Expected mock key to be generated")
	}
	if mockCertPEM == nil {
		t.Fatal("Expected mock cert to be generated")
	}
}

func TestPublicKey(t *testing.T) {
	resp, err := http.Get(fmt.Sprintf("http://%s/publicKey", testMockServer.Address()))
	if err != nil {
		t.Fatalf("Network error: %s", err)
	}
	defer resp.Body.Close()
	if resp.StatusCode != 200 {
		t.Fatalf("Got HTTP status code %d", resp.StatusCode)
	}

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		t.Fatalf("Error reading body: %s", err)
	}
	pb, _ := pem.Decode(body)
	if pb == nil {
		t.Fatalf("Failed decoding public key body \"%s\"", string(body))
	}
	if pb.Type != "CERTIFICATE" {
		t.Fatalf("Got back invalid PEM type %s", pb.Type)
	}

	cert, err := x509.ParseCertificate(pb.Bytes)
	if err != nil {
		t.Fatalf("Error decoding certificate: %s", err)
	}
	if cert.Subject.CommonName != "mockserver" {
		t.Fatalf("Common name does not match \"mockserver\": \"%s\"", cert.Subject.CommonName)
	}
}

func TestProducts(t *testing.T) {
	resp, err := http.Get(fmt.Sprintf("http://%s/products", testMockServer.Address()))
	if err != nil {
		t.Fatalf("Network error: %s", err)
	}
	defer resp.Body.Close()
	if resp.StatusCode != 200 {
		t.Fatalf("Got HTTP status code %d", resp.StatusCode)
	}
	if resp.Header.Get("content-type") != "application/json" {
		t.Fatalf("Invalid content typs %s", resp.Header.Get("content-type"))
	}

	dec := json.NewDecoder(resp.Body)
	var products []common.APIProduct
	err = dec.Decode(&products)
	if err != nil {
		t.Fatalf("Error decoding response json: %s", err)
	}
}

func TestAPIKeyWrongFormat(t *testing.T) {
	req := common.VerifyAPIKeyRequest{}
	requestBod, _ := json.Marshal(&req)
	resp, err := http.DefaultClient.Post(
		fmt.Sprintf("http://%s/verifyApiKey", testMockServer.Address()),
		"text/plain",
		bytes.NewBuffer(requestBod))
	if err != nil {
		t.Fatalf("Network error: %s", err)
	}
	defer resp.Body.Close()
	if resp.StatusCode != 404 {
		t.Fatalf("Got HTTP status code %d -- expected 404", resp.StatusCode)
	}
}

func TestAPIKeyNotJSON(t *testing.T) {
	resp, err := http.DefaultClient.Post(
		fmt.Sprintf("http://%s/verifyApiKey", testMockServer.Address()),
		"application/json",
		bytes.NewBuffer([]byte("Hello!")))
	if err != nil {
		t.Fatalf("Network error: %s", err)
	}
	defer resp.Body.Close()
	if resp.StatusCode != 500 {
		t.Fatalf("Got HTTP status code %d -- expected 500", resp.StatusCode)
	}
}

func TestAPIKeyNoKey(t *testing.T) {
	req := common.VerifyAPIKeyRequest{}
	requestBod, _ := json.Marshal(&req)
	resp, err := http.DefaultClient.Post(
		fmt.Sprintf("http://%s/verifyApiKey", testMockServer.Address()),
		"application/json",
		bytes.NewBuffer(requestBod))
	if err != nil {
		t.Fatalf("Network error: %s", err)
	}
	defer resp.Body.Close()
	if resp.StatusCode != 404 {
		t.Fatalf("Got HTTP status code %d -- expected 404", resp.StatusCode)
	}
}

func TestAPIKeyBadKey(t *testing.T) {
	req := common.VerifyAPIKeyRequest{
		Key: "foobar",
	}
	requestBod, _ := json.Marshal(&req)
	resp, err := http.DefaultClient.Post(
		fmt.Sprintf("http://%s/verifyApiKey", testMockServer.Address()),
		"application/json",
		bytes.NewBuffer(requestBod))
	if err != nil {
		t.Fatalf("Network error: %s", err)
	}
	defer resp.Body.Close()
	if resp.StatusCode != 404 {
		t.Fatalf("Got HTTP status code %d -- expected 404", resp.StatusCode)
	}
}

func TestAPIKeySuccess(t *testing.T) {
	req := common.VerifyAPIKeyRequest{
		Key: ValidAPIKey1,
	}
	requestBod, _ := json.Marshal(&req)
	resp, err := http.DefaultClient.Post(
		fmt.Sprintf("http://%s/verifyApiKey", testMockServer.Address()),
		"application/json",
		bytes.NewBuffer(requestBod))
	if err != nil {
		t.Fatalf("Network error: %s", err)
	}
	defer resp.Body.Close()
	if resp.StatusCode != 200 {
		t.Fatalf("Got HTTP status code %d -- expected 200", resp.StatusCode)
	}

	var respBody common.VerifyAPIKeyResponse
	dec := json.NewDecoder(resp.Body)
	err = dec.Decode(&respBody)
	if err != nil {
		t.Fatalf("Error reading JSON response: %s", err)
	}

	_, err = jws.ParseJWT([]byte(respBody.Token))
	if err != nil {
		t.Fatalf("Error parsing JWT: %s", err)
	}
}
