| /* |
| * 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.Meta; |
| import org.apache.calcite.avatica.Meta.Frame; |
| import org.apache.calcite.avatica.metrics.noop.NoopMetricsSystem; |
| import org.apache.calcite.avatica.proto.Common; |
| import org.apache.calcite.avatica.proto.Common.ColumnValue; |
| import org.apache.calcite.avatica.proto.Requests; |
| import org.apache.calcite.avatica.proto.Responses; |
| import org.apache.calcite.avatica.remote.Handler.HandlerResponse; |
| import org.apache.calcite.avatica.remote.Service.FetchRequest; |
| import org.apache.calcite.avatica.remote.Service.FetchResponse; |
| import org.apache.calcite.avatica.remote.Service.RpcMetadataResponse; |
| |
| import org.junit.Before; |
| import org.junit.Test; |
| import org.mockito.Mockito; |
| |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertTrue; |
| import static org.mockito.Mockito.when; |
| |
| /** |
| * Test basic serialization of objects with protocol buffers. |
| */ |
| public class ProtobufHandlerTest { |
| |
| // Mocks |
| private Service service; |
| private ProtobufTranslation translation; |
| |
| // Real objects |
| private ProtobufHandler handler; |
| |
| @Before |
| public void setupMocks() { |
| // Mocks |
| service = Mockito.mock(Service.class); |
| translation = Mockito.mock(ProtobufTranslation.class); |
| |
| // Real objects |
| handler = new ProtobufHandler(service, translation, NoopMetricsSystem.getInstance()); |
| } |
| |
| @Test |
| public void testFetch() throws Exception { |
| final String connectionId = "cnxn1"; |
| final int statementId = 30; |
| final long offset = 10; |
| final int fetchMaxRowCount = 100; |
| final List<Common.TypedValue> values = new ArrayList<>(); |
| |
| values.add(Common.TypedValue.newBuilder().setType(Common.Rep.BOOLEAN).setBoolValue(true) |
| .build()); |
| values.add(Common.TypedValue.newBuilder().setType(Common.Rep.STRING) |
| .setStringValue("my_string").build()); |
| |
| Requests.FetchRequest protoRequest = Requests.FetchRequest.newBuilder() |
| .setConnectionId(connectionId).setStatementId(statementId) |
| .setOffset(offset).setFetchMaxRowCount(fetchMaxRowCount) |
| .build(); |
| byte[] serializedRequest = protoRequest.toByteArray(); |
| |
| FetchRequest request = new FetchRequest().deserialize(protoRequest); |
| |
| List<Object> frameRows = new ArrayList<>(); |
| frameRows.add(new Object[] {true, "my_string"}); |
| |
| Meta.Frame frame = Frame.create(0, true, frameRows); |
| RpcMetadataResponse metadata = new RpcMetadataResponse("localhost:8765"); |
| FetchResponse response = new FetchResponse(frame, false, false, metadata); |
| |
| when(translation.parseRequest(serializedRequest)).thenReturn(request); |
| when(service.apply(request)).thenReturn(response); |
| when(translation.serializeResponse(response)) |
| .thenReturn(response.serialize().toByteArray()); |
| |
| HandlerResponse<byte[]> handlerResponse = handler.apply(serializedRequest); |
| byte[] serializedResponse = handlerResponse.getResponse(); |
| assertEquals(200, handlerResponse.getStatusCode()); |
| |
| Responses.FetchResponse protoResponse = Responses.FetchResponse.parseFrom(serializedResponse); |
| |
| Common.Frame protoFrame = protoResponse.getFrame(); |
| |
| assertEquals(frame.offset, protoFrame.getOffset()); |
| assertEquals(frame.done, protoFrame.getDone()); |
| |
| List<Common.Row> rows = protoFrame.getRowsList(); |
| assertEquals(1, rows.size()); |
| Common.Row row = rows.get(0); |
| List<Common.ColumnValue> columnValues = row.getValueList(); |
| assertEquals(2, columnValues.size()); |
| |
| Iterator<Common.ColumnValue> iter = columnValues.iterator(); |
| assertTrue(iter.hasNext()); |
| Common.ColumnValue column = iter.next(); |
| assertTrue("The Column should have contained a scalar: " + column, |
| column.hasField(ColumnValue.getDescriptor() |
| .findFieldByNumber(ColumnValue.SCALAR_VALUE_FIELD_NUMBER))); |
| |
| Common.TypedValue value = column.getScalarValue(); |
| assertEquals(Common.Rep.BOOLEAN, value.getType()); |
| assertEquals(true, value.getBoolValue()); |
| |
| assertTrue(iter.hasNext()); |
| column = iter.next(); |
| assertTrue("The Column should have contained a scalar: " + column, |
| column.hasField(ColumnValue.getDescriptor() |
| .findFieldByNumber(ColumnValue.SCALAR_VALUE_FIELD_NUMBER))); |
| value = column.getScalarValue(); |
| assertEquals(Common.Rep.STRING, value.getType()); |
| assertEquals("my_string", value.getStringValue()); |
| } |
| |
| } |
| |
| // End ProtobufHandlerTest.java |