Skip to content

Commit 4a58535

Browse files
committed
tests: Enable Protobuf Value tests on Emulator
Closes b/356532914
1 parent d7251a3 commit 4a58535

File tree

5 files changed

+134
-144
lines changed

5 files changed

+134
-144
lines changed

apis/Google.Cloud.Spanner.Data/Google.Cloud.Spanner.Data.CommonTesting/SpannerTestDatabase.cs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -78,27 +78,22 @@ protected override bool TryCreateDatabase()
7878
Duration.Descriptor.File.ToProto(),
7979
Rectangle.Descriptor.File.ToProto(),
8080
ValueWrapper.Descriptor.File.ToProto(),
81+
Value.Descriptor.File.ToProto(),
82+
Person.Descriptor.File.ToProto()
8183
}
8284
};
8385

84-
if (!SpannerClientCreationOptions.UsesEmulator)
85-
{
86-
// b/348716298
87-
fileDescriptorSet.File.Add(Value.Descriptor.File.ToProto());
88-
fileDescriptorSet.File.Add(Person.Descriptor.File.ToProto());
89-
}
90-
9186
using var connection = new SpannerConnection(NoDbConnectionString);
9287
var createCmd = connection.CreateDdlCommand($"CREATE DATABASE {SpannerDatabase}",protobufDescriptors: fileDescriptorSet,
9388
$"CREATE PROTO BUNDLE (" +
9489
$"{Point.Descriptor.FullName}" +
9590
$", {Rectangle.Descriptor.FullName}" +
9691
$", {Duration.Descriptor.FullName}" +
97-
EmptyOnEmulator($", {Person.Descriptor.FullName}"/* b/348716298 */) +
98-
EmptyOnEmulator($", {ValueWrapper.Descriptor.FullName}"/* b/348716298 */) +
99-
EmptyOnEmulator($", {Value.Descriptor.FindFieldByNumber(Value.NullValueFieldNumber).EnumType.FullName}"/* b/348716298 */) +
100-
EmptyOnEmulator($", {ListValue.Descriptor.FullName}"/* b/348716298 */) +
101-
EmptyOnEmulator($", {Value.Descriptor.FullName}"/* b/348716298 */) +
92+
$", {Person.Descriptor.FullName}" +
93+
$", {ValueWrapper.Descriptor.FullName}" +
94+
$", {Value.Descriptor.FindFieldByNumber(Value.NullValueFieldNumber).EnumType.FullName}" +
95+
$", {ListValue.Descriptor.FullName}" +
96+
$", {Value.Descriptor.FullName}" +
10297
$")");
10398
try
10499
{

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

Lines changed: 46 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@ public string CreateInsertCommand(bool skipProtobufValue = false) =>
4747
TimestampValue,
4848
{EmptyOnEmulator("JsonValue,")}
4949
DateValue,
50-
{MaybeEmpty(EmptyOnEmulator("ProtobufValueValue,"), skipProtobufValue)/* b/348716298 and b/348711708 */}
50+
{MaybeEmpty("ProtobufValueValue,", skipProtobufValue)/* b/348711708 */}
5151
ProtobufDurationValue,
5252
ProtobufRectangleValue,
53-
{EmptyOnEmulator("ProtobufPersonValue,")/* b/348716298 */}
54-
{EmptyOnEmulator("ProtobufValueWrapperValue,")/* b/348716298 */}
53+
ProtobufPersonValue,
54+
ProtobufValueWrapperValue,
5555
BoolArrayValue,
5656
Int64ArrayValue,
5757
{EmptyOnEmulator("Float32ArrayValue,")}
@@ -63,11 +63,11 @@ public string CreateInsertCommand(bool skipProtobufValue = false) =>
6363
TimestampArrayValue,
6464
{EmptyOnEmulator("JsonArrayValue,")}
6565
DateArrayValue,
66-
{EmptyOnEmulator("ProtobufValueArrayValue,")/* b/348716298 */}
66+
ProtobufValueArrayValue,
6767
ProtobufDurationArrayValue,
68-
ProtobufRectangleArrayValue
69-
{EmptyOnEmulator(", ProtobufPersonArrayValue")/* b/348716298 */}
70-
{EmptyOnEmulator(", ProtobufValueWrapperArrayValue")/* b/348716298 */}) VALUES(
68+
ProtobufRectangleArrayValue,
69+
ProtobufPersonArrayValue,
70+
ProtobufValueWrapperArrayValue) VALUES(
7171
@K,
7272
@BoolValue,
7373
@Int64Value,
@@ -79,11 +79,11 @@ public string CreateInsertCommand(bool skipProtobufValue = false) =>
7979
@TimestampValue,
8080
{EmptyOnEmulator("@JsonValue,")}
8181
@DateValue,
82-
{MaybeEmpty(EmptyOnEmulator("@ProtobufValueValue,"), skipProtobufValue)/* b/348716298 and b/348711708 */}
82+
{MaybeEmpty("@ProtobufValueValue,", skipProtobufValue)/* b/348711708 */}
8383
@ProtobufDurationValue,
8484
@ProtobufRectangleValue,
85-
{EmptyOnEmulator("@ProtobufPersonValue,")/* b/348716298 */}
86-
{EmptyOnEmulator("@ProtobufValueWrapperValue,")/* b/348716298 */}
85+
@ProtobufPersonValue,
86+
@ProtobufValueWrapperValue,
8787
@BoolArrayValue,
8888
@Int64ArrayValue,
8989
{EmptyOnEmulator("@Float32ArrayValue,")}
@@ -95,48 +95,48 @@ public string CreateInsertCommand(bool skipProtobufValue = false) =>
9595
@TimestampArrayValue,
9696
{EmptyOnEmulator("@JsonArrayValue,")}
9797
@DateArrayValue,
98-
{EmptyOnEmulator("@ProtobufValueArrayValue,")/* b/348716298 */}
98+
@ProtobufValueArrayValue,
9999
@ProtobufDurationArrayValue,
100-
@ProtobufRectangleArrayValue
101-
{EmptyOnEmulator(", @ProtobufPersonArrayValue")/* b/348716298 */}
102-
{EmptyOnEmulator(", @ProtobufValueWrapperArrayValue")/* b/348716298 */}
100+
@ProtobufRectangleArrayValue,
101+
@ProtobufPersonArrayValue
102+
@ProtobufValueWrapperArrayValue
103103
)";
104104

