blob: 838cd8645a37abe4fe26e5e787096ae14921de15 [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.installer.provider.jcr.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import javax.jcr.Node;
import org.junit.Test;
/** Verify that JcrInstaller scans folders only when needed */
public class ScanningLoopTest extends JcrInstallTestBase {
private void assertCounter(int index, long value) {
String label;
switch (index ) {
case JcrInstaller.RUN_LOOP_COUNTER:
label = "RUN_LOOP_COUNTER";
break;
case JcrInstaller.SCAN_FOLDERS_COUNTER:
label = "SCAN_FOLDERS_COUNTER";
break;
case JcrInstaller.UPDATE_FOLDERS_LIST_COUNTER:
label = "UPDATE_FOLDERS_LIST_COUNTER";
break;
default:
label = "Unknown (" + index +")";
break;
}
assertEquals("Counter " + label, value, installer.getCounterValue(index));
}
private void assertIdle() throws Exception {
final long sf = installer.getCounterValue(JcrInstaller.SCAN_FOLDERS_COUNTER);
final long uc = installer.getCounterValue(JcrInstaller.UPDATE_FOLDERS_LIST_COUNTER);
Thread.sleep(JcrInstaller.RUN_LOOP_DELAY_MSEC * 2);
assertCounter(JcrInstaller.SCAN_FOLDERS_COUNTER, sf);
assertCounter(JcrInstaller.UPDATE_FOLDERS_LIST_COUNTER, uc);
}
private void assertEvents(String info, long oldCount, int counterIndex) {
final long newCount = installer.getCounterValue(counterIndex);
assertTrue(info + " (old=" + oldCount + ", new=" + newCount + ")", newCount > oldCount);
}
@Test
public void testIdleState() throws Exception {
Thread.sleep(JcrInstaller.RUN_LOOP_DELAY_MSEC * 4);
assertIdle();
}
@Test
public void testDefaultScanPauseFalse() throws Exception{
assertFalse(installer.scanningIsPaused(installer.getConfiguration(), installer.getSession()));
}
@Test
public void testPauseScan() throws Exception{
assertFalse(installer.scanningIsPaused(installer.getConfiguration(), installer.getSession()));
Node n = contentHelper.createFolder(JcrInstaller.PAUSE_SCAN_NODE_PATH);
Node testNode = n.addNode("foo.example.pause");
session.save();
eventHelper.waitForEvents(TIMEOUT);
assertTrue(installer.scanningIsPaused(installer.getConfiguration(), installer.getSession()));
final long sf = installer.getCounterValue(JcrInstaller.SCAN_FOLDERS_COUNTER);
final long uc = installer.getCounterValue(JcrInstaller.UPDATE_FOLDERS_LIST_COUNTER);
Thread.sleep(JcrInstaller.RUN_LOOP_DELAY_MSEC * 2);
//Counters should not have changed as no scanning being performed
assertEquals(sf, installer.getCounterValue(JcrInstaller.SCAN_FOLDERS_COUNTER));
//Now lets resume again
testNode.remove();
session.save();
Thread.sleep(JcrInstaller.RUN_LOOP_DELAY_MSEC * 2);
//Now counters should have changed
assertIdle();
}
@Test
public void testAddBundle() throws Exception {
contentHelper.createOrUpdateFile(contentHelper.FAKE_RESOURCES[0]);
eventHelper.waitForEvents(TIMEOUT);
Thread.sleep(JcrInstaller.RUN_LOOP_DELAY_MSEC * 2);
assertIdle();
}
@Test
public void testAddContentOutside() throws Exception {
final long sf = installer.getCounterValue(JcrInstaller.SCAN_FOLDERS_COUNTER);
final long uc = installer.getCounterValue(JcrInstaller.UPDATE_FOLDERS_LIST_COUNTER);
contentHelper.createOrUpdateFile("/" + System.currentTimeMillis());
eventHelper.waitForEvents(TIMEOUT);
Thread.sleep(JcrInstaller.RUN_LOOP_DELAY_MSEC * 2);
// Adding a file outside /libs or /apps must not "wake up" the scan loop
assertCounter(JcrInstaller.SCAN_FOLDERS_COUNTER, sf);
assertCounter(JcrInstaller.UPDATE_FOLDERS_LIST_COUNTER, uc);
}
@Test
public void testDeleteFile() throws Exception {
contentHelper.setupContent();
eventHelper.waitForEvents(TIMEOUT);
Thread.sleep(JcrInstaller.RUN_LOOP_DELAY_MSEC * 2);
assertIdle();
final long sf = installer.getCounterValue(JcrInstaller.SCAN_FOLDERS_COUNTER);
contentHelper.delete(contentHelper.FAKE_RESOURCES[0]);
eventHelper.waitForEvents(TIMEOUT);
Thread.sleep(JcrInstaller.RUN_LOOP_DELAY_MSEC * 2);
assertEvents("Expected at least one folder scan event",
sf, JcrInstaller.SCAN_FOLDERS_COUNTER);
assertIdle();
}
@Test
public void testDeleteLibsFolder() throws Exception {
contentHelper.setupContent();
eventHelper.waitForEvents(TIMEOUT);
Thread.sleep(JcrInstaller.RUN_LOOP_DELAY_MSEC * 2);
assertIdle();
final long uc = installer.getCounterValue(JcrInstaller.UPDATE_FOLDERS_LIST_COUNTER);
contentHelper.delete("/libs");
eventHelper.waitForEvents(TIMEOUT);
Thread.sleep(JcrInstaller.RUN_LOOP_DELAY_MSEC * 2);
assertEvents("Expected at least one folders list update event",
uc, JcrInstaller.UPDATE_FOLDERS_LIST_COUNTER);
assertIdle();
}
}