blob: fc1c57e306064931cbeec2636803858bc3949002 [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.scriptingbundle.plugin.processor;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import org.apache.sling.api.resource.type.ResourceType;
import org.apache.sling.scriptingbundle.plugin.capability.ProvidedResourceTypeCapability;
import org.apache.sling.scriptingbundle.plugin.capability.RequiredResourceTypeCapability;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.VersionRange;
public class FileProcessorTest {
private FileProcessor processor;
Set<ProvidedResourceTypeCapability> providedCapabilities;
Set<RequiredResourceTypeCapability> requiredCapabilities;
private static final ResourceType MY_RESOURCE_TYPE = ResourceType.parseResourceType("apps/my/resource");
@Before
public void setUp() {
processor = new FileProcessor(new Slf4jLogger(), Constants.DEFAULT_SEARCH_PATHS, Constants.DEFAULT_EXTENSION_TO_SCRIPT_ENGINE_MAPPING);
providedCapabilities = new HashSet<>();
requiredCapabilities = new HashSet<>();
}
@Test
public void testExtendsValid() {
Path extendsFile = Paths.get("src", "test", "resources", "extends", "valid");
processor.processExtendsFile(MY_RESOURCE_TYPE, extendsFile, providedCapabilities, requiredCapabilities);
Assert.assertEquals(1, requiredCapabilities.size());
RequiredResourceTypeCapability expectedRequiredCapability = RequiredResourceTypeCapability.builder()
.withResourceType("org/apache/sling/bar")
.withVersionRange(new VersionRange("[1.0.0,2.0.0)"))
.withIsOptional().build();
Assert.assertEquals(expectedRequiredCapability, requiredCapabilities.iterator().next());
Assert.assertEquals(1, providedCapabilities.size());
ProvidedResourceTypeCapability expectedProvidedCapability = ProvidedResourceTypeCapability.builder()
.withResourceTypes(new HashSet<>(Arrays.asList("my/resource", "/apps/my/resource")))
.withVersion(MY_RESOURCE_TYPE.getVersion())
.withExtendsResourceType("org/apache/sling/bar")
.build();
Assert.assertEquals(expectedProvidedCapability, providedCapabilities.iterator().next());
}
@Test
public void testExtendsMultipleClauses() {
Path extendsFile = Paths.get("src", "test", "resources", "extends", "multiple-clauses");
Assert.assertThrows(IllegalArgumentException.class, () -> { processor.processExtendsFile(MY_RESOURCE_TYPE, extendsFile, providedCapabilities, requiredCapabilities); });
}
@Test
public void testExtendsInvalidAttributes() {
Path extendsFile = Paths.get("src", "test", "resources", "extends", "invalid-attributes");
Assert.assertThrows(IllegalArgumentException.class, () -> { processor.processExtendsFile(MY_RESOURCE_TYPE, extendsFile, providedCapabilities, requiredCapabilities); });
}
@Test
public void testExtendsMultipleLines() {
Path extendsFile = Paths.get("src", "test", "resources", "extends", "multiple-lines");
Assert.assertThrows(IllegalArgumentException.class, () -> { processor.processExtendsFile(MY_RESOURCE_TYPE, extendsFile, providedCapabilities, requiredCapabilities); });
}
@Test
public void testRequiresValid() {
Path requiresFile = Paths.get("src", "test", "resources", "requires", "valid");
processor.processRequiresFile(requiresFile, requiredCapabilities);
Assert.assertEquals(1, requiredCapabilities.size());
RequiredResourceTypeCapability expectedCapability = RequiredResourceTypeCapability.builder()
.withResourceType("org/apache/sling/bar")
.withVersionRange(new VersionRange("[1.0.0,2.0.0)"))
.withIsOptional().build();
Assert.assertEquals(expectedCapability, requiredCapabilities.iterator().next());
}
@Test
public void testRequiresMultipleClauses() {
Path requiresFile = Paths.get("src", "test", "resources", "requires", "multiple-clauses");
Assert.assertThrows(IllegalArgumentException.class, () -> { processor.processRequiresFile(requiresFile, requiredCapabilities); });
}
@Test
public void testRequiresInvalidAttributes() {
Path requiresFile = Paths.get("src", "test", "resources", "extends", "invalid-attributes");
Assert.assertThrows(IllegalArgumentException.class, () -> { processor.processRequiresFile(requiresFile, requiredCapabilities); });
}
@Test
public void testScriptValid() {
Path resourceTypeFolder = Paths.get("apps", "my", "resource", "2.0");
Path script = Paths.get("apps", "my", "resource", "2.0", "selectorb", "selectora.POST.html");
processor.processScriptFile(resourceTypeFolder, script, MY_RESOURCE_TYPE, providedCapabilities, false);
Assert.assertEquals(1, providedCapabilities.size());
ProvidedResourceTypeCapability expectedProvidedCapability = ProvidedResourceTypeCapability.builder()
.withResourceTypes(new HashSet<>(Arrays.asList("my/resource", "/apps/my/resource")))
.withVersion(MY_RESOURCE_TYPE.getVersion())
.withRequestMethod("POST")
.withSelectors(Arrays.asList("selectorb", "selectora"))
.withScriptEngine("htl")
.withScriptExtension("html")
.build();
Assert.assertEquals(expectedProvidedCapability, providedCapabilities.iterator().next());
}
@Test
public void testScriptUnknownExtension() {
Path resourceTypeFolder = Paths.get("scripts", "apps", "my", "resource", "2.0");
Path script = Paths.get("scripts", "apps", "my", "resource", "2.0", "selectorb", "selectora.POST.abc");
processor.processScriptFile(resourceTypeFolder, script, MY_RESOURCE_TYPE, providedCapabilities, false);
// this must not throw an exception but a WARN should be emitted in the log to make users aware of potential misconfigurations
Assert.assertEquals(0, providedCapabilities.size());
}
}