blob: 0efcb02eac2ecce84c7fef17472bb4c0d1ca2034 [file] [log] [blame]
/*
* 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.calcite.avatica.remote;
import org.apache.calcite.avatica.AvaticaUtils;
import org.apache.calcite.avatica.ColumnMetaData.Rep;
import org.apache.calcite.avatica.Meta.Signature;
import org.apache.calcite.avatica.Meta.StatementHandle;
import org.apache.calcite.avatica.proto.Common.WireMessage;
import org.apache.calcite.avatica.proto.Requests;
import org.apache.calcite.avatica.remote.Service.Request;
import com.google.protobuf.UnsafeByteOperations;
import org.junit.Assert;
import org.junit.Test;
import java.io.ByteArrayOutputStream;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import static org.junit.Assert.assertEquals;
/**
* Protobuf serialization tests.
*/
public class ProtobufSerializationTest {
private Signature getSignature() {
return null;
}
private List<TypedValue> getTypedValues() {
List<TypedValue> paramValues =
Arrays.asList(TypedValue.create(Rep.BOOLEAN.name(), Boolean.TRUE),
TypedValue.create(Rep.STRING.name(), "string"));
return paramValues;
}
@Test public void testExecuteSerialization() throws Exception {
Service.ExecuteRequest executeRequest = new Service.ExecuteRequest(
new StatementHandle("connection", 12345, getSignature()), getTypedValues(), 0);
Requests.ExecuteRequest pbExecuteRequest = executeRequest.serialize();
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
pbExecuteRequest.writeTo(baos);
byte[] serialized = baos.toByteArray();
baos.reset();
WireMessage wireMsg = WireMessage.newBuilder().setName(Requests.ExecuteRequest.class.getName())
.setWrappedMessage(UnsafeByteOperations.unsafeWrap(serialized)).build();
wireMsg.writeTo(baos);
serialized = baos.toByteArray();
ProtobufTranslation translator = new ProtobufTranslationImpl();
Request newRequest = translator.parseRequest(serialized);
Assert.assertEquals(executeRequest, newRequest);
}
@Test public void testPrepareSerialization() throws Exception {
final String sql = "SELECT * FROM FOO";
final String connectionId = UUID.randomUUID().toString();
for (long maxRowCount : Arrays.asList(-1L, 0L, 1L, Long.MAX_VALUE)) {
Service.PrepareRequest prepareReq = new Service.PrepareRequest(connectionId, sql,
maxRowCount);
Requests.PrepareRequest prepareProtoReq = prepareReq.serialize();
assertEquals(maxRowCount, prepareProtoReq.getMaxRowCount());
assertEquals(maxRowCount, prepareProtoReq.getMaxRowsTotal());
assertEquals(prepareReq, prepareReq.deserialize(prepareProtoReq));
}
}
@Test public void testPrepareDeserialization() throws Exception {
final String sql = "SELECT * FROM FOO";
final String connectionId = UUID.randomUUID().toString();
final long maxRowCount = 200L;
// The "current" serialization strategy.
Requests.PrepareRequest protoPrepare = Requests.PrepareRequest.newBuilder()
.setConnectionId(connectionId).setSql(sql).setMaxRowsTotal(maxRowCount)
.build();
Service.PrepareRequest prepareReq = new Service.PrepareRequest().deserialize(protoPrepare);
assertEquals(maxRowCount, prepareReq.maxRowCount);
// The "old" serialization strategy.
protoPrepare = Requests.PrepareRequest.newBuilder()
.setConnectionId(connectionId).setSql(sql).setMaxRowCount(maxRowCount)
.build();
prepareReq = new Service.PrepareRequest().deserialize(protoPrepare);
assertEquals(maxRowCount, prepareReq.maxRowCount);
// Both the new and old provided should default to the new
protoPrepare = Requests.PrepareRequest.newBuilder()
.setConnectionId(connectionId).setSql(sql).setMaxRowCount(500L)
.setMaxRowsTotal(maxRowCount).build();
prepareReq = new Service.PrepareRequest().deserialize(protoPrepare);
assertEquals(maxRowCount, prepareReq.maxRowCount);
}
@Test public void testPrepareAndExecuteSerialization() throws Exception {
final String sql = "SELECT * FROM FOO";
final int statementId = 12345;
final String connectionId = UUID.randomUUID().toString();
for (long maxRowCount : Arrays.asList(-1L, 0L, 1L, Long.MAX_VALUE)) {
Service.PrepareAndExecuteRequest prepareAndExecuteReq =
new Service.PrepareAndExecuteRequest(connectionId, statementId, sql, maxRowCount);
Requests.PrepareAndExecuteRequest prepareAndExecuteProtoReq =
prepareAndExecuteReq.serialize();
assertEquals(maxRowCount, prepareAndExecuteProtoReq.getMaxRowCount());
assertEquals(maxRowCount, prepareAndExecuteProtoReq.getMaxRowsTotal());
assertEquals(AvaticaUtils.toSaturatedInt(maxRowCount),
prepareAndExecuteProtoReq.getFirstFrameMaxSize());
assertEquals(prepareAndExecuteReq,
prepareAndExecuteReq.deserialize(prepareAndExecuteProtoReq));
}
int maxRowsInFirstFrame = 50;
for (long maxRowCount : Arrays.asList(-1L, 0L, 1L, Long.MAX_VALUE)) {
Service.PrepareAndExecuteRequest prepareAndExecuteReq =
new Service.PrepareAndExecuteRequest(connectionId, statementId, sql, maxRowCount,
maxRowsInFirstFrame);
Requests.PrepareAndExecuteRequest prepareAndExecuteProtoReq =
prepareAndExecuteReq.serialize();
assertEquals(maxRowCount, prepareAndExecuteProtoReq.getMaxRowCount());
assertEquals(maxRowCount, prepareAndExecuteProtoReq.getMaxRowsTotal());
assertEquals(maxRowsInFirstFrame, prepareAndExecuteProtoReq.getFirstFrameMaxSize());
assertEquals(prepareAndExecuteReq,
prepareAndExecuteReq.deserialize(prepareAndExecuteProtoReq));
}
}
@Test public void testPrepareAndExecuteDeserialization() throws Exception {
final String sql = "SELECT * FROM FOO";
final String connectionId = UUID.randomUUID().toString();
final long maxRowCount = 200L;
final int maxRowsInFirstFrame = 50;
// The "current" serialization strategy (maxRowsTotal and firstFrameMaxSize)
Requests.PrepareAndExecuteRequest protoPrepare = Requests.PrepareAndExecuteRequest.newBuilder()
.setConnectionId(connectionId).setSql(sql).setMaxRowsTotal(maxRowCount)
.setFirstFrameMaxSize(maxRowsInFirstFrame).build();
Service.PrepareAndExecuteRequest prepareAndExecuteReq = new Service.PrepareAndExecuteRequest()
.deserialize(protoPrepare);
assertEquals(maxRowCount, prepareAndExecuteReq.maxRowCount);
assertEquals(maxRowsInFirstFrame, prepareAndExecuteReq.maxRowsInFirstFrame);
// The "old" serialization strategy (maxRowCount)
protoPrepare = Requests.PrepareAndExecuteRequest.newBuilder()
.setConnectionId(connectionId).setSql(sql).setMaxRowCount(maxRowCount)
.build();
prepareAndExecuteReq = new Service.PrepareAndExecuteRequest().deserialize(protoPrepare);
assertEquals(maxRowCount, prepareAndExecuteReq.maxRowCount);
assertEquals(AvaticaUtils.toSaturatedInt(maxRowCount),
prepareAndExecuteReq.maxRowsInFirstFrame);
// Both the new and old provided should default to the new (firstFrameMaxSize should be the
// the same as what ultimately is set to maxRowCount)
protoPrepare = Requests.PrepareAndExecuteRequest.newBuilder()
.setConnectionId(connectionId).setSql(sql).setMaxRowCount(500L)
.setMaxRowsTotal(maxRowCount).build();
prepareAndExecuteReq = new Service.PrepareAndExecuteRequest().deserialize(protoPrepare);
assertEquals(maxRowCount, prepareAndExecuteReq.maxRowCount);
assertEquals(AvaticaUtils.toSaturatedInt(maxRowCount),
prepareAndExecuteReq.maxRowsInFirstFrame);
// Same as previous example, but explicitly setting maxRowsInFirstFrame too
protoPrepare = Requests.PrepareAndExecuteRequest.newBuilder()
.setConnectionId(connectionId).setSql(sql).setMaxRowCount(500L)
.setMaxRowsTotal(maxRowCount).setFirstFrameMaxSize(maxRowsInFirstFrame).build();
prepareAndExecuteReq = new Service.PrepareAndExecuteRequest().deserialize(protoPrepare);
assertEquals(maxRowCount, prepareAndExecuteReq.maxRowCount);
assertEquals(maxRowsInFirstFrame, prepareAndExecuteReq.maxRowsInFirstFrame);
}
@Test public void testFetchRequestSerialization() throws Exception {
final String connectionId = UUID.randomUUID().toString();
final int statementId = 12345;
final long offset = 0L;
for (int maxRowCount : Arrays.asList(-1, 0, 1, Integer.MAX_VALUE)) {
Service.FetchRequest fetchReq = new Service.FetchRequest(connectionId, statementId,
offset, maxRowCount);
Requests.FetchRequest fetchProtoReq = fetchReq.serialize();
assertEquals(maxRowCount, fetchProtoReq.getFetchMaxRowCount());
assertEquals(maxRowCount, fetchProtoReq.getFrameMaxSize());
assertEquals(fetchReq, fetchReq.deserialize(fetchProtoReq));
}
}
@Test public void testFetchRequestDeserialization() throws Exception {
final String connectionId = UUID.randomUUID().toString();
final int statementId = 12345;
final long offset = 0L;
final int maxSize = 200;
// The "current" serialization strategy.
Requests.FetchRequest protoFetch = Requests.FetchRequest.newBuilder()
.setConnectionId(connectionId).setStatementId(statementId)
.setOffset(offset).setFrameMaxSize(maxSize).build();
Service.FetchRequest fetchReq = new Service.FetchRequest().deserialize(protoFetch);
assertEquals(maxSize, fetchReq.fetchMaxRowCount);
// The "old" serialization strategy.
protoFetch = Requests.FetchRequest.newBuilder()
.setConnectionId(connectionId).setStatementId(statementId)
.setOffset(offset).setFetchMaxRowCount(maxSize).build();
fetchReq = new Service.FetchRequest().deserialize(protoFetch);
assertEquals(maxSize, fetchReq.fetchMaxRowCount);
// Both the new and old provided should default to the new
protoFetch = Requests.FetchRequest.newBuilder()
.setConnectionId(connectionId).setStatementId(statementId)
.setOffset(offset).setFetchMaxRowCount(100).setFrameMaxSize(maxSize)
.build();
fetchReq = new Service.FetchRequest().deserialize(protoFetch);
assertEquals(maxSize, fetchReq.fetchMaxRowCount);
}
}
// End ProtobufSerializationTest.java