Package test.baseline

Source Code of test.baseline.BaselineTest

package test.baseline;

import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;

import java.io.*;
import java.util.*;
import java.util.regex.*;

import junit.framework.*;
import aQute.bnd.build.*;
import aQute.bnd.differ.*;
import aQute.bnd.differ.Baseline.BundleInfo;
import aQute.bnd.differ.Baseline.Info;
import aQute.bnd.header.*;
import aQute.bnd.osgi.*;
import aQute.bnd.service.*;
import aQute.bnd.service.diff.*;
import aQute.bnd.version.*;
import aQute.lib.collections.*;
import aQute.lib.io.*;
import aQute.libg.reporter.*;

@SuppressWarnings("resource")
public class BaselineTest extends TestCase {
  File    tmp  = new File("tmp").getAbsoluteFile();
  Workspace  workspace;

  public Workspace getWorkspace() throws Exception {
    if (workspace != null)
      return workspace;

    IO.delete(tmp);
    IO.copy(IO.getFile("testresources/ws"), tmp);
    return workspace = new Workspace(tmp);
  }

  public void tearDown() throws Exception {
    IO.delete(tmp);
    workspace = null;
  }

  public void testJava8DefaultMethods() throws Exception {
    Builder older = new Builder();
    older.addClasspath( IO.getFile("java8/older/bin"));
    older.setExportPackage("*");
    Jar o = older.build();
    assertTrue(older.check());
   
    Builder newer = new Builder();
    newer.addClasspath( IO.getFile("java8/newer/bin"));
    newer.setExportPackage("*");
    Jar n = newer.build();
    assertTrue(newer.check());
   
    DiffPluginImpl differ = new DiffPluginImpl();
    Baseline baseline = new Baseline(older, differ);

    Set<Info> infoSet = baseline.baseline(n,o, null);
    assertEquals(1, infoSet.size());
    for ( Info info : infoSet ) {
      assertTrue(info.mismatch);
      assertEquals( new Version(0,1,0), info.suggestedVersion);
      assertEquals(info.packageName, "api_default_methods");
    }
   
  }
 
 
 
 
  /**
   * Check if we can ignore resources in the baseline. First build two jars
   * that are identical except for the b/b resource. Then do baseline on them.
   */
  public void testIgnoreResourceDiff() throws Exception {
    Processor processor = new Processor();
    DiffPluginImpl differ = new DiffPluginImpl();
    differ.setIgnore("b/b");
    Baseline baseline = new Baseline(processor, differ);

    Builder a = new Builder();
    a.setProperty("-includeresource", "a/a;literal='aa',b/b;literal='bb'");
    a.setProperty("-resourceonly", "true");
    Jar aj = a.build();

    Builder b = new Builder();
    b.setProperty("-includeresource", "a/a;literal='aa',b/b;literal='bbb'");
    b.setProperty("-resourceonly", "true");
    Jar bj = b.build();

    Set<Info> infoSet = baseline.baseline(aj, bj, null);

    BundleInfo binfo = baseline.getBundleInfo();
    assertFalse(binfo.mismatch);

    a.close();
    b.close();
  }

  public static void testBaslineJar() throws Exception {
    // Workspace ws = new Workspace(IO.getFile("testresources/ws"));
    //
    // Project p3 = ws.getProject("p3");
    //
    // ProjectBuilder builder = (ProjectBuilder)
    // p3.getBuilder(null).getSubBuilder();
    // builder.setBundleSymbolicName("p3");
    //
    // // Nothing specified
    // Jar jar = builder.getBaselineJar(false);
    // assertNull(jar);
    //
    // jar = builder.getBaselineJar(true);
    // assertEquals(".", jar.getName());
    //
    // // Fallback to release repo
    // builder.set("-releaserepo", "Repo");
    // jar = builder.getBaselineJar(false);
    // assertNull(jar);
    //
    // jar = builder.getBaselineJar(true);
    // assertEquals("p3", jar.getBsn());
    // assertEquals("1.0.1", jar.getVersion());
    //
    // // -baselinerepo specified
    // builder.set("-baselinerepo", "Release");
    // jar = builder.getBaselineJar(false);
    // assertEquals("p3", jar.getBsn());
    // assertEquals("1.2.0", jar.getVersion());
    //
    // jar = builder.getBaselineJar(true);
    // assertEquals("p3", jar.getBsn());
    // assertEquals("1.2.0", jar.getVersion());
    //
    // // -baseline specified
    // builder.set("-baseline", "p3;version=1.1.0");
    // jar = builder.getBaselineJar(false);
    // assertEquals("p3", jar.getBsn());
    // assertEquals("1.1.0", jar.getVersion());
    //
    // jar = builder.getBaselineJar(true);
    // assertEquals("p3", jar.getBsn());
    // assertEquals("1.1.0", jar.getVersion());

  }

