jtulach@35: /* jaroslav@264: * Quoridor server and related libraries jaroslav@264: * Copyright (C) 2009-2010 Jaroslav Tulach jtulach@35: * jaroslav@264: * This program is free software: you can redistribute it and/or modify jaroslav@264: * it under the terms of the GNU General Public License as published by jaroslav@264: * the Free Software Foundation, either version 3 of the License. jtulach@35: * jaroslav@264: * This program is distributed in the hope that it will be useful, jaroslav@264: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@264: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@264: * GNU General Public License for more details. jtulach@35: * jaroslav@264: * You should have received a copy of the GNU General Public License jaroslav@264: * along with this program. Look for COPYING file in the top folder. jaroslav@264: * If not, see http://www.gnu.org/licenses/. jtulach@35: */ jtulach@35: package cz.xelfi.quoridor.webidor; jtulach@35: jaroslav@258: import com.sun.jersey.test.framework.AppDescriptor; jaroslav@179: import cz.xelfi.quoridor.IllegalPositionException; jaroslav@179: import java.io.StringWriter; jtulach@35: import com.sun.jersey.api.client.GenericType; jtulach@35: import com.sun.jersey.api.client.UniformInterfaceException; jtulach@35: import com.sun.jersey.core.header.MediaTypes; jtulach@35: import com.sun.jersey.test.framework.JerseyTest; jaroslav@258: import com.sun.jersey.test.framework.WebAppDescriptor; jtulach@39: import cz.xelfi.quoridor.Board; jtulach@39: import cz.xelfi.quoridor.Move; jtulach@39: import cz.xelfi.quoridor.webidor.resources.Games; jtulach@82: import cz.xelfi.quoridor.webidor.resources.Quoridor; jtulach@37: import java.io.File; jtulach@82: import java.io.FileOutputStream; jtulach@37: import java.io.FileReader; jtulach@37: import java.io.IOException; jaroslav@179: import java.io.StringReader; jtulach@35: import java.util.List; jaroslav@46: import java.util.Map; jaroslav@46: import javax.ws.rs.core.MediaType; jtulach@35: import org.junit.Test; jtulach@35: import static org.junit.Assert.*; jtulach@35: jtulach@35: /** jtulach@35: * jtulach@35: * @author Jaroslav Tulach jtulach@35: */ jtulach@35: public class QuoridorTest extends JerseyTest { jaroslav@145: static { jaroslav@145: System.setProperty("JERSEY_HTTP_PORT", "33434"); jaroslav@145: } jtulach@37: private File dir; jtulach@35: jaroslav@258: @Override jaroslav@258: protected AppDescriptor configure() { jaroslav@258: try { jaroslav@258: dir = File.createTempFile("quoridor", ".dir"); jaroslav@258: dir.delete(); jaroslav@258: System.setProperty("quoridor.dir", dir.getPath()); jaroslav@258: dir.mkdirs(); jaroslav@258: File passwd = new File(dir, "passwd"); jaroslav@258: FileOutputStream os = new FileOutputStream(passwd); jaroslav@258: os.write("Jarda=heslo\nJirka=pesko\n".getBytes("UTF-8")); jaroslav@258: os.close(); jaroslav@258: } catch (Exception ex) { jaroslav@258: throw new IllegalStateException(ex); jaroslav@258: } jaroslav@285: return new WebAppDescriptor.Builder("cz.xelfi.quoridor.webidor.resources").contextPath("quoTest").build(); jtulach@35: } jtulach@35: jaroslav@258: jtulach@37: jtulach@37: @Override jtulach@37: public void tearDown() throws Exception { jtulach@37: super.tearDown(); jtulach@37: deleteRec(dir); jtulach@37: } jtulach@37: jtulach@37: static void deleteRec(File dir) throws IOException { jtulach@37: if (dir == null) { jtulach@37: return; jtulach@37: } jtulach@37: File[] arr = dir.listFiles(); jtulach@37: if (arr != null) { jtulach@37: for (File f : arr) { jtulach@37: deleteRec(f); jtulach@37: } jtulach@37: } jtulach@37: dir.delete(); jtulach@37: } jtulach@37: jtulach@35: @Test public void testApplicationWadl() { jaroslav@258: String serviceWadl = resource().path("application.wadl"). jtulach@35: accept(MediaTypes.WADL).get(String.class); jtulach@35: assertTrue(serviceWadl.length() > 0); jtulach@35: } jtulach@35: jtulach@37: @Test public void testCreateAGame() throws Exception { jaroslav@258: String logJarda = resource().path("login"). jtulach@82: queryParam("name", "Jarda"). jtulach@82: queryParam("password", "heslo"). jtulach@82: accept(MediaType.TEXT_PLAIN). jtulach@82: put(String.class); jaroslav@258: String logJirka = resource().path("login"). jtulach@82: queryParam("name", "Jirka"). jtulach@82: queryParam("password", "pesko"). jtulach@82: accept(MediaType.TEXT_PLAIN). jtulach@82: put(String.class); jaroslav@145: jaroslav@258: User uJirka = resource().path("users"). jaroslav@145: queryParam("loginID", logJirka). jaroslav@145: accept(MediaType.TEXT_XML). jaroslav@145: get(User.class); jaroslav@145: jaroslav@145: assertEquals("Jirka", uJirka.getId()); jaroslav@145: jaroslav@145: jaroslav@258: GameId s = resource().path("games").queryParam("loginID", logJarda). jtulach@82: queryParam("white", "Jarda") jaroslav@48: .queryParam("black", "Jirka").post(GameId.class); jtulach@35: jtulach@78: Thread.sleep(100); jtulach@78: final long now = System.currentTimeMillis(); jtulach@78: if (s.getModified() >= now) { jtulach@78: fail("The game is supposed to be modified in past"); jtulach@78: } jtulach@78: Thread.sleep(100); jtulach@78: jaroslav@258: String msg = resource().path("games").get(String.class); jaroslav@258: //List games = resource().path("games").get(new GenericType>() {}); jtulach@35: jaroslav@48: GenericType> gType = new GenericType>() {}; jtulach@35: jaroslav@258: List games = resource().path("games").accept("application/json").get(gType); jtulach@35: assertEquals("One game", 1, games.size()); jtulach@35: assertEquals("Same white", "Jarda", games.get(0).getWhite()); jtulach@35: assertEquals("Same black", "Jirka", games.get(0).getBlack()); jtulach@35: jaroslav@258: GameId s1 = resource().path("games/" + s.getId()). jtulach@82: queryParam("loginID", logJarda). jtulach@82: queryParam("player", "Jarda").queryParam("move", "N").put(GameId.class); jtulach@35: try { jaroslav@258: GameId s2 = resource().path("games/" + s.getId()). jtulach@82: queryParam("loginID", logJarda). jtulach@82: queryParam("player", "Jarda").queryParam("move", "N").put(GameId.class); jtulach@35: fail("Not Jarda's turn, previous call shall fail"); jtulach@35: } catch (UniformInterfaceException ex) { jtulach@35: // OK jtulach@35: } jtulach@35: try { jaroslav@258: GameId s2 = resource().path("games/" + s.getId()). jtulach@82: queryParam("loginID", logJirka). jtulach@82: queryParam("player", "Jirka").queryParam("move", "NONSENCE").put(GameId.class); jtulach@35: fail("Invalid move"); jtulach@35: } catch (UniformInterfaceException ex) { jtulach@35: // OK jtulach@35: } jaroslav@258: GameId s2 = resource().path("games/" + s.getId()). jtulach@82: queryParam("loginID", logJirka). jtulach@82: queryParam("player", "Jirka").queryParam("move", "S").put(GameId.class); jtulach@35: assertNotNull("Successful move", s2); jtulach@78: if (s2.getModified() <= now) { jtulach@78: fail("The game is newly modified"); jtulach@78: } jaroslav@258: Game snapshot = resource().path("games/" + s.getId()).queryParam("move", "0").accept(MediaType.TEXT_XML).get(Game.class); jaroslav@258: String ssnapshot = resource().path("games/" + s.getId()).queryParam("move", "0").accept(MediaType.TEXT_XML).get(String.class); jaroslav@115: assertEquals("All moves listed:\n" + ssnapshot, 2, snapshot.getMoves().size()); jaroslav@100: assertEquals("Current move", 0, snapshot.getCurrentMove()); jaroslav@100: assertEquals("Position 0", 0, snapshot.getBoard().getPlayers().get(0).getRow()); jaroslav@100: assertEquals("Position 8", 8, snapshot.getBoard().getPlayers().get(1).getRow()); jaroslav@115: assertEquals("Moves numbered from 1", 1, snapshot.getMoves().get(0).getIndex()); jaroslav@115: assertEquals("Moves numbered from 1, 2", 2, snapshot.getMoves().get(1).getIndex()); jtulach@37: jtulach@37: File game = new File(new File(dir, "games"), s2.getId()); jtulach@37: assertTrue("File for game exists", game.exists()); jtulach@37: jtulach@37: char[] arr = new char[4096]; jtulach@37: FileReader gameContent = new FileReader(game); jtulach@37: int len = gameContent.read(arr); jtulach@37: String content = new String(arr, 0, len); jtulach@37: jtulach@37: if (!content.contains("# white: Jarda")) { jtulach@37: fail(content); jtulach@37: } jtulach@37: if (!content.contains("# black: Jirka")) { jtulach@37: fail(content); jtulach@37: } jtulach@37: if (!content.contains("N S")) { jtulach@37: fail(content); jtulach@37: } jtulach@39: jtulach@82: Games read = new Games(new File(dir, "games"), new Quoridor()); jtulach@39: List readGames = read.getGames(); jtulach@39: assertEquals("One game read", 1, readGames.size()); jaroslav@48: Board board = readGames.get(0).getBoard(); jtulach@39: assertEquals(1, board.getPlayers().get(0).getRow()); jtulach@39: assertEquals(7, board.getPlayers().get(1).getRow()); jaroslav@115: assertEquals(Move.NORTH, readGames.get(0).getMoves().get(0).getMove()); jaroslav@115: assertEquals(Move.SOUTH, readGames.get(0).getMoves().get(1).getMove()); jaroslav@46: jaroslav@46: class GMap extends GenericType>{} jaroslav@258: String text = resource().path("games").path(s.getId()).accept(MediaType.TEXT_PLAIN).get(String.class); jaroslav@179: text = (boardToPicture(Board.valueOf(text))); jaroslav@48: if (text.indexOf("-----") == -1) { jaroslav@48: fail("Expecting board:\n" + text); jaroslav@48: } jaroslav@258: Game readGame = resource().path("games").path(s.getId()).accept(MediaType.TEXT_XML).get(Game.class); jaroslav@258: String sGame = resource().path("games").path(s.getId()).accept(MediaType.TEXT_XML).get(String.class); jaroslav@48: assertNotNull("Game really returned", readGame); jaroslav@178: // assertEquals("Same game as in text representation", readGame.getBoard(), Board.valueOf(text)); jaroslav@179: assertEquals("Same game as in text representation", readGame.getBoard(), picture2board(text)); jaroslav@178: // assertEquals("It is same as text of our game", readGame.getBoard().toString(), text); jaroslav@179: assertEquals("It is same as text of our game", boardToPicture(readGame.getBoard()), text); jaroslav@46: jaroslav@115: assertEquals(Move.NORTH, readGame.getMoves().get(0).getMove()); jaroslav@115: assertEquals(Move.SOUTH, readGame.getMoves().get(1).getMove()); jtulach@35: } jaroslav@179: private static String boardToPicture(Board b) { jaroslav@179: StringWriter w = new StringWriter(); jaroslav@179: try { jaroslav@179: b.write(w); jaroslav@179: } catch (IOException ex) { jaroslav@179: return ex.toString(); jaroslav@179: } jaroslav@179: return w.toString(); jaroslav@179: } jtulach@35: jaroslav@179: private static Board picture2board(String text) throws IOException, IllegalPositionException { jaroslav@179: StringReader sr = new StringReader(text); jaroslav@179: return Board.read(sr); jaroslav@179: } jtulach@35: }