105105
// Note: the emulator doesn't yet support the JSON type.
106106
protected override void CreateTable() =>
107107
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-
{EmptyOnEmulator($"ProtobufValueValue {Value.Descriptor.FullName},")/* b/348716298 */}
120-
ProtobufDurationValue {Duration.Descriptor.FullName},
121-
ProtobufRectangleValue {Rectangle.Descriptor.FullName},
122-
{EmptyOnEmulator($"ProtobufPersonValue {Person.Descriptor.FullName},")/* b/348716298 */}
123-
{EmptyOnEmulator($"ProtobufValueWrapperValue {ValueWrapper.Descriptor.FullName},")/* b/348716298 */}
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-
{EmptyOnEmulator($"ProtobufValueArrayValue ARRAY<{Value.Descriptor.FullName}>,")/* b/348716298 */}
136-
ProtobufDurationArrayValue ARRAY<{Duration.Descriptor.FullName}>,
137-
ProtobufRectangleArrayValue ARRAY<{Rectangle.Descriptor.FullName}>
138-
{EmptyOnEmulator($", ProtobufPersonArrayValue ARRAY<{Person.Descriptor.FullName}>")/* b/348716298 */}
139-
{EmptyOnEmulator($", ProtobufValueWrapperArrayValue ARRAY<{ValueWrapper.Descriptor.FullName}>")/* b/348716298 */}
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}>
140140
) PRIMARY KEY(K)");
141141

142142
private string EmptyOnEmulator(string text) => RunningOnEmulator ? "" : text;

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

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ public BindingTests(SpannerDatabaseFixture fixture) =>
6060
SpannerDbType.Bytes,
6161
SpannerDbType.FromClrType(typeof(Duration)),
6262
SpannerDbType.FromClrType(typeof(Rectangle)),
63+
SpannerDbType.FromClrType(typeof(Person)),
64+
SpannerDbType.FromClrType(typeof(ValueWrapper)),
6365
SpannerDbType.ArrayOf(SpannerDbType.Bool),
6466
SpannerDbType.ArrayOf(SpannerDbType.String),
6567
SpannerDbType.ArrayOf(SpannerDbType.Int64),
@@ -69,34 +71,37 @@ public BindingTests(SpannerDatabaseFixture fixture) =>
6971
SpannerDbType.ArrayOf(SpannerDbType.Date),
7072
SpannerDbType.ArrayOf(SpannerDbType.Bytes),
7173
SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(Duration))),
72-
SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(Rectangle)))
74+
SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(Rectangle))),
75+
SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(Person))),
76+
SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(ValueWrapper))),
77+
SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(Value))),
7378
};
7479

7580
// These SpannerDbTypes are unsupported on emulator.
76-
public static TheoryData<SpannerDbType> BindUnsupportedNullData { get; } = new TheoryData<SpannerDbType>
81+
public static TheoryData<SpannerDbType> BindEmulatorUnsupportedNullData { get; } = new TheoryData<SpannerDbType>
7782
{
7883
SpannerDbType.Float32,
7984
SpannerDbType.ArrayOf(SpannerDbType.Float32),
8085
SpannerDbType.Json,
8186
SpannerDbType.ArrayOf(SpannerDbType.Json),
82-
// b/348716298
83-
SpannerDbType.FromClrType(typeof(Person)),
84-
SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(Person))),
85-
SpannerDbType.FromClrType(typeof(ValueWrapper)),
86-
SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(ValueWrapper))),
87-
SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(Value))),
88-
// b/348716298 Makes it unsupported in the emulator
87+
};
88+
89+
// These SpannerDbTypes are unsupported on production.
90+
public static TheoryData<SpannerDbType> BindProductionUnsupportedNullData { get; } = new TheoryData<SpannerDbType>
91+
{
8992
// b/348711708 Makes it unsupported in production
90-
// SpannerDbType.FromClrType(typeof(Value)),
93+
SpannerDbType.FromClrType(typeof(Value)),
9194
};
9295

9396
// TODO: xUnit v3 supports traits for DataAttributes. Use that instead of Skip when we migrate.
9497
[SkippableTheory]
9598
[MemberData(nameof(BindNullData))]
96-
[MemberData(nameof(BindUnsupportedNullData))]
99+
[MemberData(nameof(BindEmulatorUnsupportedNullData))]
100+
[MemberData(nameof(BindProductionUnsupportedNullData))]
97101
public async Task BindNull(SpannerDbType parameterType)
98102
{
99103
MaybeSkipIfOnEmulator(parameterType);
104+
MaybeSkipIfOnProduction(parameterType);
100105
using var connection = _fixture.GetConnection();
101106
using var cmd = connection.CreateSelectCommand("SELECT @v");
102107
cmd.Parameters.Add("v", parameterType, null);
@@ -143,6 +148,7 @@ internal static async Task AssertNotNull<T>(SpannerDataReader reader, T value, F
143148

144149
private async Task TestBindNonNull<T>(SpannerDbType parameterType, T value, Func<SpannerDataReader, T> typeSpecificReader = null)
145150
{
151+
MaybeSkipIfOnProduction(parameterType);
146152
using var connection = _fixture.GetConnection();
147153
using var cmd = connection.CreateSelectCommand("SELECT @v");
148154
cmd.Parameters.Add("v", parameterType, value);
@@ -306,21 +312,18 @@ public async Task BindJsonEmptyArray() => await TestBindNonNull(
306312
SpannerDbType.ArrayOf(SpannerDbType.Json),
307313
new string[] { });
308314

309-
[Fact(Skip = "b/348711708 makes it unsupported in production")]
310-
[Trait(Constants.SupportedOnEmulator, Constants.No)] // b/348716298 makes it unsupported by the emulator
315+
[SkippableFact] //"b/348711708
311316
public async Task BindProtobufValue() => await TestBindNonNull(
312317
SpannerDbType.FromClrType(typeof(Value)),
313318
Value.ForString("Hello"),
314319
r => r.GetFieldValue<Value>(0));
315320

316321
[Fact]
317-
[Trait(Constants.SupportedOnEmulator, Constants.No)] // b/348716298
318322
public async Task BindProtobufValueArray() => await TestBindNonNull(
319323
SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(Value))),
320324
new Value[] { Value.ForNumber(10), null, Value.ForString("Hello world") });
321325

322326
[Fact]
323-
[Trait(Constants.SupportedOnEmulator, Constants.No)] // b/348716298
324327
public async Task BindProtobufValueEmptyArray() => await TestBindNonNull(
325328
SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(Value))),
326329
new Value[] { });
@@ -356,41 +359,39 @@ public async Task BindProtobufRectangleEmptyArray() => await TestBindNonNull(
356359
new Rectangle[] { });
357360

