提交 ea44dc5e 编写于 作者: A Andy Gocke 提交者: GitHub

Add blanket exception handling in DesktopStrongNameProvider (#14414)

上级 387d373d
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.CodeAnalysis.CSharp.Test.Utilities;
using Roslyn.Test.Utilities;
using System;
using System.Collections.Immutable;
using System.IO;
using Xunit;
......@@ -41,6 +43,84 @@ internal override Stream CreateInputStream()
_underlyingProvider.SignAssembly(keys, inputStream, outputStream);
}
private class TestDesktopStrongNameProvider : DesktopStrongNameProvider
{
private readonly Func<string, byte[]> m_readAllBytes;
internal delegate void ReadKeysFromContainerDelegate(
string keyContainer,
out ImmutableArray<byte> publicKey);
private readonly ReadKeysFromContainerDelegate m_readKeysFromContainer;
public TestDesktopStrongNameProvider(
Func<string, byte[]> readAllBytes = null,
ReadKeysFromContainerDelegate readKeysFromContainer = null)
{
m_readAllBytes = readAllBytes;
m_readKeysFromContainer = readKeysFromContainer;
}
internal override byte[] ReadAllBytes(string fullPath) =>
m_readAllBytes != null ? m_readAllBytes(fullPath)
: base.ReadAllBytes(fullPath);
internal override void ReadKeysFromContainer(string keyContainer, out ImmutableArray<byte> publicKey)
{
if (m_readKeysFromContainer != null)
{
m_readKeysFromContainer(keyContainer, out publicKey);
}
else
{
base.ReadKeysFromContainer(keyContainer, out publicKey);
}
}
}
[Fact]
[WorkItem(209695, "https://devdiv.visualstudio.com/DevDiv/_workitems?id=209694")]
public void ExceptionInReadAllBytes()
{
var ex = new Exception("Crazy exception you could never have predicted!");
var provider = new TestDesktopStrongNameProvider((_) =>
{
throw ex;
});
var src = @"class C {}";
var keyFile = Temp.CreateFile().WriteAllBytes(TestResources.General.snKey).Path;
var options = TestOptions.DebugDll
.WithStrongNameProvider(provider)
.WithCryptoKeyFile(keyFile);
var comp = CreateCompilationWithMscorlib(src, options: options);
comp.VerifyEmitDiagnostics(
// error CS7027: Error signing output with public key from file '{0}' -- '{1}'
Diagnostic(ErrorCode.ERR_PublicKeyFileFailure).WithArguments(keyFile, ex.Message).WithLocation(1, 1));
}
[Fact]
public void ExceptionInReadKeysFromContainer()
{
var ex = new Exception("Crazy exception you could never have predicted!");
var provider = new TestDesktopStrongNameProvider(readKeysFromContainer:
(string _1, out ImmutableArray<byte> _2) =>
{
throw ex;
});
var src = @"class C {}";
var options = TestOptions.DebugDll
.WithStrongNameProvider(provider)
.WithCryptoKeyContainer("RoslynTestContainer");
var comp = CreateCompilationWithMscorlib(src, options: options);
comp.VerifyEmitDiagnostics(
// error CS7028: Error signing output with public key from container 'RoslynTestContainer' -- Crazy exception you could never have predicted!
Diagnostic(ErrorCode.ERR_PublicKeyContainerFailure).WithArguments("RoslynTestContainer", ex.Message).WithLocation(1, 1));
}
[Fact]
public void BadInputStream()
{
......
......@@ -213,7 +213,7 @@ internal override StrongNameKeys CreateKeys(string keyFilePath, string keyContai
var fileContent = ImmutableArray.Create(ReadAllBytes(resolvedKeyFile));
return StrongNameKeys.CreateHelper(fileContent, keyFilePath);
}
catch (IOException ex)
catch (Exception ex)
{
return new StrongNameKeys(StrongNameKeys.GetKeyFileError(messageProvider, keyFilePath, ex.Message));
}
......@@ -232,7 +232,7 @@ internal override StrongNameKeys CreateKeys(string keyFilePath, string keyContai
return new StrongNameKeys(StrongNameKeys.GetContainerError(messageProvider, keyContainerName,
new CodeAnalysisResourcesLocalizableErrorArgument(nameof(CodeAnalysisResources.AssemblySigningNotSupported))));
}
catch (IOException ex)
catch (Exception ex)
{
return new StrongNameKeys(StrongNameKeys.GetContainerError(messageProvider, keyContainerName, ex.Message));
}
......@@ -241,7 +241,7 @@ internal override StrongNameKeys CreateKeys(string keyFilePath, string keyContai
return new StrongNameKeys(keyPair, publicKey, container, keyFilePath);
}
private void ReadKeysFromContainer(string keyContainer, out ImmutableArray<byte> publicKey)
internal virtual void ReadKeysFromContainer(string keyContainer, out ImmutableArray<byte> publicKey)
{
try
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册