annotate test/org/tmatesoft/hg/test/TestTransaction.java @ 665:dde18bc7053b v1.2m1

Test Copy-on-Write transactions
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Wed, 10 Jul 2013 20:16:37 +0200
parents
children
rev   line source
665
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
1 /*
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
2 * Copyright (c) 2013 TMate Software Ltd
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
3 *
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
4 * This program is free software; you can redistribute it and/or modify
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
5 * it under the terms of the GNU General Public License as published by
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
6 * the Free Software Foundation; version 2 of the License.
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
7 *
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
8 * This program is distributed in the hope that it will be useful,
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
11 * GNU General Public License for more details.
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
12 *
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
13 * For information on how to redistribute this software under
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
14 * the terms of a license other than GNU General Public License
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
15 * contact TMate Software at support@hg4j.com
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
16 */
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
17 package org.tmatesoft.hg.test;
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
18
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
19 import static org.junit.Assert.*;
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
20
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
21 import java.io.File;
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
22 import java.io.FileReader;
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
23 import java.io.IOException;
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
24
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
25 import org.junit.Rule;
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
26 import org.junit.Test;
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
27 import org.tmatesoft.hg.internal.BasicSessionContext;
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
28 import org.tmatesoft.hg.internal.COWTransaction;
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
29 import org.tmatesoft.hg.internal.Transaction;
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
30
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
31 /**
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
32 * Check transaction rollback/commit as it's tricky to test transactions as part of pull/push commands
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
33 *
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
34 * @author Artem Tikhomirov
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
35 * @author TMate Software Ltd.
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
36 */
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
37 public class TestTransaction {
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
38
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
39 @Rule
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
40 public ErrorCollectorExt errorCollector = new ErrorCollectorExt();
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
41
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
42 @Test
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
43 public void testCopyOnWriteTransaction() throws Exception {
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
44 final BasicSessionContext ctx = new BasicSessionContext(null);
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
45 Transaction.Factory f = new COWTransaction.Factory();
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
46 File dir = RepoUtils.createEmptyDir("test-transaction-cow");
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
47 File f1 = new File(dir, "f1");
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
48 File f2 = new File(dir, "f2");
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
49 File f3 = new File(dir, "f3");
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
50 RepoUtils.createFile(f1, "1");
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
51 assertTrue(f1.exists());
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
52 assertFalse(f2.exists());
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
53 assertFalse(f3.exists());
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
54 //
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
55 // transaction commit
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
56 Transaction tr1 = f.create(ctx);
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
57 File tf1 = tr1.prepare(f1);
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
58 RepoUtils.modifyFileAppend(tf1, "2");
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
59 tr1.done(tf1);
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
60 File tf2 = tr1.prepare(f2);
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
61 errorCollector.assertTrue(tf2.exists());
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
62 RepoUtils.modifyFileAppend(tf2, "A");
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
63 tr1.done(tf2);
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
64 tr1.commit();
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
65 errorCollector.assertTrue(f1.isFile());
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
66 errorCollector.assertTrue(f2.isFile());
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
67 errorCollector.assertEquals("12", read(f1));
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
68 errorCollector.assertEquals("A", read(f2));
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
69 //
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
70 // transaction rollback
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
71 assertFalse(f3.exists());
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
72 Transaction tr2 = f.create(ctx);
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
73 tf1 = tr2.prepare(f1);
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
74 RepoUtils.modifyFileAppend(tf1, "3");
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
75 tr2.done(tf1);
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
76 errorCollector.assertEquals("123", read(tf1));
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
77 tf2 = tr2.prepare(f2);
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
78 RepoUtils.modifyFileAppend(tf2, "B");
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
79 tr2.done(tf2);
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
80 errorCollector.assertEquals("AB", read(tf2));
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
81 File tf3 = tr2.prepare(f3);
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
82 errorCollector.assertTrue(tf3.exists());
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
83 RepoUtils.modifyFileAppend(tf3, "!");
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
84 tr2.done(tf3);
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
85 errorCollector.assertEquals("!", read(tf3));
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
86 tr2.rollback();
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
87 errorCollector.assertTrue(f1.isFile());
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
88 errorCollector.assertTrue(f2.isFile());
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
89 errorCollector.assertFalse(f3.isFile());
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
90 errorCollector.assertEquals("12", read(f1));
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
91 errorCollector.assertEquals("A", read(f2));
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
92 }
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
93
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
94 String read(File f) throws IOException {
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
95 StringBuilder sb = new StringBuilder();
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
96 FileReader fr = new FileReader(f);
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
97 int ch;
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
98 while ((ch = fr.read()) != -1) {
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
99 sb.append((char) ch);
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
100 }
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
101 fr.close();
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
102 return sb.toString();
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
103 }
dde18bc7053b Test Copy-on-Write transactions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
104 }