// Copyright 2017 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import (
	"testplugin/iface_i"
	"log"
	"plugin"
)

func main() {
	a, err := plugin.Open("iface_a.so")
	if err != nil {
		log.Fatalf(`plugin.Open("iface_a.so"): %v`, err)
	}
	b, err := plugin.Open("iface_b.so")
	if err != nil {
		log.Fatalf(`plugin.Open("iface_b.so"): %v`, err)
	}

	af, err := a.Lookup("F")
	if err != nil {
		log.Fatalf(`a.Lookup("F") failed: %v`, err)
	}
	bf, err := b.Lookup("F")
	if err != nil {
		log.Fatalf(`b.Lookup("F") failed: %v`, err)
	}
	if af.(func() interface{})() != bf.(func() interface{})() {
		panic("empty interfaces not equal")
	}

	ag, err := a.Lookup("G")
	if err != nil {
		log.Fatalf(`a.Lookup("G") failed: %v`, err)
	}
	bg, err := b.Lookup("G")
	if err != nil {
		log.Fatalf(`b.Lookup("G") failed: %v`, err)
	}
	if ag.(func() iface_i.I)() != bg.(func() iface_i.I)() {
		panic("nonempty interfaces not equal")
	}
}
