tikhomirov@665: /* tikhomirov@665: * Copyright (c) 2013 TMate Software Ltd tikhomirov@665: * tikhomirov@665: * This program is free software; you can redistribute it and/or modify tikhomirov@665: * it under the terms of the GNU General Public License as published by tikhomirov@665: * the Free Software Foundation; version 2 of the License. tikhomirov@665: * tikhomirov@665: * This program is distributed in the hope that it will be useful, tikhomirov@665: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@665: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@665: * GNU General Public License for more details. tikhomirov@665: * tikhomirov@665: * For information on how to redistribute this software under tikhomirov@665: * the terms of a license other than GNU General Public License tikhomirov@665: * contact TMate Software at support@hg4j.com tikhomirov@665: */ tikhomirov@665: package org.tmatesoft.hg.test; tikhomirov@665: tikhomirov@665: import static org.junit.Assert.*; tikhomirov@665: tikhomirov@665: import java.io.File; tikhomirov@665: import java.io.FileReader; tikhomirov@665: import java.io.IOException; tikhomirov@665: tikhomirov@665: import org.junit.Rule; tikhomirov@665: import org.junit.Test; tikhomirov@665: import org.tmatesoft.hg.internal.BasicSessionContext; tikhomirov@665: import org.tmatesoft.hg.internal.COWTransaction; tikhomirov@665: import org.tmatesoft.hg.internal.Transaction; tikhomirov@665: tikhomirov@665: /** tikhomirov@665: * Check transaction rollback/commit as it's tricky to test transactions as part of pull/push commands tikhomirov@665: * tikhomirov@665: * @author Artem Tikhomirov tikhomirov@665: * @author TMate Software Ltd. tikhomirov@665: */ tikhomirov@665: public class TestTransaction { tikhomirov@665: tikhomirov@665: @Rule tikhomirov@665: public ErrorCollectorExt errorCollector = new ErrorCollectorExt(); tikhomirov@665: tikhomirov@665: @Test tikhomirov@665: public void testCopyOnWriteTransaction() throws Exception { tikhomirov@665: final BasicSessionContext ctx = new BasicSessionContext(null); tikhomirov@665: Transaction.Factory f = new COWTransaction.Factory(); tikhomirov@665: File dir = RepoUtils.createEmptyDir("test-transaction-cow"); tikhomirov@665: File f1 = new File(dir, "f1"); tikhomirov@665: File f2 = new File(dir, "f2"); tikhomirov@665: File f3 = new File(dir, "f3"); tikhomirov@665: RepoUtils.createFile(f1, "1"); tikhomirov@665: assertTrue(f1.exists()); tikhomirov@665: assertFalse(f2.exists()); tikhomirov@665: assertFalse(f3.exists()); tikhomirov@665: // tikhomirov@665: // transaction commit tikhomirov@665: Transaction tr1 = f.create(ctx); tikhomirov@665: File tf1 = tr1.prepare(f1); tikhomirov@665: RepoUtils.modifyFileAppend(tf1, "2"); tikhomirov@665: tr1.done(tf1); tikhomirov@665: File tf2 = tr1.prepare(f2); tikhomirov@665: errorCollector.assertTrue(tf2.exists()); tikhomirov@665: RepoUtils.modifyFileAppend(tf2, "A"); tikhomirov@665: tr1.done(tf2); tikhomirov@665: tr1.commit(); tikhomirov@665: errorCollector.assertTrue(f1.isFile()); tikhomirov@665: errorCollector.assertTrue(f2.isFile()); tikhomirov@665: errorCollector.assertEquals("12", read(f1)); tikhomirov@665: errorCollector.assertEquals("A", read(f2)); tikhomirov@665: // tikhomirov@665: // transaction rollback tikhomirov@665: assertFalse(f3.exists()); tikhomirov@665: Transaction tr2 = f.create(ctx); tikhomirov@665: tf1 = tr2.prepare(f1); tikhomirov@665: RepoUtils.modifyFileAppend(tf1, "3"); tikhomirov@665: tr2.done(tf1); tikhomirov@665: errorCollector.assertEquals("123", read(tf1)); tikhomirov@665: tf2 = tr2.prepare(f2); tikhomirov@665: RepoUtils.modifyFileAppend(tf2, "B"); tikhomirov@665: tr2.done(tf2); tikhomirov@665: errorCollector.assertEquals("AB", read(tf2)); tikhomirov@665: File tf3 = tr2.prepare(f3); tikhomirov@665: errorCollector.assertTrue(tf3.exists()); tikhomirov@665: RepoUtils.modifyFileAppend(tf3, "!"); tikhomirov@665: tr2.done(tf3); tikhomirov@665: errorCollector.assertEquals("!", read(tf3)); tikhomirov@665: tr2.rollback(); tikhomirov@665: errorCollector.assertTrue(f1.isFile()); tikhomirov@665: errorCollector.assertTrue(f2.isFile()); tikhomirov@665: errorCollector.assertFalse(f3.isFile()); tikhomirov@665: errorCollector.assertEquals("12", read(f1)); tikhomirov@665: errorCollector.assertEquals("A", read(f2)); tikhomirov@665: } tikhomirov@665: tikhomirov@665: String read(File f) throws IOException { tikhomirov@665: StringBuilder sb = new StringBuilder(); tikhomirov@665: FileReader fr = new FileReader(f); tikhomirov@665: int ch; tikhomirov@665: while ((ch = fr.read()) != -1) { tikhomirov@665: sb.append((char) ch); tikhomirov@665: } tikhomirov@665: fr.close(); tikhomirov@665: return sb.toString(); tikhomirov@665: } tikhomirov@665: }