/****************************************************************************/
/* File: UniverseTest.java */
/* Author: F. Georges - H2O Consulting */
/* Date: 2011-01-29 */
/* Tags: */
/* Copyright (c) 2011-2013 Florent Georges (see end of file.) */
/* ------------------------------------------------------------------------ */
package org.expath.pkg.repo;
import java.io.IOException;
import java.net.URI;
import java.io.File;
import java.net.URISyntaxException;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Test the {@code Universe}, especially its resolve mechanism.
*
* @author Florent Georges
*/
public class UniverseTest
{
private File pkgComponentFile(String repo, String lib, String version, String component)
{
System.err.println("test/repos/" + repo + "/" + lib + "-" + version + "/" + lib + "/" + component);
return new File("test/repos/" + repo + "/" + lib + "-" + version + "/" + lib + "/" + component);
}
private File sourceFile(Source src)
throws URISyntaxException
{
assertNotNull(src);
String sysid = src.getSystemId();
URI uri = new URI(sysid);
return new File(uri);
}
private void assertComponent(String repo, String lib, String version, String component, Source src)
throws URISyntaxException, IOException
{
File expected = pkgComponentFile(repo, lib, version, component);
File actual = sourceFile(src);
String exp_path = expected.getCanonicalPath();
String act_path = actual.getCanonicalPath();
assertEquals(exp_path, act_path);
}
private Repository getRepository(String repo)
throws PackageException
{
File repo_dir = new File("test/repos/" + repo);
Storage storage = new FileSystemStorage(repo_dir);
return new Repository(storage);
}
private Package latestPackage(Repository repo, String name)
{
Packages pp = repo.getPackages(name);
return pp.latest();
}
private static class TestSource
extends StreamSource
{
public TestSource(String str) {
myStr = str;
}
@Override
public String toString() {
return myStr;
}
private final String myStr;
}
private static class TestResolver
extends Storage.PackageResolver
{
public TestResolver(String pkg) {
myPkg = pkg;
}
@Override
public StreamSource resolveComponent(String path) throws PackageException {
return new TestSource(myPkg + " | component | " + path);
}
@Override
public String getResourceName() {
throw new UnsupportedOperationException("Not supported in tests.");
}
@Override
public StreamSource resolveResource(String path) throws PackageException {
throw new UnsupportedOperationException("Not supported in tests.");
}
@Override
public URI getContentDirBaseURI() throws PackageException {
throw new UnsupportedOperationException("Not supported in tests.");
}
private final String myPkg;
}
private static final String APP_PKG_NAME = "http://example.com/my-app";
private static final String LIB_A_PKG_NAME = "http://example.org/lib-a";
private static final String LIB_B_PKG_NAME = "http://example.org/lib-b";
private static final String LIB_X_PKG_NAME = "http://example.org/lib-x";
private static final String LIB_Y_PKG_NAME = "http://example.org/lib-y";
/**
* Use "by-hand-constructed" repository and packages.
*
* Other tests parse real repositories directly from the file system.
*/
@Test
public void firstSimpleTest()
throws PackageException
{
// the fixture (the repository and packages)
Repository repo = new Repository();
Package p1 = new Package(repo, new TestResolver("pkg 1"), "urn:test:1", "p1", "1.0", "title 1", "http://home/1");
p1.addPublicUri(URISpace.XSLT, "urn:test:1:some.xsl", "dir/some.xsl");
p1.addPublicUri(URISpace.XSLT, "urn:test:1:other.xsl", "dir/other.xsl");
repo.addPackage(p1);
Package p2 = new Package(repo, new TestResolver("pkg 2"), "urn:test:2", "p2", "1.0", "title 2", "http://home/2");
p2.addPublicUri(URISpace.XSLT, "urn:test:2:some.xsl", "dir/some.xsl");
p2.addPublicUri(URISpace.XSLT, "urn:test:2:other.xsl", "dir/other.xsl");
repo.addPackage(p2);
// the SUT
CompositeUniverse sut = new CompositeUniverse(true);
sut.addUniverse(p1);
sut.addUniverse(p2);
// do it
Source src = sut.resolve("urn:test:1:some.xsl", URISpace.XSLT);
// assert
assertEquals("the resolved component", "pkg 1 | component | dir/some.xsl", src.toString());
}
/**
* Use one package
*/
@Test
public void onePackageDefaultDependencies()
throws PackageException, URISyntaxException, IOException
{
// the fixture
Repository repo = getRepository("deps-1");
// the sut
Package sut = latestPackage(repo, APP_PKG_NAME);
// do it
Source src = sut.resolve("http://example.org/lib-x/query", URISpace.XQUERY);
// assertions
assertComponent("deps-1", "lib-x", "12.9.0", "query.xql", src);
}
@Test
public void onePackageDefaultDependenciesPackages()
throws PackageException, URISyntaxException, IOException
{
// the fixture
Repository repo = getRepository("deps-1");
// the sut
Packages sut = repo.getPackages(LIB_Y_PKG_NAME);
// do it
Source src = sut.resolve("http://example.org/lib-y/query", URISpace.XQUERY);
// assertions
assertComponent("deps-1", "lib-y", "1.19.18", "query.xql", src);
}
@Test
public void onePackageTransitiveDependencies()
throws PackageException, URISyntaxException, IOException
{
// the fixture
Repository repo = getRepository("deps-1");
// the sut
Package sut = latestPackage(repo, APP_PKG_NAME);
// do it
Source src = sut.resolve("http://example.org/lib-y/style.xsl", URISpace.XSLT, true);
// assertions
assertComponent("deps-1", "lib-y", "1.19.18", "style.xsl", src);
}
@Test
public void onePackageTransitiveDependenciesPackages()
throws PackageException, URISyntaxException, IOException
{
// the fixture
Repository repo = getRepository("deps-1");
// the sut
Packages sut = repo.getPackages(APP_PKG_NAME);
// do it
Source src = sut.resolve("http://example.org/lib-y/style.xsl", URISpace.XSLT, true);
// assertions
assertComponent("deps-1", "lib-y", "1.19.18", "style.xsl", src);
}
@Test
public void onePackageStrictDependencies()
throws PackageException, URISyntaxException, IOException
{
// the fixture
Repository repo = getRepository("deps-1");
// the sut
Package sut = latestPackage(repo, APP_PKG_NAME);
// do it
Source src = sut.resolve("http://example.org/lib-y/style.xsl", URISpace.XSLT, false);
// assertions
assertNull(src);
}
@Test
public void onePackageStrictDependenciesPackages()
throws PackageException, URISyntaxException, IOException
{
// the fixture
Repository repo = getRepository("deps-1");
// the sut
Packages sut = repo.getPackages(APP_PKG_NAME);
// do it
Source src = sut.resolve("http://example.org/lib-y/style.xsl", URISpace.XSLT, false);
// assertions
assertNull(src);
}
@Test
public void wholeRepoUniverse()
throws PackageException, URISyntaxException, IOException
{
// the sut
Repository sut = getRepository("deps-1");
// do it
Source src = sut.resolve("http://example.org/lib-b/query", URISpace.XQUERY);
// assertions
assertComponent("deps-1", "lib-b", "0.1.0", "query.xql", src);
}
}
/* ------------------------------------------------------------------------ */
/* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS COMMENT. */
/* */
/* The contents of this file are subject to the Mozilla Public License */
/* Version 1.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.mozilla.org/MPL/. */
/* */
/* Software distributed under the License is distributed on an "AS IS" */
/* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See */
/* the License for the specific language governing rights and limitations */
/* under the License. */
/* */
/* The Original Code is: all this file. */
/* */
/* The Initial Developer of the Original Code is Florent Georges. */
/* */
/* Contributor(s): none. */
/* ------------------------------------------------------------------------ */