Как автоматизировать тестирование среднего доверительного кода

@CQ: Почему Вы создаете локальный pf Jump копии? Кроме того, можно сохранить последующий тест путем небольшого изменения объявления события:

public event EventHandler Jump = delegate { };

public void OnJump()
{
    Jump(this, EventArgs.Empty);
}
13
задан shytikov 4 June 2015 в 09:49
поделиться

3 ответа

Я никогда не пытался это сделать, но в целом для обработки сбоев загрузки сборок из пользовательских доменов приложений можно использовать событие AppDomain.AssemblyResolve.

Хотя это совершенно не связано, вот ] пример использования AppDomain.AssemblyResolve .

0
ответ дан 2 December 2019 в 01:21
поделиться

Ответ зависит от того, что делает ваш код, когда кто-то со средним уровнем доверия пытается получить доступ к функции полного доверия. Я предполагаю, что будет сгенерировано какое-то исключение.

В этом случае напишите модульный тест, который работает в контексте среднего доверия, пытается получить доступ к функции полного доверия и ожидает возникновения исключения. Если вы никогда не писали подобный тест, один из распространенных способов его выполнения, поддерживаемых большинством фреймворков тестирования, заключается в следующем:

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, но этот шаблон должен работать на любом языке, который вы используете, предполагая он поддерживает обработку исключений.

0
ответ дан 2 December 2019 в 01:21
поделиться

Бесстыдно украдено из Как разместить песочницу с частичным доверием - # 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
7
ответ дан 2 December 2019 в 01:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: