Skip to content

Commit db63d6f

Browse files
committed
tests: Enable JSON and Float32 tests for emulator.
These are now supported according to documentation: https://github.com/GoogleCloudPlatform/cloud-spanner-emulator#features-and-limitations. Closes b/409115477.
1 parent 3f0bcad commit db63d6f

File tree

4 files changed

+71
-137
lines changed

4 files changed

+71
-137
lines changed

apis/Google.Cloud.Spanner.Data/Google.Cloud.Spanner.Data.IntegrationTests/AllTypesTableFixture.cs

Lines changed: 40 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,13 @@ public string CreateInsertCommand(bool skipProtobufValue = false) =>
3939
K,
4040
BoolValue,
4141
Int64Value,
42-
{EmptyOnEmulator("Float32Value,")}
42+
Float32Value,
4343
Float64Value,
4444
StringValue,
4545
NumericValue,
4646
BytesValue,
4747
TimestampValue,
48-
{EmptyOnEmulator("JsonValue,")}
48+
JsonValue,
4949
DateValue,
5050
{MaybeEmptyOnProduction("ProtobufValueValue,", skipProtobufValue)/* b/348711708 */}
5151
ProtobufDurationValue,
@@ -54,14 +54,14 @@ public string CreateInsertCommand(bool skipProtobufValue = false) =>
5454
ProtobufValueWrapperValue,
5555
BoolArrayValue,
5656
Int64ArrayValue,
57-
{EmptyOnEmulator("Float32ArrayValue,")}
57+
Float32ArrayValue,
5858
Float64ArrayValue,
5959
NumericArrayValue,
6060
StringArrayValue,
6161
Base64ArrayValue,
6262
BytesArrayValue,
6363
TimestampArrayValue,
64-
{EmptyOnEmulator("JsonArrayValue,")}
64+
JsonArrayValue,
6565
DateArrayValue,
6666
ProtobufValueArrayValue,
6767
ProtobufDurationArrayValue,
@@ -71,13 +71,13 @@ public string CreateInsertCommand(bool skipProtobufValue = false) =>
7171
@K,
7272
@BoolValue,
7373
@Int64Value,
74-
{EmptyOnEmulator("@Float32Value,")}
74+
@Float32Value,
7575
@Float64Value,
7676
@StringValue,
7777
@NumericValue,
7878
@BytesValue,
7979
@TimestampValue,
80-
{EmptyOnEmulator("@JsonValue,")}
80+
@JsonValue,
8181
@DateValue,
8282
{MaybeEmptyOnProduction("@ProtobufValueValue,", skipProtobufValue)/* b/348711708 */}
8383
@ProtobufDurationValue,
@@ -86,14 +86,14 @@ public string CreateInsertCommand(bool skipProtobufValue = false) =>
8686
@ProtobufValueWrapperValue,
8787
@BoolArrayValue,
8888
@Int64ArrayValue,
89-
{EmptyOnEmulator("@Float32ArrayValue,")}
89+
@Float32ArrayValue,
9090
@Float64ArrayValue,
9191
@NumericArrayValue,
9292
@StringArrayValue,
9393
@Base64ArrayValue,
9494
@BytesArrayValue,
9595
@TimestampArrayValue,
96-
{EmptyOnEmulator("@JsonArrayValue,")}
96+
@JsonArrayValue,
9797
@DateArrayValue,
9898
@ProtobufValueArrayValue,
9999
@ProtobufDurationArrayValue,
@@ -102,45 +102,42 @@ public string CreateInsertCommand(bool skipProtobufValue = false) =>
102102
@ProtobufValueWrapperArrayValue
103103
)";
104104

