/* * 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.sal.dom.broker; import static junit.framework.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.opendaylight.controller.md.sal.dom.api.DOMMountPoint; import org.opendaylight.controller.md.sal.dom.api.DOMMountPointService; import org.opendaylight.controller.md.sal.dom.api.DOMService; import org.opendaylight.controller.md.sal.dom.broker.impl.mount.DOMMountPointServiceImpl; import org.opendaylight.controller.sal.core.api.mount.MountProvisionInstance; import org.opendaylight.controller.sal.core.api.mount.MountProvisionListener; import org.opendaylight.yangtools.concepts.ObjectRegistration; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Optional; public class BackwardsCompatibleMountPointManagerTest { private static final Logger log = LoggerFactory.getLogger(BackwardsCompatibleMountPointManagerTest.class); @Mock private DOMMountPointServiceImpl domMountPointService; @Mock private DOMMountPointService.DOMMountPointBuilder mountBuilder; private BackwardsCompatibleMountPointManager compatibleMountPointManager; static final QName qName = QName.create("namespace", "12-12-1212", "mount"); static final InstanceIdentifier id = InstanceIdentifier.builder(qName).build(); @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); stubMountService(); compatibleMountPointManager = new BackwardsCompatibleMountPointManager(domMountPointService); } @Test public void testCreateMountpointAlreadyCreated() throws Exception { compatibleMountPointManager.createMountPoint(id); verify(domMountPointService).createMountPoint(id); verify(mountBuilder, times(3)).addService(any(Class.class), any(DOMService.class)); verify(mountBuilder).addInitialSchemaContext(any(SchemaContext.class)); try { compatibleMountPointManager.createMountPoint(id); } catch (final IllegalStateException e) { log.debug("", e); return; } fail("Should fail to create duplicate mount"); } @Test public void testCreateMountpointGetOrCreate() throws Exception { compatibleMountPointManager = new BackwardsCompatibleMountPointManager(new DOMMountPointServiceImpl()); final MountProvisionListener listener = new MountProvisionListener() { public int createdMounts = 0; @Override public void onMountPointCreated(final InstanceIdentifier path) { if(createdMounts++ > 1 ) { fail("Only one mount point should have been created"); } } @Override public void onMountPointRemoved(final InstanceIdentifier path) {} }; compatibleMountPointManager.registerProvisionListener(listener); final MountProvisionInstance m1 = compatibleMountPointManager.createOrGetMountPoint(id); m1.setSchemaContext(mockSchemaContext()); compatibleMountPointManager.createOrGetMountPoint(id); compatibleMountPointManager.createOrGetMountPoint(id); } private void stubMountService() { doReturn(mockMountPointBuilder()).when(domMountPointService).createMountPoint(any(InstanceIdentifier.class)); doReturn(Optional.of(mockMountPoint())).when(domMountPointService).getMountPoint(any(InstanceIdentifier.class)); } private DOMMountPoint mockMountPoint() { final DOMMountPoint mock = mock(DOMMountPoint.class); doAnswer(new Answer() { @Override public Object answer(final InvocationOnMock invocation) throws Throwable { return Optional.of(mock(((Class) invocation.getArguments()[0]))); } }).when(mock).getService(any(Class.class)); doReturn(mockSchemaContext()).when(mock).getSchemaContext(); return mock; } static SchemaContext mockSchemaContext() { final SchemaContext mock = mock(SchemaContext.class); doReturn(qName).when(mock).getQName(); doReturn("schema").when(mock).toString(); doReturn(mock(DataSchemaNode.class)).when(mock).getDataChildByName(any(QName.class)); return mock; } private DOMMountPointService.DOMMountPointBuilder mockMountPointBuilder() { doReturn(mountBuilder).when(mountBuilder).addService(any(Class.class), any(DOMService.class)); doReturn(mockObjectRegistration()).when(mountBuilder).register(); doReturn(mountBuilder).when(mountBuilder).addInitialSchemaContext(any(SchemaContext.class)); return mountBuilder; } private ObjectRegistration mockObjectRegistration() { return mock(ObjectRegistration.class); } }