blob: 4e0f97d1c16b30b41458145738e070248bc84b8b [file]
/**
* Derby - Class org.apache.derbyTesting.functionTests.tests.lang.VetJigsawTest
*
* 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.derbyTesting.functionTests.tests.lang;
import java.net.URL;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import junit.framework.Test;
import org.apache.derbyTesting.junit.BaseJDBCTestCase;
import org.apache.derbyTesting.junit.BaseTestSuite;
import org.apache.derbyTesting.junit.CleanDatabaseTestSetup;
import org.apache.derbyTesting.junit.JDBC;
import org.apache.derbyTesting.junit.SecurityManagerSetup;
/**
* Test to verify that jigsaw module rules are applied.
*/
public class VetJigsawTest extends BaseJDBCTestCase
{
////////////////////////////////////////////////
//
// CONSTANTS
//
////////////////////////////////////////////////
private static final String[] JAR_FILES =
{
"derby.jar",
"derbyclient.jar",
"derbynet.jar",
"derbyoptionaltools.jar",
"derbyrun.jar",
"derbyshared.jar",
"derbytools.jar",
"derbyTesting.jar",
};
////////////////////////////////////////////////
//
// CONSTRUCTOR
//
////////////////////////////////////////////////
public VetJigsawTest(String name)
{
super(name);
}
////////////////////////////////////////////////
//
// JUnit MACHINERY
//
////////////////////////////////////////////////
/**
* Returns the implemented tests.
*
* @return An instance of <code>Test</code> with the implemented tests to
* run.
*/
public static Test suite()
{
// no need to install a security manager. we're just
// verifying the jar file contents.
BaseTestSuite baseTest = new BaseTestSuite( VetJigsawTest.class, "VetJigsawTest" );
Test cleanDatabaseWrapper = new CleanDatabaseTestSetup( baseTest );
Test noSecurityWrapper = SecurityManagerSetup.noSecurityManager( cleanDatabaseWrapper );
return noSecurityWrapper;
}
////////////////////////////////////////////////
//
// TESTS
//
////////////////////////////////////////////////
/**
* Verify that jar files do not share packages.
*/
public void test_jarContents() throws Exception
{
final String className = "org.apache.derby.impl.jdbc.EmbedConnection";
URL derbyURL = SecurityManagerSetup.getURL(className);
String derbyJarFileName = derbyURL.toURI().getPath();
String jarFileDirectory = derbyJarFileName.substring(0, derbyJarFileName.indexOf("derby.jar"));
String result = null;
try (Connection conn = getConnection())
{
loadJarFileContents(conn, jarFileDirectory);
result = vetContents();
}
if ((result != null) && (result.length() != 0))
{
fail("Jar files overlap!\n" + result);
}
}
private void loadJarFileContents(Connection conn, String jarFileDirectory) throws Exception
{
goodStatement
(
conn,
"create function zipFile(zipFileName varchar( 32672 ))\n" +
"returns table\n" +
"(\n" +
" name varchar( 100 ),\n" +
" directory varchar( 32672 ),\n" +
" comment varchar( 100 ),\n" +
" crc varchar(100),\n" +
" size bigint,\n" +
" modification_time timestamp\n" +
")\n" +
"language java parameter style derby_jdbc_result_set no sql\n" +
"external name 'org.apache.derbyTesting.functionTests.tests.lang.ZipFileTableFunction.zipFile'\n"
);
goodStatement
(
conn,
"create table zipPackages\n" +
"(\n" +
" packageName varchar(32672),\n" +
" zipFileName varchar(32672),\n" +
" primary key (packageName, zipFileName)\n" +
")\n"
);
goodStatement
(
conn,
"create table zipClasses\n" +
"(\n" +
" packageName varchar(32672),\n" +
" zipFileName varchar(32672),\n" +
" className varchar(32672),\n" +
" primary key (packageName, zipFileName, className)\n" +
")\n"
);
for (String jarFileName : JAR_FILES)
{
loadJarFile(conn, jarFileDirectory, jarFileName);
}
}
private void loadJarFile(Connection conn, String jarFileDirectory, String jarFileName)
throws Exception
{
String fullJarFileName = jarFileDirectory + jarFileName;
goodStatement
(
conn,
"insert into zipPackages\n" +
" select distinct directory, '" + fullJarFileName + "'\n" +
" from table(zipfile('" + fullJarFileName + "')) t\n"
);
goodStatement
(
conn,
"insert into zipClasses\n" +
" select directory, '" + fullJarFileName + "', name\n" +
" from table(zipFile('" + fullJarFileName + "')) t\n" +
" where name like '%.class' and name <> 'module-info.class'"
);
}
private String vetContents() throws Exception
{
String packageCounts =
"select packageName, count(packageName) instanceCount\n" +
"from zipPackages\n" +
"where packageName not like 'META-INF%'\n" +
"group by packageName\n" +
"having count(packageName) > 1\n";
StringBuilder buffer = new StringBuilder();
try (PreparedStatement ps = prepareStatement(packageCounts))
{
try (ResultSet rs = ps.executeQuery())
{
while (rs.next())
{
String packageName = rs.getString(1);
examinePackage(buffer, packageName);
}
}
}
return buffer.toString();
}
private void examinePackage(StringBuilder buffer, String packageName) throws Exception
{
String packageContents =
"select zipFileName, className\n" +
"from zipClasses\n" +
"where packageName = '" + packageName + "'\n" +
"order by zipFileName, className\n";
StringBuffer localBuffer = new StringBuffer();
int zipsWithClasses = 0;
try (PreparedStatement ps = prepareStatement(packageContents))
{
String lastZipFileName = null;
try (ResultSet rs = ps.executeQuery())
{
while(rs.next())
{
String zipFileName = rs.getString(1);
String className = rs.getString(2);
if ((lastZipFileName != null) && !zipFileName.equals(lastZipFileName))
{ zipsWithClasses++; }
localBuffer
.append(" ")
.append(zipFileName)
.append("\t")
.append(className)
.append("\n");
}
}
}
if (zipsWithClasses > 1)
{
buffer
.append(packageName + " straddles more than one jar file:\n")
.append(localBuffer.toString())
.append("\n");
}
}
}