Skip to content

Commit 44cfedd

Browse files
Enhance Test Coverage for JSON datatype support (#3062)
Enhanced BCP tests to transfer multiple rows Added SqlDataReader specific API tests Added scenario of read MARS involving json datatype Parameterized jsonArrayElements and rows for JsonBulkCopyTests
1 parent 9da4916 commit 44cfedd

File tree

2 files changed

+212
-84
lines changed

2 files changed

+212
-84
lines changed

src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonBulkCopyTest.cs

Lines changed: 87 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,51 @@
22
using System.Collections.Generic;
33
using System.Data;
44
using System.IO;
5-
using System.Linq;
6-
using System.Text;
75
using System.Threading.Tasks;
86
using Newtonsoft.Json.Linq;
97
using Newtonsoft.Json;
108
using Xunit.Abstractions;
119
using Xunit;
10+
using System.Collections;
1211

1312
namespace Microsoft.Data.SqlClient.ManualTesting.Tests.SQL.JsonTest
1413
{
14+
public class JsonBulkCopyTestData : IEnumerable<object[]>
15+
{
16+
public IEnumerator<object[]> GetEnumerator()
17+
{
18+
yield return new object[] { CommandBehavior.Default, false, 300, 100 };
19+
yield return new object[] { CommandBehavior.Default, true, 300, 100 };
20+
yield return new object[] { CommandBehavior.SequentialAccess, false, 300, 100 };
21+
yield return new object[] { CommandBehavior.SequentialAccess, true, 300, 100 };
22+
}
23+
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
24+
}
25+
1526
public class JsonBulkCopyTest
1627
{
1728
private readonly ITestOutputHelper _output;
18-
private static readonly string _jsonFile = "randomRecords.json";
19-
private static readonly string _outputFile = "serverRecords.json";
29+
private static readonly string _generatedJsonFile = DataTestUtility.GenerateRandomCharacters("randomRecords");
30+
private static readonly string _outputFile = DataTestUtility.GenerateRandomCharacters("serverResults");
31+
private static readonly string _sourceTableName = DataTestUtility.GenerateObjectName();
32+
private static readonly string _destinationTableName = DataTestUtility.GenerateObjectName();
2033

2134
public JsonBulkCopyTest(ITestOutputHelper output)
2235
{
2336
_output = output;
2437
}
2538

26-
private void PopulateData(int noOfRecords)
39+
private void PopulateData(int noOfRecords, int rows)
2740
{
2841
using (SqlConnection connection = new SqlConnection(DataTestUtility.TCPConnectionString))
2942
{
30-
DataTestUtility.CreateTable(connection, "jsonTab", "(data json)");
31-
DataTestUtility.CreateTable(connection, "jsonTabCopy", "(data json)");
32-
GenerateJsonFile(50000, _jsonFile);
33-
StreamJsonFileToServer(connection);
43+
DataTestUtility.CreateTable(connection, _sourceTableName, "(data json)");
44+
DataTestUtility.CreateTable(connection, _destinationTableName, "(data json)");
45+
GenerateJsonFile(noOfRecords, _generatedJsonFile);
46+
while (rows-- > 0)
47+
{
48+
StreamJsonFileToServer(connection);
49+
}
3450
}
3551
}
3652

@@ -59,7 +75,7 @@ private void GenerateJsonFile(int noOfRecords, string filename)
5975

6076
private void CompareJsonFiles()
6177
{
62-
using (var stream1 = File.OpenText(_jsonFile))
78+
using (var stream1 = File.OpenText(_generatedJsonFile))
6379
using (var stream2 = File.OpenText(_outputFile))
6480
using (var reader1 = new JsonTextReader(stream1))
6581
using (var reader2 = new JsonTextReader(stream2))
@@ -70,14 +86,14 @@ private void CompareJsonFiles()
7086
}
7187
}
7288

73-
private void PrintJsonDataToFile(SqlConnection connection)
89+
private void PrintJsonDataToFileAndCompare(SqlConnection connection)
7490
{
75-
DeleteFile(_outputFile);
76-
using (SqlCommand command = new SqlCommand("SELECT [data] FROM [jsonTabCopy]", connection))
91+
try
7792
{
78-
using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess))
93+
DeleteFile(_outputFile);
94+
using (SqlCommand command = new SqlCommand("SELECT [data] FROM [" + _destinationTableName + "]", connection))
7995
{
80-
using (StreamWriter sw = new StreamWriter(_outputFile))
96+
using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess))
8197
{
8298
while (reader.Read())
8399
{
@@ -86,28 +102,36 @@ private void PrintJsonDataToFile(SqlConnection connection)
86102

87103
using (TextReader data = reader.GetTextReader(0))
88104
{
89-
do
105+
using (StreamWriter sw = new StreamWriter(_outputFile))
90106
{
91-
charsRead = data.Read(buffer, 0, buffer.Length);
92-
sw.Write(buffer, 0, charsRead);
107+
do
108+
{
109+
charsRead = data.Read(buffer, 0, buffer.Length);
110+
sw.Write(buffer, 0, charsRead);
93111

94-
} while (charsRead > 0);
112+
} while (charsRead > 0);
113+
}
95114
}
96-
_output.WriteLine("Output written to " + _outputFile);
115+
CompareJsonFiles();
97116
}
98117
}
99118
}
100119
}
120+
finally
121+
{
122+
DeleteFile(_outputFile);
123+
}
124+
101125
}
102126