  /**
   * When a JAR is build the manifest is not set in the resources but in a
   * instance var.
   *
   * @throws Exception
   */
  public void testPrematureJar() throws Exception {
    Builder b1 = new Builder();
    b1.addClasspath(IO.getFile(new File(""), "jar/osgi.jar"));
    b1.setProperty(Constants.BUNDLE_VERSION, "1.0.0.${tstamp}");
    b1.setExportPackage("org.osgi.service.event");
    Jar j1 = b1.build();
    System.out.println(j1.getResources().keySet());
    assertTrue(b1.check());

    File tmp = new File("tmp.jar");
    try {
      j1.write(tmp);
      Jar j11 = new Jar(tmp);

      Thread.sleep(2000);

      Builder b2 = new Builder();
      b2.addClasspath(IO.getFile(new File(""), "jar/osgi.jar"));
      b2.setProperty(Constants.BUNDLE_VERSION, "1.0.0.${tstamp}");
      b2.setExportPackage("org.osgi.service.event");
      Jar j2 = b2.build();
      assertTrue(b2.check());
      System.out.println(j2.getResources().keySet());

      DiffPluginImpl differ = new DiffPluginImpl();

      ReporterAdapter ra = new ReporterAdapter();
      Baseline baseline = new Baseline(ra, differ);
      ra.setTrace(true);
      ra.setPedantic(true);
      Set<Info> infos = baseline.baseline(j2, j11, null);
      print(baseline.getDiff(), " ");

      assertEquals(Delta.UNCHANGED, baseline.getDiff().getDelta());
    }
    finally {
      tmp.delete();
    }
  }

  static Pattern  VERSION_HEADER_P  = Pattern.compile("Bundle-Header:(" + Verifier.VERSION_STRING + ")",
                        Pattern.CASE_INSENSITIVE);

  void print(Diff diff, String indent) {
    if (diff.getDelta() == Delta.UNCHANGED)
      return;

    System.out.println(indent + " " + diff);
    for (Diff sub : diff.getChildren()) {
      print(sub, indent + " ");
    }
  }

  /**
   * In repo:
   *
   * <pre>
   * p3-1.1.0.jar
   * p3-1.2.0.jar
   * </pre>
   *
   * @throws Exception
   */
  public void testRepository() throws Exception {
    Jar v1_2_0_a = mock(Jar.class);
    when(v1_2_0_a.getVersion()).thenReturn("1.2.0.b");
    when(v1_2_0_a.getBsn()).thenReturn("p3");

    RepositoryPlugin repo = mock(RepositoryPlugin.class);
    getWorkspace().addBasicPlugin(repo);
    @SuppressWarnings("unchecked")
    Map<String,String> map = any(Map.class);
    when(repo.get(anyString(), any(Version.class), map)).thenReturn(
        IO.getFile("testresources/ws/cnf/releaserepo/p3/p3-1.2.0.jar"));
    System.out.println(repo.get("p3", new Version("1.2.0.b"), new Attrs()));

    when(repo.canWrite()).thenReturn(true);
    when(repo.getName()).thenReturn("Baseline");
    when(repo.versions("p3")).thenReturn(
        new SortedList<Version>(new Version("1.1.0.a"), new Version("1.1.0.b"), new Version("1.2.0.a"),
            new Version("1.2.0.b")));

    Project p3 = getWorkspace().getProject("p3");
    p3.setBundleVersion("1.3.0");
    ProjectBuilder builder = (ProjectBuilder) p3.getBuilder(null).getSubBuilder();
    builder.setProperty(Constants.BASELINE, "*");
    builder.setProperty(Constants.BASELINEREPO, "Baseline");

    // Nothing specified
    Jar jar = builder.getBaselineJar();
    assertEquals("1.2.0", new Version(jar.getVersion()).getWithoutQualifier().toString());

    if (!builder.check())
      fail();
    {
      // check for error when repository contains later versions
      builder = (ProjectBuilder) p3.getBuilder(null).getSubBuilder();
      builder.setBundleVersion("1.1.3");
      builder.setTrace(true);
      builder.setProperty(Constants.BASELINE, "*");
      builder.setProperty(Constants.BASELINEREPO, "Baseline");
      jar = builder.getBaselineJar();
      assertNull(jar);

      if (!builder.check("The baseline version 1.2.0.b is higher than the current version 1.1.3 for p3"))
        fail();
    }
    {
      // check for no error when repository has the same version
      builder = (ProjectBuilder) p3.getBuilder(null).getSubBuilder();
      builder.setBundleVersion("1.2.0.b");
      builder.setTrace(true);
      builder.setProperty(Constants.BASELINE, "*");
      builder.setProperty(Constants.BASELINEREPO, "Baseline");
      jar = builder.getBaselineJar();
      assertNotNull(jar);

      if (!builder.check())
        fail();

    }
    {
      // check for no error when repository has the same version
      builder = (ProjectBuilder) p3.getBuilder(null).getSubBuilder();
      builder.setBundleVersion("1.2.0.b");
      builder.setTrace(true);
      builder.setProperty(Constants.BASELINE, "*");
      builder.setProperty(Constants.BASELINEREPO, "Baseline");
      builder.build();

      if (!builder.check("The bundle version \\(1.2.0/1.2.0\\) is too low, must be at least 1.3.0"))
        fail();

    }
  }

