package common

import (
	"fmt"
	"io/ioutil"
	"math/rand"
	"os"
	"testing"

	"github.com/libp2p/go-libp2p-core/crypto"
	"github.com/stretchr/testify/assert"
	"go.uber.org/zap"
)

func TestGetOrCreateNodeKeyWithNewPath(t *testing.T) {
	// Get a non-existing temp file path to write auto-generated privKey to
	path := "/tmp/node_key_test_" + fmt.Sprint(rand.Int()) //#nosec G404 no CSPRNG needed here
	defer os.Remove(path)

	logger, _ := zap.NewProduction()
	privKey1, _ := GetOrCreateNodeKey(logger, path)
	assert.NotNil(t, privKey1)

	// Re-read the generated privKey file back into memory
	b, _ := ioutil.ReadFile(path)
	privKey2, _ := crypto.UnmarshalPrivateKey(b)

	// Make sure we got the same key
	assert.Equal(t, privKey1, privKey2)
}

func TestGetOrCreateNodeKeyWithPreExistingPath(t *testing.T) {
	// Get a temp file to write our test private key to
	file, err := os.CreateTemp("", "tmpfile1-")
	assert.Nil(t, err)
	defer os.Remove(file.Name())

	// Generate a test private key
	privKey1, _, _ := crypto.GenerateKeyPair(crypto.Ed25519, -1)

	// Marshall the private key to bytes
	marshalledPrivKey, _ := crypto.MarshalPrivateKey(privKey1)

	// Write the private key bytes to temp file
	_, _ = file.Write(marshalledPrivKey)

	logger, _ := zap.NewProduction()
	privKey2, _ := GetOrCreateNodeKey(logger, file.Name())

	// Make sure we got the same key
	assert.Equal(t, privKey1, privKey2)
}
