/// <summary>
        /// Create the template output
        /// </summary>
        public virtual string TransformText()
        {
            this.Write("<%@ Application Language=\"C#\" %>\r\n\r\n");

#line 12 "E:\dd\DevDiv\Offcycle\WPT\WebStackRuntime\QA\Func\src\Common\WebHost\GlobalAsaxTemplate.tt"
            // Import name spaces
            foreach (var each in this.Namespaces)
            {
#line default
#line hidden
                this.Write("<%@ Import namespace=\"");

#line 16 "E:\dd\DevDiv\Offcycle\WPT\WebStackRuntime\QA\Func\src\Common\WebHost\GlobalAsaxTemplate.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(each));

#line default
#line hidden
                this.Write("\" %>\r\n");

#line 17 "E:\dd\DevDiv\Offcycle\WPT\WebStackRuntime\QA\Func\src\Common\WebHost\GlobalAsaxTemplate.tt"
            }


#line default
#line hidden
            this.Write("\r\n<script RunAt=\"server\">\r\n\tprivate void RegisterRoutes(RouteCollection routes)\r\n" +
                       "\t{\r\n");

#line 24 "E:\dd\DevDiv\Offcycle\WPT\WebStackRuntime\QA\Func\src\Common\WebHost\GlobalAsaxTemplate.tt"
            // Add routes
            foreach (var route in this._routes)
            {
#line default
#line hidden
                this.Write("\t\t");

#line 28 "E:\dd\DevDiv\Offcycle\WPT\WebStackRuntime\QA\Func\src\Common\WebHost\GlobalAsaxTemplate.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(route.RouteMapFunctionCall));

#line default
#line hidden
                this.Write("(\r\n\t\t\troutes,\r\n\t\t\t\"");

#line 30 "E:\dd\DevDiv\Offcycle\WPT\WebStackRuntime\QA\Func\src\Common\WebHost\GlobalAsaxTemplate.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(route.Name));

#line default
#line hidden
                this.Write("\",\r\n\t\t\t\"");

#line 31 "E:\dd\DevDiv\Offcycle\WPT\WebStackRuntime\QA\Func\src\Common\WebHost\GlobalAsaxTemplate.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(route.Path));

#line default
#line hidden
                this.Write("\",\r\n\t\t\t");

#line 32 "E:\dd\DevDiv\Offcycle\WPT\WebStackRuntime\QA\Func\src\Common\WebHost\GlobalAsaxTemplate.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture((route.Defaults ?? "null")));

#line default
#line hidden
                this.Write(");\r\n");

#line 33 "E:\dd\DevDiv\Offcycle\WPT\WebStackRuntime\QA\Func\src\Common\WebHost\GlobalAsaxTemplate.tt"
            }


#line default
#line hidden
            this.Write("    }\r\n\r\n    protected void Application_Start(object sender, System.EventArgs e)\r" +
                       "\n    {\r\n        RegisterRoutes(System.Web.Routing.RouteTable.Routes);\r\n");

#line 41 "E:\dd\DevDiv\Offcycle\WPT\WebStackRuntime\QA\Func\src\Common\WebHost\GlobalAsaxTemplate.tt"
            // replace trace if the given trace writer type is not null
            if (this._traceWriterType != null)
            {
#line default
#line hidden
                this.Write("\r\n        GlobalConfiguration.Configuration.Services.Replace(\r\n            typeof" +
                           "(ITraceWriter),\r\n            new ");

#line 48 "E:\dd\DevDiv\Offcycle\WPT\WebStackRuntime\QA\Func\src\Common\WebHost\GlobalAsaxTemplate.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(this._traceWriterType.Name));

#line default
#line hidden
                this.Write("());\r\n");

#line 49 "E:\dd\DevDiv\Offcycle\WPT\WebStackRuntime\QA\Func\src\Common\WebHost\GlobalAsaxTemplate.tt"
            } // END if (this.Options.TraceWriterType != null)


#line default
#line hidden

#line 52 "E:\dd\DevDiv\Offcycle\WPT\WebStackRuntime\QA\Func\src\Common\WebHost\GlobalAsaxTemplate.tt"

            // call the configuration method if it is given
            if (this._configureMethod != null)
            {
                var configMtdDeclaringType = this._configureMethod.DeclaringType;

                string declareTypeName;
                if (configMtdDeclaringType.IsGenericType)
                {
                    declareTypeName = WebAppSetupOptions.GenericTypeFullNameToString(configMtdDeclaringType);
                }
                else
                {
                    declareTypeName = this._configureMethod.DeclaringType.FullName;
                }

                string methodName = this._configureMethod.Name;


#line default
#line hidden
                this.Write("\t\tGlobalConfiguration.Configuration.SetHttpServer(GlobalConfiguration.DefaultServ" +
                           "er);\r\n\r\n\t\t");

#line 72 "E:\dd\DevDiv\Offcycle\WPT\WebStackRuntime\QA\Func\src\Common\WebHost\GlobalAsaxTemplate.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(declareTypeName));

#line default
#line hidden
                this.Write(".");

#line 72 "E:\dd\DevDiv\Offcycle\WPT\WebStackRuntime\QA\Func\src\Common\WebHost\GlobalAsaxTemplate.tt"
                this.Write(this.ToStringHelper.ToStringWithCulture(methodName));

#line default
#line hidden
                this.Write("(GlobalConfiguration.Configuration);\r\n");

#line 73 "E:\dd\DevDiv\Offcycle\WPT\WebStackRuntime\QA\Func\src\Common\WebHost\GlobalAsaxTemplate.tt"
            } // END if (this.Options.ConfigureMethod != null)


#line default
#line hidden
            this.Write("    }\r\n</script>");
            return(this.GenerationEnvironment.ToString());
        }
        private IDirectory GetAssemblyAndResourceDirectory(WebHostContext context)
        {
            var descriptor = context.TestType;
            var frame      = context.Frame;
            var options    = WebAppSetupOptions.GenerateDefaultOptions();

            options.AddWebApiAssemblies();
            options.AddRoute(
                new WebAPIRouteSetup(
                    "api default",
                    "api/{controller}/{action}",
                    "new { action = " + typeof(RouteParameter).FullName + ".Optional }"));

            var deploymentDescriptor = context.Deployment;

            if (deploymentDescriptor.ScopePath != null)
            {
                var resourceAssembly = deploymentDescriptor.ScopeResourceType != null ? deploymentDescriptor.ScopeResourceType.Assembly : descriptor.TestAssembly;
                options.AddAssemblyAndReferences(resourceAssembly);
                options.AddTextFilesFromResources(resourceAssembly, deploymentDescriptor.ScopePath);
            }

            if (options.TextFiles.ContainsKey("web.config"))
            {
                options.UpdateWebConfig(WebConfigHelper.Load(options.TextFiles["web.config"]));
            }

            if (!descriptor.TestControllerTypes.Any())
            {
                if (descriptor.TestAssembly == null)
                {
                    throw new InvalidOperationException(
                              "Neither Controller Types or test assembly is given to web-host strategy. " +
                              "That will cause issue in runtime, because the assemblies contain the controller " +
                              "will not be copied to IIS website bin folder. Please given Controller Type by " +
                              "NuwaControllerAttribute.");
                }

                options.AddAssemblyAndReferences(descriptor.TestAssembly);
            }
            else
            {
                foreach (var ct in descriptor.TestControllerTypes)
                {
                    options.AddAssemblyAndReferences(ct.Assembly);
                }
            }

            // set trace writer
            TraceElement traceElem = frame.GetFirstElement <TraceElement>();

            if (traceElem != null)
            {
                options.TraceWriterType = traceElem.TracerType;
            }

            // set configure action
            if (descriptor.ConfigureMethod != null)
            {
                options.ConfigureMethod = descriptor.ConfigureMethod;
                options.AddAssemblyAndReferences(options.ConfigureMethod.Module.Assembly);
            }

            // TODO: are they used in all situation?
            // setup katana integration pipeline
            if (descriptor.GetDesignatedMethod <NuwaKatanaConfigurationAttribute>() != null)
            {
                options.AddAssemblyAndReferences(Assembly.Load("Microsoft.Owin.Host.SystemWeb"));
                options.UpdateWebConfig(config =>
                {
                    var method = descriptor.GetDesignatedMethod <NuwaKatanaConfigurationAttribute>();
                    config.AddAppSection(
                        "owin:AppStartup",
                        string.Format("{0}.{1}, {2}",
                                      method.DeclaringType.FullName,
                                      method.Name,
                                      method.DeclaringType.Assembly.GetName().Name));
                });
            }
            else if (EnableDefaultOwinWebApiConfiguration)
            {
                options.AddAssemblyAndReferences(Assembly.Load("Microsoft.Owin.Host.SystemWeb"));
                options.UpdateWebConfig(config =>
                {
                    config.AddAppSection(
                        "owin:AppStartup",
                        string.Format("{0}.{1}, {2}",
                                      typeof(WebBaseHostElement).FullName,
                                      "DefaultOwinWebApiConfiguration",
                                      typeof(WebBaseHostElement).Assembly.GetName().Name));
                    if (options.TraceWriterType != null)
                    {
                        config.AddAppSection(
                            NuwaGlobalConfiguration.TraceWriterTypeKey,
                            string.Format("{0}, {1}",
                                          options.TraceWriterType.FullName,
                                          options.TraceWriterType.Assembly.GetName().Name));
                    }

                    if (options.ConfigureMethod != null)
                    {
                        config.AddAppSection(
                            NuwaGlobalConfiguration.HttpConfigureKey,
                            string.Format("{0}.{1}, {2}",
                                          options.ConfigureMethod.DeclaringType.FullName,
                                          options.ConfigureMethod.Name,
                                          options.ConfigureMethod.DeclaringType.Assembly.GetName().Name));
                    }
                });
            }
            else
            {
                options.UpdateWebConfig(config =>
                {
                    config.AddAppSection(
                        "owin:AutomaticAppStartup",
                        "false");
                });
            }

            // update web.config
            if (descriptor.WebConfigMethod != null)
            {
                Action <WebConfigHelper> action = Delegate.CreateDelegate(
                    typeof(Action <WebConfigHelper>),
                    descriptor.WebConfigMethod)
                                                  as Action <WebConfigHelper>;

                if (action != null)
                {
                    options.UpdateWebConfig(action);
                }
            }

            // retrieve partial trust element
            options.UpdateWebConfig(webConfig => webConfig.ConfigureTrustLevel("Full"));

            var ramfarSetting = ConfigurationManager.AppSettings["runAllManagedModulesForAllRequests"];

            if (ramfarSetting != null && string.Equals(ramfarSetting, "true", StringComparison.InvariantCultureIgnoreCase))
            {
                options.UpdateWebConfig(webConfig => webConfig.AddRAMFAR(true));
            }

            // Update deployment options
            if (descriptor.WebDeployConfigMethod != null)
            {
                descriptor.WebDeployConfigMethod.Invoke(null, new object[] { options });
            }

            if (EnableGlobalAsax)
            {
                options.GenerateGlobalAsaxForCS();
            }

            doAdditionalAssemblyAndREferences();
            doAdditionalUpdateWebConfig();

            return(options.ToDirectory());
        }
 public WebHostSetupFixture()
 {
     this.options     = new TSetupOptionsProvider().GetSetupOptions();
     this.VDirAddress = IISHelper.SetupIIS(this.options);
 }