/*
 * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 */

package org.opendaylight.controller.netconf.impl;

import com.google.common.base.Optional;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import io.netty.channel.Channel;
import java.util.List;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.opendaylight.controller.netconf.api.monitoring.NetconfManagementSession;
import org.opendaylight.controller.netconf.impl.NetconfServerSession;
import org.opendaylight.controller.netconf.impl.NetconfServerSessionListener;
import org.opendaylight.controller.netconf.impl.osgi.NetconfMonitoringServiceImpl;
import org.opendaylight.controller.netconf.mapping.api.Capability;
import org.opendaylight.controller.netconf.mapping.api.NetconfOperationProvider;
import org.opendaylight.controller.netconf.mapping.api.NetconfOperationService;
import org.opendaylight.controller.netconf.mapping.api.NetconfOperationServiceSnapshot;
import org.opendaylight.controller.netconf.util.messages.NetconfHelloMessageAdditionalHeader;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.*;

public class NetconfMonitoringServiceImplTest {

    private NetconfMonitoringServiceImpl service;

    @Mock
    private NetconfOperationProvider operationProvider;
    @Mock
    private NetconfManagementSession managementSession;
    @Mock
    private NetconfOperationServiceSnapshot snapshot;
    @Mock
    private NetconfOperationService operationService;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
        service = new NetconfMonitoringServiceImpl(operationProvider);
    }

    @Test
    public void testSessions() throws Exception {
        doReturn("sessToStr").when(managementSession).toString();
        service.onSessionUp(managementSession);
        List list = Lists.newArrayList(managementSession);
    }

    @Test(expected = RuntimeException.class)
    public void testGetSchemas() throws Exception {
        doThrow(RuntimeException.class).when(operationProvider).openSnapshot(anyString());
        service.getSchemas();
    }

    @Test(expected = IllegalStateException.class)
    public void testGetSchemas2() throws Exception {
        doThrow(Exception.class).when(operationProvider).openSnapshot(anyString());
        service.getSchemas();
    }

    @Test
    public void testGetSchemas3() throws Exception {
        doReturn("").when(managementSession).toString();
        Capability cap = mock(Capability.class);
        Set caps = Sets.newHashSet(cap);
        Set services = Sets.newHashSet(operationService);
        doReturn(snapshot).when(operationProvider).openSnapshot(anyString());
        doReturn(services).when(snapshot).getServices();
        doReturn(caps).when(operationService).getCapabilities();
        Optional<String> opt = mock(Optional.class);
        doReturn(opt).when(cap).getCapabilitySchema();
        doReturn(true).when(opt).isPresent();
        doReturn(opt).when(cap).getModuleNamespace();
        doReturn("namespace").when(opt).get();
        Optional<String> optRev = Optional.of("rev");
        doReturn(optRev).when(cap).getRevision();
        doReturn(Optional.of("modName")).when(cap).getModuleName();
        doReturn(Optional.of(Lists.newArrayList("loc"))).when(cap).getLocation();
        doNothing().when(snapshot).close();

        assertNotNull(service.getSchemas());
        verify(snapshot, times(1)).close();

        NetconfServerSessionListener sessionListener = mock(NetconfServerSessionListener.class);
        Channel channel = mock(Channel.class);
        NetconfHelloMessageAdditionalHeader header = new NetconfHelloMessageAdditionalHeader("name", "addr", "2", "tcp", "id");
        NetconfServerSession sm = new NetconfServerSession(sessionListener, channel, 10, header);
        doNothing().when(sessionListener).onSessionUp(any(NetconfServerSession.class));
        sm.sessionUp();
        service.onSessionUp(sm);
        assertEquals(1, service.getSessions().getSession().size());

        assertEquals(Long.valueOf(10), service.getSessions().getSession().get(0).getSessionId());

        service.onSessionDown(sm);
        assertEquals(0, service.getSessions().getSession().size());
    }
}

@@ -509,31 +509,8 @@
 el;%0A
-import java.util.List;%0A
 impo
@@ -2256,67 +2256,8 @@
 n);%0A
-        List list = Lists.newArrayList(managementSession);%0A
     

Remove unused local variable