// Copyright (C) 2017 The Android Open Source Project
//
// Licensed 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 com.ericsson.gerrit.plugins.gcconductor.evaluator;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;

import com.ericsson.gerrit.plugins.gcconductor.ShutdownNotifier;
import org.junit.Before;
import org.junit.Test;

public class OnPluginLoadUnloadTest {

  private OnPluginLoadUnload onPluginLoadUnload;
  private ShutdownNotifier shutdownNotifierMock;

  @Before
  public void setUp() {
    shutdownNotifierMock = mock(ShutdownNotifier.class);
    onPluginLoadUnload = new OnPluginLoadUnload(shutdownNotifierMock);
  }

  @Test
  public void testStart() {
    onPluginLoadUnload.start();
    verifyZeroInteractions(shutdownNotifierMock);
  }

  @Test
  public void testStop() {
    onPluginLoadUnload.stop();
    verify(shutdownNotifierMock).notifyAllListeners();
  }
}
