/*
* Copyright (c) 2016 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.yangtools.yang.model.repo.util;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doReturn;
import com.google.common.base.MoreObjects;
import com.google.common.base.Optional;
import com.google.common.util.concurrent.CheckedFuture;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.opendaylight.yangtools.yang.model.repo.api.RevisionSourceIdentifier;
import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceException;
import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceRepresentation;
import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
import org.opendaylight.yangtools.yang.model.repo.api.YangSchemaSourceRepresentation;
import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource;
import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider;
import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistration;
import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistry;
@RunWith(MockitoJUnitRunner.class)
public class InMemorySchemaSourceCacheTest {
private static final Class<YangSchemaSourceRepresentation> representation = YangSchemaSourceRepresentation.class;
private static final long lifetime = 1000l;
private static final TimeUnit units = TimeUnit.MILLISECONDS;
@Mock
private SchemaSourceRegistry registry;
@Mock
private SchemaSourceRegistration<?> registration;
@Before
public void setUp() throws Exception {
doReturn(this.registration).when(this.registry).registerSchemaSource(any(SchemaSourceProvider.class),
any(PotentialSchemaSource.class));
}
@Test
public void inMemorySchemaSourceCacheTest1() {
final InMemorySchemaSourceCache<YangSchemaSourceRepresentation> inMemorySchemaSourceCache = InMemorySchemaSourceCache
.createSoftCache(this.registry, InMemorySchemaSourceCacheTest.representation);
Assert.assertNotNull(inMemorySchemaSourceCache);
inMemorySchemaSourceCache.close();
}
@Test
public void inMemorySchemaSourceCacheTest2() {
final InMemorySchemaSourceCache<YangSchemaSourceRepresentation> inMemorySchemaSourceCache = InMemorySchemaSourceCache
.createSoftCache(this.registry, InMemorySchemaSourceCacheTest.representation,
InMemorySchemaSourceCacheTest.lifetime, InMemorySchemaSourceCacheTest.units);
Assert.assertNotNull(inMemorySchemaSourceCache);
inMemorySchemaSourceCache.close();
}
@Test
public void inMemorySchemaSourceCacheOfferAndGetSourcestest() throws Exception {
final InMemorySchemaSourceCache<YangSchemaSourceRepresentation> inMemorySchemaSourceCache = InMemorySchemaSourceCache
.createSoftCache(this.registry, InMemorySchemaSourceCacheTest.representation);
final String content = "content";
final YangTextSchemaSource source = new TestingYangSource("test", "2012-12-12", content);
inMemorySchemaSourceCache.offer(source);
final SourceIdentifier sourceIdentifier = RevisionSourceIdentifier.create("test", "2012-12-12");
final CheckedFuture<? extends YangSchemaSourceRepresentation, SchemaSourceException> checkedSource = inMemorySchemaSourceCache
.getSource(sourceIdentifier);
Assert.assertNotNull(checkedSource);
final YangSchemaSourceRepresentation yangSchemaSourceRepresentation = checkedSource.get();
Assert.assertNotNull(yangSchemaSourceRepresentation);
Assert.assertEquals(sourceIdentifier, yangSchemaSourceRepresentation.getIdentifier());
inMemorySchemaSourceCache.close();
}
@Test(expected = ExecutionException.class)
public void inMemorySchemaSourceCacheNullGetSourcestest() throws Exception {
final InMemorySchemaSourceCache<YangSchemaSourceRepresentation> inMemorySchemaSourceCache = InMemorySchemaSourceCache
.createSoftCache(this.registry, InMemorySchemaSourceCacheTest.representation);
final SourceIdentifier sourceIdentifier = RevisionSourceIdentifier.create("test", "2012-12-12");
final CheckedFuture<? extends YangSchemaSourceRepresentation, SchemaSourceException> checkedSource = inMemorySchemaSourceCache
.getSource(sourceIdentifier);
Assert.assertNotNull(checkedSource);
checkedSource.get();
inMemorySchemaSourceCache.close();
}
@Test
public void inMemorySchemaSourceCache3test() throws Exception {
final InMemorySchemaSourceCache<YangSchemaSourceRepresentation> inMemorySchemaSourceCache = InMemorySchemaSourceCache
.createSoftCache(this.registry, InMemorySchemaSourceCacheTest.representation);
final InMemorySchemaSourceCache<YangSchemaSourceRepresentation> inMemorySchemaSourceCache2 = InMemorySchemaSourceCache
.createSoftCache(this.registry, representation, InMemorySchemaSourceCacheTest.lifetime,
InMemorySchemaSourceCacheTest.units);
final String content = "content";
final YangTextSchemaSource source = new TestingYangSource("test", "2012-12-12", content);
inMemorySchemaSourceCache.offer(source);
inMemorySchemaSourceCache2.offer(source);
final SourceIdentifier sourceIdentifier = RevisionSourceIdentifier.create("test", "2012-12-12");
final CheckedFuture<? extends YangSchemaSourceRepresentation, SchemaSourceException> checkedSource = inMemorySchemaSourceCache
.getSource(sourceIdentifier);
final CheckedFuture<? extends SchemaSourceRepresentation, SchemaSourceException> checkedSource2 = inMemorySchemaSourceCache2
.getSource(sourceIdentifier);
Assert.assertNotNull(checkedSource);
Assert.assertNotNull(checkedSource2);
Assert.assertEquals(checkedSource.get(), checkedSource2.get());
inMemorySchemaSourceCache.close();
inMemorySchemaSourceCache2.close();
}
private class TestingYangSource extends YangTextSchemaSource {
private final String content;
protected TestingYangSource(final String name, final String revision, final String content) {
super(RevisionSourceIdentifier.create(name, Optional.fromNullable(revision)));
this.content = content;
}
@Override
protected MoreObjects.ToStringHelper addToStringAttributes(final MoreObjects.ToStringHelper toStringHelper) {
return toStringHelper;
}
@Override
public InputStream openStream() throws IOException {
return new ByteArrayInputStream(this.content.getBytes(StandardCharsets.UTF_8));
}
}
}