103-
private async Task PrintJsonDataToFileAsync(SqlConnection connection)
127+
private async Task PrintJsonDataToFileAndCompareAsync(SqlConnection connection)
104128
{
105-
DeleteFile(_outputFile);
106-
using (SqlCommand command = new SqlCommand("SELECT [data] FROM [jsonTab]", connection))
129+
try
107130
{
108-
using (SqlDataReader reader = await command.ExecuteReaderAsync(CommandBehavior.SequentialAccess))
131+
DeleteFile(_outputFile);
132+
using (SqlCommand command = new SqlCommand("SELECT [data] FROM [" + _destinationTableName + "]", connection))
109133
{
110-
using (StreamWriter sw = new StreamWriter(_outputFile))
134+
using (SqlDataReader reader = await command.ExecuteReaderAsync(CommandBehavior.SequentialAccess))
111135
{
112136
while (await reader.ReadAsync())
113137
{
@@ -116,25 +140,32 @@ private async Task PrintJsonDataToFileAsync(SqlConnection connection)
116140

117141
using (TextReader data = reader.GetTextReader(0))
118142
{
119-
do
143+
using (StreamWriter sw = new StreamWriter(_outputFile))
120144
{
121-
charsRead = await data.ReadAsync(buffer, 0, buffer.Length);
122-
await sw.WriteAsync(buffer, 0, charsRead);
145+
do
146+
{
147+
charsRead = await data.ReadAsync(buffer, 0, buffer.Length);
148+
await sw.WriteAsync(buffer, 0, charsRead);
123149

124-
} while (charsRead > 0);
150+
} while (charsRead > 0);
151+
}
125152
}
126-
_output.WriteLine("Output written to file " + _outputFile);
153+
CompareJsonFiles();
127154
}
128155
}
129156
}
130157
}
158+
finally
159+
{
160+
DeleteFile(_outputFile);
161+
}
131162
}
132163

