/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* Copyright (c) 2013, MPL CodeInside http://codeinside.ru
*/
package ru.codeinside.gses.migrations;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import ru.codeinside.adm.database.Employee;
import ru.codeinside.gses.liquibase.impl.DbConfig;
import ru.codeinside.gses.liquibase.impl.LegacyMigrationService;
import ru.codeinside.gses.liquibase.impl.Migration;
import ru.codeinside.gses.liquibase.impl.MigrationServiceImpl;
import ru.codeinside.gses.webui.osgi.Renovation;
import ru.codeinside.log.Log;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import javax.transaction.UserTransaction;
import java.io.File;
import java.io.PrintStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.LinkedList;
import java.util.Map;
/**
* Можно запустить вручную, например:
* <pre></pre>mvn test -Dtest=ValidateSchemaTest -Darquillian.launch=xeodon</pre>
*/
@RunWith(Arquillian.class)
public class ValidateSchemaTest extends Assert {
@Deployment
public static JavaArchive createDeployment() {
return ShrinkWrap.create(JavaArchive.class)
.addPackage(Employee.class.getPackage())
.addPackage(Log.class.getPackage())
.addClass(BaseBean.class)
.addAsResource("META-INF/persistence.xml");
//.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
}
static void assertMigration() throws Exception {
final UserTransaction tx = InitialContext.doLookup("UserTransaction");
tx.begin();
final DataSource tmp = InitialContext.doLookup(Databases.TMP);
final DbConfig tmpDb = new DbConfig(tmp);
File target = new File("target");
LinkedList<String> bad = new LinkedList<String>();
for (final Map.Entry<String, String> entry : Databases.VERSIONS.entrySet()) {
final String dbName = entry.getKey();
final String version = entry.getValue();
final String simpleName = dbName.substring(dbName.indexOf('/') + 1);
final String resource = "migrations/" + simpleName + "/migration.xml";
final Migration assistance = new LegacyMigrationService().create(resource, ValidateSchemaTest.class.getClassLoader());
final DataSource ds = InitialContext.doLookup(dbName);
final DbConfig db = new DbConfig(ds);
final PrintStream ps = new PrintStream(new File(target, "validation_" + simpleName + ".diff"));
if (!assistance.validate(version, db, tmpDb, ps)) {
bad.add(simpleName);
}
ps.close();
}
if (bad.isEmpty()) {
tx.commit();
} else {
tx.rollback();
}
assertTrue("Ошибки в миграции " + bad + ", детали в файлах target/validation_{dbName}.diff", bad.isEmpty());
}
@Test
public void validateAll() throws Exception {
Renovation renovation = new Renovation();
renovation.validateResources();
renovation.validatePersistence();
GenerateSchema.generateToFiles();
final String profile = System.getProperty("arquillian.launch");
if (profile == null) {
System.out.println();
System.out.println();
System.out.println("----------------------------------------------------");
System.out.println("Профиль по умолчанию пока не поддерживает PostgreSQL");
System.out.println("----------------------------------------------------");
System.out.println();
System.out.println();
} else {
CleanSchema.clean();
renovation.renovate(new MigrationServiceImpl());
CleanSchema.clean();
GenerateSchema.generate(false);
createViewForSecurityRealm();
assertMigration();
}
}
private void createViewForSecurityRealm() {
try {
final DataSource admin = InitialContext.doLookup(Databases.ADMIN);
Connection connection = admin.getConnection();
PreparedStatement st = connection.prepareStatement("create view active_employee as select * from employee where locked = false ");
st.executeUpdate();
st.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
fail("Can't create view for security realm " + e.getMessage());
}
}
}