/**
* Licensed to JumpMind Inc under one or more contributor
* license agreements. See the NOTICE file distributed
* with this work for additional information regarding
* copyright ownership. JumpMind Inc licenses this file
* to you under the GNU General Public License, version 3.0 (GPLv3)
* (the "License"); you may not use this file except in compliance
* with the License.
*
* You should have received a copy of the GNU General Public License,
* version 3.0 (GPLv3) along with this library; if not, see
* <http://www.gnu.org/licenses/>.
*
* 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.jumpmind.symmetric.io.data.reader;
import static org.junit.Assert.*;
import org.jumpmind.db.model.Table;
import org.jumpmind.db.util.BinaryEncoding;
import org.jumpmind.symmetric.io.data.Batch;
import org.jumpmind.symmetric.io.data.CsvConstants;
import org.jumpmind.symmetric.io.data.CsvData;
import org.jumpmind.symmetric.io.data.DataContext;
import org.jumpmind.symmetric.io.data.DataEventType;
import org.jumpmind.symmetric.io.data.Batch.BatchType;
import org.junit.Test;
public class ProtocolDataReaderTest {
@Test
public void testSimpleRead() {
String nodeId= "055";
long batchId = 123;
String channelId = "nbc";
StringBuilder builder = beginCsv(nodeId);
beginBatch(builder, batchId, channelId);
putTableN(builder, 1, true);
putInsert(builder, 4);
endCsv(builder);
ProtocolDataReader reader = new ProtocolDataReader(BatchType.LOAD, "test", builder);
DataContext ctx = new DataContext(reader);
reader.open(ctx);
Batch batch = reader.nextBatch();
assertNotNull(batch);
assertEquals(batchId, batch.getBatchId());
Table table = reader.nextTable();
assertNotNull(table);
assertEquals("test1", table.getName());
assertEquals(2, table.getColumnCount());
assertEquals(1, table.getPrimaryKeyColumns().length);
assertEquals("id", table.getColumn(0).getName());
assertEquals("text", table.getColumn(1).getName());
CsvData data = reader.nextData();
assertNotNull(data);
assertEquals(DataEventType.INSERT, data.getDataEventType());
assertEquals("0", data.getParsedData(CsvData.ROW_DATA)[0]);
assertEquals("test", data.getParsedData(CsvData.ROW_DATA)[1]);
data = reader.nextData();
assertNotNull(data);
assertEquals(DataEventType.INSERT, data.getDataEventType());
assertEquals("1", data.getParsedData(CsvData.ROW_DATA)[0]);
assertEquals("test", data.getParsedData(CsvData.ROW_DATA)[1]);
data = reader.nextData();
assertNotNull(data);
assertEquals(DataEventType.INSERT, data.getDataEventType());
assertEquals("2", data.getParsedData(CsvData.ROW_DATA)[0]);
assertEquals("test", data.getParsedData(CsvData.ROW_DATA)[1]);
data = reader.nextData();
assertNotNull(data);
assertEquals(DataEventType.INSERT, data.getDataEventType());
assertEquals("3", data.getParsedData(CsvData.ROW_DATA)[0]);
assertEquals("test", data.getParsedData(CsvData.ROW_DATA)[1]);
data = reader.nextData();
assertNull(data);
table = reader.nextTable();
assertNull(table);
batch = reader.nextBatch();
assertNull(batch);
reader.close();
}
@Test
public void testTableContextSwitch() {
String nodeId= "1";
long batchId = 1;
String channelId = "test";
StringBuilder builder = beginCsv(nodeId);
beginBatch(builder, batchId, channelId);
putTableN(builder, 1, true);
putInsert(builder, 4);
putTableN(builder, 2, true);
putInsert(builder, 4);
putTableN(builder, 1, false);
putInsert(builder, 2);
putTableN(builder, 2, false);
putInsert(builder, 2);
endCsv(builder);
ProtocolDataReader reader = new ProtocolDataReader(BatchType.LOAD, "test", builder);
DataContext ctx = new DataContext(reader);
reader.open(ctx);
Batch batch = reader.nextBatch();
assertNotNull(batch);
Table table = reader.nextTable();
assertNotNull(table);
assertEquals(2, table.getColumnCount());
assertEquals(1, table.getPrimaryKeyColumnCount());
assertEquals("test1", table.getName());
int dataCount = 0;
while (reader.nextData() != null) {
dataCount++;
}
assertEquals(4, dataCount);
table = reader.nextTable();
assertNotNull(table);
assertEquals(2, table.getColumnCount());
assertEquals(1, table.getPrimaryKeyColumnCount());
assertEquals("test2", table.getName());
dataCount = 0;
while (reader.nextData() != null) {
dataCount++;
}
assertEquals(4, dataCount);
table = reader.nextTable();
assertNotNull(table);
assertEquals(2, table.getColumnCount());
assertEquals(1, table.getPrimaryKeyColumnCount());
assertEquals("test1", table.getName());
dataCount = 0;
while (reader.nextData() != null) {
dataCount++;
}
assertEquals(2, dataCount);
table = reader.nextTable();
assertNotNull(table);
assertEquals(2, table.getColumnCount());
assertEquals(1, table.getPrimaryKeyColumnCount());
assertEquals("test2", table.getName());
dataCount = 0;
while (reader.nextData() != null) {
dataCount++;
}
assertEquals(2, dataCount);
}
protected StringBuilder beginCsv(String nodeId) {
StringBuilder builder = new StringBuilder();
builder.append(String.format("%s,%s\n", CsvConstants.NODEID, nodeId));
builder.append(String.format("%s,%s\n", CsvConstants.BINARY, BinaryEncoding.BASE64.toString()));
return builder;
}
protected StringBuilder beginBatch(StringBuilder builder, long batchId, String channelId) {
builder.append(String.format("%s,%s\n", CsvConstants.CHANNEL, channelId));
builder.append(String.format("%s,%d\n", CsvConstants.BATCH, batchId));
return builder;
}
protected StringBuilder putTableN(StringBuilder builder, int n, boolean includeMetadata) {
builder.append(String.format("%s,%s\n", CsvConstants.SCHEMA, ""));
builder.append(String.format("%s,%s\n", CsvConstants.CATALOG, ""));
builder.append(String.format("%s,%s%d\n", CsvConstants.TABLE, "test", n));
if (includeMetadata) {
builder.append(String.format("%s,%s\n", CsvConstants.KEYS, "id"));
builder.append(String.format("%s,%s,%s\n", CsvConstants.COLUMNS, "id", "text"));
}
return builder;
}
protected StringBuilder putInsert(StringBuilder builder, int count) {
for (int i = 0; i < count; i++) {
builder.append(String.format("%s,%d,%s\n", CsvConstants.INSERT, i, "\"test\""));
}
return builder;
}
protected StringBuilder endCsv(StringBuilder builder) {
builder.append(String.format("%s\n", CsvConstants.COMMIT));
return builder;
}
}