// RAINBOND, Application Management Platform
// Copyright (C) 2014-2017 Goodrain Co., Ltd.

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version. For any non-GPL usage of Rainbond,
// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd.
// must be obtained first.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.

package prober

import (
	"context"
	"github.com/goodrain/rainbond/util/prober/types/v1"
	"testing"
	"time"
)

// capability_id: rainbond.util.prober.manage-service-health-watchers
func TestProbeManager_Start(t *testing.T) {
	t.Skip("integration test depends on reachable external TCP endpoint")
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	mgr, ok := NewProber(ctx, cancel).(*probeManager)
	if !ok {
		t.Fatal("expected *probeManager")
	}

	mgr.SetServices([]*v1.Service{{
		Name: "etcd",
		ServiceHealth: &v1.Health{
			Name:         "etcd",
			Model:        "unknown",
			Address:      "127.0.0.1:2379",
			TimeInterval: 3,
		},
	}})

	watcher := mgr.WatchServiceHealthy("etcd")
	mgr.EnableWatcher(watcher.GetServiceName(), watcher.GetID())
	go mgr.handleStatus()
	defer watcher.Close()

	mgr.statusChan <- &v1.HealthStatus{
		Name:   "etcd",
		Status: v1.StatHealthy,
		Info:   "ok",
	}

	select {
	case got := <-watcher.Watch():
		if got == nil {
			t.Fatal("expected status update")
		}
		if got.Name != "etcd" || got.Status != v1.StatHealthy {
			t.Fatalf("unexpected status: %+v", got)
		}
	case <-time.After(2 * time.Second):
		t.Fatal("timed out waiting for watcher update")
	}
}