You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ModuleTest.java 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /* *******************************************************************
  2. * Copyright (c) 2016-2017 Contributors
  3. * All rights reserved.
  4. * This program and the accompanying materials are made available
  5. * under the terms of the Eclipse Public License v 2.0
  6. * which accompanies this distribution and is available at
  7. * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt
  8. * ******************************************************************/
  9. package org.aspectj.apache.bcel.classfile.tests;
  10. import java.io.ByteArrayOutputStream;
  11. import java.io.DataOutputStream;
  12. import org.aspectj.apache.bcel.Constants;
  13. import org.aspectj.apache.bcel.classfile.Attribute;
  14. import org.aspectj.apache.bcel.classfile.ClassParser;
  15. import org.aspectj.apache.bcel.classfile.JavaClass;
  16. import org.aspectj.apache.bcel.classfile.Module;
  17. import org.aspectj.apache.bcel.classfile.Module.Export;
  18. import org.aspectj.apache.bcel.classfile.Module.Open;
  19. import org.aspectj.apache.bcel.classfile.Module.Provide;
  20. import org.aspectj.apache.bcel.classfile.Module.Require;
  21. import org.aspectj.apache.bcel.classfile.Module.Uses;
  22. import org.aspectj.apache.bcel.classfile.SourceFile;
  23. /**
  24. * https://cr.openjdk.java.net/~mr/jigsaw/spec/lang-vm.html
  25. *
  26. * @author Andy Clement
  27. */
  28. public class ModuleTest extends BcelTestCase {
  29. public void testLoadSimpleModuleClass() throws Exception {
  30. String moduleFilename = "testdata/modules/one/module-info.class";
  31. ClassParser classParser = new ClassParser(moduleFilename);
  32. JavaClass javaClass = classParser.parse();
  33. assertNotNull(javaClass);
  34. assertEquals(Constants.ClassFileVersion.of(9).MAJOR, javaClass.getMajor());
  35. assertEquals(Constants.ClassFileVersion.of(9).MINOR, javaClass.getMinor());
  36. assertEquals(Constants.ACC_MODULE,javaClass.getModifiers());
  37. assertEquals(0,javaClass.getSuperclassNameIndex());
  38. assertEquals(0,javaClass.getInterfaceIndices().length);
  39. assertEquals(0,javaClass.getFields().length);
  40. assertEquals(0,javaClass.getMethods().length);
  41. Attribute[] attrs = javaClass.getAttributes();
  42. assertEquals(2,attrs.length);
  43. SourceFile sourceFile = (SourceFile) getAttribute(attrs,Constants.ATTR_SOURCE_FILE);
  44. Module moduleAttr = (Module) getAttribute(attrs, Constants.ATTR_MODULE);
  45. byte[] originalData = moduleAttr.getBytes();
  46. String[] requiredModuleNames = moduleAttr.getRequiredModuleNames();
  47. assertEquals(1,requiredModuleNames.length);
  48. assertEquals("java.base",requiredModuleNames[0]);
  49. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  50. moduleAttr.dump(new DataOutputStream(baos));
  51. byte[] newData = baos.toByteArray();
  52. // The 6 offset here is because the newdata includes the 2byte cpool pointer for the name 'Module'
  53. // and the 4byte int length field for the attribute data
  54. if (newData.length!=originalData.length+6) {
  55. fail("Expected the length of the original attribute ("+originalData.length+") to match the new written length ("+newData.length+")");
  56. }
  57. for (int i=0;i<originalData.length;i++) {
  58. if (originalData[i]!=newData[i+6]) {
  59. fail("byte mismatch at position "+i+" of "+newData.length);
  60. }
  61. }
  62. }
  63. public void testRequires() throws Exception {
  64. Module moduleAttr = getModuleAttribute("testdata/modules/two/d/module-info.class");
  65. Require[] requires = moduleAttr.getRequires();
  66. assertEquals(4, requires.length);
  67. assertEquals("requires mandated java.base 9",requires[0].toString());
  68. assertEquals("requires a.b.c",requires[1].toString());
  69. assertEquals("requires static b.c.d",requires[2].toString());
  70. assertEquals("requires transitive c.d.e",requires[3].toString());
  71. assertEquals("java.base",requires[0].getModuleName());
  72. assertEquals("a.b.c",requires[1].getModuleName());
  73. assertEquals("b.c.d",requires[2].getModuleName());
  74. assertEquals("c.d.e",requires[3].getModuleName());
  75. }
  76. public void testExports() throws Exception {
  77. Module moduleAttr = getModuleAttribute("testdata/modules/two/e/module-info.class");
  78. Export[] exports = moduleAttr.getExports();
  79. assertEquals(3, exports.length);
  80. assertEquals("exports com.foo1", exports[0].toString());
  81. assertEquals("exports com.foo2 to a.b.c",exports[1].toString());
  82. assertEquals("exports com.foo3 to a.b.c, b.c.d",exports[2].toString());
  83. assertEquals("com/foo1",exports[0].getPackage());
  84. assertEquals("com/foo2",exports[1].getPackage());
  85. assertEquals("com/foo3",exports[2].getPackage());
  86. assertEquals("a.b.c",exports[1].getToModuleNames()[0]);
  87. assertEquals("a.b.c",exports[2].getToModuleNames()[0]);
  88. assertEquals("b.c.d",exports[2].getToModuleNames()[1]);
  89. }
  90. public void testOpens() throws Exception {
  91. Module moduleAttr = getModuleAttribute("testdata/modules/two/h/module-info.class");
  92. Open[] opens = moduleAttr.getOpens();
  93. assertEquals(3, opens.length);
  94. assertEquals("opens com.foo1", opens[0].toString());
  95. assertEquals("opens com.foo2 to a.b.c", opens[1].toString());
  96. assertEquals("opens com.foo3 to a.b.c, b.c.d", opens[2].toString());
  97. }
  98. public void testUses() throws Exception {
  99. Module moduleAttr = getModuleAttribute("testdata/modules/two/f/module-info.class");
  100. Uses[] uses = moduleAttr.getUses();
  101. assertEquals(1,uses.length);
  102. assertEquals("com/foo1/I1",uses[0].getTypeName());
  103. assertEquals("uses com.foo1.I1",uses[0].toString());
  104. }
  105. public void testProvides() throws Exception {
  106. Module moduleAttr = getModuleAttribute("testdata/modules/two/g/module-info.class");
  107. Provide[] provides = moduleAttr.getProvides();
  108. assertEquals(2,provides.length);
  109. assertEquals("provides com.foo1.I1 with com.foo1.C1",provides[0].toString());
  110. assertEquals("provides com.foo2.I2 with com.foo2.C2",provides[1].toString());
  111. assertEquals("com/foo1/I1",provides[0].getProvidedType());
  112. assertEquals("com/foo1/C1",provides[0].getWithTypeStrings()[0]);
  113. assertEquals("com/foo2/I2",provides[1].getProvidedType());
  114. assertEquals("com/foo2/C2",provides[1].getWithTypeStrings()[0]);
  115. }
  116. // ---
  117. private Module getModuleAttribute(String moduleInfoClass) throws Exception {
  118. ClassParser classParser = new ClassParser(moduleInfoClass);
  119. JavaClass javaClass = classParser.parse();
  120. return (Module)getAttribute(javaClass.getAttributes(), Constants.ATTR_MODULE);
  121. }
  122. }