blob: 04b1fe86fe5df0736c23e9d78b678b21614640e2 [file]
/*
* 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.
*/
using System;
using System.Collections.Generic;
using System.Data.Common;
using Apache.Arrow.Adbc.Drivers.BigQuery;
using Apache.Arrow.Adbc.Tests.Xunit;
using Xunit;
using Xunit.Abstractions;
namespace Apache.Arrow.Adbc.Tests.Drivers.BigQuery
{
/// <summary>
/// Class for testing the ADBC Client using the BigQuery ADBC driver.
/// </summary>
/// <remarks>
/// Tests are ordered to ensure data is created for the other
/// queries to run.
/// </remarks>
[TestCaseOrderer("Apache.Arrow.Adbc.Tests.Xunit.TestOrderer", "Apache.Arrow.Adbc.Tests")]
public class ClientTests
{
private BigQueryTestConfiguration _testConfiguration;
readonly List<BigQueryTestEnvironment> _environments;
readonly ITestOutputHelper _outputHelper;
public ClientTests(ITestOutputHelper outputHelper)
{
Skip.IfNot(Utils.CanExecuteTestConfig(BigQueryTestingUtils.BIGQUERY_TEST_CONFIG_VARIABLE));
_testConfiguration = MultiEnvironmentTestUtils.LoadMultiEnvironmentTestConfiguration<BigQueryTestConfiguration>(BigQueryTestingUtils.BIGQUERY_TEST_CONFIG_VARIABLE);
_environments = MultiEnvironmentTestUtils.GetTestEnvironments<BigQueryTestEnvironment>(_testConfiguration);
_outputHelper = outputHelper;
}
/// <summary>
/// Validates if the client execute updates.
/// </summary>
[SkippableFact, Order(1)]
public void CanClientExecuteUpdate()
{
foreach (BigQueryTestEnvironment environment in _environments)
{
using (Adbc.Client.AdbcConnection adbcConnection = GetAdbcConnection(environment))
{
adbcConnection.Open();
string[] queries = BigQueryTestingUtils.GetQueries(environment);
List<int> expectedResults = new List<int>() { -1, 1, 1 };
Tests.ClientTests.CanClientExecuteUpdate(adbcConnection, environment, queries, expectedResults);
}
}
}
/// <summary>
/// Validates if the client can get the schema.
/// </summary>
[SkippableFact, Order(2)]
public void CanClientGetSchema()
{
foreach (BigQueryTestEnvironment environment in _environments)
{
using (Adbc.Client.AdbcConnection adbcConnection = GetAdbcConnection(environment))
{
Tests.ClientTests.CanClientGetSchema(adbcConnection, environment);
}
}
}
/// <summary>
/// Validates if the client can connect to a live server and
/// parse the results.
/// </summary>
[SkippableFact, Order(3)]
public void CanClientExecuteQuery()
{
foreach (BigQueryTestEnvironment environment in _environments)
{
using (Adbc.Client.AdbcConnection adbcConnection = GetAdbcConnection(environment))
{
Tests.ClientTests.CanClientExecuteQuery(adbcConnection, environment, environmentName: environment.Name);
}
}
}
/// <summary>
/// Validates if the client is retrieving and converting values
/// to the expected types.
/// </summary>
[SkippableFact, Order(4)]
public void VerifyTypesAndValues()
{
foreach (BigQueryTestEnvironment environment in _environments)
{
using (Adbc.Client.AdbcConnection dbConnection = GetAdbcConnection(environment))
{
SampleDataBuilder sampleDataBuilder = BigQueryData.GetSampleData();
Tests.ClientTests.VerifyTypesAndValues(dbConnection, sampleDataBuilder, environment.Name);
}
}
}
[SkippableFact]
public void VerifySchemaTablesWithNoConstraints()
{
foreach (BigQueryTestEnvironment environment in _environments)
{
using (Adbc.Client.AdbcConnection adbcConnection = GetAdbcConnection(environment, includeTableConstraints: false))
{
adbcConnection.Open();
string schema = "Tables";
var tables = adbcConnection.GetSchema(schema);
Assert.True(tables.Rows.Count > 0, $"No tables were found in the schema '{schema}' for environment '{environment.Name}'");
}
}
}
[SkippableFact]
public void VerifySchemaTables()
{
foreach (BigQueryTestEnvironment environment in _environments)
{
using (Adbc.Client.AdbcConnection adbcConnection = GetAdbcConnection(environment))
{
adbcConnection.Open();
var collections = adbcConnection.GetSchema("MetaDataCollections");
Assert.Equal(7, collections.Rows.Count);
Assert.Equal(2, collections.Columns.Count);
var restrictions = adbcConnection.GetSchema("Restrictions");
Assert.Equal(11, restrictions.Rows.Count);
Assert.Equal(3, restrictions.Columns.Count);
var catalogs = adbcConnection.GetSchema("Catalogs");
Assert.Single(catalogs.Columns);
var catalog = (string?)catalogs.Rows[0].ItemArray[0];
catalogs = adbcConnection.GetSchema("Catalogs", new[] { catalog });
Assert.Equal(1, catalogs.Rows.Count);
string random = "X" + Guid.NewGuid().ToString("N");
catalogs = adbcConnection.GetSchema("Catalogs", new[] { random });
Assert.Equal(0, catalogs.Rows.Count);
var schemas = adbcConnection.GetSchema("Schemas", new[] { catalog });
Assert.Equal(2, schemas.Columns.Count);
var schema = (string?)schemas.Rows[0].ItemArray[1];
schemas = adbcConnection.GetSchema("Schemas", new[] { catalog, schema });
Assert.Equal(1, schemas.Rows.Count);
schemas = adbcConnection.GetSchema("Schemas", new[] { random });
Assert.Equal(0, schemas.Rows.Count);
schemas = adbcConnection.GetSchema("Schemas", new[] { catalog, random });
Assert.Equal(0, schemas.Rows.Count);
schemas = adbcConnection.GetSchema("Schemas", new[] { random, random });
Assert.Equal(0, schemas.Rows.Count);
var tableTypes = adbcConnection.GetSchema("TableTypes");
Assert.Single(tableTypes.Columns);
var tables = adbcConnection.GetSchema("Tables", new[] { catalog, schema });
Assert.Equal(4, tables.Columns.Count);
tables = adbcConnection.GetSchema("Tables", new[] { catalog, random });
Assert.Equal(0, tables.Rows.Count);
tables = adbcConnection.GetSchema("Tables", new[] { random, schema });
Assert.Equal(0, tables.Rows.Count);
tables = adbcConnection.GetSchema("Tables", new[] { random, random });
Assert.Equal(0, tables.Rows.Count);
tables = adbcConnection.GetSchema("Tables", new[] { catalog, schema, random });
Assert.Equal(0, tables.Rows.Count);
var columns = adbcConnection.GetSchema("Columns", new[] { catalog, schema });
Assert.Equal(16, columns.Columns.Count);
}
}
}
private Adbc.Client.AdbcConnection GetAdbcConnection(
BigQueryTestEnvironment environment,
bool includeTableConstraints = true
)
{
environment.IncludeTableConstraints = includeTableConstraints;
if (string.IsNullOrEmpty(environment.StructBehavior))
{
Dictionary<string, string> connectionParameters = BigQueryTestingUtils.GetBigQueryParameters(environment);
return new Adbc.Client.AdbcConnection(
new BigQueryDriver(),
connectionParameters,
new Dictionary<string, string>()
);
}
else
{
return GetAdbcConnectionUsingConnectionString(environment, includeTableConstraints);
}
}
private Adbc.Client.AdbcConnection GetAdbcConnectionUsingConnectionString(
BigQueryTestEnvironment environment,
bool includeTableConstraints = true
)
{
Dictionary<string, string> connectionParameters = BigQueryTestingUtils.GetBigQueryParameters(environment);
if (!string.IsNullOrEmpty(environment.StructBehavior))
connectionParameters.Add("StructBehavior", environment.StructBehavior!);
DbConnectionStringBuilder builder = new DbConnectionStringBuilder(true);
foreach (string key in connectionParameters.Keys)
{
builder[key] = connectionParameters[key];
}
return new Adbc.Client.AdbcConnection(builder.ConnectionString)
{
AdbcDriver = new BigQueryDriver()
};
}
}
}