package netflix.admin;
import com.google.inject.Module;
import com.netflix.config.ConfigurationManager;
import netflix.adminresources.AbstractAdminPageInfo;
import netflix.adminresources.AdminPage;
import netflix.adminresources.AdminPageInfo;
import netflix.adminresources.AdminPageRegistry;
import org.junit.Before;
import org.junit.Test;
import java.lang.annotation.Annotation;
import java.util.*;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.*;
public class AdminPageRegistryTest {
static final AdminPageRegistry adminPageRegistry = new AdminPageRegistry();
@java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE})
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
public static @interface MockAnnotation1 {
}
@java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE})
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
public static @interface MockAnnotation2 {
}
@AdminPage
public static class MockPlugin1 extends AbstractAdminPageInfo {
public MockPlugin1() {
super("id-plugin1", "plugin-1");
}
@Override
public String getJerseyResourcePackageList() {
return "pkg1;pkg2";
}
}
@AdminPage
public static class MockPlugin2 extends AbstractAdminPageInfo {
public MockPlugin2() {
super("id-plugin2", "plugin-2");
}
@Override
public String getJerseyResourcePackageList() {
return "pkg3;pkg4";
}
}
@AdminPage
public static class DisabledMockPlugin3 extends AbstractAdminPageInfo {
public DisabledMockPlugin3() {
super("id-plugin3", "plugin-3");
}
@Override
public boolean isEnabled() {
return false;
}
}
@AdminPage
public static class DisabledMockPlugin4 implements AdminPageInfo {
private String id = "id-plugin4";
private String name = "plugin4";
@Override
public String getPageId() {
return id;
}
@Override
public String getName() {
return name;
}
@Override
public String getPageTemplate() {
return null;
}
@Override
public Map<String, Object> getDataModel() {
Map<String, Object> dataModel = new HashMap<>(1);
dataModel.put("foo", "bar");
return dataModel;
}
@Override
public String getJerseyResourcePackageList() {
return null;
}
@Override
public List<Module> getGuiceModules() {
return new ArrayList<>(0);
}
@Override
public boolean isEnabled() {
return true;
}
@Override
public boolean isVisible() {
return false;
}
}
@Before
public void init() {
adminPageRegistry.registerAdminPagesWithClasspathScan();
}
@Test
public void verifyAllPages() {
final Collection<AdminPageInfo> allPages = adminPageRegistry.getAllPages();
// 4 modules - 1 disabled
assertTrue(allPages.size() == 3);
for (AdminPageInfo pageInfo : allPages) {
assertTrue(pageInfo.getName().startsWith("plugin"));
}
}
@Test
public void addAndRemoveAdminPluginDynamically() {
Collection<AdminPageInfo> allPlugins = adminPageRegistry.getAllPages();
assertThat("Admin plugins are not null by default", allPlugins, notNullValue());
assertThat("Admin plugins size is 3", allPlugins.size(), is(3));
final AbstractAdminPageInfo dynamicPlugin1 = new AbstractAdminPageInfo("dynamicPluginId1", "dynamicPluginName1") {
};
adminPageRegistry.add(dynamicPlugin1);
assertThat("Admin plugins added dynamically", adminPageRegistry.getAllPages().size(), is(4));
adminPageRegistry.remove(dynamicPlugin1);
assertThat("Admin plugins removed dynamically", adminPageRegistry.getAllPages().size(), is(3));
}
@Test
public void verifyJerseyPkgPath() {
final String jerseyResourcePath = adminPageRegistry.buildJerseyResourcePkgListForAdminPages();
assertEquals("pkg1;pkg2;pkg3;pkg4;", jerseyResourcePath);
}
@Test
public void verifyVisible() {
final AdminPageInfo plugin4 = adminPageRegistry.getPageInfo("id-plugin4");
assertThat("Plugin4 should not be null", plugin4, notNullValue());
assertThat("Plugin4 should not be visible", plugin4.isVisible(), is(false));
}
@Test
public void verifyDataModel() {
final AdminPageInfo plugin4 = adminPageRegistry.getPageInfo("id-plugin4");
assertThat("Plugin4 should is null", plugin4, notNullValue());
final Map<String, Object> dataModel = plugin4.getDataModel();
assertThat("Data model is null", dataModel, notNullValue());
assertThat("Data model does not contain 1 entry", dataModel.size(), is(1));
assertThat("Data model does not contain foo", dataModel.containsKey("foo"), is(true));
}
@Test
public void defaultAdminPageAnnotations() {
final List<Class<? extends Annotation>> adminPageAnnotations = adminPageRegistry.getAdminPageAnnotations();
assertThat("AdminPage Annotations are not null by default", adminPageAnnotations, notNullValue());
assertThat("AdminPage Annotations size is 1 by default", adminPageAnnotations.size(), is(1));
final String defaultAnnotationClassName = adminPageAnnotations.get(0).getName();
assertThat("DefaultAnnotationClassName is AdminPage", defaultAnnotationClassName, is("netflix.adminresources.AdminPage"));
}
@Test
public void badAdminPageAnnotation() {
ConfigurationManager.getConfigInstance().setProperty(AdminPageRegistry.PROP_ID_ADMIN_PAGE_ANNOTATION, "netflix.InvalidAnnotation1;netflix.InvalidAnnotation2");
final List<Class<? extends Annotation>> adminPageAnnotations = adminPageRegistry.getAdminPageAnnotations();
assertThat("AdminPage Annotations are not null", adminPageAnnotations, notNullValue());
assertThat("AdminPage Annotations size is 0", adminPageAnnotations.size(), is(0));
ConfigurationManager.getConfigInstance().setProperty(AdminPageRegistry.PROP_ID_ADMIN_PAGE_ANNOTATION, AdminPageRegistry.DEFAULT_ADMIN_PAGE_ANNOTATION);
}
@Test
public void configureAdminPageAnnotation() {
ConfigurationManager.getConfigInstance().setProperty(AdminPageRegistry.PROP_ID_ADMIN_PAGE_ANNOTATION,
"netflix.admin.AdminPageRegistryTest$MockAnnotation1;netflix.admin.AdminPageRegistryTest$MockAnnotation2");
final List<Class<? extends Annotation>> adminPageAnnotations = adminPageRegistry.getAdminPageAnnotations();
assertThat("AdminPage Annotations are not empty", adminPageAnnotations, notNullValue());
assertThat("AdminPage Annotations size is 2", adminPageAnnotations.size(), is(2));
final String firstAnnotation = adminPageAnnotations.get(0).getName();
final String secondAnnotation = adminPageAnnotations.get(1).getName();
assertThat("AdminPage annotation is netflix.Annotation1", firstAnnotation, is("netflix.admin.AdminPageRegistryTest$MockAnnotation1"));
assertThat("AdminPage annotation is netflix.Annotation2", secondAnnotation, is("netflix.admin.AdminPageRegistryTest$MockAnnotation2"));
ConfigurationManager.getConfigInstance().setProperty(AdminPageRegistry.PROP_ID_ADMIN_PAGE_ANNOTATION, AdminPageRegistry.DEFAULT_ADMIN_PAGE_ANNOTATION);
}
}