blob: bc817a184ba3a93bab1bd78c8a4d6684ec93f6ba [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.sling.feature.cpconverter.handlers;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doCallRealMethod;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Dictionary;
import java.util.Hashtable;
import org.apache.jackrabbit.vault.fs.io.Archive;
import org.apache.jackrabbit.vault.fs.io.Archive.Entry;
import org.apache.sling.feature.ArtifactId;
import org.apache.sling.feature.Configuration;
import org.apache.sling.feature.Feature;
import org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
import org.apache.sling.feature.cpconverter.features.DefaultFeaturesManager;
import org.apache.sling.feature.cpconverter.features.FeaturesManager;
import org.apache.sling.feature.io.json.FeatureJSONReader;
import org.apache.sling.feature.io.json.FeatureJSONWriter;
import org.jetbrains.annotations.NotNull;
import org.junit.Test;
import org.mockito.Mockito;
public class ConfigEntryHandlerTest {
@Test
public void collectionValuesIncluded() throws Exception {
String resourceConfiguration = "/jcr_root/apps/asd/config/org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~ims.config";
Archive archive = mock(Archive.class);
Entry entry = mock(Entry.class);
when(entry.getName()).thenReturn(resourceConfiguration.substring(resourceConfiguration.lastIndexOf('/') + 1));
when(archive.openInputStream(entry)).thenReturn(getClass().getResourceAsStream(resourceConfiguration.substring(1)));
Feature expected = new Feature(new ArtifactId("org.apache.sling", "org.apache.sling.cp2fm", "0.0.1", null, null));
FeaturesManager featuresManager = spy(DefaultFeaturesManager.class);
when(featuresManager.getTargetFeature()).thenReturn(expected);
doCallRealMethod().when(featuresManager).addConfiguration(anyString(), anyString(), anyString(), any());
ContentPackage2FeatureModelConverter converter = mock(ContentPackage2FeatureModelConverter.class);
when(converter.getFeaturesManager()).thenReturn(featuresManager);
new ConfigurationEntryHandler().handle(resourceConfiguration, archive, entry, converter);
verifyConfiguration(expected);
StringWriter writer = new StringWriter();
FeatureJSONWriter.write(writer, expected);
Feature current = FeatureJSONReader.read(new StringReader(writer.toString()), "fake");
verifyConfiguration(current);
}
private void verifyConfiguration(Feature feature) {
Configuration configuration = feature.getConfigurations().getConfiguration("org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~ims");
assertNotNull(configuration);
Dictionary<String, Object> configurationProperties = configuration.getConfigurationProperties();
assertNotNull(configurationProperties);
assertFalse(configurationProperties.isEmpty());
assertEquals(1, configurationProperties.get("user.membershipNestingDepth"));
assertArrayEquals(new Object[] { "oauth/oauthid-stage=profile/id", "profile/app-stage=access_token" }, (Object[]) configurationProperties.get("user.propertyMapping"));
assertArrayEquals(new String[] { "Administrators" }, (String[]) configurationProperties.get("user.autoMembership"));
assertEquals("ims", configurationProperties.get("handler.name"));
assertEquals("ims", configurationProperties.get("user.pathPrefix"));
assertTrue((boolean) configurationProperties.get("user.disableMissing"));
}
@Test
public void testConfigPathWithFolders() throws Exception {
Archive archive = mock(Archive.class);
Entry entry = mock(Entry.class);
FeaturesManager manager = mock(FeaturesManager.class);
ContentPackage2FeatureModelConverter converter = mock(ContentPackage2FeatureModelConverter.class);
when(converter.getFeaturesManager()).thenReturn(manager);
when(entry.getName()).thenReturn("/jcr_root/apps/foo/bar/config/baz/blub.cfg");
when(archive.openInputStream(entry)).thenReturn(new ByteArrayInputStream("{}".getBytes()));
AbstractConfigurationEntryHandler handler = new AbstractConfigurationEntryHandler("cfg") {
@Override
protected @NotNull Dictionary<String, Object> parseConfiguration(@NotNull String name, @NotNull InputStream input) throws Exception {
return new Hashtable(){{put("foo", "bar");}};
}
};
handler.handle("/jcr_root/apps/foo/bar/config/baz/blub.cfg", archive, entry, converter);
Mockito.verify(manager).addConfiguration(null, "blub", "/jcr_root/apps/foo/bar/config/baz/blub.cfg", new Hashtable(){{put("foo","bar");}});
Mockito.verify(manager).addConfiguration(Mockito.any(), Mockito.anyString(), Mockito.anyString(), Mockito.any());
}
@Test
public void testConfigPathBelowInstallFolder() {
ConfigurationEntryHandler handler = new ConfigurationEntryHandler();
handler.setEnforceConfgurationBelowConfigFolder(true);
assertThrows(IllegalStateException.class, () -> { handler.handle("/jcr_root/apps/myapp/install/myconfig.config", null, null, null); });
}
}