Home | History | Annotate | Download | only in test
      1 // Copyright 2012 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 // +build !windows
      6 
      7 package cgotest
      8 
      9 /*
     10 #include <dlfcn.h>
     11 #cgo linux LDFLAGS: -ldl
     12 
     13 extern void call4029(void *arg);
     14 */
     15 import "C"
     16 
     17 import (
     18 	"testing"
     19 )
     20 
     21 var callbacks int
     22 
     23 //export IMPIsOpaque
     24 func IMPIsOpaque() {
     25 	callbacks++
     26 }
     27 
     28 //export IMPInitWithFrame
     29 func IMPInitWithFrame() {
     30 	callbacks++
     31 }
     32 
     33 //export IMPDrawRect
     34 func IMPDrawRect() {
     35 	callbacks++
     36 }
     37 
     38 //export IMPWindowResize
     39 func IMPWindowResize() {
     40 	callbacks++
     41 }
     42 
     43 func test4029(t *testing.T) {
     44 	loadThySelf(t, "IMPWindowResize")
     45 	loadThySelf(t, "IMPDrawRect")
     46 	loadThySelf(t, "IMPInitWithFrame")
     47 	loadThySelf(t, "IMPIsOpaque")
     48 	if callbacks != 4 {
     49 		t.Errorf("got %d callbacks, expected 4", callbacks)
     50 	}
     51 }
     52 
     53 func loadThySelf(t *testing.T, symbol string) {
     54 	this_process := C.dlopen(nil, C.RTLD_NOW)
     55 	if this_process == nil {
     56 		t.Error("dlopen:", C.GoString(C.dlerror()))
     57 		return
     58 	}
     59 	defer C.dlclose(this_process)
     60 
     61 	symbol_address := C.dlsym(this_process, C.CString(symbol))
     62 	if symbol_address == nil {
     63 		t.Error("dlsym:", C.GoString(C.dlerror()))
     64 		return
     65 	}
     66 	t.Log(symbol, symbol_address)
     67 	C.call4029(symbol_address)
     68 }
     69