/** * Copyright (c) 2013-2016 Angelo ZERR. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation */ package tern.server.protocol; import java.io.IOException; import org.junit.Assert; import org.junit.Test; import tern.ITernFileSynchronizer; import tern.TernException; import tern.server.AbstractTernServerTest; import tern.server.DefaultResponseHandler; import tern.server.MapTernFile; import tern.utils.IOUtils; public abstract class AbstractTernServerAddFileWithThreadTest extends AbstractTernServerTest { @Test public void empty() { } // @Test public void addBigFileWith2Threads() throws TernException, IOException { final ITernFileSynchronizer manager = server.getFileSynchronizer(); final MapTernFile jQuery = new MapTernFile("jquery", IOUtils.toString(MapTernFile.class .getResourceAsStream("jquery-1.10.2.js"))); // Create 2 requests with big files started in the same time. DefaultResponseHandler response1 = new DefaultResponseHandler(true); TernDoc doc1 = new TernDoc(); Thread request1 = createRequestThread(manager, jQuery, response1, doc1); DefaultResponseHandler response2 = new DefaultResponseHandler(true); TernDoc doc2 = new TernDoc(); Thread request2 = createRequestThread(manager, jQuery, response2, doc2); request1.start(); request2.start(); try { request1.join(); request2.join(); } catch (InterruptedException e) { e.printStackTrace(); } // check if tern server doesn't throw errors. response1.getData(); response2.getData(); // the 2 requests which are started in the same time, parse 2 times the // same js. Assert.assertEquals(2, doc1.getFiles().size() + doc2.getFiles().size()); // Create a new request (at this step the big file is parsed), so tern // doc should not contains this file. DefaultResponseHandler response3 = new DefaultResponseHandler(true); TernDoc doc3 = new TernDoc(); Thread request3 = createRequestThread(manager, jQuery, response3, doc3); request3.start(); try { request3.join(); } catch (InterruptedException e) { e.printStackTrace(); } // check if tern server doesn't throw errors. response3.getData(); // fiel must be empty. Assert.assertEquals(0, doc3.getFiles().size()); } public Thread createRequestThread(final ITernFileSynchronizer fileManager, final MapTernFile jQuery, final DefaultResponseHandler response, final TernDoc doc) { return new Thread(new Runnable() { @Override public void run() { try { //Test was already disabled when file management API has been //updated. A special cache manager would have to be created to //mimic old behaviour //fileManager.updateFile(jQuery, doc, null); server.request(doc, response); } catch (Exception e) { e.printStackTrace(); } } }); } private TernDoc createTernDoc() { String name = "myfile.js"; String text = "var arr = [];"; TernDoc doc = new TernDoc(); doc.addFile(name, text, null, null); return doc; } }