105-
// Note: the emulator doesn't yet support the JSON type.
106105
protected override void CreateTable() =>
107106
ExecuteDdl($@"CREATE TABLE {TableName}(
108-
K STRING(MAX) NOT NULL,
109-
BoolValue BOOL,
110-
Int64Value INT64,
111-
{EmptyOnEmulator("Float32Value FLOAT32,")}
112-
Float64Value FLOAT64,
113-
StringValue STRING(MAX),
114-
NumericValue NUMERIC,
115-
BytesValue BYTES(MAX),
116-
TimestampValue TIMESTAMP,
117-
{EmptyOnEmulator("JsonValue JSON,")}
118-
DateValue DATE,
119-
ProtobufValueValue {Value.Descriptor.FullName},
120-
ProtobufDurationValue {Duration.Descriptor.FullName},
121-
ProtobufRectangleValue {Rectangle.Descriptor.FullName},
122-
ProtobufPersonValue {Person.Descriptor.FullName},
123-
ProtobufValueWrapperValue {ValueWrapper.Descriptor.FullName},
124-
BoolArrayValue ARRAY<BOOL>,
125-
Int64ArrayValue ARRAY<INT64>,
126-
{EmptyOnEmulator("Float32ArrayValue ARRAY<FLOAT32>,")}
127-
Float64ArrayValue ARRAY<FLOAT64>,
128-
NumericArrayValue ARRAY<NUMERIC>,
129-
StringArrayValue ARRAY<STRING(MAX)>,
130-
Base64ArrayValue ARRAY<BYTES(MAX)>,
131-
BytesArrayValue ARRAY<BYTES(MAX)>,
132-
TimestampArrayValue ARRAY<TIMESTAMP>,
133-
{EmptyOnEmulator("JsonArrayValue ARRAY<JSON>,")}
134-
DateArrayValue ARRAY<DATE>,
135-
ProtobufValueArrayValue ARRAY<{Value.Descriptor.FullName}>,
136-
ProtobufDurationArrayValue ARRAY<{Duration.Descriptor.FullName}>,
137-
ProtobufRectangleArrayValue ARRAY<{Rectangle.Descriptor.FullName}>,
138-
ProtobufPersonArrayValue ARRAY<{Person.Descriptor.FullName}>,
139-
ProtobufValueWrapperArrayValue ARRAY<{ValueWrapper.Descriptor.FullName}>
107+
K STRING(MAX) NOT NULL,
108+
BoolValue BOOL,
109+
Int64Value INT64,
110+
Float32Value FLOAT32,
111+
Float64Value FLOAT64,
112+
StringValue STRING(MAX),
113+
NumericValue NUMERIC,
114+
BytesValue BYTES(MAX),
115+
TimestampValue TIMESTAMP,
116+
JsonValue JSON,
117+
DateValue DATE,
118+
ProtobufValueValue {Value.Descriptor.FullName},
119+
ProtobufDurationValue {Duration.Descriptor.FullName},
120+
ProtobufRectangleValue {Rectangle.Descriptor.FullName},
121+
ProtobufPersonValue {Person.Descriptor.FullName},
122+
ProtobufValueWrapperValue {ValueWrapper.Descriptor.FullName},
123+
BoolArrayValue ARRAY<BOOL>,
124+
Int64ArrayValue ARRAY<INT64>,
125+
Float32ArrayValue ARRAY<FLOAT32>,
126+
Float64ArrayValue ARRAY<FLOAT64>,
127+
NumericArrayValue ARRAY<NUMERIC>,
128+
StringArrayValue ARRAY<STRING(MAX)>,
129+
Base64ArrayValue ARRAY<BYTES(MAX)>,
130+
BytesArrayValue ARRAY<BYTES(MAX)>,
131+
TimestampArrayValue ARRAY<TIMESTAMP>,
132+
JsonArrayValue ARRAY<JSON>,
133+
DateArrayValue ARRAY<DATE>,
134+
ProtobufValueArrayValue ARRAY<{Value.Descriptor.FullName}>,
135+
ProtobufDurationArrayValue ARRAY<{Duration.Descriptor.FullName}>,
136+
ProtobufRectangleArrayValue ARRAY<{Rectangle.Descriptor.FullName}>,
137+
ProtobufPersonArrayValue ARRAY<{Person.Descriptor.FullName}>,
138+
ProtobufValueWrapperArrayValue ARRAY<{ValueWrapper.Descriptor.FullName}>
140139
) PRIMARY KEY(K)");
141140

142-
private string EmptyOnEmulator(string text) => RunningOnEmulator ? "" : text;
143-
144141
private string MaybeEmptyOnProduction(string text, bool skip) => skip && !RunningOnEmulator ? "" : text;
145142
}
146143
}

