blob: 5f1a74b7948667e246f9fbf0ff595a15fb17f08e [file] [log] [blame]
/*
* 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.jackrabbit.oak.plugins.index;
import java.util.Collections;
import java.util.List;
import com.google.common.collect.Lists;
import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
import org.apache.jackrabbit.oak.spi.state.NodeStore;
import org.apache.sling.testing.mock.osgi.MockOsgi;
import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import static org.junit.Assert.*;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class IndexInfoServiceImplTest {
@Rule
public final OsgiContext context = new OsgiContext();
private IndexInfoServiceImpl service = new IndexInfoServiceImpl();
private NodeStore store = new MemoryNodeStore();
private SimpleIndexPathService pathService = new SimpleIndexPathService();
@Before
public void setUp(){
context.registerService(NodeStore.class, store);
context.registerService(IndexPathService.class, pathService);
MockOsgi.injectServices(service, context.bundleContext());
}
@Test
public void indexInfo() throws Exception{
//1. Test Empty
assertNull(service.getInfo("/nonExistingPath"));
//2. Test when no backing InfoProvider
NodeBuilder builder = store.getRoot().builder();
builder.child("oak:index").child("fooIndex").setProperty("type", "foo");
store.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
IndexInfo info = service.getInfo("/oak:index/fooIndex");
assertNotNull(info);
assertEquals("/oak:index/fooIndex", info.getIndexPath());
assertEquals("foo", info.getType());
//3. Test when backing InfoProvider
IndexInfo testInfo = mock(IndexInfo.class);
when(testInfo.getIndexPath()).thenReturn("/some/other/path");
IndexInfoProvider infoProvider = mock(IndexInfoProvider.class);
when(infoProvider.getType()).thenReturn("foo");
when(infoProvider.getInfo(anyString())).thenReturn(testInfo);
service.bindInfoProviders(infoProvider);
IndexInfo info2 = service.getInfo("/oak:index/fooIndex");
assertNotNull(info2);
assertEquals("/some/other/path", info2.getIndexPath());
}
@Test
public void allIndexInfo() throws Exception{
pathService.paths = Lists.newArrayList("/oak:index/a", "/oak:index/b", "/oak:index/c", "/oak:index/d");
NodeBuilder builder = store.getRoot().builder();
builder.child("oak:index").child("a"); //Index with no type
builder.child("oak:index").child("b").setProperty("type", "type-b"); //No backing info provider
builder.child("oak:index").child("c").setProperty("type", "type-c"); //Info provider throws exception
builder.child("oak:index").child("d").setProperty("type", "type-d"); //Info provider returns result
store.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
IndexInfoProvider type_c = mock(IndexInfoProvider.class);
when(type_c.getInfo(anyString())).thenThrow(new RuntimeException());
when(type_c.getType()).thenReturn("type-c");
IndexInfo infod = mock(IndexInfo.class);
when(infod.getType()).thenReturn("type-d");
when(infod.getAsyncLaneName()).thenReturn("async-d");
IndexInfoProvider type_d = mock(IndexInfoProvider.class);
when(type_d.getInfo(anyString())).thenReturn(infod);
when(type_d.getType()).thenReturn("type-d");
service.bindInfoProviders(type_c);
service.bindInfoProviders(type_d);
List<IndexInfo> infos = Lists.newArrayList(service.getAllIndexInfo());
//Result would only have 2 entries. One throwing exception would be ignored
assertEquals(2, infos.size());
for (IndexInfo info : infos) {
if (info.getType().equals("type-d")){
assertEquals("async-d", info.getAsyncLaneName());
}
}
}
private static class SimpleIndexPathService implements IndexPathService {
List<String> paths = Collections.emptyList();
@Override
public Iterable<String> getIndexPaths() {
return paths;
}
}
}