Skv.cs 5.72 KB
/* Skatteverkets plugins
   (C) Skatteverket Svenska STATEN!!!
   */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.WebTesting;
using System.ComponentModel;
using System.Text.RegularExpressions;

namespace LIL_VSTT_Plugins
{
    [DisplayName("MS Throttle Broms")]
    [Description("Ökar betänketiden på request som får ett 500 svar från MS Throttle att lugna ner sig lite. Slumpar en tid mellan angiven min och max.")]
    public class ZMSThrottle : WebTestPlugin
    {
        [DisplayName("Minsta Paustid"), DefaultValue(100), Description("Minsta paus i sekunder vid begäran om throttling")]
        public int MinimumPaus { get; set; }
        [DisplayName("Högsta Paustid"), DefaultValue(300), Description("Högsta paus i sekunder vid begäran om throttling")]
        public int MaximumPaus { get; set; }
        [DisplayName("Debugläge"), DefaultValue(false), Description("Sätter pausen oavsett svar samt loggar")]
        public bool Debug { get; set; }
        [DisplayName("Acceptera 500 koden"), DefaultValue(false), Description("Om MS svarar med en 500 kod SAMT throttle JSON finns i svaret med ExternalLimitReached:true ignoreras 500 koden så att anropet inte failar.")]
        public bool Acceptera500 { get; set; }
        [DisplayName("Stoppa inte iterationen"), DefaultValue(false), Description("Om MS svarar med en 500 kod SAMT throttle JSON finns i svaret med ExternalLimitReached:true stoppas exekveringen av skriptet.")]
        public bool DontStopIteration { get; set; }

        Random rnd = new Random();
        Regex rx = new Regex("externalSystemRequestLimitReached\".?:.?true", RegexOptions.IgnoreCase);

        public override void PreRequest(object sender, PreRequestEventArgs e)
        {
            base.PreRequest(sender, e);
            if(Acceptera500 == true)
                e.Request.IgnoreHttpStatusCode = true;
        }

        public override void PostRequest(object sender, PostRequestEventArgs e)
        {
            base.PostRequest(sender, e);
            bool isLimitReachedFound = false;
            if(e.ResponseExists && e.Response.StatusCode == System.Net.HttpStatusCode.InternalServerError)
            {
                if(rx.IsMatch(e.Response.BodyString))
                {
                    e.Request.ThinkTime = rnd.Next(MinimumPaus, MaximumPaus);
                    isLimitReachedFound = true;
                    e.WebTest.AddCommentToResult("ExternalSystemRequestLimitReached:true pausar i " + e.Request.ThinkTime + " sekunder");
                    if (!DontStopIteration)
                    {
                        e.WebTest.AddCommentToResult("Stoppar iterationen av skriptet efter detta anrop");
                        e.WebTest.Stop();
                    }
                }
            }
            if(Acceptera500 == true && (int)e.Response.StatusCode >= 400 && isLimitReachedFound == false)
            {
                e.Request.Outcome = Outcome.Fail;
                e.WebTest.AddCommentToResult("Failar eftersom statuskod >= 400 samt ExternalSystemRequestLimitReached:true inte fanns i svaret");
            }
            if (Debug)
            {
                e.WebTest.AddCommentToResult("Sätter pausen eftersom debugläge är aktiverat");
                e.Request.ThinkTime = rnd.Next(MinimumPaus, MaximumPaus);
            }
        }
    }

    [DisplayName("Validera Header")]
    [Description("(C) Mårten\r\nValiderar att en header har ett visst värde i svaret.")]
    public class ValidateHeader : ValidationRule
    {
        [DisplayName("Header Namn"), DefaultValue(""), Description("Namnet på headern i svaret")]
        public string HeaderName { get; set; }

        [DisplayName("Värde"), DefaultValue(""), Description("Värdet som headern ska ha")]
        public string HeaderValue { get; set; }

        public override void Validate(object sender, ValidationEventArgs e)
        {
            e.IsValid = false;
            e.Message = "Default triggades. False! Check the code!!";
            if (e.Response.Headers[HeaderName] == HeaderValue)
            {
                e.IsValid = true;
                e.Message = "Hittade header " + HeaderName + " med värde " + HeaderValue;
            } else
            {
                e.IsValid = false;
                e.Message = "Hittande ingen header med namnet " + HeaderName + " och värdet " + HeaderValue;
            }
        }
    }

    [DisplayName("Validate Response URL")]
    [Description("(C) Mårten\r\nValiderar att en Response URL har ett visst värde eller inte.")]
    public class ValidateResponseURL : ValidationRule
    {
        Regex rxRegExp = null;

        [DisplayName("Regular expression"), DefaultValue(""), Description("Uttrycket som ska matcha Response URL")]
        public string strRegExp { get; set; }

        [DisplayName("Pass if found"), DefaultValue(false), Description("Om uttrycket matchar ska testet failas eller inte?")]
        public bool boolPassIfFound { get; set; }

        public override void Validate(object sender, ValidationEventArgs e)
        {
            e.IsValid = false;
            e.Message = "Default triggades. False! Check the code!!";

            if (rxRegExp == null)
            {
                rxRegExp = new Regex(strRegExp);
            }
            if (rxRegExp.IsMatch(e.Response.ResponseUri.AbsoluteUri))
            {
                e.IsValid = boolPassIfFound;
                e.Message = "" + e.Response.ResponseUri.AbsoluteUri + " matchade  uttrycket!";
            }
            else
            {
                e.IsValid = !boolPassIfFound;
                e.Message = "" + e.Response.ResponseUri.AbsoluteUri + " matchade inte uttrycket!";
            }

        }

    }

 }