apis/Google.Cloud.Spanner.Data/Google.Cloud.Spanner.Data.IntegrationTests/BindingTests.cs

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ public BindingTests(SpannerDatabaseFixture fixture) =>
5858
SpannerDbType.Numeric,
5959
SpannerDbType.Date,
6060
SpannerDbType.Bytes,
61+
SpannerDbType.Float32,
62+
SpannerDbType.Json,
6163
SpannerDbType.FromClrType(typeof(Duration)),
6264
SpannerDbType.FromClrType(typeof(Rectangle)),
6365
SpannerDbType.FromClrType(typeof(Person)),
@@ -70,22 +72,15 @@ public BindingTests(SpannerDatabaseFixture fixture) =>
7072
SpannerDbType.ArrayOf(SpannerDbType.Numeric),
7173
SpannerDbType.ArrayOf(SpannerDbType.Date),
7274
SpannerDbType.ArrayOf(SpannerDbType.Bytes),
75+
SpannerDbType.ArrayOf(SpannerDbType.Float32),
76+
SpannerDbType.ArrayOf(SpannerDbType.Json),
7377
SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(Duration))),
7478
SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(Rectangle))),
7579
SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(Person))),
7680
SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(ValueWrapper))),
7781
SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(Value))),
7882
};
7983

80-
// These SpannerDbTypes are unsupported on emulator.
81-
public static TheoryData<SpannerDbType> BindEmulatorUnsupportedNullData { get; } = new TheoryData<SpannerDbType>
82-
{
83-
SpannerDbType.Float32,
84-
SpannerDbType.ArrayOf(SpannerDbType.Float32),
85-
SpannerDbType.Json,
86-
SpannerDbType.ArrayOf(SpannerDbType.Json),
87-
};
88-
8984
// These SpannerDbTypes are unsupported on production.
9085
public static TheoryData<SpannerDbType> BindProductionUnsupportedNullData { get; } = new TheoryData<SpannerDbType>
9186
{
@@ -96,11 +91,9 @@ public BindingTests(SpannerDatabaseFixture fixture) =>
9691
// TODO: xUnit v3 supports traits for DataAttributes. Use that instead of Skip when we migrate.
9792
[SkippableTheory]
9893
[MemberData(nameof(BindNullData))]
99-
[MemberData(nameof(BindEmulatorUnsupportedNullData))]
10094
[MemberData(nameof(BindProductionUnsupportedNullData))]
10195
public async Task BindNull(SpannerDbType parameterType)
10296
{
103-
MaybeSkipIfOnEmulator(parameterType);
10497
MaybeSkipIfOnProduction(parameterType);
10598
using var connection = _fixture.GetConnection();
10699
using var cmd = connection.CreateSelectCommand("SELECT @v");
@@ -204,17 +197,14 @@ public Task BindDateEmptyArray() => TestBindNonNull(
204197
new DateTime?[] { });
205198

206199
[Fact]
207-
[Trait(Constants.SupportedOnEmulator, Constants.No)]
208200
public Task BindFloat32() => TestBindNonNull(SpannerDbType.Float32, 1.0f, r => r.GetFloat(0));
209201

210202
[Fact]
211-
[Trait(Constants.SupportedOnEmulator, Constants.No)]
212203
public Task BindFloat32Array() => TestBindNonNull(
213204
SpannerDbType.ArrayOf(SpannerDbType.Float32),
214205
new float?[] { 0.0f, null, 1.0f });
215206

216207
[Fact]
217-
[Trait(Constants.SupportedOnEmulator, Constants.No)]
218208
public Task BindFloat32EmptyArray() => TestBindNonNull(
219209
SpannerDbType.ArrayOf(SpannerDbType.Float32),
220210
new float[] { });
@@ -294,20 +284,17 @@ public Task BindTimestampEmptyArray() => TestBindNonNull(
294284
new DateTime?[] { });
295285

296286
[Fact]
297-
[Trait(Constants.SupportedOnEmulator, Constants.No)]
298287
public async Task BindJson() => await TestBindNonNull(
299288
SpannerDbType.Json,
300289
"{\"key\":\"value\"}",
301290
r => r.GetString(0));
302291

303292
[Fact]
304-
[Trait(Constants.SupportedOnEmulator, Constants.No)]
305293
public async Task BindJsonArray() => await TestBindNonNull(
306294
SpannerDbType.ArrayOf(SpannerDbType.Json),
307295
new string[] { "{\"key\":\"value\"}", null, "{\"other-key\":\"other-value\"}" });
308296

309297
[Fact]
310-
[Trait(Constants.SupportedOnEmulator, Constants.No)]
311298
public async Task BindJsonEmptyArray() => await TestBindNonNull(
312299
SpannerDbType.ArrayOf(SpannerDbType.Json),
313300
new string[] { });
@@ -386,10 +373,6 @@ public async Task BindProtobufValueWrapperEmptyArray() => await TestBindNonNull(
386373
SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(ValueWrapper))),
387374
new ValueWrapper[] { });
388375

