/*
* #%L
* Gravia :: Provision
* %%
* Copyright (C) 2013 - 2014 JBoss by Red Hat
* %%
* Licensed 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.
* #L%
*/
package org.jboss.test.gravia.provision;
import java.io.File;
import java.util.Collections;
import java.util.Iterator;
import java.util.concurrent.atomic.AtomicLong;
import org.jboss.gravia.Constants;
import org.jboss.gravia.provision.DefaultProvisioner;
import org.jboss.gravia.provision.ProvisionResult;
import org.jboss.gravia.provision.Provisioner;
import org.jboss.gravia.provision.ResourceInstaller;
import org.jboss.gravia.repository.DefaultRepository;
import org.jboss.gravia.repository.DefaultRepositoryStorage;
import org.jboss.gravia.repository.MavenIdentityRequirementBuilder;
import org.jboss.gravia.repository.Repository;
import org.jboss.gravia.repository.RepositoryStorage;
import org.jboss.gravia.resolver.DefaultEnvironment;
import org.jboss.gravia.resolver.DefaultResolver;
import org.jboss.gravia.resolver.Environment;
import org.jboss.gravia.resolver.Resolver;
import org.jboss.gravia.resource.DefaultRequirementBuilder;
import org.jboss.gravia.resource.DefaultResourceBuilder;
import org.jboss.gravia.resource.IdentityNamespace;
import org.jboss.gravia.resource.MavenCoordinates;
import org.jboss.gravia.resource.Requirement;
import org.jboss.gravia.resource.RequirementBuilder;
import org.jboss.gravia.resource.Resource;
import org.jboss.gravia.resource.ResourceBuilder;
import org.jboss.gravia.runtime.spi.PropertiesProvider;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
/**
* Test the {@link Provisioner}.
*
* @author thomas.diesler@jboss.com
* @since 06-May-2013
*/
public class ProvisionerTestCase {
AtomicLong installIndex = new AtomicLong();
Repository repository;
Provisioner provisioner;
Environment environment;
@Before
public void setUp() throws Exception {
File storageDir = new File("./target/repository/" + System.currentTimeMillis()).getCanonicalFile();
environment = new DefaultEnvironment("TestEnv");
Resolver resolver = new DefaultResolver();
PropertiesProvider propertyProvider = Mockito.mock(PropertiesProvider.class);
Mockito.when(propertyProvider.getProperty(Constants.PROPERTY_REPOSITORY_STORAGE_DIR)).thenReturn(storageDir.getPath());
Mockito.when(propertyProvider.getProperty(Constants.PROPERTY_REPOSITORY_STORAGE_FILE, DefaultRepositoryStorage.REPOSITORY_XML_NAME)).thenReturn(DefaultRepositoryStorage.REPOSITORY_XML_NAME);
repository = new DefaultRepository(propertyProvider);
ResourceInstaller installer = Mockito.mock(ResourceInstaller.class);
provisioner = new DefaultProvisioner(environment, resolver, repository, installer);
}
@Test
public void testEmptyEnvironment() {
Iterator<Resource> itres = environment.getResources();
Assert.assertFalse("Empty environment", itres.hasNext());
}
@Test
public void testEmptyRepository() {
RepositoryStorage storage = repository.adapt(RepositoryStorage.class);
Resource resource = storage.getRepositoryReader().nextResource();
Assert.assertNull("Empty repository", resource);
}
@Test
public void testCapabilityInEnvironment() {
ResourceBuilder cbuilder = new DefaultResourceBuilder();
cbuilder.addCapability(IdentityNamespace.IDENTITY_NAMESPACE, "res1");
Resource res = cbuilder.getResource();
environment.addResource(res);
RequirementBuilder rbuilder = new DefaultRequirementBuilder(IdentityNamespace.IDENTITY_NAMESPACE, "res1");
Requirement req = rbuilder.getRequirement();
ProvisionResult result = provisioner.findResources(Collections.singleton(req));
Assert.assertEquals(res, result.getMapping().get(req));
Assert.assertTrue("Empty resources", result.getResources().isEmpty());
Assert.assertTrue("Nothing unsatisfied", result.getUnsatisfiedRequirements().isEmpty());
}
@Test
public void testCapabilityInRepository() {
ResourceBuilder cbuilder = new DefaultResourceBuilder();
cbuilder.addCapability(IdentityNamespace.IDENTITY_NAMESPACE, "res1");
Resource res = cbuilder.getResource();
RepositoryStorage storage = repository.adapt(RepositoryStorage.class);
storage.addResource(res);
RequirementBuilder rbuilder = new DefaultRequirementBuilder(IdentityNamespace.IDENTITY_NAMESPACE, "res1");
Requirement req = rbuilder.getRequirement();
ProvisionResult result = provisioner.findResources(Collections.singleton(req));
Assert.assertEquals(res, result.getMapping().get(req));
Assert.assertEquals("One resource", 1, result.getResources().size());
Assert.assertEquals(res, result.getResources().iterator().next());
Assert.assertTrue("Nothing unsatisfied", result.getUnsatisfiedRequirements().isEmpty());
}
@Test
public void testCascadingRequirement() {
ResourceBuilder cbuilder = new DefaultResourceBuilder();
cbuilder.addCapability(IdentityNamespace.IDENTITY_NAMESPACE, "res1");
cbuilder.addRequirement(IdentityNamespace.IDENTITY_NAMESPACE, "res2");
Resource res1 = cbuilder.getResource();
cbuilder = new DefaultResourceBuilder();
cbuilder.addCapability(IdentityNamespace.IDENTITY_NAMESPACE, "res2");
Resource res2 = cbuilder.getResource();
RepositoryStorage storage = repository.adapt(RepositoryStorage.class);
storage.addResource(res1);
storage.addResource(res2);
RequirementBuilder rbuilder = new DefaultRequirementBuilder(IdentityNamespace.IDENTITY_NAMESPACE, "res1");
Requirement req = rbuilder.getRequirement();
ProvisionResult result = provisioner.findResources(Collections.singleton(req));
Assert.assertEquals("Two resources", 2, result.getResources().size());
Assert.assertTrue("Nothing unsatisfied", result.getUnsatisfiedRequirements().isEmpty());
Assert.assertEquals(res1, result.getMapping().get(req));
}
@Test
public void testPreferHigherVersion() {
ResourceBuilder cbuilder = new DefaultResourceBuilder();
cbuilder.addCapability(IdentityNamespace.IDENTITY_NAMESPACE, "res1").getAttributes().put("version", "1.0.0");
Resource res1 = cbuilder.getResource();
cbuilder = new DefaultResourceBuilder();
cbuilder.addCapability(IdentityNamespace.IDENTITY_NAMESPACE, "res1").getAttributes().put("version", "2.0.0");
Resource res2 = cbuilder.getResource();
RepositoryStorage storage = repository.adapt(RepositoryStorage.class);
storage.addResource(res1);
storage.addResource(res2);
RequirementBuilder rbuilder = new DefaultRequirementBuilder(IdentityNamespace.IDENTITY_NAMESPACE, "res1");
Requirement req = rbuilder.getRequirement();
ProvisionResult result = provisioner.findResources(Collections.singleton(req));
Assert.assertEquals(res2, result.getMapping().get(req));
Assert.assertEquals("One resources", 1, result.getResources().size());
Assert.assertEquals(res2, result.getResources().iterator().next());
Assert.assertTrue("Nothing unsatisfied", result.getUnsatisfiedRequirements().isEmpty());
}
@Test
public void testMavenCoordinates() throws Exception {
MavenCoordinates mavenid = MavenCoordinates.parse("org.osgi:org.osgi.core:5.0.0");
Requirement req = new MavenIdentityRequirementBuilder(mavenid).getRequirement();
ProvisionResult result = provisioner.findResources(Collections.singleton(req));
Assert.assertEquals("One resource", 1, result.getResources().size());
Assert.assertTrue("Nothing unsatisfied", result.getUnsatisfiedRequirements().isEmpty());
}
}