This is an automated email from the ASF dual-hosted git repository.

radu pushed a commit to branch issue/SLING-12635
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-sightly-js-provider.git

commit 6f5796f70b589e54b38c86b4053eed259c5afbda
Author: Radu Cotescu <[email protected]>
AuthorDate: Fri Jan 24 11:25:21 2025 +0100

    SLING-12635 - JS Use Scripts should only be read on-demand
    
    * added a test to show that the stream is already read when the
    SlyBindingsValuesProvider initialises the ScriptNameAwareReader;
    the reader needs to be read only when the JsEnvironment needs to
    compile/evaluate a script
---
 .../js/impl/jsapi/SlyBindingsValuesProvider.java   |  5 +-
 .../impl/jsapi/SlyBindingsValuesProviderTest.java  | 93 ++++++++++++++++++++++
 2 files changed, 95 insertions(+), 3 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/scripting/sightly/js/impl/jsapi/SlyBindingsValuesProvider.java
 
b/src/main/java/org/apache/sling/scripting/sightly/js/impl/jsapi/SlyBindingsValuesProvider.java
index ba1314d..31351e9 100644
--- 
a/src/main/java/org/apache/sling/scripting/sightly/js/impl/jsapi/SlyBindingsValuesProvider.java
+++ 
b/src/main/java/org/apache/sling/scripting/sightly/js/impl/jsapi/SlyBindingsValuesProvider.java
@@ -90,13 +90,13 @@ public class SlyBindingsValuesProvider {
                         " dependency chain."
 
         )
-        String[] org_apache_sling_scripting_sightly_js_bindings() default 
"sightly:" + SlyBindingsValuesProvider.SLING_NS_PATH;
+        String[] org_apache_sling_scripting_sightly_js_bindings() default 
SlyBindingsValuesProvider.SLING_NS_PATH;
 
     }
 
     public static final String SCR_PROP_JS_BINDING_IMPLEMENTATIONS = 
"org.apache.sling.scripting.sightly.js.bindings";
 
-    public static final String SLING_NS_PATH = 
"/libs/sling/sightly/js/internal/sly.js";
+    public static final String SLING_NS_PATH = 
"sightly:/libs/sling/sightly/js/internal/sly.js";
     public static final String Q_PATH = 
"/libs/sling/sightly/js/3rd-party/q.js";
 
     private static final String REQ_NS = 
SlyBindingsValuesProvider.class.getCanonicalName();
@@ -285,7 +285,6 @@ public class SlyBindingsValuesProvider {
             LOGGER.error("Unable to compile the Q library at path " + Q_PATH + 
".", e);
         } finally {
             Context.exit();
-            IOUtils.closeQuietly(reader);
         }
         return null;
     }
diff --git 
a/src/test/java/org/apache/sling/scripting/sightly/js/impl/jsapi/SlyBindingsValuesProviderTest.java
 
b/src/test/java/org/apache/sling/scripting/sightly/js/impl/jsapi/SlyBindingsValuesProviderTest.java
new file mode 100644
index 0000000..209a9d3
--- /dev/null
+++ 
b/src/test/java/org/apache/sling/scripting/sightly/js/impl/jsapi/SlyBindingsValuesProviderTest.java
@@ -0,0 +1,93 @@
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ~ 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.scripting.sightly.js.impl.jsapi;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Objects;
+
+import javax.script.Bindings;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.scripting.SlingBindings;
+import org.apache.sling.scripting.core.ScriptNameAwareReader;
+import org.apache.sling.scripting.sightly.js.impl.JsEnvironment;
+import org.apache.sling.scripting.sightly.js.impl.async.AsyncContainer;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.mozilla.javascript.Function;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+class SlyBindingsValuesProviderTest {
+
+    @Mock
+    private ResourceResolver resolver;
+
+    @Mock
+    private Resource scriptResource;
+
+    @Mock
+    private SlyBindingsValuesProvider.Configuration configuration;
+
+    @Mock
+    private JsEnvironment jsEnvironment;
+
+    @Mock
+    private AsyncContainer asyncContainer;
+
+    @Mock
+    private Function function;
+
+    private InputStream inputStream;
+
+    @BeforeEach
+    void setUp() {
+        String scriptPath = 
SlyBindingsValuesProvider.SLING_NS_PATH.split(":")[1];
+        inputStream = 
spy(Objects.requireNonNull(getClass().getResourceAsStream("/SLING-INF" + 
scriptPath)));
+        when(scriptResource.getPath()).thenReturn(scriptPath);
+        when(resolver.getResource(scriptPath)).thenReturn(scriptResource);
+        
when(scriptResource.adaptTo(InputStream.class)).thenReturn(inputStream);
+        when(asyncContainer.getResult()).thenReturn(function);
+        when(jsEnvironment.runScript(any(ScriptNameAwareReader.class), 
any(Bindings.class), any(Bindings.class))).thenReturn(asyncContainer);
+    }
+
+    @Test
+    void testResourceLoading() throws IOException {
+        assertNotNull(inputStream);
+        SlyBindingsValuesProvider provider = new SlyBindingsValuesProvider();
+        provider.activate(configuration);
+        provider.initialise(resolver, jsEnvironment, new SlingBindings());
+        verify(inputStream, never()).read();
+        verify(inputStream, never()).read(any(byte[].class));
+        verify(inputStream, never()).read(any(byte[].class), anyInt(), 
anyInt());
+    }
+
+}

Reply via email to