/*
 * Licensed to the LF AI & Data foundation under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you 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 hookutil

import (
	"sync"
	"testing"

	"github.com/stretchr/testify/assert"

	"github.com/milvus-io/milvus/pkg/v3/util/paramtable"
)

func TestInitHook(t *testing.T) {
	paramtable.Init()
	Params := paramtable.Get()
	paramtable.Get().Save(Params.ProxyCfg.SoPath.Key, "")
	initHook()
	assert.IsType(t, DefaultHook{}, GetHook())

	paramtable.Get().Save(Params.ProxyCfg.SoPath.Key, "/a/b/hook.so")
	err := initHook()
	assert.Error(t, err)
	paramtable.Get().Save(Params.ProxyCfg.SoPath.Key, "")
}

func TestHookInitPanicError(t *testing.T) {
	paramtable.Init()
	p := paramtable.Get()
	p.Save(p.ProxyCfg.SoPath.Key, "/a/b/hook.so")
	defer p.Reset(p.ProxyCfg.SoPath.Key)
	err := initHook()
	assert.Error(t, err)
	assert.Panics(t, func() {
		initOnce = sync.Once{}
		InitOnceHook()
	})
}

func TestHookInitLogError(t *testing.T) {
	paramtable.Init()
	p := paramtable.Get()
	p.Save(p.ProxyCfg.SoPath.Key, "/a/b/hook.so")
	defer p.Reset(p.ProxyCfg.SoPath.Key)
	p.Save(p.CommonCfg.PanicWhenPluginFail.Key, "false")
	defer p.Reset(p.CommonCfg.PanicWhenPluginFail.Key)
	err := initHook()
	assert.Error(t, err)
	assert.NotPanics(t, func() {
		initOnce = sync.Once{}
		InitOnceHook()
	})
}

func TestDefaultHook(t *testing.T) {
	d := &DefaultHook{}
	assert.NoError(t, d.Init(nil))
	{
		_, err := d.VerifyAPIKey("key")
		assert.Error(t, err)
	}
	assert.NotPanics(t, func() {
		d.Release()
	})
}
