1 /* 2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 package com.sun.fx.webnode.tests.html5.webstorage; 26 27 import com.sun.fx.webnode.tests.commonUtils.GenericTestClass; 28 import static com.sun.fx.webnode.tests.commonUtils.GenericTestClass.getPath; 29 import com.sun.fx.webnode.tests.commonUtils.ToolkitInitializer; 30 import javafx.application.Platform; 31 import javafx.beans.value.ChangeListener; 32 import javafx.beans.value.ObservableValue; 33 import javafx.concurrent.Worker; 34 import org.junit.Assert; 35 import static org.junit.Assert.assertTrue; 36 import org.junit.BeforeClass; 37 import org.junit.Test; 38 39 /** 40 * 41 * @author Dmitry Ginzburg <dmitry.ginzburg@oracle.com> 42 */ 43 public class LocalStorageTest extends GenericTestClass { 44 45 public static final String key = "xxx", value = "yyy", secondValue = "zzz"; 46 public static final String uriDomain1 = "http://shaman.ru.oracle.com/",uriDomain2 = "http://spb-ebola.ru.oracle.com/"; 47 public static final String veryLongString = "abacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabahabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabaiabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabahabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabajabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabahabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabaiabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabahabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabakabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabahabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabaiabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabahabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabajabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabahabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabaiabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabahabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacaba"; 48 // Length: 2047 /\ 49 50 //Domains are available from inner/outer network 51 52 protected Object result; 53 protected Tester resultReady = new Tester() { 54 public boolean isPassed() { 55 return result != null; 56 } 57 }; 58 59 @BeforeClass 60 public static void init() { 61 test.javaclient.shared.Utils.launch(ToolkitInitializer.class, new String[0]); 62 } 63 64 public void initPage() { 65 result = null; 66 Platform.runLater(new Runnable() { 67 @Override 68 public void run() { 69 initWebEngine(); 70 engine.load(getPath(this.getClass(), "resources/empty.html")); 71 72 } 73 }); 74 doWaitPageLoading(); 75 Platform.runLater(new Runnable() { 76 @Override 77 public void run() { 78 result = engine.executeScript("window.localStorage.clear();"); 79 } 80 }); 81 doWait(resultReady); 82 result = null; 83 } 84 85 @Test(timeout = 10000) 86 public void testCheckStorageTypeExists() { 87 result = null; 88 Platform.runLater(new Runnable() { 89 @Override 90 public void run() { 91 initWebEngine(); 92 result = engine.executeScript("if (typeof (Storage) !== \"undefined\") 1; else 2;"); 93 } 94 }); 95 doWait(resultReady); 96 assertTrue("Javascript type \"storage\" does not exist", result.equals(Integer.valueOf(1))); 97 } 98 99 @Test(timeout = 10000) 100 public void testCheckLocalStorageVariableExists() { 101 initPage(); 102 Platform.runLater(new Runnable() { 103 @Override 104 public void run() { 105 result = engine.executeScript("window.localStorage;"); 106 } 107 }); 108 doWait(resultReady); 109 assertTrue("Javascript variable \"localStorage\" does not exist", result != null); 110 } 111 112 @Test(timeout = 10000) 113 public void testCheckLocalStorageBasicReadWrite() { 114 initPage(); 115 Platform.runLater(new Runnable() { 116 @Override 117 public void run() { 118 engine.executeScript("window.localStorage.setItem(\"" + key + "\", \"" + value + "\");"); 119 result = engine.executeScript("window.localStorage.getItem(\"" + key + "\");"); 120 } 121 }); 122 doWait(resultReady); 123 assertTrue("LocalStorage doesn't support basic read/write operations", result.equals(value)); 124 } 125 126 @Test(timeout = 10000) 127 public void testCheckLocalStorageBasicReadWriteAccessThroughInnerVariable() { 128 initPage(); 129 Platform.runLater(new Runnable() { 130 @Override 131 public void run() { 132 engine.executeScript("window.localStorage." + key + " = \"" + value + "\";"); 133 result = engine.executeScript("window.localStorage." + key + ";"); 134 } 135 }); 136 doWait(resultReady); 137 assertTrue("LocalStorage doesn't support basic read/write operations through dot", result.equals(value)); 138 } 139 140 @Test(timeout = 10000) 141 public void testCheckLocalStorageBasicReadWriteMixedAccessSetThroughInnerVariable() { 142 initPage(); 143 Platform.runLater(new Runnable() { 144 @Override 145 public void run() { 146 engine.executeScript("window.localStorage." + key + " = \"" + value + "\";"); 147 result = engine.executeScript("window.localStorage.getItem(\"" + key + "\");"); 148 } 149 }); 150 doWait(resultReady); 151 assertTrue("LocalStorage doesn't support basic mixed read/write operations through dot", result.equals(value)); 152 } 153 154 @Test(timeout = 10000) 155 public void testCheckLocalStorageBasicReadWriteMixedAccessSetThroughMethod() { 156 initPage(); 157 Platform.runLater(new Runnable() { 158 @Override 159 public void run() { 160 engine.executeScript("window.localStorage.setItem(\"" + key + "\", \"" + value + "\");"); 161 result = engine.executeScript("window.localStorage." + key + ";"); 162 } 163 }); 164 doWait(resultReady); 165 assertTrue("LocalStorage doesn't support basic mixed read/write operations through dot", result.equals(value)); 166 } 167 168 @Test(timeout = 10000) 169 public void testCheckLocalStorageWithLongString() { 170 initPage(); 171 Platform.runLater(new Runnable() { 172 @Override 173 public void run() { 174 engine.executeScript("window.localStorage.setItem(\"" + key + "\", \"" + veryLongString + "\");"); 175 result = engine.executeScript("window.localStorage.getItem(\"" + key + "\");"); 176 } 177 }); 178 doWait(resultReady); 179 assertTrue("LocalStorage doesn't support basic read/write operations with long strings", result.equals(veryLongString)); 180 } 181 182 @Test(timeout = 10000) 183 public void testCheckLocalStorageWithEmptyString() { 184 initPage(); 185 Platform.runLater(new Runnable() { 186 @Override 187 public void run() { 188 engine.executeScript("window.localStorage.setItem(\"" + key + "\", \"\");"); 189 result = engine.executeScript("window.localStorage.getItem(\"" + key + "\");"); 190 } 191 }); 192 doWait(resultReady); 193 assertTrue("LocalStorage doesn't support basic read/write operations with empty strings", result.toString().isEmpty()); 194 } 195 196 @Test(timeout = 10000) 197 public void testCheckLocalStorageDoubleWrite() { 198 initPage(); 199 Platform.runLater(new Runnable() { 200 @Override 201 public void run() { 202 result = engine.executeScript("window.localStorage.setItem(\"" + key + "\", \"" + value + "\");"); 203 } 204 }); 205 doWait(resultReady); 206 result = null; 207 Platform.runLater(new Runnable() { 208 @Override 209 public void run() { 210 engine.executeScript("window.localStorage.setItem(\"" + key + "\", \"" + secondValue + "\");"); 211 result = engine.executeScript("window.localStorage.getItem(\"" + key + "\");"); 212 } 213 }); 214 doWait(resultReady); 215 assertTrue("LocalStorage doesn't support basic read/write operations double writing", result.equals (secondValue)); 216 } 217 218 @Test(timeout = 10000) 219 public void testCheckLocalStorageSaveBetweenRuns() { 220 initPage(); 221 Platform.runLater(new Runnable() { 222 @Override 223 public void run() { 224 engine.executeScript("window.localStorage.setItem(\"" + key + "\", \"" + value + "\");"); 225 engine = null; 226 initWebEngine(); 227 engine.load(getPath(this.getClass(), "resources/empty.html")); 228 } 229 }); 230 doWaitPageLoading(); 231 Platform.runLater(new Runnable() { 232 @Override 233 public void run() { 234 result = engine.executeScript("window.localStorage.getItem(\"" + key + "\");"); 235 } 236 }); 237 doWait(resultReady); 238 Assert.assertTrue("localStorage content is changing between runs", result.equals(value)); 239 } 240 241 @Test(timeout = 20000) 242 public void testCheckLocalStorageCrossDomainVariables() { 243 result = null; 244 Platform.runLater(new Runnable() { 245 @Override 246 public void run() { 247 engine = null; 248 initWebEngine(); 249 engine.load(uriDomain1); 250 engine.getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() { 251 @Override 252 public void changed(ObservableValue<? extends Worker.State> ov, Worker.State t, Worker.State t1) { 253 if (t1.equals(Worker.State.SUCCEEDED)) { 254 result = engine.executeScript("window.localStorage.clear();"); 255 } 256 } 257 }); 258 } 259 }); 260 doWait(resultReady); 261 result = null; 262 Platform.runLater(new Runnable() { 263 @Override 264 public void run() { 265 result = engine.executeScript("window.localStorage.setItem(\"" + key + "\", \"" + value + "\");"); 266 } 267 }); 268 doWait(resultReady); 269 result = new Object(); 270 Platform.runLater(new Runnable() { 271 @Override 272 public void run() { 273 engine = null; 274 initWebEngine(); 275 engine.load(uriDomain2); 276 engine.getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() { 277 @Override 278 public void changed(ObservableValue<? extends Worker.State> ov, Worker.State t, Worker.State t1) { 279 if (t1.equals(Worker.State.SUCCEEDED)) { 280 result = engine.executeScript ("window.localStorage.getItem(\"" + key + "\");"); 281 } 282 } 283 }); 284 } 285 }); 286 doWait (new Tester() { 287 @Override 288 public boolean isPassed() { 289 return result == null; 290 } 291 }); 292 } 293 }