/* * 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.core.impl; import static org.junit.Assert.fail; import java.io.IOException; import java.util.Collection; import java.util.Hashtable; import java.util.Set; import java.util.TreeSet; import org.apache.sling.installer.api.InstallableResource; import org.apache.sling.installer.api.tasks.InstallTask; import org.apache.sling.installer.api.tasks.TransformationResult; import org.apache.sling.installer.core.impl.tasks.BundleInstallTask; import org.apache.sling.installer.core.impl.tasks.BundleRemoveTask; import org.apache.sling.installer.core.impl.tasks.BundleStartTask; import org.apache.sling.installer.core.impl.tasks.BundleUpdateTask; import org.apache.sling.installer.core.impl.tasks.MockInstallationListener; import org.apache.sling.installer.core.impl.tasks.RefreshBundlesTask; /** Test the ordering and duplicates elimination of * OsgiControllerTasks */ public class TaskOrderingTest { private Set<InstallTask> taskSet; @org.junit.Before public void setUp() { // The data type must be consistent with the "tasks" member // of the {@link OsgiControllerImpl} class. taskSet = new TreeSet<InstallTask>(); } private static EntityResourceList getRegisteredResource(String url) throws IOException { new FileDataStore(new MockBundleContext()); final InternalResource internal = InternalResource.create("test", new InstallableResource(url, null, new Hashtable<String, Object>(), null, null, null)); RegisteredResourceImpl rr = RegisteredResourceImpl.create(internal); TransformationResult[] tr = new DefaultTransformer().transform(rr); if ( tr == null ) { final TransformationResult result = new TransformationResult(); result.setId(url); result.setResourceType(InstallableResource.TYPE_CONFIG); tr = new TransformationResult[] { result }; } rr = (RegisteredResourceImpl)rr.clone(tr[0]); final EntityResourceList erl = new EntityResourceList("test", new MockInstallationListener()); erl.addOrUpdate(rr); return erl; } private void assertOrder(int testId, Collection<InstallTask> actual, InstallTask [] expected) { int index = 0; for(InstallTask t : actual) { if(!t.equals(expected[index])) { fail("Test " + testId + ": at index " + index + ", expected " + expected[index] + " but got " + t); } index++; } } @org.junit.Test public void testBasicOrdering() throws Exception { int testIndex = 1; final InstallTask [] tasksInOrder = { new BundleRemoveTask(getRegisteredResource("test:url"), null), new BundleInstallTask(getRegisteredResource("test:url"), null), new BundleUpdateTask(getRegisteredResource("test:url"), null), new RefreshBundlesTask(null), new BundleStartTask(null, 0, null) }; taskSet.clear(); taskSet.add(tasksInOrder[4]); taskSet.add(tasksInOrder[3]); taskSet.add(tasksInOrder[2]); taskSet.add(tasksInOrder[1]); taskSet.add(tasksInOrder[0]); assertOrder(testIndex++, taskSet, tasksInOrder); taskSet.clear(); taskSet.add(tasksInOrder[0]); taskSet.add(tasksInOrder[1]); taskSet.add(tasksInOrder[2]); taskSet.add(tasksInOrder[3]); taskSet.add(tasksInOrder[4]); assertOrder(testIndex++, taskSet, tasksInOrder); taskSet.clear(); taskSet.add(tasksInOrder[3]); taskSet.add(tasksInOrder[2]); taskSet.add(tasksInOrder[0]); taskSet.add(tasksInOrder[4]); taskSet.add(tasksInOrder[1]); assertOrder(testIndex++, taskSet, tasksInOrder); taskSet.clear(); taskSet.add(tasksInOrder[4]); taskSet.add(tasksInOrder[0]); taskSet.add(tasksInOrder[2]); taskSet.add(tasksInOrder[3]); taskSet.add(tasksInOrder[1]); assertOrder(testIndex++, taskSet, tasksInOrder); } @org.junit.Test public void testMultipleConfigAndBundles() throws Exception { int testIndex = 1; final InstallTask [] tasksInOrder = { new BundleInstallTask(getRegisteredResource("test:someURIa.nothing"), null), new BundleInstallTask(getRegisteredResource("test:someURIb.nothing"), null), new RefreshBundlesTask(null), new BundleStartTask(null, 0, null) }; taskSet.clear(); for(int i = tasksInOrder.length -1 ; i >= 0; i--) { taskSet.add(tasksInOrder[i]); } assertOrder(testIndex++, taskSet, tasksInOrder); taskSet.clear(); for(int i = 0 ; i < tasksInOrder.length; i++) { taskSet.add(tasksInOrder[i]); } assertOrder(testIndex++, taskSet, tasksInOrder); } @org.junit.Test public void testMultipleRefreshAndStart() throws Exception { int testIndex = 1; final InstallTask [] tasksInOrder = { new BundleRemoveTask(getRegisteredResource("test:url"), null), new RefreshBundlesTask(null), new BundleStartTask(null, 0, null), new BundleStartTask(null, 1, null) }; taskSet.clear(); taskSet.add(tasksInOrder[3]); taskSet.add(tasksInOrder[3]); taskSet.add(new RefreshBundlesTask(null)); taskSet.add(tasksInOrder[2]); taskSet.add(tasksInOrder[2]); taskSet.add(tasksInOrder[1]); taskSet.add(new RefreshBundlesTask(null)); taskSet.add(new RefreshBundlesTask(null)); taskSet.add(tasksInOrder[0]); taskSet.add(tasksInOrder[3]); taskSet.add(new RefreshBundlesTask(null)); taskSet.add(tasksInOrder[3]); taskSet.add(tasksInOrder[2]); taskSet.add(new RefreshBundlesTask(null)); taskSet.add(tasksInOrder[2]); taskSet.add(tasksInOrder[1]); taskSet.add(new RefreshBundlesTask(null)); taskSet.add(tasksInOrder[1]); taskSet.add(new RefreshBundlesTask(null)); assertOrder(testIndex++, taskSet, tasksInOrder); } @org.junit.Test public void testBundleStartOrder() { int testIndex = 1; final InstallTask [] tasksInOrder = { new BundleStartTask(null, 0, null), new BundleStartTask(null, 1, null), new BundleStartTask(null, 5, null), new BundleStartTask(null, 11, null), new BundleStartTask(null, 51, null) }; taskSet.clear(); for(int i = tasksInOrder.length -1 ; i >= 0; i--) { taskSet.add(tasksInOrder[i]); } assertOrder(testIndex++, taskSet, tasksInOrder); taskSet.clear(); for(int i = 0 ; i < tasksInOrder.length; i++) { taskSet.add(tasksInOrder[i]); } assertOrder(testIndex++, taskSet, tasksInOrder); } }