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