문제

중간 신뢰로 실행되는 자동 테스트를 작성하고 완전한 신뢰가 필요한 경우 실패하고 싶습니다.

전체 신뢰 시나리오에서만 사용할 수있는 라이브러리를 작성하고 있으며 중간 신뢰로 실행하려는 코드가 잘 작동하는지 확인하고 싶습니다. 또한 완전한 신뢰가 필요한 수업을 변경하면 테스트가 실패 할 것임을 알고 싶을 경우.

다른 AppDomain을 만들고 Medium Trust Policylevel을로드하려고 시도했지만 Cross AppDomain 콜백을 실행하는 동안 항상 어셈블리에 오류가 발생하거나 그 종속성을로드 할 수 없습니다.

이것을 뽑는 방법이 있습니까?

업데이트: 기반 답장, 여기에 내가 가진 것이 있습니다. 테스트중인 수업은 MarshalbyRefobject를 확장해야합니다. 이것은 매우 제한적이지만 주변의 길은 보이지 않습니다.

using System;
using System.Reflection;
using System.Security;
using System.Security.Permissions;
using Xunit;

namespace PartialTrustTest
{
    [Serializable]
    public class ClassUnderTest : MarshalByRefObject
    {
        public void PartialTrustSuccess()
        {
            Console.WriteLine( "partial trust success #1" );
        }

        public void PartialTrustFailure()
        {
            FieldInfo fi = typeof (Int32).GetField( "m_value", BindingFlags.Instance | BindingFlags.NonPublic );
            object value = fi.GetValue( 1 );
            Console.WriteLine( "value: {0}", value );
        }
    }

    public class Test
    {
        [Fact]
        public void MediumTrustWithExternalClass()
        {
            // ClassUnderTest must extend MarshalByRefObject
            var classUnderTest = MediumTrustContext.Create<ClassUnderTest>();

            classUnderTest.PartialTrustSuccess();
            Assert.Throws<FieldAccessException>( classUnderTest.PartialTrustFailure );
        }
    }

    internal static class MediumTrustContext
    {
        public static T Create<T>()
        {
            AppDomain appDomain = CreatePartialTrustDomain();
            var t = (T) appDomain.CreateInstanceAndUnwrap( typeof (T).Assembly.FullName, typeof (T).FullName );
            return t;
        }

        public static AppDomain CreatePartialTrustDomain()
        {
            var setup = new AppDomainSetup {ApplicationBase = AppDomain.CurrentDomain.BaseDirectory};
            var permissions = new PermissionSet( null );
            permissions.AddPermission( new SecurityPermission( SecurityPermissionFlag.Execution ) );
            permissions.AddPermission( new ReflectionPermission( ReflectionPermissionFlag.RestrictedMemberAccess ) );
            return AppDomain.CreateDomain( "Partial Trust AppDomain: " + DateTime.Now.Ticks, null, setup, permissions );
        }
    }
}
도움이 되었습니까?

해결책

방금 제목의 기사를 게시했습니다 xunit.net을 사용한 부분 신뢰 테스트. 엔티티 프레임 워크 팀에서 사용하는 xunit.net 기반 프레임 워크를 부분 신뢰 하에서 코드를 행사하기 위해 자세히 설명합니다.

다음은 사용법의 예입니다.

public class SomeTests : MarshalByRefObject
{
    [PartialTrustFact]
    public void Partial_trust_test1()
    {
        // Runs in medium trust
    }
}

// Or...

[PartialTrustFixture]
public class MoreTests : MarshalByRefObject
{
    [Fact]
    public void Another_partial_trust_test()
    {
        // Runs in medium trust
    }
}

다른 팁

뻔뻔스럽게 도난당했습니다 부분 신뢰 샌드 박스를 주최하는 방법 - #7, 그러나 단순한 킥을 위해 F#에서 (간단한 테스트 케이스와 함께) 상환 :-)

open System
open System.Reflection
open System.Security
open System.Security.Permissions
open System.Security.Policy

type Program() =
    inherit System.MarshalByRefObject()
    member x.PartialTrustSuccess() =
        Console.WriteLine("foo")
    member x.PartialTrustFailure() =
        let field = typeof<Int32>.GetField("m_value", BindingFlags.Instance ||| BindingFlags.NonPublic)
        let value = field.GetValue(1)
        Console.WriteLine("value: {0}", value)

