From efd8f211612fa55a2b35d1c72a9913f2011bfe7a Mon Sep 17 00:00:00 2001
From: Johannes Dahlström <johannesd@vaadin.com>
Date: Wed, 22 Jan 2014 17:48:19 +0200
Subject: Implement long polling support for push (#13011)

* The Transport enum has a new LONG_POLLING constant
* AbstractTestUI supports the ?transport=long-polling GET parameter

Change-Id: Ic2f5abfbd4aa3c875f5c83932ce5ee6f31c366ad
---
 .../vaadin/tests/components/AbstractTestUI.java    | 30 +++++------
 .../vaadin/tests/push/BasicPushLongPolling.java    | 34 ++++++++++++
 .../tests/push/BasicPushLongPollingTest.java       | 19 +++++++
 .../tests/push/LongPollingReconnectTest.java       | 25 +++++++++
 .../tests/push/PushLargeDataLongPolling.java       | 32 ++++++++++++
 .../tests/push/PushLargeDataLongPollingTest.java   | 61 ++++++++++++++++++++++
 6 files changed, 186 insertions(+), 15 deletions(-)
 create mode 100644 uitest/src/com/vaadin/tests/push/BasicPushLongPolling.java
 create mode 100644 uitest/src/com/vaadin/tests/push/BasicPushLongPollingTest.java
 create mode 100644 uitest/src/com/vaadin/tests/push/LongPollingReconnectTest.java
 create mode 100644 uitest/src/com/vaadin/tests/push/PushLargeDataLongPolling.java
 create mode 100644 uitest/src/com/vaadin/tests/push/PushLargeDataLongPollingTest.java

(limited to 'uitest')

diff --git a/uitest/src/com/vaadin/tests/components/AbstractTestUI.java b/uitest/src/com/vaadin/tests/components/AbstractTestUI.java
index 8f92ff3118..cbca4bcf7f 100644
--- a/uitest/src/com/vaadin/tests/components/AbstractTestUI.java
+++ b/uitest/src/com/vaadin/tests/components/AbstractTestUI.java
@@ -113,27 +113,27 @@ public abstract class AbstractTestUI extends UI {
     protected void setTransport(VaadinRequest request) {
         String transport = request.getParameter("transport");
         PushConfiguration config = getPushConfiguration();
-        PushMode mode = config.getPushMode();
 
         if ("xhr".equals(transport)) {
             config.setPushMode(PushMode.DISABLED);
         } else if ("websocket".equals(transport)) {
-            if (!mode.isEnabled()) {
-                config.setPushMode(PushMode.AUTOMATIC);
-            }
-            config.setTransport(Transport.WEBSOCKET);
-            // Ensure no fallback is used
-            getPushConfiguration().setParameter(
-                    PushConfigurationState.FALLBACK_TRANSPORT_PARAM, "none");
+            enablePush(Transport.WEBSOCKET);
         } else if ("streaming".equals(transport)) {
-            if (!mode.isEnabled()) {
-                config.setPushMode(PushMode.AUTOMATIC);
-            }
-            config.setTransport(Transport.STREAMING);
-            // Ensure no fallback is used
-            getPushConfiguration().setParameter(
-                    PushConfigurationState.FALLBACK_TRANSPORT_PARAM, "none");
+            enablePush(Transport.STREAMING);
+        } else if ("long-polling".equals(transport)) {
+            enablePush(Transport.LONG_POLLING);
+        }
+    }
+
+    protected void enablePush(Transport transport) {
+        PushConfiguration config = getPushConfiguration();
+        if (!config.getPushMode().isEnabled()) {
+            config.setPushMode(PushMode.AUTOMATIC);
         }
+        config.setTransport(transport);
+        // Ensure no fallback is used
+        getPushConfiguration().setParameter(
+                PushConfigurationState.FALLBACK_TRANSPORT_PARAM, "none");
     }
 
     private VerticalLayout layout;
diff --git a/uitest/src/com/vaadin/tests/push/BasicPushLongPolling.java b/uitest/src/com/vaadin/tests/push/BasicPushLongPolling.java
new file mode 100644
index 0000000000..bbb7895f20
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/BasicPushLongPolling.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2000-2013 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 com.vaadin.annotations.Push;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.shared.ui.ui.Transport;
+import com.vaadin.shared.ui.ui.UIState.PushConfigurationState;
+
+@Push(transport = Transport.LONG_POLLING)
+public class BasicPushLongPolling extends BasicPush {
+
+    @Override
+    public void init(VaadinRequest request) {
+        super.init(request);
+        // Don't use fallback so we can easier detect if long polling fails
+        getPushConfiguration().setParameter(
+                PushConfigurationState.FALLBACK_TRANSPORT_PARAM, "none");
+    }
+
+}
diff --git a/uitest/src/com/vaadin/tests/push/BasicPushLongPollingTest.java b/uitest/src/com/vaadin/tests/push/BasicPushLongPollingTest.java
new file mode 100644
index 0000000000..b526a11d38
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/BasicPushLongPollingTest.java
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2000-2013 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;
+
+public class BasicPushLongPollingTest extends BasicPushTest {
+}
\ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/push/LongPollingReconnectTest.java b/uitest/src/com/vaadin/tests/push/LongPollingReconnectTest.java
new file mode 100644
index 0000000000..81c974e1e5
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/LongPollingReconnectTest.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2000-2013 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;
+
+public class LongPollingReconnectTest extends PushReconnectTest {
+
+    @Override
+    protected Class<?> getUIClass() {
+        return BasicPushLongPolling.class;
+    }
+
+}
diff --git a/uitest/src/com/vaadin/tests/push/PushLargeDataLongPolling.java b/uitest/src/com/vaadin/tests/push/PushLargeDataLongPolling.java
new file mode 100644
index 0000000000..52a647115a
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/PushLargeDataLongPolling.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2000-2013 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 com.vaadin.annotations.Push;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.shared.ui.ui.Transport;
+import com.vaadin.shared.ui.ui.UIState.PushConfigurationState;
+
+@Push(transport = Transport.LONG_POLLING)
+public class PushLargeDataLongPolling extends PushLargeData {
+
+    @Override
+    protected void setup(VaadinRequest request) {
+        super.setup(request);
+        getPushConfiguration().setParameter(
+                PushConfigurationState.FALLBACK_TRANSPORT_PARAM, "none");
+    }
+}
diff --git a/uitest/src/com/vaadin/tests/push/PushLargeDataLongPollingTest.java b/uitest/src/com/vaadin/tests/push/PushLargeDataLongPollingTest.java
new file mode 100644
index 0000000000..624310f1b5
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/push/PushLargeDataLongPollingTest.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2000-2013 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 org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class PushLargeDataLongPollingTest extends MultiBrowserTest {
+
+    @Test
+    public void testLongPollingLargeData() {
+        openTestURL();
+
+        // Without this there is a large chance that we will wait for all pushes
+        // to complete before moving on
+        testBench(driver).disableWaitForVaadin();
+
+        push();
+        // Push complete. Browser will reconnect now as > 10MB has been sent
+        // Push again to ensure push still works
+        push();
+
+    }
+
+    private void push() {
+        // Wait for startButton to be present
+        waitForElementToBePresent(vaadinLocatorById("startButton"));
+
+        String logRow0Id = "Log_row_0";
+        By logRow0 = vaadinLocatorById(logRow0Id);
+
+        vaadinElementById("startButton").click();
+        // Wait for push to start
+        waitUntil(ExpectedConditions.textToBePresentInElement(logRow0,
+                "Package "));
+
+        // Wait for until push should be done
+        sleep(PushLargeData.DEFAULT_DURATION_MS);
+
+        // Wait until push is actually done
+        waitUntil(ExpectedConditions.textToBePresentInElement(logRow0,
+                "Push complete"));
+    }
+
+}
-- 
cgit v1.2.3