static Task RunArbitraryFn(CancellationToken cancel, FnInner fn) { var tcs = new TaskCompletionSource <bool>(); try { var thread = new Thread(new ThreadStart(() => { try { _context = new FakeAspContext(tcs, fn, cancel); HttpRuntime.ProcessRequest(new SimpleWorkerRequest("", "", new StringWriter())); } catch (Exception ex) { tcs.TrySetException(ex); } })); thread.Start(); cancel.Register(() => { thread.Abort(); tcs.TrySetException(new Exception("Cancelled!")); }); } catch (Exception ex) { tcs.TrySetException(ex); } return(tcs.Task); }
public FakeAspContext(TaskCompletionSource <bool> tcs, FnInner fn, CancellationToken cancel) { _tcs = tcs; _fn = fn; _cancel = cancel; }
public static Test Create(FnInner fn) => new Test((ct, fnInner) => fnInner(ct), fn);
public static Test RunAsp(FnInner fn) => Test.Create(fn) .WrapOuter(_ => RunArbitraryFn) .Timeout(300);
private Test(FnOuter fnOuter, FnInner fnInner) { _fnOuter = fnOuter; _fnInner = fnInner; }