[<EntryPoint>]
let main _ =
    let appDomain =
        let setup = AppDomainSetup(ApplicationBase = AppDomain.CurrentDomain.BaseDirectory)
        let permissions = PermissionSet(null)
        permissions.AddPermission(SecurityPermission(SecurityPermissionFlag.Execution)) |> ignore
        permissions.AddPermission(ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess)) |> ignore
        AppDomain.CreateDomain("Partial Trust AppDomain", null, setup, permissions)

    let program = appDomain.CreateInstanceAndUnwrap(
                      typeof<Program>.Assembly.FullName,
                      typeof<Program>.FullName) :?> Program

    program.PartialTrustSuccess()

    try
        program.PartialTrustFailure()
        Console.Error.WriteLine("partial trust test failed")
    with
        | :? FieldAccessException -> ()

    0

및 C# 버전 :

using System;
using System.Reflection;
using System.Security;
using System.Security.Permissions;
using System.Security.Policy;

namespace PartialTrustTest
{
    internal class Program : MarshalByRefObject
    {
        public void PartialTrustSuccess()
        {
            Console.WriteLine("partial trust success #1");
        }

        public void PartialTrustFailure()
        {
            FieldInfo fi = typeof(Int32).GetField("m_value", BindingFlags.Instance | BindingFlags.NonPublic);
            object value = fi.GetValue(1);
            Console.WriteLine("value: {0}", value);
        }

        private static AppDomain CreatePartialTrustDomain()
        {
            AppDomainSetup setup = new AppDomainSetup() { ApplicationBase = AppDomain.CurrentDomain.BaseDirectory };
            PermissionSet permissions = new PermissionSet(null);
            permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
            permissions.AddPermission(new ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess));
            return AppDomain.CreateDomain("Partial Trust AppDomain", null, setup, permissions);
        }

        static void Main(string[] args)
        {
            AppDomain appDomain = CreatePartialTrustDomain();

            Program program = (Program)appDomain.CreateInstanceAndUnwrap(
                typeof(Program).Assembly.FullName,
                typeof(Program).FullName);

            program.PartialTrustSuccess();

            try
            {
                program.PartialTrustFailure();
                Console.Error.WriteLine("!!! partial trust test failed");
            }
            catch (FieldAccessException)
            {
                Console.WriteLine("partial trust success #2");
            }
        }
    }
}
 C:\temp\PartialTrustTest\bin\Debug>PartialTrustTest.exe
 partial trust success #1
 partial trust success #2

Medium Trust에서 단위 테스트에 3 부로 된 블로그 게시물을 게시했습니다.

나는 여기서 몇 가지 답변과 비슷한 방식으로 대체 appdomain을 비슷한 방식으로 회전하지만 다른 앱 도메인에서 테스트 방법을 호출하기 위해 MarshalbyRefoBject를 사용하여 더 나아가서 테스트 클래스를 구현할 필요가 없음을 의미합니다.

3 부 (다른 부분에 대한 링크 포함)는 여기에 있습니다. http://boxbinary.com/2011/10/how-to-run-a-unit-medium-trust-with-nunitpart-three-mbraco-framework-testing/

나는이 작업을 시도한 적이 없지만 일반적으로 사용자 정의 앱 도메인의 어셈블리로드 실패를 처리하려면 AppDomain.assemblyresolve 이벤트를 사용할 수 있습니다.

완전히 관련이 없지만 여기에 있습니다 AppDomain.assemblyresolve를 사용하는 예.

답은 중간 신뢰 특권을 가진 사람이 전체 신뢰 기능에 액세스하려고 시도 할 때 코드의 행동에 달려 있습니다. 나는 어떤 종류의 예외가 발생한다고 가정합니다.

이 경우 중간 신뢰 상황에서 실행되는 단위 테스트를 작성하고 전체 신뢰 기능에 액세스하려고 시도하며 예외가 발생할 것으로 예상됩니다. 이와 같은 테스트를 한 적이 없다면 대부분의 테스트 프레임 워크가 지원하는 일반적인 방법 중 하나는 다음과 같습니다.

testMediumTrustUserWontAccessFeatureX()
{
    // set up the context of your test ...

    try
    {
        accessFullTrustFeature();
        fail("Test failed - Medium trust user can access full trust feature");
    }
    catch( SomeKindOfException e )
    {
        // Success - feature was denied to the untrusted user 
    }
}

예외가 잡히면 신뢰할 수없는 사용자가 기능 (및 테스트 패스)에 액세스하지 못했지만 예외가 없으면 테스트가 실패합니다 (예외를 예상하고 얻지 못했습니다).

이것은 Java-esque pseudo 코드이지만이 패턴은 예외 처리를 지원한다고 가정 할 때 사용하는 모든 언어로 작동해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top