133164
private void StreamJsonFileToServer(SqlConnection connection)
134165
{
135-
using (SqlCommand cmd = new SqlCommand("INSERT INTO [jsonTab] (data) VALUES (@jsondata)", connection))
166+
using (SqlCommand cmd = new SqlCommand("INSERT INTO [" + _sourceTableName + "] (data) VALUES (@jsondata)", connection))
136167
{
137-
using (StreamReader jsonFile = File.OpenText(_jsonFile))
168+
using (StreamReader jsonFile = File.OpenText(_generatedJsonFile))
138169
{
139170
cmd.Parameters.Add("@jsondata", Microsoft.Data.SqlDbTypeExtensions.Json, -1).Value = jsonFile;
140171
cmd.ExecuteNonQuery();
@@ -144,9 +175,9 @@ private void StreamJsonFileToServer(SqlConnection connection)
144175

145176
private async Task StreamJsonFileToServerAsync(SqlConnection connection)
146177
{
147-
using (SqlCommand cmd = new SqlCommand("INSERT INTO [jsonTab] (data) VALUES (@jsondata)", connection))
178+
using (SqlCommand cmd = new SqlCommand("INSERT INTO [" + _sourceTableName + "] (data) VALUES (@jsondata)", connection))
148179
{
149-
using (StreamReader jsonFile = File.OpenText(_jsonFile))
180+
using (StreamReader jsonFile = File.OpenText(_generatedJsonFile))
150181
{
151182
cmd.Parameters.Add("@jsondata", Microsoft.Data.SqlDbTypeExtensions.Json, -1).Value = jsonFile;
152183
await cmd.ExecuteNonQueryAsync();
@@ -162,23 +193,23 @@ private void DeleteFile(string filename)
162193
}
163194
}
164195

165-
private void BulkCopyData(CommandBehavior cb, bool enableStraming)
196+
private void BulkCopyData(CommandBehavior cb, bool enableStraming, int expectedTransferCount)
166197
{
167198
using (SqlConnection sourceConnection = new SqlConnection(DataTestUtility.TCPConnectionString))
168199
{
169200
sourceConnection.Open();
170-
SqlCommand commandRowCount = new SqlCommand("SELECT COUNT(*) FROM " + "dbo.jsonTabCopy;", sourceConnection);
201+
SqlCommand commandRowCount = new SqlCommand("SELECT COUNT(*) FROM " + _destinationTableName, sourceConnection);
171202
long countStart = System.Convert.ToInt32(commandRowCount.ExecuteScalar());
172203
_output.WriteLine("Starting row count = {0}", countStart);
173-
SqlCommand commandSourceData = new SqlCommand("SELECT data FROM dbo.jsonTab;", sourceConnection);
204+
SqlCommand commandSourceData = new SqlCommand("SELECT data FROM " + _sourceTableName, sourceConnection);
174205
SqlDataReader reader = commandSourceData.ExecuteReader(cb);
175206
using (SqlConnection destinationConnection = new SqlConnection(DataTestUtility.TCPConnectionString))
176207
{
177208
destinationConnection.Open();
178209
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection))
179210
{
180211
bulkCopy.EnableStreaming = enableStraming;
181-
bulkCopy.DestinationTableName = "dbo.jsonTabCopy";
212+
bulkCopy.DestinationTableName = _destinationTableName;
182213
try
183214
{
184215
bulkCopy.WriteToServer(reader);
@@ -195,27 +226,28 @@ private void BulkCopyData(CommandBehavior cb, bool enableStraming)
195226
long countEnd = System.Convert.ToInt32(commandRowCount.ExecuteScalar());
196227
_output.WriteLine("Ending row count = {0}", countEnd);
197228
_output.WriteLine("{0} rows were added.", countEnd - countStart);
229+
Assert.Equal(expectedTransferCount, countEnd - countStart);
198230
}
199231
}
200232
}
201233

202-
private async Task BulkCopyDataAsync(CommandBehavior cb, bool enableStraming)
234+
private async Task BulkCopyDataAsync(CommandBehavior cb, bool enableStraming, int expectedTransferCount)
203235
{
204236
using (SqlConnection sourceConnection = new SqlConnection(DataTestUtility.TCPConnectionString))
205237
{
206238
await sourceConnection.OpenAsync();
207-
SqlCommand commandRowCount = new SqlCommand("SELECT COUNT(*) FROM " + "dbo.jsonTabCopy;", sourceConnection);
239+
SqlCommand commandRowCount = new SqlCommand("SELECT COUNT(*) FROM " + _destinationTableName, sourceConnection);
208240
long countStart = System.Convert.ToInt32(await commandRowCount.ExecuteScalarAsync());
209241
_output.WriteLine("Starting row count = {0}", countStart);
210-
SqlCommand commandSourceData = new SqlCommand("SELECT data FROM dbo.jsonTab;", sourceConnection);
242+
SqlCommand commandSourceData = new SqlCommand("SELECT data FROM " + _sourceTableName, sourceConnection);
211243
SqlDataReader reader = await commandSourceData.ExecuteReaderAsync(cb);
212244
using (SqlConnection destinationConnection = new SqlConnection(DataTestUtility.TCPConnectionString))
213245
{
214246
await destinationConnection.OpenAsync();
215247
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection))
216248
{
217249
bulkCopy.EnableStreaming = enableStraming;
218-
bulkCopy.DestinationTableName = "dbo.jsonTabCopy";
250+
bulkCopy.DestinationTableName = _destinationTableName;
219251
try
220252
{
221253
await bulkCopy.WriteToServerAsync(reader);
@@ -232,44 +264,37 @@ private async Task BulkCopyDataAsync(CommandBehavior cb, bool enableStraming)
232264
long countEnd = System.Convert.ToInt32(await commandRowCount.ExecuteScalarAsync());
233265
_output.WriteLine("Ending row count = {0}", countEnd);
234266
_output.WriteLine("{0} rows were added.", countEnd - countStart);
267+
Assert.Equal(expectedTransferCount, countEnd - countStart);
235268
}
236269
}
237270
}
238271

239-
[InlineData(CommandBehavior.Default, false)]
240-
[InlineData(CommandBehavior.Default, true)]
241-
[InlineData(CommandBehavior.SequentialAccess, false)]
242-
[InlineData(CommandBehavior.SequentialAccess, true)]
243272
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.IsJsonSupported))]
244-
public void TestJsonBulkCopy(CommandBehavior cb, bool enableStraming)
273+
[ClassData(typeof(JsonBulkCopyTestData))]
274+
public void TestJsonBulkCopy(CommandBehavior cb, bool enableStraming, int jsonArrayElements, int rows)
245275
{
246-
PopulateData(10000);
276+
PopulateData(jsonArrayElements, rows);
247277
using (SqlConnection connection = new SqlConnection(DataTestUtility.TCPConnectionString))
248278
{
249-
BulkCopyData(cb, enableStraming);
279+
BulkCopyData(cb, enableStraming, rows);
250280
connection.Open();
251-
PrintJsonDataToFile(connection);
252-
CompareJsonFiles();
253-
DeleteFile(_jsonFile);
281+
PrintJsonDataToFileAndCompare(connection);
282+
DeleteFile(_generatedJsonFile);
254283
DeleteFile(_outputFile);
255284
}
256285
}
257286

258-
[InlineData(CommandBehavior.Default, false)]
259-
[InlineData(CommandBehavior.Default, true)]
260-
[InlineData(CommandBehavior.SequentialAccess, false)]
261-
[InlineData(CommandBehavior.SequentialAccess, true)]
262287
[ConditionalTheory(typeof(DataTestUtility), nameof(DataTestUtility.IsJsonSupported))]
263-
public async Task TestJsonBulkCopyAsync(CommandBehavior cb, bool enableStraming)
288+
[ClassData(typeof(JsonBulkCopyTestData))]
289+
public async Task TestJsonBulkCopyAsync(CommandBehavior cb, bool enableStraming, int jsonArrayElements, int rows)
264290
{
265-
PopulateData(10000);
291+
PopulateData(jsonArrayElements, rows);
266292
using (SqlConnection connection = new SqlConnection(DataTestUtility.TCPConnectionString))
267293
{
268-
await BulkCopyDataAsync(cb, enableStraming);
294+
await BulkCopyDataAsync(cb, enableStraming, rows);
269295
await connection.OpenAsync();
270-
await PrintJsonDataToFileAsync(connection);
271-
CompareJsonFiles();
272-
DeleteFile(_jsonFile);
296+
await PrintJsonDataToFileAndCompareAsync(connection);
297+
DeleteFile(_generatedJsonFile);
273298
DeleteFile(_outputFile);
274299
}
275300
}

0 commit comments

Comments
 (0)