/*
 * Licensed to the Apache Software Foundation (ASF) 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 notify

import (
	simple "github.com/apache/servicecomb-service-center/pkg/time"
	"testing"
	"time"
)

func TestGetNotifyService(t *testing.T) {
	INSTANCE := RegisterType("INSTANCE", 1)

	notifyService := NewNotifyService()
	if notifyService == nil {
		t.Fatalf("TestGetNotifyService failed")
	}
	if notifyService.Closed() != true {
		t.Fatalf("TestGetNotifyService failed")
	}

	err := notifyService.AddSubscriber(nil)
	if err == nil {
		t.Fatalf("TestGetNotifyService failed")
	}
	err = notifyService.Publish(nil)
	if err == nil {
		t.Fatalf("TestGetNotifyService failed")
	}

	notifyService.Start()
	notifyService.Start()
	if notifyService.Closed() != false {
		t.Fatalf("TestGetNotifyService failed")
	}

	s := NewSubscriber(-1, "s", "g")
	err = notifyService.AddSubscriber(s)
	if err == nil {
		t.Fatalf("TestGetNotifyService failed")
	}
	notifyService.RemoveSubscriber(s)

	s = NewSubscriber(INSTANCE, "s", "g")
	err = notifyService.AddSubscriber(s)
	if err != nil {
		t.Fatalf("TestGetNotifyService failed, %v", err)
	}
	j := &baseEvent{INSTANCE, "s", "g", simple.FromTime(time.Now())}
	err = notifyService.Publish(j)
	if err != nil {
		t.Fatalf("TestGetNotifyService failed")
	}
	err = notifyService.Publish(NewNotifyServiceHealthCheckJob(NewNotifyServiceHealthChecker()))
	if err != nil {
		t.Fatalf("TestGetNotifyService failed")
	}
	err = notifyService.Publish(NewNotifyServiceHealthCheckJob(s))
	if err != nil {
		t.Fatalf("TestGetNotifyService failed")
	}
	<-time.After(time.Second)
	notifyService.Stop()
	if notifyService.Closed() != true {
		t.Fatalf("TestGetNotifyService failed")
	}
}