358361
[Fact]
359-
[Trait(Constants.SupportedOnEmulator, Constants.No)] // b/348716298
360362
public async Task BindProtobufPerson() => await TestBindNonNull(
361363
SpannerDbType.FromClrType(typeof(Person)), testPerson, r => r.GetFieldValue<Person>(0));
362364

363365
[Fact]
364-
[Trait(Constants.SupportedOnEmulator, Constants.No)] // b/348716298
365366
public async Task BindProtobufPersonArray() => await TestBindNonNull(
366367
SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(Person))),
367368
new Person[] { testPerson, null, new Person() });
368369

369370
[Fact]
370-
[Trait(Constants.SupportedOnEmulator, Constants.No)] // b/348716298
371371
public async Task BindProtobufPersonEmptyArray() => await TestBindNonNull(
372372
SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(Person))),
373373
new Person[] { });
374374

375375
[Fact]
376-
[Trait(Constants.SupportedOnEmulator, Constants.No)] // b/348716298
377376
public async Task BindProtobufValueWrapper() => await TestBindNonNull(
378377
SpannerDbType.FromClrType(typeof(ValueWrapper)), testValueWrapper, r => r.GetFieldValue<ValueWrapper>(0));
379378

380379
[Fact]
381-
[Trait(Constants.SupportedOnEmulator, Constants.No)] // b/348716298
382380
public async Task BindProtobufValueWrapperArray() => await TestBindNonNull(
383381
SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(ValueWrapper))),
384382
new ValueWrapper[] { testValueWrapper, null, new ValueWrapper() });
385383

386384
[Fact]
387-
[Trait(Constants.SupportedOnEmulator, Constants.No)] // b/348716298
388385
public async Task BindProtobufValueWrapperEmptyArray() => await TestBindNonNull(
389386
SpannerDbType.ArrayOf(SpannerDbType.FromClrType(typeof(ValueWrapper))),
390387
new ValueWrapper[] { });
391388

392389
private void MaybeSkipIfOnEmulator(SpannerDbType spannerDbType) =>
393-
Skip.If(_fixture.RunningOnEmulator && BindUnsupportedNullData.Any<SpannerDbType>(spannerDbType.Equals),
390+
Skip.If(_fixture.RunningOnEmulator && BindEmulatorUnsupportedNullData.Any<SpannerDbType>(spannerDbType.Equals),
394391
$"The emulator does not support {spannerDbType}.");
392+
393+
private void MaybeSkipIfOnProduction(SpannerDbType spannerDbType) =>
394+
Skip.If(!_fixture.RunningOnEmulator && BindProductionUnsupportedNullData.Any<SpannerDbType>(spannerDbType.Equals),
395+
$"Production does not support {spannerDbType}.");
395396
}
396397
}

0 commit comments

Comments
 (0)