package org.molgenis.xgap.test;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import matrix.DataMatrixInstance;
import matrix.general.DataMatrixHandler;
import org.molgenis.data.Data;
import org.molgenis.framework.db.CsvToDatabase.ImportResult;
import org.molgenis.framework.db.Database;
import org.molgenis.framework.db.DatabaseException;
import org.molgenis.framework.db.QueryRule;
import org.molgenis.framework.db.QueryRule.Operator;
import org.molgenis.organization.Investigation;
import org.molgenis.pheno.Individual;
import org.molgenis.util.DetectOS;
import org.molgenis.util.Entity;
import org.molgenis.util.SimpleTuple;
import org.molgenis.util.TarGz;
import org.molgenis.xgap.Marker;
import org.molgenis.xgap.xqtlworkbench.ResetXgapDb;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import regressiontest.cluster.DataLoader;
import app.CsvExport;
import app.CsvImport;
import app.DatabaseFactory;
import filehandling.storage.StorageHandler;
/**
* Test data matrix import and export across all backends, all retrieval
* functions, data types, and most dimensions, transpositions, sparsities, and
* text length variation.
*
* To be used in xQTL automated test cases
*
*/
public class Archiver_XqtlTestNG
{
Database db;
File archive;
@BeforeClass
public void setup() throws Exception
{
// cleanup before we start
XqtlSeleniumTest.deleteDatabase();
db = DatabaseFactory.create();
// assert db has no tables
try
{
db.find(Investigation.class);
Assert.fail("DatabaseException expected");
}
catch (DatabaseException expected)
{
// Good: DatabaseException was thrown
// FIXME: only because this is the first test to be run?
}
// setup database tables
String report = ResetXgapDb.reset(db, true);
Assert.assertTrue(report.endsWith("SUCCESS"));
StorageHandler sh = new StorageHandler(db);
Assert.assertFalse(sh.hasFileStorage(false, db));
// setup file storage
sh.setFileStorage(storagePath(), db);
sh.validateFileStorage(db);
Assert.assertTrue(sh.hasValidFileStorage(db));
}
@AfterClass(alwaysRun = true)
public void cleanupAfterClass() throws InterruptedException, Exception
{
db.close();
XqtlSeleniumTest.deleteDatabase();
}
@Test
public void importExampleData() throws Exception
{
ArrayList<String> result = DataLoader.load(db, false);
Assert.assertTrue(result.get(result.size() - 2).equals("Complete success"));
checkIfExampleDataIsOK();
}
@Test(dependsOnMethods = "importExampleData")
public void exportArchive() throws Exception
{
File tmpDir = new File(System.getProperty("java.io.tmpdir") + File.separator + "dbexport_" + System.nanoTime());
tmpDir.mkdir();
if (!tmpDir.exists()) throw new Exception("Could not create tmp folder: " + tmpDir.getAbsolutePath());
List<Class<? extends Entity>> specialCases = new ArrayList<Class<? extends Entity>>();
specialCases.add(org.molgenis.auth.MolgenisGroup.class);
specialCases.add(org.molgenis.auth.MolgenisPermission.class);
specialCases.add(org.molgenis.auth.MolgenisRoleGroupLink.class);
specialCases.add(org.molgenis.auth.MolgenisUser.class);
specialCases.add(org.molgenis.core.MolgenisEntity.class);
new CsvExport().exportSpecial(tmpDir, db, specialCases, true);
archive = TarGz.tarDir(tmpDir);
Assert.assertTrue(archive.exists());
}
@Test(dependsOnMethods = "exportArchive")
public void softResetDb() throws Exception
{
String report = ResetXgapDb.reset(db, false);
Assert.assertTrue(report.endsWith("SUCCESS"));
Assert.assertTrue(db.find(Marker.class).size() == 0);
Assert.assertTrue(db.find(Individual.class).size() == 0);
Assert.assertTrue(db.find(Data.class).size() == 0);
}
@Test(dependsOnMethods = "softResetDb")
public void importArchive() throws Exception
{
File extractDir = TarGz.tarExtract(archive);
ImportResult i = CsvImport.importAll(extractDir, db, new SimpleTuple(), true);
Assert.assertTrue(i.getErrorItem().equals("no error found"));
checkIfExampleDataIsOK();
}
@Test(dependsOnMethods = "importArchive")
public void hardResetDb() throws Exception
{
String report = ResetXgapDb.reset(db, true);
Assert.assertTrue(report.endsWith("SUCCESS"));
Assert.assertTrue(db.find(Marker.class).size() == 0);
Assert.assertTrue(db.find(Individual.class).size() == 0);
Assert.assertTrue(db.find(Data.class).size() == 0);
}
@Test(dependsOnMethods = "hardResetDb")
public void importArchiveAgain() throws Exception
{
File extractDir = TarGz.tarExtract(archive);
ImportResult i = CsvImport.importAll(extractDir, db, new SimpleTuple(), true);
Assert.assertTrue(i.getErrorItem().equals("no error found"));
// we expect to see database records
Assert.assertTrue(db.find(Marker.class).size() > 0);
Assert.assertTrue(db.find(Individual.class).size() > 0);
Assert.assertTrue(db.find(Data.class).size() > 0);
Data geno = db.find(Data.class, new QueryRule(Data.NAME, Operator.EQUALS, "genotypes")).get(0);
try
{
// but not binary file for data matrix
new DataMatrixHandler(db).createInstance(geno, db);
Assert.fail("DatabaseException expected");
}
catch (FileNotFoundException expected)
{
// FileNotFoundException was thrown as expected
}
}
/**
* Helper function, use to see if the example data is all there.
*/
private void checkIfExampleDataIsOK() throws Exception
{
Assert.assertTrue(db.find(Marker.class).size() > 0);
Assert.assertTrue(db.find(Individual.class).size() > 0);
Assert.assertTrue(db.find(Data.class).size() > 0);
Data geno = db.find(Data.class, new QueryRule(Data.NAME, Operator.EQUALS, "genotypes")).get(0);
DataMatrixInstance dm = new DataMatrixHandler(db).createInstance(geno, db);
Assert.assertTrue(dm.getElement(0, 0).equals("A"));
Assert.assertTrue(dm.getElement(1, 2).equals("B"));
}
/**
* Helper function. Get the storage path to use in test.
*/
public String storagePath()
{
String storagePath = new File(".").getAbsolutePath() + File.separator + "tmp_archiver_test_data";
if (DetectOS.getOS().startsWith("windows"))
{
return storagePath.replace("\\", "/");
}
else
{
return storagePath;
}
}
}