// TestServiceMemberIdentification checks that a client can register with the serviceproxy.
func TestServiceMemberIdentification(t *testing.T) {
	// register proxy
	serfagent := register.NewAgent("proxy", 15333)
	serfagent.RegisterService("")

	// make sure service is up
	time.Sleep(1 * time.Second)

	// register dummy adder service
	serfagent2 := register.NewAgent("adder", 23230)
	hname, _ := os.Hostname()
	serfagent2.RegisterService(hname + ":7946")

	// make sure service is up
	time.Sleep(1 * time.Second)

	var registry proxy.Registry
	registry.UpdateRegistry()
	members := registry.GetServicesSlice()

	if len(members) != 1 {
		t.Errorf("Number service members %d (should be 1)", len(members))
		return
	}

	if members[0] != "adder" {
		t.Errorf("adder should be the service member")
		return
	}
}
// Run creates the serf agent and launches the http server
func (proxy *ServiceProxy) Run() error {
	// create agent and launch (no join node is specified)
	serfagent := register.NewAgent("proxy", proxy.Port)
	serfagent.Debug = proxy.Debug
	serfagent.RegisterService("")

	hname, _ := os.Hostname()
	serfaddr := hname + ":" + strconv.Itoa(serfagent.GetSerfPort())

	// address for clients to register (port does not need to be specified
	// by the client if using the Go register interface)
	fmt.Printf("Registry address: %s\n", serfaddr)

	// exit server if user presses Ctrl-C
	go func() {
		sigch := make(chan os.Signal)
		signal.Notify(sigch, os.Interrupt, syscall.SIGTERM)
		<-sigch
		fmt.Println("Exiting...")
		os.Exit(0)
	}()

	// create web server
	return Serve(proxy.Port)
}
// TestServiceRegister checks that a client can be registered as a serf agent.
func TestServiceRegister(t *testing.T) {
	// register proxy
	serfagent := register.NewAgent("adder", 23230)
	err := serfagent.RegisterService("")

	// make sure service is up
	time.Sleep(1 * time.Second)

	if err != nil {
		t.Errorf("Error when registering")
		return
	}

	port := serfagent.GetSerfPort()
	if port <= 25000 {
		t.Errorf("Service port not found in correct range")
		return
	}

	// TODO check that service is alive

	err = serfagent.UnRegisterService()
	if err != nil {
		t.Errorf("Failed to unregister service")
		return
	}
}
// TestProxyRegister checks that serviceproxy can be registered as a serf agent.
func TestProxyRegister(t *testing.T) {
	// register proxy
	serfagent := register.NewAgent("proxy", 15333)
	err := serfagent.RegisterService("")

	// make sure service is up
	time.Sleep(1 * time.Second)

	if err != nil {
		t.Errorf("Error when registering")
		return
	}

	port := serfagent.GetSerfPort()
	if port != 7946 {
		t.Errorf("Proxy not registered at port 7946")
		return
	}

	// TODO: check that service is alive

	err = serfagent.UnRegisterService()
	if err != nil {
		t.Errorf("Failed to unregister proxy")
		return
	}
}
func main() {
	flag.BoolVar(showHelp, "h", false, "Show help message")
	flag.Parse()

	if *showHelp {
		fmt.Printf(helpMessage)
		os.Exit(0)
	}

	if *registry != "" {
		// creates adder service and points to first argument
		serfagent := register.NewAgent("calcoverlap", *portNum)
		serfagent.RegisterService(*registry)
	}

	overlap.Serve(*proxy, *portNum)
}
func main() {
	flag.BoolVar(showHelp, "h", false, "Show help message")
	flag.Parse()

	if *showHelp {
		fmt.Printf(helpMessage)
		os.Exit(0)
	}

	// register service
	if flag.NArg() != 1 {
		fmt.Printf("Must provide registry address")
		fmt.Printf(helpMessage)
		os.Exit(0)
	}

	// creates adder service and points to first argument
	serfagent := register.NewAgent("adder", *portNum)
	serfagent.RegisterService(flag.Arg(0))

	Serve(*portNum)
}
func main() {
	flag.BoolVar(showHelp, "h", false, "Show help message")
	flag.Parse()

	if *showHelp {
		fmt.Printf(helpMessage)
		os.Exit(0)
	}

	if flag.NArg() != 1 {
		fmt.Println("Must provide a directory for temporary segmentation data")
		fmt.Println(helpMessage)
		os.Exit(0)
	}

	if *registry != "" {
		// creates adder service and points to first argument
		serfagent := register.NewAgent("clustercompute", *portNum)
		serfagent.RegisterService(*registry)
	}

	calclabels.Serve(*proxy, *portNum, *configFile, flag.Arg(0))
}