/*
Copyright IBM Corp. All Rights Reserved.

SPDX-License-Identifier: Apache-2.0
*/

package factory

import (
	"fmt"
	"os"
	"strings"
	"testing"

	"github.com/hyperledger/fabric/bccsp/pkcs11"
	"github.com/spf13/viper"
	"github.com/stretchr/testify/require"
)

func TestMain(m *testing.M) {
	var yamlBCCSP *FactoryOpts

	yamlCFG := `
BCCSP:
    default: SW
    SW:
        Hash: SHA3
        Security: 256
`

	if pkcs11Enabled {
		lib, pin, label := pkcs11.FindPKCS11Lib()
		yamlCFG = fmt.Sprintf(`
BCCSP:
    default: PKCS11
    SW:
        Hash: SHA3
        Security: 256
    PKCS11:
        Hash: SHA3
        Security: 256

        Library: %s
        Pin:     '%s'
        Label:   %s
        `, lib, pin, label)
	}

	viper.SetConfigType("yaml")
	err := viper.ReadConfig(strings.NewReader(yamlCFG))
	if err != nil {
		fmt.Printf("Could not read YAML config [%s]", err)
		os.Exit(-1)
	}

	err = viper.UnmarshalKey("bccsp", &yamlBCCSP)
	if err != nil {
		fmt.Printf("Could not parse YAML config [%s]", err)
		os.Exit(-1)
	}

	cfgVariations := []*FactoryOpts{
		{},
		{ProviderName: "SW"},
		{ProviderName: "SW", SwOpts: &SwOpts{HashFamily: "SHA2", SecLevel: 256, Ephemeral: true}},
		yamlBCCSP,
	}

	for index, config := range cfgVariations {
		fmt.Printf("Trying configuration [%d]\n", index)
		factoriesInitError = initFactories(config)
		if factoriesInitError != nil {
			fmt.Fprintf(os.Stderr, "initFactories failed: %s", factoriesInitError)
			os.Exit(1)
		}
		if rc := m.Run(); rc != 0 {
			os.Exit(rc)
		}
	}
	os.Exit(0)
}

func TestGetDefault(t *testing.T) {
	bccsp := GetDefault()
	require.NotNil(t, bccsp, "Failed getting default BCCSP. Nil instance.")
}
