/*
* Copyright 2006-2015 University of Dundee. All rights reserved.
* Use is subject to license terms supplied in LICENSE.txt
*/
package integration;
import static org.testng.AssertJUnit.assertTrue;
import java.util.Date;
import java.util.UUID;
import omero.ApiUsageException;
import omero.ServerError;
import omero.cmd.Delete2;
import omero.gateway.util.Requests;
import omero.grid.Column;
import omero.grid.Data;
import omero.grid.LongColumn;
import omero.grid.StringColumn;
import omero.grid.TablePrx;
import omero.model.OriginalFile;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
/**
* Collections of tests for the <code>IUpdate</code> service.
*
* @author Brian loranger
* @version 3.0 <small> (<b>Internal version:</b> $Revision: $Date: $) </small>
* @since 3.0-Beta4
*/
public class TableTest extends AbstractServerTest {
/** The default size of a buffer. */
protected int DEFAULT_BUFFER_SIZE = 3;
/** Identifies the ID column. */
protected int UID_COLUMN = 0;
/** Identifies the Long column. */
protected int LONG_COLUMN = 1;
/** Identifies the String column. */
protected int STRING_COLUMN = 2;
protected long[] ColNumbers = { UID_COLUMN, LONG_COLUMN, STRING_COLUMN };
/** Reference to the columns. */
protected Column[] myColumns;
/** Reference to the table. */
protected TablePrx myTable = null;
// ~ Helpers
// =========================================================================
/**
* Creates a number of empty rows of [rows] size for the table
*
* @param rows
* The number of rows.
* @return See above.
*/
private Column[] createColumns(int rows) {
Column[] newColumns = new Column[3];
newColumns[UID_COLUMN] = new LongColumn("Uid", "", new long[rows]);
newColumns[LONG_COLUMN] = new LongColumn("MyLongColumn", "",
new long[rows]);
newColumns[STRING_COLUMN] = new StringColumn("MyStringColumn", "", 64,
new String[rows]);
return newColumns;
}
/**
* Create/initialize a new myTable.
*
* @throws ServerError
* Thrown if an error occurred.
*/
@SuppressWarnings("unused")
@BeforeMethod
private String createTable() throws ServerError {
myColumns = createColumns(1);
String uniqueTableFile = "TableTest" + UUID.randomUUID().toString();
// Create new unique table
myTable = factory.sharedResources().newTable(1, uniqueTableFile);
if (myTable != null)
myTable.initialize(myColumns);
return uniqueTableFile;
}
/**
* Delete myTable.
*
* @throws ServerError
* Thrown if an error occurred.
*/
@SuppressWarnings("unused")
@AfterMethod
private void deleteTable() throws Exception {
if (myTable != null) {
OriginalFile f = myTable.getOriginalFile();
final Delete2 dc = Requests.delete("OriginalFile", f.getId().getValue());
callback(true, client, dc);
myTable = null;
}
}
/**
* Retrieve table's OriginalFile.
*
* @throws Exception
* Thrown if an error occurred.
*/
@Test
public void testGetOriginalFile() throws Exception {
if (myTable != null)
myTable.getOriginalFile();
}
/**
* Retrieve table header.
*
* @throws Exception
* Thrown if an error occurred.
*/
@Test
public void testGetHeaders() throws Exception {
if (myTable != null)
myTable.getHeaders();
}
/**
* Add two rows of data to the table.
*
* @throws Exception
* Thrown if an error occurred.
*/
@Test
public void testAddData() throws Exception {
Column[] newRow = createColumns(2);
LongColumn uids = (LongColumn) newRow[UID_COLUMN];
LongColumn myLongs = (LongColumn) newRow[LONG_COLUMN];
StringColumn myStrings = (StringColumn) newRow[STRING_COLUMN];
uids.values[0] = 0;
myLongs.values[0] = 0;
myStrings.values[0] = "zero";
uids.values[1] = 1;
myLongs.values[1] = 1;
myStrings.values[1] = "one";
if (myTable != null)
myTable.addData(newRow);
}
/**
* Retrieves the number of rows.
*
* @throws Exception
* Thrown if an error occurred.
*/
@Test
public void testGetNumberOfRows() throws Exception {
if (myTable != null) {
assertTrue(myTable.getNumberOfRows() == 0);
Column[] newRow = createColumns(1);
LongColumn uids = (LongColumn) newRow[UID_COLUMN];
LongColumn myLongs = (LongColumn) newRow[LONG_COLUMN];
StringColumn myStrings = (StringColumn) newRow[STRING_COLUMN];
uids.values[0] = 0;
myLongs.values[0] = 0;
myStrings.values[0] = "none";
myTable.addData(newRow);
assertTrue(myTable.getNumberOfRows() == 1);
}
}
/**
* Tests the <code>WhereList</code> method.
*
* @throws Exception
* Thrown if an error occurred.
*/
@Test
public void testGetWhereListEmptyTable() throws Exception {
if (myTable != null) {
long[] ids = myTable.getWhereList("(Uid==" + 0 + ")", null, 0,
myTable.getNumberOfRows(), 1);
assertTrue(ids.length == 0);
}
}
/**
* Tests the <code>WhereList</code> method.
*
* @throws Exception
* Thrown if an error occurred.
*/
@Test
public void testGetWhereListManyRows() throws Exception {
if (myTable != null) {
Column[] newRow = createColumns(3);
LongColumn uids = (LongColumn) newRow[UID_COLUMN];
LongColumn myLongs = (LongColumn) newRow[LONG_COLUMN];
StringColumn myStrings = (StringColumn) newRow[STRING_COLUMN];
uids.values[0] = 0;
myLongs.values[0] = 0;
myStrings.values[0] = "zero";
uids.values[1] = 1;
myLongs.values[1] = 1;
myStrings.values[1] = "one";
uids.values[2] = 2;
myLongs.values[2] = 2;
myStrings.values[2] = "two";
myTable.addData(newRow);
long[] ids = myTable.getWhereList("(Uid==" + 1 + ")", null, 0,
myTable.getNumberOfRows(), 1);
// getWhereList should have returned one row
assertTrue(ids.length == 1);
// Retrieve data again
Data myData = myTable.read(ColNumbers, 0L,
myTable.getNumberOfRows());
myStrings = (StringColumn) myData.columns[STRING_COLUMN];
myLongs = (LongColumn) myData.columns[LONG_COLUMN];
// Row's time string and value should be the same
assertTrue((myLongs.values[(int) ids[0]]) == 1);
assertTrue((myStrings.values[(int) ids[0]]).equals("one"));
}
}
/**
* Tests <code>readCoordinates()</code> with zero rows in table. This throws
* an exception because there's no need to try to read zero data.
*
* @throws Exception
* Thrown if an error occurred.
*/
@Test(expectedExceptions = ApiUsageException.class)
public void testReadCoordinates0Rows() throws Exception {
if (myTable != null)
myTable.readCoordinates(null);
else
throw new ApiUsageException(); // table not available
}
/**
* Tests <code>readCoordinates()</code> with one row in table.
*
* @throws Exception
* Thrown if an error occurred.
*/
@Test
public void testReadCoordinates1Rows() throws Exception {
if (myTable != null) {
Column[] newRow = createColumns(1);
LongColumn uids = (LongColumn) newRow[UID_COLUMN];
LongColumn myLongs = (LongColumn) newRow[LONG_COLUMN];
StringColumn myStrings = (StringColumn) newRow[STRING_COLUMN];
uids.values[0] = 0;
myLongs.values[0] = 0;
myStrings.values[0] = "zero";
myTable.addData(newRow);
myTable.readCoordinates(new long[] { 0L });
}
}
/**
* Tests <code>readCoordinates()</code> with two row in table
*
* @throws Exception
* Thrown if an error occurred.
*/
@Test
public void testReadCoordinates2Rows() throws Exception {
if (myTable != null) {
Column[] newRow = createColumns(2);
LongColumn uids = (LongColumn) newRow[UID_COLUMN];
LongColumn myLongs = (LongColumn) newRow[LONG_COLUMN];
StringColumn myStrings = (StringColumn) newRow[STRING_COLUMN];
uids.values[0] = 0;
myLongs.values[0] = 0;
myStrings.values[0] = "zero";
uids.values[1] = 1;
myLongs.values[1] = 1;
myStrings.values[1] = "one";
myTable.addData(newRow);
myTable.readCoordinates(new long[] { 0L, 1L });
}
}
/**
* Tests <code>read()</code> with no rows in table.
*
* @throws Exception
* Thrown if an error occurred.
*/
@Test
public void testRead0Rows() throws Exception {
if (myTable != null)
myTable.read(ColNumbers, 0L, myTable.getNumberOfRows());
}
/**
* Tests <code>read</code> method with one row in table.
*
* @throws Exception
* Thrown if an error occurred.
*/
@Test
public void testRead1Rows() throws Exception {
if (myTable != null) {
Column[] newRow = createColumns(1);
LongColumn uids = (LongColumn) newRow[UID_COLUMN];
LongColumn myLongs = (LongColumn) newRow[LONG_COLUMN];
StringColumn myStrings = (StringColumn) newRow[STRING_COLUMN];
uids.values[0] = 0;
myLongs.values[0] = 0;
myStrings.values[0] = "none";
myTable.addData(newRow);
myTable.read(ColNumbers, 0L, myTable.getNumberOfRows());
}
}
/**
* Test <code>read</code> method with two rows in table
*
* @throws Exception
* Thrown if an error occurred.
*/
@Test
public void testRead2Rows() throws Exception {
if (myTable != null) {
Column[] newRow = createColumns(2);
LongColumn uids = (LongColumn) newRow[UID_COLUMN];
LongColumn myLongs = (LongColumn) newRow[LONG_COLUMN];
StringColumn myStrings = (StringColumn) newRow[STRING_COLUMN];
uids.values[0] = 0;
myLongs.values[0] = 0;
myStrings.values[0] = "zero";
uids.values[1] = 1;
myLongs.values[1] = 1;
myStrings.values[1] = "one";
myTable.addData(newRow);
myTable.read(ColNumbers, 0L, myTable.getNumberOfRows());
}
}
/**
* Tests <code>slice</code> method.
*
* @throws Exception
* Thrown if an error occurred.
*/
@Test(expectedExceptions = ApiUsageException.class)
public void testSlice0Rows() throws Exception {
if (myTable != null)
myTable.slice(null, null);
else
throw new ApiUsageException(); // table not available
}
/**
* Tests <code>slice</code> method.
*
* @throws Exception
* Thrown if an error occurred.
*/
@Test
public void testSlice1Rows() throws Exception {
if (myTable != null) {
Column[] newRow = createColumns(1);
LongColumn uids = (LongColumn) newRow[UID_COLUMN];
LongColumn myLongs = (LongColumn) newRow[LONG_COLUMN];
StringColumn myStrings = (StringColumn) newRow[STRING_COLUMN];
uids.values[0] = 0;
myLongs.values[0] = 0;
myStrings.values[0] = "zero";
myTable.addData(newRow);
myTable.slice(ColNumbers, new long[] { 0L });
}
}
/**
* Tests <code>slice</code> method.
*
* @throws Exception
* Thrown if an error occurred.
*/
@Test
public void testSlice2Rows() throws Exception {
if (myTable != null) {
Column[] newRow = createColumns(2);
LongColumn uids = (LongColumn) newRow[UID_COLUMN];
LongColumn myLongs = (LongColumn) newRow[LONG_COLUMN];
StringColumn myStrings = (StringColumn) newRow[STRING_COLUMN];
uids.values[0] = 0;
myLongs.values[0] = 0;
myStrings.values[0] = "zero";
uids.values[1] = 1;
myLongs.values[1] = 1;
myStrings.values[1] = "one";
myTable.addData(newRow);
myTable.slice(ColNumbers, new long[] { 0L, 1L });
}
}
/**
* Add then update a table row, assert its validity
*
* @throws Exception
* Thrown if an error occurred.
*/
@Test
public void testUpdateTableWith1Rows() throws Exception {
if (myTable != null) {
// Add a new row to table
Column[] newRow = createColumns(1);
LongColumn uids = (LongColumn) newRow[UID_COLUMN];
LongColumn myLongs = (LongColumn) newRow[LONG_COLUMN];
StringColumn myStrings = (StringColumn) newRow[STRING_COLUMN];
Long oldTime = new Date().getTime();
uids.values[0] = 1;
myLongs.values[0] = oldTime;
myStrings.values[0] = oldTime.toString();
myTable.addData(newRow);
// Retrieve the table data
Data myData = myTable.read(ColNumbers, 0L,
myTable.getNumberOfRows());
// Find the specific row we added
long[] ids = myTable.getWhereList("(Uid==" + 1 + ")", null, 0,
myTable.getNumberOfRows(), 1);
// getWhereList should have returned one row
assertTrue(ids.length == 1);
// Update the row with new data
Long newTime = new Date().getTime();
((LongColumn) myData.columns[LONG_COLUMN]).values[(int) ids[0]] = newTime;
((StringColumn) myData.columns[STRING_COLUMN]).values[(int) ids[0]] = newTime
.toString();
myTable.update(myData);
// Retrieve data again
myData = myTable.read(ColNumbers, 0L, myTable.getNumberOfRows());
myStrings = (StringColumn) myData.columns[STRING_COLUMN];
myLongs = (LongColumn) myData.columns[LONG_COLUMN];
// Row's time string and value should be the same
assertTrue(newTime.toString()
.equals(myStrings.values[(int) ids[0]]));
assertTrue(newTime == myLongs.values[(int) ids[0]]);
}
} // updateTableRow()
/**
* Add then update a table row, assert its validity.
*
* @throws Exception
* Thrown if an error occurred.
*/
@Test
public void testUpdateTableWith2Rows() throws Exception {
if (myTable != null) {
// Add a new row to table
Column[] newRow = createColumns(2);
LongColumn uids = (LongColumn) newRow[UID_COLUMN];
LongColumn myLongs = (LongColumn) newRow[LONG_COLUMN];
StringColumn myStrings = (StringColumn) newRow[STRING_COLUMN];
Long oldTime = new Date().getTime();
uids.values[0] = 1;
myLongs.values[0] = oldTime;
myStrings.values[0] = oldTime.toString();
uids.values[1] = 2;
myLongs.values[1] = oldTime;
myStrings.values[1] = oldTime.toString();
myTable.addData(newRow);
// Retrieve the table data
Data myData = myTable.read(ColNumbers, 0L,
myTable.getNumberOfRows());
// Find the specific row we added
long[] ids = myTable.getWhereList("(Uid==" + 1 + ")", null, 0,
myTable.getNumberOfRows(), 1);
// getWhereList should have returned one row
assertTrue(ids.length == 1);
// Update the row with new data
Long newTime = new Date().getTime();
((LongColumn) myData.columns[LONG_COLUMN]).values[(int) ids[0]] = newTime;
((StringColumn) myData.columns[STRING_COLUMN]).values[(int) ids[0]] = newTime
.toString();
myTable.update(myData);
// Retrieve data again
myData = myTable.read(ColNumbers, 0L, myTable.getNumberOfRows());
myStrings = (StringColumn) myData.columns[STRING_COLUMN];
myLongs = (LongColumn) myData.columns[LONG_COLUMN];
// Row's time string and value should be the same
assertTrue(newTime.toString()
.equals(myStrings.values[(int) ids[0]]));
assertTrue(newTime == myLongs.values[(int) ids[0]]);
}
}
}