]> source.dussan.org Git - vaadin-framework.git/commitdiff
Implement long polling support for push (#13011)
authorJohannes Dahlström <johannesd@vaadin.com>
Wed, 22 Jan 2014 15:48:19 +0000 (17:48 +0200)
committerArtur Signell <artur@vaadin.com>
Fri, 31 Jan 2014 09:21:44 +0000 (09:21 +0000)
* The Transport enum has a new LONG_POLLING constant
* AbstractTestUI supports the ?transport=long-polling GET parameter

Change-Id: Ic2f5abfbd4aa3c875f5c83932ce5ee6f31c366ad

shared/src/com/vaadin/shared/ui/ui/Transport.java
uitest/src/com/vaadin/tests/components/AbstractTestUI.java
uitest/src/com/vaadin/tests/push/BasicPushLongPolling.java [new file with mode: 0644]
uitest/src/com/vaadin/tests/push/BasicPushLongPollingTest.java [new file with mode: 0644]
uitest/src/com/vaadin/tests/push/LongPollingReconnectTest.java [new file with mode: 0644]
uitest/src/com/vaadin/tests/push/PushLargeDataLongPolling.java [new file with mode: 0644]
uitest/src/com/vaadin/tests/push/PushLargeDataLongPollingTest.java [new file with mode: 0644]

index ea641c0a3c59868c17d8db14097fcf361e1cb73c..ebc0ba3aea2ce2deef5cd9a28375e99574b1cc61 100644 (file)
@@ -30,7 +30,11 @@ public enum Transport {
     /**
      * HTTP streaming
      */
-    STREAMING("streaming");
+    STREAMING("streaming"),
+    /**
+     * HTTP long polling
+     */
+    LONG_POLLING("long-polling");
 
     private String identifier;
 
index 8f92ff31187ca97140d53e5ba732618e5cd45e0c..cbca4bcf7fc03233ec83d9dd1003f62d570e460f 100644 (file)
@@ -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 (file)
index 0000000..bbb7895
--- /dev/null
@@ -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 (file)
index 0000000..b526a11
--- /dev/null
@@ -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 (file)
index 0000000..81c974e
--- /dev/null
@@ -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 (file)
index 0000000..52a6471
--- /dev/null
@@ -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 (file)
index 0000000..624310f
--- /dev/null
@@ -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"));
+    }
+
+}