389-
private void MaybeSkipIfOnEmulator(SpannerDbType spannerDbType) =>
390-
Skip.If(_fixture.RunningOnEmulator && BindEmulatorUnsupportedNullData.Any<SpannerDbType>(spannerDbType.Equals),
391-
$"The emulator does not support {spannerDbType}.");
392-
393376
private void MaybeSkipIfOnProduction(SpannerDbType spannerDbType) =>
394377
Skip.If(!_fixture.RunningOnEmulator && BindProductionUnsupportedNullData.Any<SpannerDbType>(spannerDbType.Equals),
395378
$"Production does not support {spannerDbType}.");

apis/Google.Cloud.Spanner.Data/Google.Cloud.Spanner.Data.IntegrationTests/GetSchemaTableTests.cs

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,8 @@ public class GetSchemaTableTests
2929
{
3030
private readonly AllTypesTableFixture _fixture;
3131

32-
// On emulator, the types defined in SchemaTestUnsupportedData are skipped from tests.
3332
// The table also contains the `K` column that is the primary key.
34-
internal int ExpectedRowCountOnEmulator => SchemaTestData.Count() + 1;
35-
36-
// On production, the types defined in both SchemaTestUnsupportedData and SchemaTestData are executed.
37-
// The table also contains the `K` column that is the primary key.
38-
internal int ExpectedRowCountOnProduction => SchemaTestUnsupportedData.Count() + SchemaTestData.Count() + 1;
33+
internal int ExpectedRowCount => SchemaTestData.Count() + 1;
3934

4035
public GetSchemaTableTests(AllTypesTableFixture fixture) => _fixture = fixture;
4136

@@ -53,39 +48,29 @@ public async Task GetSchemaTable_Default_ReturnsNull()
5348
}
5449

5550
// TODO: xUnit v3 supports traits for DataAttributes. Use that instead of Skip when we migrate.
56-
[SkippableTheory]
51+
[Theory]
5752
[MemberData(nameof(SchemaTestData))]
58-
[MemberData(nameof(SchemaTestUnsupportedData))]
5953
public async Task GetSchemaTable_WithFlagEnabled_ReturnsSchema(string columnName, System.Type type, SpannerDbType spannerDbType)
6054
{
61-
MaybeSkipIfOnEmulator(spannerDbType);
6255
string selectQuery = $"SELECT {columnName} FROM {_fixture.TableName}";
6356
await GetSchemaTable_WithFlagEnabled_ReturnsSchema_Impl(columnName, type, spannerDbType, _fixture.ConnectionString, selectQuery);
6457
}
6558

