<?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="DownloadSpeedTest" extends="BaseURLLoadTest">

    <handler name="oninit">
        this.setAttribute("testsCount", 1);
        this.setAttribute("testName", "Download speed");
        this.setAttribute("loadFileName", "downloadTest");
        this.setAttribute("verbose", false);
        this.setAttribute("resultText", true);
    </handler>

    <method name="generateReport">
        var mBytes = loader.bytesTotal/(1024*1024);
        var timeSec = wholeTime/1000;
        var speed = mBytes/timeSec;

        var report = "Bytes downloaded: " + mBytes + " Mb\n";
        report += "Download time: " + timeSec + " s\n";
        report += "Download speed: " + speed + " Mb/s\n";

        resultLabel.setAttribute("text", "");
        resultLabel.addFormat("%.2f\n%s", speed, "Mb/s");

        return report;
    </method>

</class>

</library>
