mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-02-16 18:47:57 -05:00
Fix batch parser test (#239)
* fixed batch parser test * fix batch parser test * fix batch parser test * fixed baseline tests for parser and fixed trace output logic * Update RunEnvironmentInfo.cs * checking error logs on AppVeyor * checking error logs on app veyor * changed file reading encoding * adding logs to app veyor build * changed encoding of baseline files * added error logs for app veyor * changed error logs for app veyor * changed how file stream works in batch parser tests * changed baseline and testscript encodings * cleaned code for necessary batch parser tests
This commit is contained in:
@@ -8,10 +8,10 @@ using System.Globalization;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Microsoft.SqlTools.ServiceLayer.BatchParser;
|
using Microsoft.SqlTools.ServiceLayer.BatchParser;
|
||||||
using Microsoft.SqlTools.ServiceLayer.QueryExecution;
|
|
||||||
using Microsoft.SqlTools.ServiceLayer.Test.Common;
|
using Microsoft.SqlTools.ServiceLayer.Test.Common;
|
||||||
using Microsoft.SqlTools.ServiceLayer.Test.Common.Baselined;
|
using Microsoft.SqlTools.ServiceLayer.Test.Common.Baselined;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
using Microsoft.SqlTools.ServiceLayer.QueryExecution;
|
||||||
|
|
||||||
namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.BatchParser
|
namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.BatchParser
|
||||||
{
|
{
|
||||||
@@ -27,7 +27,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.BatchParser
|
|||||||
public void InitializeTest()
|
public void InitializeTest()
|
||||||
{
|
{
|
||||||
CategoryName = "BatchParser";
|
CategoryName = "BatchParser";
|
||||||
this.TraceOutputDirectory = RunEnvironmentInfo.GetTestDataLocation();
|
this.TraceOutputDirectory = RunEnvironmentInfo.GetTraceOutputLocation();
|
||||||
TestInitialize();
|
TestInitialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,22 +39,36 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.BatchParser
|
|||||||
|
|
||||||
TestCommandHandler handler = new TestCommandHandler(output);
|
TestCommandHandler handler = new TestCommandHandler(output);
|
||||||
IVariableResolver resolver = new TestVariableResolver(new StringBuilder());
|
IVariableResolver resolver = new TestVariableResolver(new StringBuilder());
|
||||||
Parser p = new Parser(
|
using (Parser p = new Parser(
|
||||||
handler,
|
handler,
|
||||||
resolver,
|
resolver,
|
||||||
new StringReader(script),
|
new StringReader(script),
|
||||||
"test");
|
"test"))
|
||||||
p.ThrowOnUnresolvedVariable = true;
|
{
|
||||||
|
p.ThrowOnUnresolvedVariable = true;
|
||||||
|
handler.SetParser(p);
|
||||||
|
|
||||||
handler.SetParser(p);
|
Assert.Throws<BatchParserException>(() => p.Parse());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Assert.Throws<BatchParserException>(() => p.Parse());
|
private static Stream GenerateStreamFromString(string s)
|
||||||
|
{
|
||||||
|
MemoryStream stream = new MemoryStream();
|
||||||
|
StreamWriter writer = new StreamWriter(stream);
|
||||||
|
writer.Write(s);
|
||||||
|
writer.Flush();
|
||||||
|
stream.Position = 0;
|
||||||
|
return stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void TokenizeWithLexer(string filename, StringBuilder output)
|
public void TokenizeWithLexer(string filename, StringBuilder output)
|
||||||
{
|
{
|
||||||
|
// Create a new file by changing CRLFs to LFs and generate a new steam
|
||||||
using (Lexer lexer = new Lexer(new StreamReader(File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Read)), filename))
|
// or the tokens generated by the lexer will always have off by one errors
|
||||||
|
string input = File.ReadAllText(filename).Replace("\r\n", "\n");
|
||||||
|
var inputStream = GenerateStreamFromString(input);
|
||||||
|
using (Lexer lexer = new Lexer(new StreamReader(inputStream), filename))
|
||||||
{
|
{
|
||||||
|
|
||||||
string inputText = File.ReadAllText(filename);
|
string inputText = File.ReadAllText(filename);
|
||||||
@@ -71,9 +85,9 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.BatchParser
|
|||||||
{
|
{
|
||||||
lexer.ConsumeToken();
|
lexer.ConsumeToken();
|
||||||
token = lexer.CurrentToken;
|
token = lexer.CurrentToken;
|
||||||
roundtripTextBuilder.Append(token.Text);
|
roundtripTextBuilder.Append(token.Text.Replace("\r\n", "\n"));
|
||||||
outputBuilder.AppendLine(GetTokenString(token));
|
outputBuilder.AppendLine(GetTokenString(token));
|
||||||
tokenizedInput.Append('[').Append(GetTokenCode(token.TokenType)).Append(':').Append(token.Text).Append(']');
|
tokenizedInput.Append('[').Append(GetTokenCode(token.TokenType)).Append(':').Append(token.Text.Replace("\r\n", "\n")).Append(']');
|
||||||
} while (token.TokenType != LexerTokenType.Eof);
|
} while (token.TokenType != LexerTokenType.Eof);
|
||||||
}
|
}
|
||||||
catch (BatchParserException ex)
|
catch (BatchParserException ex)
|
||||||
@@ -91,7 +105,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.BatchParser
|
|||||||
if (lexerError == false)
|
if (lexerError == false)
|
||||||
{
|
{
|
||||||
// Verify that all text from tokens can be recombined into original string
|
// Verify that all text from tokens can be recombined into original string
|
||||||
Assert.Equal<string>(inputText, roundtripTextBuilder.ToString().Replace("\r\n", "\n"));
|
Assert.Equal<string>(inputText, roundtripTextBuilder.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -113,9 +127,18 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.BatchParser
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void CopyToOutput(string sourceDirectory, string filename)
|
||||||
|
{
|
||||||
|
File.Copy(Path.Combine(sourceDirectory, filename), filename, true);
|
||||||
|
FileUtilities.SetFileReadWrite(filename);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void BatchParserTest()
|
public void BatchParserTest()
|
||||||
{
|
{
|
||||||
|
CopyToOutput(FilesLocation, "TS-err-cycle1.txt");
|
||||||
|
CopyToOutput(FilesLocation, "cycle2.txt");
|
||||||
|
|
||||||
Start("err-blockComment");
|
Start("err-blockComment");
|
||||||
Start("err-blockComment2");
|
Start("err-blockComment2");
|
||||||
Start("err-varDefinition");
|
Start("err-varDefinition");
|
||||||
@@ -151,17 +174,22 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.BatchParser
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// Create a new file by changing CRLFs to LFs and generate a new steam
|
||||||
|
// or the tokens generated by the lexer will always have off by one errors
|
||||||
TestCommandHandler commandHandler = new TestCommandHandler(output);
|
TestCommandHandler commandHandler = new TestCommandHandler(output);
|
||||||
|
string input = File.ReadAllText(filename).Replace("\r\n", "\n");
|
||||||
|
var inputStream = GenerateStreamFromString(input);
|
||||||
|
StreamReader streamReader = new StreamReader(inputStream);
|
||||||
|
|
||||||
Parser parser = new Parser(
|
using (Parser parser = new Parser(
|
||||||
commandHandler,
|
commandHandler,
|
||||||
new TestVariableResolver(output),
|
new TestVariableResolver(output),
|
||||||
new StreamReader(File.Open(filename, FileMode.Open)),
|
streamReader,
|
||||||
filename);
|
filename))
|
||||||
|
{
|
||||||
commandHandler.SetParser(parser);
|
commandHandler.SetParser(parser);
|
||||||
|
parser.Parse();
|
||||||
parser.Parse();
|
}
|
||||||
}
|
}
|
||||||
catch (BatchParserException ex)
|
catch (BatchParserException ex)
|
||||||
{
|
{
|
||||||
@@ -185,7 +213,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.BatchParser
|
|||||||
string tokenText = token.Text;
|
string tokenText = token.Text;
|
||||||
if (tokenText != null)
|
if (tokenText != null)
|
||||||
{
|
{
|
||||||
tokenText = tokenText.Replace("\n", "\\n").Replace("\r", "\\r").Replace("\t", "\\t");
|
tokenText = tokenText.Replace("\r\n", "\\n").Replace("\n", "\\n").Replace("\r", "\\r").Replace("\t", "\\t");
|
||||||
}
|
}
|
||||||
string tokenFilename = token.Filename;
|
string tokenFilename = token.Filename;
|
||||||
tokenFilename = GetFilenameOnly(tokenFilename);
|
tokenFilename = GetFilenameOnly(tokenFilename);
|
||||||
@@ -216,14 +244,14 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.BatchParser
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
baseline = GetFileContent(baselineFilename);
|
baseline = GetFileContent(baselineFilename).Replace("\r\n", "\n");
|
||||||
}
|
}
|
||||||
catch (FileNotFoundException)
|
catch (FileNotFoundException)
|
||||||
{
|
{
|
||||||
baseline = string.Empty;
|
baseline = string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
string outputString = output.ToString();
|
string outputString = output.ToString().Replace("\r\n", "\n");
|
||||||
|
|
||||||
Console.WriteLine(baselineFilename);
|
Console.WriteLine(baselineFilename);
|
||||||
|
|
||||||
|
|||||||
@@ -360,7 +360,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.Common.Baselined
|
|||||||
{
|
{
|
||||||
Trace.WriteLine(string.Format("GetFileContent for [{0}]", Path.GetFullPath(path)));
|
Trace.WriteLine(string.Format("GetFileContent for [{0}]", Path.GetFullPath(path)));
|
||||||
|
|
||||||
using (StreamReader sr = new StreamReader(File.Open(path, FileMode.Open), Encoding.Unicode))
|
using (StreamReader sr = new StreamReader(File.Open(path, FileMode.Open), Encoding.UTF8))
|
||||||
{
|
{
|
||||||
return sr.ReadToEnd();
|
return sr.ReadToEnd();
|
||||||
}
|
}
|
||||||
@@ -406,13 +406,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.Common.Baselined
|
|||||||
/// <param name="text">The content for the trace file</param>
|
/// <param name="text">The content for the trace file</param>
|
||||||
public void WriteTraceFile(string traceFile, string text)
|
public void WriteTraceFile(string traceFile, string text)
|
||||||
{
|
{
|
||||||
Stream traceStream = GetStreamFromString(traceFile);
|
File.WriteAllText(traceFile, text);
|
||||||
using (StreamWriter sw = new StreamWriter(traceStream, Encoding.Unicode))
|
|
||||||
{
|
|
||||||
sw.Write(text);
|
|
||||||
sw.Flush();
|
|
||||||
sw.Dispose();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.Common
|
|||||||
public class RunEnvironmentInfo
|
public class RunEnvironmentInfo
|
||||||
{
|
{
|
||||||
private static string cachedTestFolderPath;
|
private static string cachedTestFolderPath;
|
||||||
|
private static string cachedTraceFolderPath;
|
||||||
|
|
||||||
public static bool IsLabMode()
|
public static bool IsLabMode()
|
||||||
{
|
{
|
||||||
@@ -64,10 +65,48 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.Common
|
|||||||
}
|
}
|
||||||
return testFolderPath;
|
return testFolderPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Location of all trace data (expected output)
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The full path to the trace data directory</returns>
|
||||||
|
public static string GetTraceOutputLocation()
|
||||||
|
{
|
||||||
|
string traceFolderPath;
|
||||||
|
string testPath = @"test\Microsoft.SqlTools.ServiceLayer.Test.Common\Trace";
|
||||||
|
string projectPath = Environment.GetEnvironmentVariable(Constants.ProjectPath);
|
||||||
|
|
||||||
|
if (projectPath != null)
|
||||||
|
{
|
||||||
|
traceFolderPath = Path.Combine(projectPath, testPath);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (cachedTraceFolderPath != null)
|
||||||
|
{
|
||||||
|
traceFolderPath = cachedTraceFolderPath;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// We are running tests locally, which means we expect to be running inside the bin\debug\netcoreapp directory
|
||||||
|
// Test Files should be found at the root of the project so go back the necessary number of directories for this
|
||||||
|
// to be found. We are manually specifying the testFolderPath here for clarity on where to expect this
|
||||||
|
|
||||||
|
string assemblyDir = Path.GetDirectoryName(typeof(Scripts).GetTypeInfo().Assembly.Location);
|
||||||
|
string defaultPath = Path.Combine(assemblyDir, GoUpNDirectories(4));
|
||||||
|
traceFolderPath = Path.Combine(defaultPath, "Microsoft.SqlTools.ServiceLayer.Test.Common", "TestData");
|
||||||
|
|
||||||
|
cachedTraceFolderPath = traceFolderPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return traceFolderPath;
|
||||||
|
}
|
||||||
|
|
||||||
private static string GoUpNDirectories(int n)
|
private static string GoUpNDirectories(int n)
|
||||||
{
|
{
|
||||||
string up = ".." + (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "\\" : "/");
|
string up = ".." + (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "\\" : "/");
|
||||||
return string.Concat(Enumerable.Repeat(up, n));
|
return string.Concat(Enumerable.Repeat(up, n));
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,4 +1,4 @@
|
|||||||
GO 2
|
GO 2
|
||||||
BEGIN
|
BEGIN
|
||||||
:r input-2.txt
|
:r input-2.txt
|
||||||
:r "input-2.txt"
|
:r "input-2.txt"
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.Common
|
|||||||
}
|
}
|
||||||
TestServiceProvider.hasInitServices = true;
|
TestServiceProvider.hasInitServices = true;
|
||||||
|
|
||||||
const string hostName = "SQ Tools Test Service Host";
|
const string hostName = "SQL Tools Test Service Host";
|
||||||
const string hostProfileId = "SQLToolsTestService";
|
const string hostProfileId = "SQLToolsTestService";
|
||||||
Version hostVersion = new Version(1, 0);
|
Version hostVersion = new Version(1, 0);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user