From 2f63cccd65c357ccd5d53a74de00021441675047 Mon Sep 17 00:00:00 2001 From: t-horikawa Date: Mon, 10 Feb 2025 22:23:59 +0900 Subject: [PATCH] refactor GetTableMetadata test --- .../tsubakuro/sql/impl/SessionImplTest.java | 26 ------- .../sql/impl/SqlServiceStubTest.java | 52 ++++++++++++++ .../sql/impl/FutureResponseMock.java | 70 ------------------- 3 files changed, 52 insertions(+), 96 deletions(-) delete mode 100644 modules/session/src/testFixtures/java/com/tsurugidb/tsubakuro/sql/impl/FutureResponseMock.java diff --git a/modules/session/src/test/java/com/tsurugidb/tsubakuro/sql/impl/SessionImplTest.java b/modules/session/src/test/java/com/tsurugidb/tsubakuro/sql/impl/SessionImplTest.java index aa87b1ae..d4f8ac8c 100644 --- a/modules/session/src/test/java/com/tsurugidb/tsubakuro/sql/impl/SessionImplTest.java +++ b/modules/session/src/test/java/com/tsurugidb/tsubakuro/sql/impl/SessionImplTest.java @@ -111,20 +111,6 @@ public FutureResponse send(int serviceID, byte[] byteArray) case ROLLBACK: nextResponse = ProtosForTest.ResultOnlyResponseChecker.builder().build(); break; - case EXPLAIN: - nextResponse = ProtosForTest.ExplainResponseChecker.builder().build(); - break; - case DESCRIBE_TABLE: - nextResponse = SqlResponse.Response.newBuilder() - .setDescribeTable(SqlResponse.DescribeTable.newBuilder() - .setSuccess(SqlResponse.DescribeTable.Success.newBuilder() - .setDatabaseName("D") - .setSchemaName("S") - .setTableName(request.getDescribeTable().getName()) - .addColumns(Types.column("a", Types.of(int.class))) - ) - ).build(); - break; case DISPOSE_TRANSACTION: nextResponse = SqlResponse.Response.newBuilder() .setDisposeTransaction(SqlResponse.DisposeTransaction.newBuilder() @@ -285,18 +271,6 @@ void usePreparedStatementAfterSessionClose() throws Exception { assertEquals("already closed", e2.getMessage()); } - @Test - void getTableMetadata() throws Exception { - var session = new SessionImpl(); - session.connect(new SessionWireMock()); - var sqlClient = SqlClient.attach(session); - - var info = sqlClient.getTableMetadata("TBL").await(); - assertEquals(Optional.of("D"), info.getDatabaseName()); - assertEquals(Optional.of("S"), info.getSchemaName()); - assertEquals("TBL", info.getTableName()); - } - @Test void requestCancel() throws Exception { var session = new SessionImpl(); diff --git a/modules/session/src/test/java/com/tsurugidb/tsubakuro/sql/impl/SqlServiceStubTest.java b/modules/session/src/test/java/com/tsurugidb/tsubakuro/sql/impl/SqlServiceStubTest.java index 4c0aa7ee..e421fd4d 100644 --- a/modules/session/src/test/java/com/tsurugidb/tsubakuro/sql/impl/SqlServiceStubTest.java +++ b/modules/session/src/test/java/com/tsurugidb/tsubakuro/sql/impl/SqlServiceStubTest.java @@ -1752,4 +1752,56 @@ void sendDisposeTransactionEngineError() throws Exception { } assertFalse(wire.hasRemaining()); } + + @Test + void sendGetTableMetadataSuccess() throws Exception { + wire.next(accepts(SqlRequest.Request.RequestCase.DESCRIBE_TABLE, + RequestHandler.returns(SqlResponse.DescribeTable.newBuilder() + .setSuccess(SqlResponse.DescribeTable.Success.newBuilder() + .setDatabaseName("D") + .setSchemaName("S") + .setTableName("TBL") + .addColumns(Types.column("a", Types.of(int.class)))) + .build()))); + + var message = SqlRequest.DescribeTable.newBuilder() + .setName("TBL") + .build(); + try ( + var service = new SqlServiceStub(session); + var future = service.send(message); + ) { + + var result = future.get(); + assertEquals(Optional.of("D"), result.getDatabaseName()); + assertEquals(Optional.of("S"), result.getSchemaName()); + assertEquals("TBL", result.getTableName()); + var columns = result.getColumns(); + assertEquals(1, columns.size()); + var column = columns.get(0); + assertEquals("a", column.getName()); + assertEquals(SqlCommon.Column.TypeInfoCase.ATOM_TYPE, column.getTypeInfoCase()); + assertEquals(SqlCommon.AtomType.INT4, column.getAtomType()); + } + assertFalse(wire.hasRemaining()); + } + + @Test + void sendGetTableMetadataEngineError() throws Exception { + wire.next(accepts(SqlRequest.Request.RequestCase.DESCRIBE_TABLE, + RequestHandler.returns(SqlResponse.DescribeTable.newBuilder() + .setError(newEngineError()) + .build()))); + + var message = SqlRequest.DescribeTable.newBuilder() + .build(); + try ( + var service = new SqlServiceStub(session); + var future = service.send(message); + ) { + var error = assertThrows(SqlServiceException.class, () -> future.await()); + assertEquals(SqlServiceCode.SQL_SERVICE_EXCEPTION, error.getDiagnosticCode()); + } + assertFalse(wire.hasRemaining()); + } } diff --git a/modules/session/src/testFixtures/java/com/tsurugidb/tsubakuro/sql/impl/FutureResponseMock.java b/modules/session/src/testFixtures/java/com/tsurugidb/tsubakuro/sql/impl/FutureResponseMock.java deleted file mode 100644 index c2e0d152..00000000 --- a/modules/session/src/testFixtures/java/com/tsurugidb/tsubakuro/sql/impl/FutureResponseMock.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2023-2024 Project Tsurugi. - * - * Licensed 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 com.tsurugidb.tsubakuro.sql.impl; - -import java.io.IOException; -import java.nio.file.Path; -import java.util.Collection; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import com.tsurugidb.tsubakuro.exception.ServerException; -import com.tsurugidb.sql.proto.SqlResponse; -import com.tsurugidb.sql.proto.SqlResponse.ResultOnly; - -/** - * FutureResponseMock type. - */ -// FIXME: remove mock code -public class FutureResponseMock extends AbstractFutureResponse { - private boolean success; - - public FutureResponseMock(Collection files) { - for (Path file : files) { - if (file.toString().contains("NG")) { - this.success = false; - return; - } - } - this.success = true; - } - - public FutureResponseMock(boolean success) { - this.success = success; - } - - @Override - protected ResultOnly getInternal() throws IOException, ServerException, InterruptedException { - if (success) { - return SqlResponse.ResultOnly.newBuilder() - .setSuccess(SqlResponse.Success.newBuilder()) - .build(); - } - return SqlResponse.ResultOnly.newBuilder() - .setError(SqlResponse.Error.newBuilder().setDetail("intentional fail for test purpose")) - .build(); - } - - @Override - protected ResultOnly getInternal(long timeout, TimeUnit unit) - throws IOException, ServerException, InterruptedException, TimeoutException { - return get(); - } - - @Override - public void close() throws IOException, ServerException, InterruptedException { - } -}