jaroslav@57: /* jaroslav@264: * Quoridor server and related libraries jaroslav@264: * Copyright (C) 2009-2010 Jaroslav Tulach jaroslav@57: * 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. jaroslav@57: * 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. jaroslav@57: * 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/. jaroslav@57: */ jaroslav@57: jaroslav@57: package cz.xelfi.quoridor.webidor; jaroslav@57: jaroslav@258: import com.sun.jersey.test.framework.WebAppDescriptor; jaroslav@258: import com.sun.jersey.test.framework.AppDescriptor; jtulach@238: import java.util.Properties; jaroslav@128: import com.sun.jersey.api.client.GenericType; jaroslav@162: import com.sun.jersey.api.client.UniformInterfaceException; jaroslav@57: import com.sun.jersey.test.framework.JerseyTest; jaroslav@57: import java.io.File; jtulach@82: import java.io.FileOutputStream; jaroslav@57: import java.io.IOException; jaroslav@128: import java.util.List; jaroslav@57: import javax.ws.rs.core.MediaType; jaroslav@57: import org.junit.Test; jaroslav@57: import static org.junit.Assert.*; jaroslav@57: jaroslav@57: /** jaroslav@57: * jaroslav@57: * @author Jaroslav Tulach jaroslav@57: */ jaroslav@57: public class FinishedGameTest extends JerseyTest { jaroslav@149: static { jaroslav@149: System.setProperty("JERSEY_HTTP_PORT", "33435"); jaroslav@149: } jaroslav@57: private File dir; jaroslav@258: jaroslav@57: @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\nMaster=mr\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("finishedGame").build(); jaroslav@57: } jaroslav@57: jaroslav@57: @Override jaroslav@57: public void tearDown() throws Exception { jaroslav@57: super.tearDown(); jaroslav@57: deleteRec(dir); jaroslav@57: } jaroslav@57: jaroslav@57: static void deleteRec(File dir) throws IOException { jaroslav@57: if (dir == null) { jaroslav@57: return; jaroslav@57: } jaroslav@57: File[] arr = dir.listFiles(); jaroslav@57: if (arr != null) { jaroslav@57: for (File f : arr) { jaroslav@57: deleteRec(f); jaroslav@57: } jaroslav@57: } jaroslav@57: dir.delete(); jaroslav@57: } jtulach@83: @Test public void testNotLoggedIn() { jaroslav@258: String status = resource().path("login").queryParam("id", "not-logged-in"). jtulach@83: accept(MediaType.TEXT_PLAIN).get(String.class); jtulach@83: assertEquals("Nobody is logged in", "", status); jtulach@83: } jtulach@83: jaroslav@57: jaroslav@57: @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); jtulach@82: assertNotNull("Logged in ok", logJarda); jaroslav@258: GameId s = resource().path("games").queryParam("white", "Jarda") jtulach@82: .queryParam("loginID", logJarda) jaroslav@57: .queryParam("black", "Jirka").post(GameId.class); jaroslav@57: jaroslav@57: for (int i = 0; i < 3; i++) { jaroslav@258: resource().path("games/" + s.getId()) jtulach@82: .queryParam("loginID", logJarda) jtulach@82: .queryParam("player", "Jarda").queryParam("move", "N").put(GameId.class); jaroslav@258: resource().path("games/" + s.getId()) jtulach@82: .queryParam("loginID", logJirka) jtulach@82: .queryParam("player", "Jirka").queryParam("move", "S").put(GameId.class); jaroslav@57: } jaroslav@57: jaroslav@258: resource().path("games/" + s.getId()) jtulach@82: .queryParam("loginID", logJarda) jtulach@82: .queryParam("player", "Jarda").queryParam("move", "N").put(GameId.class); jaroslav@258: resource().path("games/" + s.getId()) jtulach@82: .queryParam("loginID", logJirka) jtulach@82: .queryParam("player", "Jirka").queryParam("move", "SS").put(GameId.class); jaroslav@57: jaroslav@128: jaroslav@128: GenericType> gType = new GenericType>() {}; jaroslav@258: List nothing = resource().path("games/").queryParam("status", "blackWon").accept(MediaType.TEXT_XML).get(gType); jaroslav@128: assertTrue("Nothing has been finished yet: " + nothing, nothing.isEmpty()); jaroslav@128: jaroslav@57: for (int i = 0; i < 3; i++) { jaroslav@258: resource().path("games/" + s.getId()) jtulach@82: .queryParam("loginID", logJarda) jtulach@82: .queryParam("player", "Jarda").queryParam("move", "N").put(GameId.class); jaroslav@258: resource().path("games/" + s.getId()) jtulach@82: .queryParam("loginID", logJirka) jtulach@82: .queryParam("player", "Jirka").queryParam("move", "S").put(GameId.class); jaroslav@57: } jaroslav@57: jaroslav@128: jaroslav@162: try { jaroslav@258: Game end = resource().path("games/" + s.getId()).accept(MediaType.TEXT_XML).get(Game.class); jaroslav@162: fail("If the game is finished, one cannot get its status without login"); jaroslav@162: } catch (UniformInterfaceException ex) { jaroslav@162: // OK jaroslav@162: } jaroslav@258: Game end = resource().path("games/" + s.getId()).queryParam("loginID", logJirka).accept(MediaType.TEXT_XML).get(Game.class); jtulach@77: assertEquals("BlackWins", GameStatus.blackWon, end.getId().getStatus()); jaroslav@128: jaroslav@140: assertEquals("Jirka wins", "Jirka", end.getCurrentPlayer()); jaroslav@140: jaroslav@258: List none = resource().path("games/").queryParam("status", "blackWon").accept(MediaType.TEXT_XML).get(gType); jtulach@166: assertEquals("No games, for not logged in users: " + none, 0, none.size()); jaroslav@128: jaroslav@258: List something = resource().path("games/").queryParam("loginID", logJirka).queryParam("status", "blackWon").accept(MediaType.TEXT_XML).get(gType); jaroslav@128: assertEquals("One game finished: " + something, 1, something.size()); jaroslav@128: assertEquals("Id is OK", end.getId().getId(), something.get(0).getId()); jaroslav@57: } jaroslav@57: jtulach@75: @Test public void testResignAGame() 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: GameId s = resource().path("games").queryParam("white", "Jarda") jtulach@82: .queryParam("loginID", logJarda) jtulach@75: .queryParam("black", "Jirka").post(GameId.class); jtulach@75: jaroslav@162: assertTrue("In progress", s.getStatus().isInProgress()); jaroslav@162: jaroslav@258: resource().path("games/" + s.getId()). jtulach@82: queryParam("loginID", logJarda). jtulach@82: queryParam("player", "Jarda"). jtulach@82: queryParam("move", "RESIGN").put(GameId.class); jaroslav@162: try { jaroslav@258: Game end = resource().path("games/" + s.getId()).accept(MediaType.TEXT_XML).get(Game.class); jaroslav@162: fail("Should not be able to get game when finished"); jaroslav@162: } catch (UniformInterfaceException ex) { jaroslav@162: // OK jaroslav@162: } jaroslav@258: Game end = resource().path("games/" + s.getId()).queryParam("loginID", logJarda).accept(MediaType.TEXT_XML).get(Game.class); jtulach@77: assertEquals("BlackWins", GameStatus.blackWon, end.getId().getStatus()); jaroslav@140: assertEquals("Jirka wins", "Jirka", end.getCurrentPlayer()); jaroslav@162: jaroslav@162: assertFalse("is finished", end.getId().getStatus().isInProgress()); jtulach@75: } jtulach@75: jaroslav@178: @Test public void testResignBGame() throws Exception { jaroslav@258: String logJarda = resource().path("login"). jaroslav@178: queryParam("name", "Jarda"). jaroslav@178: queryParam("password", "heslo"). jaroslav@178: accept(MediaType.TEXT_PLAIN). jaroslav@178: put(String.class); jaroslav@258: String logJirka = resource().path("login"). jaroslav@178: queryParam("name", "Jirka"). jaroslav@178: queryParam("password", "pesko"). jaroslav@178: accept(MediaType.TEXT_PLAIN). jaroslav@178: put(String.class); jaroslav@178: jaroslav@258: GameId s = resource().path("games").queryParam("white", "Jarda") jaroslav@178: .queryParam("loginID", logJarda) jaroslav@178: .queryParam("black", "Jirka").post(GameId.class); jaroslav@178: jaroslav@178: assertTrue("In progress", s.getStatus().isInProgress()); jaroslav@178: jaroslav@258: resource().path("games/" + s.getId()). jaroslav@178: queryParam("loginID", logJarda). jaroslav@178: queryParam("player", "Jarda"). jaroslav@178: queryParam("move", "N").put(GameId.class); jaroslav@258: resource().path("games/" + s.getId()). jaroslav@178: queryParam("loginID", logJirka). jaroslav@178: queryParam("player", "Jirka"). jaroslav@178: queryParam("move", "RESIGN").put(GameId.class); jaroslav@178: jaroslav@178: jaroslav@178: try { jaroslav@258: Game end = resource().path("games/" + s.getId()).accept(MediaType.TEXT_XML).get(Game.class); jaroslav@178: fail("Should not be able to get game when finished"); jaroslav@178: } catch (UniformInterfaceException ex) { jaroslav@178: // OK jaroslav@178: } jaroslav@258: Game end = resource().path("games/" + s.getId()).queryParam("loginID", logJarda).accept(MediaType.TEXT_XML).get(Game.class); jaroslav@178: assertEquals("WhiteWins", GameStatus.whiteWon, end.getId().getStatus()); jaroslav@178: assertEquals("Jarda wins", "Jarda", end.getCurrentPlayer()); jaroslav@178: jaroslav@178: assertFalse("is finished", end.getId().getStatus().isInProgress()); jaroslav@178: } jaroslav@178: jtulach@238: @Test public void testResignForeignGame() throws Exception { jaroslav@258: String logJarda = resource().path("login"). jtulach@238: queryParam("name", "Jarda"). jtulach@238: queryParam("password", "heslo"). jtulach@238: accept(MediaType.TEXT_PLAIN). jtulach@238: put(String.class); jaroslav@258: GameId s = resource().path("games").queryParam("white", "Jarda") jtulach@238: .queryParam("loginID", logJarda) jtulach@238: .queryParam("black", "Jirka").post(GameId.class); jtulach@238: File usersDir = new File(dir, "users"); jtulach@238: usersDir.mkdirs(); jtulach@238: File Master = new File(usersDir, "Master"); jtulach@238: { jtulach@238: Properties p = new Properties(); jtulach@238: p.setProperty("email", "mas@ter.cz"); jtulach@238: p.setProperty("permission.resign", "true"); jtulach@238: p.store(new FileOutputStream(Master), ""); jtulach@238: } jtulach@238: jtulach@238: assertTrue("In progress", s.getStatus().isInProgress()); jaroslav@258: String logMaster = resource().path("login"). jtulach@238: queryParam("name", "Master"). jtulach@238: queryParam("password", "mr"). jtulach@238: accept(MediaType.TEXT_PLAIN). jtulach@238: put(String.class); jtulach@238: jaroslav@258: resource().path("games/" + s.getId()). jtulach@238: queryParam("loginID", logMaster). jtulach@238: queryParam("player", "Jarda"). jtulach@238: queryParam("move", "RESIGN").put(GameId.class); jtulach@238: try { jaroslav@258: Game end = resource().path("games/" + s.getId()).accept(MediaType.TEXT_XML).get(Game.class); jtulach@238: fail("Should not be able to get game when finished"); jtulach@238: } catch (UniformInterfaceException ex) { jtulach@238: // OK jtulach@238: } jaroslav@258: Game end = resource().path("games/" + s.getId()).queryParam("loginID", logJarda).accept(MediaType.TEXT_XML).get(Game.class); jtulach@238: assertEquals("BlackWins", GameStatus.blackWon, end.getId().getStatus()); jtulach@238: assertEquals("Jirka wins", "Jirka", end.getCurrentPlayer()); jtulach@238: jtulach@238: assertFalse("is finished", end.getId().getStatus().isInProgress()); jtulach@238: } jtulach@238: jaroslav@57: }