json-tck/src/main/java/net/java/html/json/tests/WebSocketTest.java
author Jaroslav Tulach <jaroslav.tulach@netbeans.org>
Fri, 07 Feb 2014 07:44:34 +0100
changeset 551 7ca2253fa86d
parent 365 5c93ad8c7a15
child 563 88fd2972bfdf
permissions -rw-r--r--
Updating copyright headers to mention current year
     1 /**
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     3  *
     4  * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved.
     5  *
     6  * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
     7  * Other names may be trademarks of their respective owners.
     8  *
     9  * The contents of this file are subject to the terms of either the GNU
    10  * General Public License Version 2 only ("GPL") or the Common
    11  * Development and Distribution License("CDDL") (collectively, the
    12  * "License"). You may not use this file except in compliance with the
    13  * License. You can obtain a copy of the License at
    14  * http://www.netbeans.org/cddl-gplv2.html
    15  * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
    16  * specific language governing permissions and limitations under the
    17  * License.  When distributing the software, include this License Header
    18  * Notice in each file and include the License file at
    19  * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
    20  * particular file as subject to the "Classpath" exception as provided
    21  * by Oracle in the GPL Version 2 section of the License file that
    22  * accompanied this code. If applicable, add the following below the
    23  * License Header, with the fields enclosed by brackets [] replaced by
    24  * your own identifying information:
    25  * "Portions Copyrighted [year] [name of copyright owner]"
    26  *
    27  * Contributor(s):
    28  *
    29  * The Original Software is NetBeans. The Initial Developer of the Original
    30  * Software is Oracle. Portions Copyright 2013-2014 Oracle. All Rights Reserved.
    31  *
    32  * If you wish your version of this file to be governed by only the CDDL
    33  * or only the GPL Version 2, indicate your decision by adding
    34  * "[Contributor] elects to include this software in this distribution
    35  * under the [CDDL or GPL Version 2] license." If you do not indicate a
    36  * single choice of license, a recipient has the option to distribute
    37  * your version of this file under either the CDDL, the GPL Version 2 or
    38  * to extend the choice of license to its licensees as provided above.
    39  * However, if you add GPL Version 2 code and therefore, elected the GPL
    40  * Version 2 license, then the option applies only if the new code is
    41  * made subject to such option by the copyright holder.
    42  */
    43 package net.java.html.json.tests;
    44 
    45 import net.java.html.BrwsrCtx;
    46 import net.java.html.json.Model;
    47 import net.java.html.json.Models;
    48 import net.java.html.json.OnReceive;
    49 import net.java.html.json.Property;
    50 import org.apidesign.html.json.tck.KOTest;
    51 
    52 /** Testing support of WebSocket communication.
    53  *
    54  * @author Jaroslav Tulach <jtulach@netbeans.org>
    55  */
    56 @Model(className = "WebSocketik", properties = {
    57     @Property(name = "fetched", type = Person.class),
    58     @Property(name = "fetchedCount", type = int.class),
    59     @Property(name = "open", type = int.class),
    60     @Property(name = "fetchedResponse", type = String.class),
    61     @Property(name = "fetchedSex", type = Sex.class, array = true)
    62 })
    63 public final class WebSocketTest {
    64     private WebSocketik js;
    65     private String url;
    66     
    67     @OnReceive(url = "{url}", data = Sex.class, method = "WebSocket", onError = "error")
    68     static void querySex(WebSocketik model, Person data) {
    69         if (data == null) {
    70             model.setOpen(1);
    71         } else {
    72             model.setFetched(data);
    73         }
    74     }
    75     
    76     @KOTest public void connectUsingWebSocket() throws Throwable {
    77         if (js == null) {
    78             url = Utils.prepareURL(
    79                 JSONTest.class, "{'firstName': 'Mitar', 'sex': '$0' }", 
    80                 "application/javascript",
    81                 "protocol:ws"
    82             );
    83             
    84             js = Models.bind(new WebSocketik(), newContext());
    85             js.applyBindings();
    86 
    87             js.setFetched(null);
    88             
    89             // connects to the server
    90             js.querySex(url, null);
    91         }
    92         
    93         if (bailOutIfNotSupported(js)) {
    94             return;
    95         }
    96         
    97         if (js.getOpen() == 0) {
    98             throw new InterruptedException();
    99         }
   100         if (js.getOpen() == 1) {
   101             // send a query to the server
   102             js.querySex(url, Sex.FEMALE);
   103             js.setOpen(2);
   104         }
   105     
   106         Person p = js.getFetched();
   107         if (p == null) {
   108             throw new InterruptedException();
   109         }
   110         
   111         assert "Mitar".equals(p.getFirstName()) : "Unexpected: " + p.getFirstName();
   112         assert Sex.FEMALE.equals(p.getSex()) : "Expecting FEMALE: " + p.getSex();
   113 
   114         if (js.getOpen() == 2) {
   115             // close the socket
   116             js.querySex(url, null);
   117             js.setOpen(3);
   118         }
   119         
   120         if (js.getFetchedResponse() == null) {
   121             throw new InterruptedException();
   122         }
   123         assert "null".equals(js.getFetchedResponse()) : "Should be null: " + js.getFetchedResponse();
   124     }
   125     
   126     @KOTest public void errorUsingWebSocket() throws Throwable {
   127         js = Models.bind(new WebSocketik(), newContext());
   128         js.applyBindings();
   129 
   130         js.setFetched(null);
   131         js.querySex("http://wrong.protocol", null);
   132 
   133         assert js.getFetchedResponse() != null : "Error reported";
   134     }
   135 
   136     @KOTest public void haveToOpenTheWebSocket() throws Throwable {
   137         js = Models.bind(new WebSocketik(), newContext());
   138         js.applyBindings();
   139 
   140         js.setFetched(null);
   141         try {
   142             js.querySex("http://wrong.protocol", Sex.MALE);
   143             assert false : "Should throw an exception";
   144         } catch (IllegalStateException ex) {
   145             assert ex.getMessage().contains("not open") : "Expecting 'not open' msg: " + ex.getMessage();
   146         }
   147     }
   148     
   149     static void error(WebSocketik model, Exception ex) {
   150         if (ex != null) {
   151             model.setFetchedResponse(ex.getClass() + ":" + ex.getMessage());
   152         } else {
   153             model.setFetchedResponse("null");
   154         }
   155     }
   156     
   157     private static BrwsrCtx newContext() {
   158         return Utils.newContext(WebSocketTest.class);
   159     }
   160 
   161     private boolean bailOutIfNotSupported(WebSocketik js) {
   162         if (js.getFetchedResponse() == null) {
   163             return false;
   164         }
   165         return js.getFetchedResponse().contains("UnsupportedOperationException") &&
   166             Utils.canFailWebSockets(WebSocketTest.class);
   167     }
   168     
   169 }