/*
* Copyright 2000-2016 Vaadin Ltd.
*
* Licensed 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.
*/
/**
*
*/
package com.vaadin.tests.push;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractTestUIWithLog;
import com.vaadin.tests.util.LoremIpsum;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI;
import com.vaadin.v7.ui.TextField;
public abstract class PushLargeData extends AbstractTestUIWithLog {
// 200KB
static final int DEFAULT_SIZE_BYTES = 200 * 1000;
// Every other second
static final int DEFAULT_DELAY_MS = 2000;
// 3 MB is enough for streaming to reconnect
static final int DEFAULT_DATA_TO_PUSH = 3 * 1000 * 1000;
static final int DEFAULT_DURATION_MS = DEFAULT_DATA_TO_PUSH
/ DEFAULT_SIZE_BYTES * DEFAULT_DELAY_MS;
private Label dataLabel = new Label();
private final ExecutorService executor = Executors
.newSingleThreadExecutor();
protected TextField dataSize;
protected TextField interval;
protected TextField duration;
@Override
protected void setup(VaadinRequest request) {
dataLabel.setSizeUndefined();
dataSize = new TextField("Data size");
dataSize.setConverter(Integer.class);
interval = new TextField("Interval (ms)");
interval.setConverter(Integer.class);
duration = new TextField("Duration (ms)");
duration.setConverter(Integer.class);
dataSize.setValue(DEFAULT_SIZE_BYTES + "");
interval.setValue(DEFAULT_DELAY_MS + "");
duration.setValue(DEFAULT_DURATION_MS + "");
addComponent(dataSize);
addComponent(interval);
addComponent(duration);
Button b = new Button("Start pushing");
b.setId("startButton");
b.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
Integer pushSize = (Integer) dataSize.getConvertedValue();
Integer pushInterval = (Integer) interval.getConvertedValue();
Integer pushDuration = (Integer) duration.getConvertedValue();
PushRunnable r = new PushRunnable(getUI(), pushSize,
pushInterval, pushDuration);
executor.execute(r);
log.log("Starting push, size: " + pushSize + ", interval: "
+ pushInterval + "ms, duration: " + pushDuration
+ "ms");
}
});
addComponent(b);
addComponent(dataLabel);
}
public Label getDataLabel() {
return dataLabel;
}
@Override
protected String getTestDescription() {
return "Tests that pushing large amounts of data do not cause problems";
}
@Override
protected Integer getTicketNumber() {
return 12567;
}
public static class PushRunnable implements Runnable {
private Integer size;
private Integer interval;
private Integer duration;
private final UI ui;
public PushRunnable(UI ui, Integer size, Integer interval,
Integer duration) {
this.size = size;
this.interval = interval;
this.duration = duration;
this.ui = ui;
}
@Override
public void run() {
final long endTime = System.currentTimeMillis() + duration;
final String data = LoremIpsum.get(size);
int packageIndex = 1;
while (System.currentTimeMillis() < endTime) {
final int idx = packageIndex++;
ui.access(new Runnable() {
@Override
public void run() {
PushLargeData pushUi = (PushLargeData) ui;
// Using description as it is not rendered to the DOM
// immediately
pushUi.getDataLabel().setDescription(
System.currentTimeMillis() + ": " + data);
pushUi.log("Package " + idx + " pushed");
}
});
try {
Thread.sleep(interval);
} catch (InterruptedException e) {
return;
}
}
ui.access(new Runnable() {
@Override
public void run() {
PushLargeData pushUi = (PushLargeData) ui;
pushUi.log("Push complete");
}
});
}
}
}