Speedtest tests the network speed of your server. It captures download, upload, ping and jitter speed and provides the results in an Ajax callback.
Start the test with the start() method of the widget. The speed results are sent to the server.
For testing the download speed you need an uncompressable payload file deployed on your server with a size of 1MB, 2MB, 5MB or 10MB. We recommend using a 5MB file. It can be generated here.
<div class="card">
<h5>Basic Usage</h5>
<p>Start the test with the <code>start()</code> method of the widget. The speed results are sent to the server.</p>
<h:form id="formBasicUsage">
<p:growl id="growl" showDetail="true" showSummary="true"/>
<pe:speedtest id="speedtest" widgetVar="speedtest" bgColor="#65ed28" captionDownload="Down" captionUpload="Up"
captionJitter="Jitter" captionPing="Ping" file="#{request.contextPath}/resources/other/dummy.payload">
<p:ajax listener="#{speedTestController.saveResults}" process="@this" update="growl"/>
</pe:speedtest>
<div>
<p:commandButton id="btnStart" value="Start Speedtest" icon="pi pi-play" style="width:100%;"
onclick="PF('speedtest').start();"/>
</div>
</h:form>
</div>
<div class="card">
<h5>Dummy load file</h5>
<p>For testing the download speed you need an uncompressable payload file deployed on your server with a size of 1MB, 2MB, 5MB
or 10MB. We recommend using a 5MB file. It can be generated here.</p>
<h:form id="formPayload">
<div class="flex flex-column gap-3">
<p:outputLabel value="Size in MB" for="SizeInMB"/>
<p:selectOneMenu id="SizeInMB" value="#{speedTestController.sizeInMB}">
<f:selectItem itemLabel="Select size" itemValue="" noSelectionOption="true" itemDisabled="true"/>
<f:selectItem itemLabel="1MB" itemValue="1"/>
<f:selectItem itemLabel="2MB" itemValue="2"/>
<f:selectItem itemLabel="5MB" itemValue="5"/>
<f:selectItem itemLabel="10MB" itemValue="10"/>
<p:ajax listener="#{speedTestController.updateSizeInMB()}" update="@this"/>
</p:selectOneMenu>
<p:commandButton value="Generate speedtest dummy load file" ajax="false"
action="#{speedTestController.downloadPayloadFile()}"/>
</div>
</h:form>
</div>
package org.primefaces.extensions.showcase.controller.speedtest;
import java.io.Serial;
import java.io.Serializable;
import jakarta.faces.application.FacesMessage;
import jakarta.faces.context.FacesContext;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Named;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.RandomStringUtils;
import org.primefaces.extensions.component.speedtest.Speedtest;
import org.primefaces.extensions.event.SpeedTestEvent;
/**
* {@link Speedtest} Controller.
*
* @author Stefan Sibitz [email protected]
*/
@Named
@ViewScoped
public class SpeedTestController implements Serializable {
@Serial
private static final long serialVersionUID = -5297177555931103300L;
private static final Integer ONEMB = 1024 * 1024;
// Size of Download-File (Default=5)
private Integer sizeInMB = 5;
public static void saveResults(final SpeedTestEvent speedTestEvent) {
final String msg = "PingTimeMS ='" + String.valueOf(speedTestEvent.getPingTimeMS()) + "', \n"
+ "Jitter ='" + String.valueOf(speedTestEvent.getJitterTimeMS()) + "', \n"
+ "SpeedMbpsDownload='" + String.valueOf(speedTestEvent.getSpeedMbpsDownload()) + "', \n"
+ "SpeedMbpsUpload='" + String.valueOf(speedTestEvent.getSpeedMbpsUpload()) + "'";
final FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Saved your speed results:", msg);
FacesContext.getCurrentInstance().addMessage(null, message);
}
private String generatePayloadFile() {
// Generate random test string
final Integer size2Generate = ONEMB * sizeInMB;
return RandomStringUtils.secure().nextAlphanumeric(size2Generate);
}
public void downloadPayloadFile() {
final String payloadString = generatePayloadFile();
try {
final FacesContext facesContext = FacesContext.getCurrentInstance();
final HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
response.reset();
response.setHeader("Content-Type", "application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=dummy.payload");
response.getWriter().write(payloadString);
response.getWriter().flush();
facesContext.responseComplete();
}
catch (final Exception e) {
// ignore
}
}
public void updateSizeInMB() {
// Dummy for updating the size on the server...
}
public Integer getSizeInMB() {
return sizeInMB;
}
public void setSizeInMB(final Integer sizeInMB) {
this.sizeInMB = sizeInMB;
}
}