/*
 * 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 org.apache.servicecomb.serviceregistry.task;

import java.util.ArrayList;
import java.util.List;

import org.apache.servicecomb.registry.api.registry.Microservice;
import org.apache.servicecomb.registry.api.registry.MicroserviceInstance;
import org.apache.servicecomb.serviceregistry.api.response.HeartbeatResponse;
import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient;
import org.apache.servicecomb.serviceregistry.config.ServiceRegistryConfig;
import org.junit.Before;
import org.junit.Test;

import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;

import mockit.Expectations;
import mockit.Mocked;
import org.junit.jupiter.api.Assertions;

public class TestMicroserviceInstanceHeartbeatTask {
  private EventBus eventBus;

  private Microservice microservice;

  private List<MicroserviceInstanceHeartbeatTask> heartbeatTaskList;

  @Before
  public void setup() {
    eventBus = new EventBus();

    heartbeatTaskList = new ArrayList<>();
    eventBus.register(new Object() {
      @Subscribe
      public void onEvent(MicroserviceInstanceHeartbeatTask task) {
        heartbeatTaskList.add(task);
      }
    });

    microservice = new Microservice();
    microservice.setAppId("app");
    microservice.setServiceName("ms");
    microservice.setServiceId("serviceId");

    microservice.setInstance(new MicroserviceInstance());
    microservice.getInstance().setInstanceId("instanceId");
  }

  @Test
  public void testNotRegistered(@Mocked ServiceRegistryClient srClient,
      @Mocked MicroserviceInstanceRegisterTask registerTask) {
    new Expectations() {
      {
      }
    };

    MicroserviceInstanceHeartbeatTask task =
        new MicroserviceInstanceHeartbeatTask(eventBus, srClient, microservice);
    registerTask.taskStatus = TaskStatus.INIT;
    eventBus.post(registerTask);

    task.run();
    Assertions.assertNull(task.getHeartbeatResult());
    Assertions.assertFalse(task.isNeedRegisterInstance());
    Assertions.assertEquals(0, heartbeatTaskList.size());
  }

  @Test
  public void testOtherMicroservice(@Mocked ServiceRegistryClient srClient,
      @Mocked ServiceRegistryConfig serviceRegistryConfig,
      @Mocked MicroserviceWatchTask watchTask) {
    Microservice otherMicroservice = new Microservice();
    otherMicroservice.setServiceName("ms1");

    new Expectations() {
      {
        watchTask.getMicroservice();
        result = otherMicroservice;
      }
    };

    MicroserviceInstanceHeartbeatTask heartbeatTask =
        new MicroserviceInstanceHeartbeatTask(eventBus, srClient, microservice);
    watchTask.taskStatus = TaskStatus.READY;
    eventBus.post(watchTask);

    heartbeatTask.run();
    Assertions.assertNull(heartbeatTask.getHeartbeatResult());
    Assertions.assertFalse(heartbeatTask.isNeedRegisterInstance());
    Assertions.assertEquals(0, heartbeatTaskList.size());
  }

  @Test
  public void testHeartbeatDisconnect(@Mocked ServiceRegistryClient srClient,
      @Mocked ServiceRegistryConfig serviceRegistryConfig,
      @Mocked MicroserviceWatchTask watchTask) {
    new Expectations() {
      {
        srClient.heartbeat(anyString, anyString);
        result = null;
        watchTask.getMicroservice();
        result = microservice;
      }
    };

    MicroserviceInstanceHeartbeatTask heartbeatTask =
        new MicroserviceInstanceHeartbeatTask(eventBus, srClient, microservice);
    watchTask.taskStatus = TaskStatus.READY;
    eventBus.post(watchTask);

    heartbeatTask.run();
    Assertions.assertEquals(HeartbeatResult.DISCONNECTED, heartbeatTask.getHeartbeatResult());
    Assertions.assertFalse(heartbeatTask.isNeedRegisterInstance());
    Assertions.assertEquals(1, heartbeatTaskList.size());
  }

  @Test
  public void testHeartbeatNotRegistered(@Mocked ServiceRegistryClient srClient,
      @Mocked ServiceRegistryConfig serviceRegistryConfig,
      @Mocked MicroserviceWatchTask watchTask) {
    HeartbeatResponse response = new HeartbeatResponse();
    response.setOk(false);
    response.setMessage("FAIL");

    new Expectations() {
      {
        srClient.heartbeat(anyString, anyString);
        result = response;
        watchTask.getMicroservice();
        result = microservice;
      }
    };

    MicroserviceInstanceHeartbeatTask heartbeatTask =
        new MicroserviceInstanceHeartbeatTask(eventBus, srClient, microservice);
    watchTask.taskStatus = TaskStatus.READY;
    eventBus.post(watchTask);

    heartbeatTask.run();
    Assertions.assertEquals(HeartbeatResult.INSTANCE_NOT_REGISTERED, heartbeatTask.getHeartbeatResult());
    Assertions.assertTrue(heartbeatTask.isNeedRegisterInstance());
    Assertions.assertEquals(1, heartbeatTaskList.size());
  }

  @Test
  public void testHeartbeatSuccess(@Mocked ServiceRegistryClient srClient,
      @Mocked ServiceRegistryConfig serviceRegistryConfig,
      @Mocked MicroserviceWatchTask watchTask) {
    HeartbeatResponse response = new HeartbeatResponse();
    response.setOk(true);
    response.setMessage("OK");

    new Expectations() {
      {
        srClient.heartbeat(anyString, anyString);
        result = response;
        watchTask.getMicroservice();
        result = microservice;
      }
    };

    MicroserviceInstanceHeartbeatTask heartbeatTask =
        new MicroserviceInstanceHeartbeatTask(eventBus, srClient, microservice);
    watchTask.taskStatus = TaskStatus.READY;
    eventBus.post(watchTask);

    heartbeatTask.run();
    Assertions.assertEquals(HeartbeatResult.SUCCESS, heartbeatTask.getHeartbeatResult());
    Assertions.assertFalse(heartbeatTask.isNeedRegisterInstance());
    Assertions.assertEquals(1, heartbeatTaskList.size());
  }
}
