<?xml version="1.0" encoding="UTF-8" ?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.

-->
<library>

<class name="JitterTest" extends="BaseURLLoadTest">

    <handler name="oninit">
        this.setAttribute("testsCount", 100);
        this.setAttribute("testName", "Jitter");
        this.setAttribute("testTypeParameter", "jitter");
        this.setAttribute("verbose", false);
        this.setAttribute("resultText", true);
    </handler>

    <method name="generateReport">
        <![CDATA[
        var averageTime = wholeTime / successfulTestsCount;
        var jitterMax = maxTime - averageTime;
        var jitterMin = minTime - averageTime;
        var report = "Average time: " + averageTime + " ms\n";
        report += "Min time: " + minTime + " ms\n";
        report += "Max time: " + maxTime + " ms\n";
        report += "Jitter: " + jitterMax + " ms and " + jitterMin + " ms \n";

        var max = -jitterMin;
        if (jitterMax > max) {
            max = jitterMax;
        }

        resultLabel.setAttribute("text", "");
        resultLabel.addFormat("%.0d\n%s", max, "ms");

        return report;
        ]]>
    </method>

</class>

</library>