66-
// These SpannerDbTypes are not supported on emulator.
67-
public static TheoryData<string, System.Type, SpannerDbType> SchemaTestUnsupportedData { get; } =
68-
new TheoryData<string, System.Type, SpannerDbType>
69-
{
70-
{ "Float32Value", typeof(float), SpannerDbType.Float32 },
71-
{ "Float32ArrayValue", typeof(List<float>), SpannerDbType.ArrayOf(SpannerDbType.Float32) },
72-
{ "JsonValue", typeof(string), SpannerDbType.Json },
73-
{ "JsonArrayValue", typeof(List<string>), SpannerDbType.ArrayOf(SpannerDbType.Json) },
74-
};
75-
7659
// These SpannerDbTypes are supported on emulator.
7760
public static TheoryData<string, System.Type, SpannerDbType> SchemaTestData { get; } =
7861
new TheoryData<string, System.Type, SpannerDbType>
7962
{
8063
// Base types.
8164
{ "BoolValue", typeof(bool), SpannerDbType.Bool },
8265
{ "Int64Value", typeof(long), SpannerDbType.Int64 },
66+
{ "Float32Value", typeof(float), SpannerDbType.Float32 },
8367
{ "Float64Value", typeof(double), SpannerDbType.Float64 },
8468
{ "NumericValue", typeof(SpannerNumeric), SpannerDbType.Numeric },
8569
{ "StringValue", typeof(string), SpannerDbType.String },
8670
{ "BytesValue", typeof(byte[]), SpannerDbType.Bytes },
8771
{ "TimestampValue", typeof(DateTime), SpannerDbType.Timestamp },
8872
{ "DateValue", typeof(DateTime), SpannerDbType.Date },
73+
{ "JsonValue", typeof(string), SpannerDbType.Json },
8974
{ "ProtobufDurationValue", typeof(Value), SpannerDbType.FromClrType(typeof(Duration)) },
9075
{ "ProtobufRectangleValue", typeof(Value), SpannerDbType.FromClrType(typeof(Rectangle)) },
9176
{ "ProtobufValueValue", typeof(Value), SpannerDbType.FromClrType(typeof(Value)) },
@@ -95,13 +80,15 @@ public async Task GetSchemaTable_WithFlagEnabled_ReturnsSchema(string columnName
9580
// Array types.
9681
{ "BoolArrayValue", typeof(List<bool>), SpannerDbType.ArrayOf(SpannerDbType.Bool) },
9782
{ "Int64ArrayValue", typeof(List<long>), SpannerDbType.ArrayOf(SpannerDbType.Int64) },
83+
{ "Float32ArrayValue", typeof(List<float>), SpannerDbType.ArrayOf(SpannerDbType.Float32) },
9884
{ "Float64ArrayValue", typeof(List<double>), SpannerDbType.ArrayOf(SpannerDbType.Float64) },
9985
{ "NumericArrayValue", typeof(List<SpannerNumeric>), SpannerDbType.ArrayOf(SpannerDbType.Numeric) },
10086
{ "StringArrayValue", typeof(List<string>), SpannerDbType.ArrayOf(SpannerDbType.String) },
10187
{ "Base64ArrayValue", typeof(List<byte[]>), SpannerDbType.ArrayOf(SpannerDbType.Bytes) },
10288
{ "BytesArrayValue", typeof(List<byte[]>), SpannerDbType.ArrayOf(SpannerDbType.Bytes) },
10389
{ "TimestampArrayValue", typeof(List<DateTime>), SpannerDbType.ArrayOf(SpannerDbType.Timestamp) },
10490
{ "DateArrayValue", typeof(List<DateTime>), SpannerDbType.ArrayOf(SpannerDbType.Date) },
91+
{ "JsonArrayValue", typeof(List<string>), SpannerDbType.ArrayOf(SpannerDbType.Json) },
10592
{ "ProtobufDurationArrayValue", typeof(List<Value>), SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(Duration))) },
10693
{ "ProtobufRectangleArrayValue", typeof(List<Value>), SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(Rectangle))) },
10794
{ "ProtobufValueArrayValue", typeof(List<Value>), SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(Value))) },
@@ -138,7 +125,7 @@ public async Task GetSchemaTable_WithFlagEnabled_ReturnsColumnOrdinals()
138125
using (var reader = await command.ExecuteReaderAsync())
139126
{
140127
var table = reader.GetSchemaTable();
141-
var expectedRowCount = _fixture.RunningOnEmulator ? ExpectedRowCountOnEmulator : ExpectedRowCountOnProduction;
128+
var expectedRowCount = ExpectedRowCount;
142129
Assert.Equal(expectedRowCount, table.Rows.Count);
143130
for (var ordinal = 1; ordinal < expectedRowCount; ordinal++)
144131
{
@@ -148,9 +135,5 @@ public async Task GetSchemaTable_WithFlagEnabled_ReturnsColumnOrdinals()
148135
}
149136
}
150137
}
151-
152-
private void MaybeSkipIfOnEmulator(SpannerDbType spannerDbType) =>
153-
Skip.If(_fixture.RunningOnEmulator && SchemaTestUnsupportedData.Any(data => spannerDbType.Equals(data[2])),
154-
$"The emulator does not support {spannerDbType}.");
155138
}
156139
}

0 commit comments

Comments
 (0)