  /**
   * Check what happens when there is nothing in the repo ... We do not
   * generate an error when version <=1.0.0, otherwise we generate an error.
   *
   * @throws Exception
   */
  public void testNothingInRepo() throws Exception {
    File tmp = new File("tmp");
    tmp.mkdirs();
    try {
      RepositoryPlugin repo = mock(RepositoryPlugin.class);
      when(repo.canWrite()).thenReturn(true);
      when(repo.getName()).thenReturn("Baseline");
      when(repo.versions("p3")).thenReturn(new TreeSet<Version>());
      getWorkspace().addBasicPlugin(repo);
      Project p3 = getWorkspace().getProject("p3");
      p3.setProperty(Constants.BASELINE, "*");
      p3.setProperty(Constants.BASELINEREPO, "Baseline");
      p3.setBundleVersion("0");
      p3.build();
      assertTrue(p3.check());

      p3.setBundleVersion("1.0.0.XXXXXX");
      p3.build();
      assertTrue(p3.check());

      p3.setBundleVersion("5");
      p3.build();
      assertTrue(p3.check("There is no baseline for p3 in the baseline repo"));
    }
    finally {
      IO.delete(tmp);
    }
  }

  // Adding a method to a ProviderType produces a MINOR bump (1.0.0 -> 1.1.0)
  public void testProviderTypeBump() throws Exception {
    Processor processor = new Processor();

    DiffPluginImpl differ = new DiffPluginImpl();
    Baseline baseline = new Baseline(processor, differ);

    Jar older = new Jar(IO.getFile("testresources/api-orig.jar"));
    Jar newer = new Jar(IO.getFile("testresources/api-providerbump.jar"));

    Set<Info> infoSet = baseline.baseline(newer, older, null);
    System.out.println(differ.tree(newer).get("<api>"));

    assertEquals(1, infoSet.size());
    Info info = infoSet.iterator().next();

    assertTrue(info.mismatch);
    assertEquals("dummy.api", info.packageName);
    assertEquals("1.1.0", info.suggestedVersion.toString());
  }

  // Adding a method to a ConsumerType produces a MINOR bump (1.0.0 -> 2.0.0)
  public static void testConsumerTypeBump() throws Exception {
    Processor processor = new Processor();

    DiffPluginImpl differ = new DiffPluginImpl();
    Baseline baseline = new Baseline(processor, differ);

    Jar older = new Jar(IO.getFile("testresources/api-orig.jar"));
    Jar newer = new Jar(IO.getFile("testresources/api-consumerbump.jar"));

    Set<Info> infoSet = baseline.baseline(newer, older, null);

    assertEquals(1, infoSet.size());
    Info info = infoSet.iterator().next();

    assertTrue(info.mismatch);
    assertEquals("dummy.api", info.packageName);
    assertEquals("2.0.0", info.suggestedVersion.toString());
  }
}
TOP

Related Classes of test.baseline.BaselineTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.