001: /*
002: * This file is part of DrFTPD, Distributed FTP Daemon.
003: *
004: * DrFTPD is free software; you can redistribute it and/or modify
005: * it under the terms of the GNU General Public License as published by
006: * the Free Software Foundation; either version 2 of the License, or
007: * (at your option) any later version.
008: *
009: * DrFTPD is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
012: * GNU General Public License for more details.
013: *
014: * You should have received a copy of the GNU General Public License
015: * along with DrFTPD; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: */
018: package org.drftpd.remotefile;
019:
020: import junit.framework.AssertionFailedError;
021: import junit.framework.TestCase;
022:
023: import net.sf.drftpd.master.SlaveFileException;
024:
025: import org.apache.log4j.BasicConfigurator;
026:
027: import org.drftpd.master.RemoteSlave;
028:
029: import org.drftpd.tests.DummyFtpConfig;
030: import org.drftpd.tests.DummyGlobalContext;
031: import org.drftpd.tests.DummyRemoteSlave;
032: import org.drftpd.tests.DummySlaveManager;
033:
034: import java.io.FileNotFoundException;
035: import java.io.IOException;
036:
037: import java.util.ArrayList;
038: import java.util.Arrays;
039: import java.util.Collections;
040: import java.util.List;
041:
042: /**
043: * @author mog
044: * @version $Id: LinkedRemoteFileTest.java 1513 2006-10-13 22:41:08Z tdsoul $
045: */
046: public class LinkedRemoteFileTest extends TestCase {
047: private LinkedRemoteFile _root;
048: private RemoteSlave _slave1;
049: private RemoteSlave _slave2;
050:
051: public LinkedRemoteFileTest(String fName) {
052: super (fName);
053: }
054:
055: private static void buildRoot(LinkedRemoteFile root,
056: List slaveBothList, List slave1List, List slave2List)
057: throws FileNotFoundException {
058: root.addFile(new StaticRemoteFile(slaveBothList,
059: "ConflictTest", 1000));
060: root.addFile(new StaticRemoteFile(slave1List, "AddSlaveTest",
061: 1000));
062: root.addFile(new StaticRemoteFile(slaveBothList,
063: "RemoteSlaveTest", 1000));
064: root.addFile(new StaticRemoteFile(slave2List, "RemoveFile",
065: 1000));
066: root.addFile(new StaticRemoteFile(null, "DirTest", 0));
067: root.addFile(new StaticRemoteFile(null, "RemoveDir", 0));
068:
069: LinkedRemoteFileInterface masterdir = root.getFile("DirTest");
070: masterdir.addFile(new StaticRemoteFile(slaveBothList,
071: "TestFileInDir", 1000));
072:
073: LinkedRemoteFileInterface removedir = root.getFile("RemoveDir");
074: removedir.addFile(new StaticRemoteFile(slave1List,
075: "TestForRemoval", 1000));
076: }
077:
078: private static void internalRemergeSlave1(LinkedRemoteFile root,
079: RemoteSlave slave1) throws IOException {
080: CaseInsensitiveHashtable slaveroot = new CaseInsensitiveHashtable();
081: slaveroot.put("ConflictTest", new LightRemoteFile(
082: "ConflictTest", System.currentTimeMillis(), 1000));
083: slaveroot.put("AddSlaveTest", new LightRemoteFile(
084: "AddSlaveTest", System.currentTimeMillis(), 1000));
085: slaveroot.put("RemoteSlaveTest", new LightRemoteFile(
086: "RemoteSlaveTest", System.currentTimeMillis(), 1000));
087: slaveroot.put("DirTest", new LightRemoteFile("DirTest", System
088: .currentTimeMillis()));
089: root.remerge(slaveroot, slave1);
090: slaveroot.clear();
091: slaveroot.put("TestFileInDir", new LightRemoteFile(
092: "TestFileInDir", System.currentTimeMillis(), 1000));
093: root.getFile("DirTest").remerge(slaveroot, slave1);
094: }
095:
096: private static void internalRemergeSlave2(LinkedRemoteFile root,
097: RemoteSlave slave2) throws IOException {
098: CaseInsensitiveHashtable slaveroot = new CaseInsensitiveHashtable();
099: slaveroot.put("ConflictTest", new LightRemoteFile(
100: "ConflictTest", System.currentTimeMillis(), 1001));
101: slaveroot.put("AddSlaveTest", new LightRemoteFile(
102: "AddSlaveTest", System.currentTimeMillis(), 1000));
103: slaveroot.put("DirTest", new LightRemoteFile("DirTest", System
104: .currentTimeMillis()));
105: root.remerge(slaveroot, slave2);
106: slaveroot.clear();
107:
108: slaveroot.put("TestFileInDir", new LightRemoteFile(
109: "TestFileInDir", System.currentTimeMillis(), 1000));
110: root.getFile("DirTest").remerge(slaveroot, slave2);
111: }
112:
113: private void internalSetUp() throws SlaveFileException {
114: _slave1 = new DummyRemoteSlave("slave1", null);
115: _slave2 = new DummyRemoteSlave("slave2", null);
116:
117: DummyFtpConfig cfg = new DummyFtpConfig();
118: DummyGlobalContext dgctx = new DummyGlobalContext();
119: dgctx.setSlaveManager(new DummySlaveManager());
120: cfg.setGlobalContext(dgctx);
121: _root = new LinkedRemoteFile(cfg);
122: }
123:
124: public void setUp() {
125: BasicConfigurator.configure();
126: }
127:
128: public void testAddSlave() throws IOException, SlaveFileException {
129: internalSetUp();
130:
131: List bothSlaves = Arrays.asList(new RemoteSlave[] { _slave1,
132: _slave2 });
133: System.out.println("bothSlaves = " + bothSlaves);
134: System.out.println("slave1 = " + _slave1);
135: System.out.println("slave2 = " + _slave2);
136: CaseInsensitiveHashtable files = new CaseInsensitiveHashtable();
137: files.put("AddSlaveTest", new LightRemoteFile("AddSlaveTest",
138: System.currentTimeMillis(), 1000));
139:
140: CaseInsensitiveHashtable files2 = new CaseInsensitiveHashtable();
141: files2.put("AddSlaveTest", new LightRemoteFile("AddSlaveTest",
142: System.currentTimeMillis(), 1000));
143: System.out.println("remerging slave1");
144: _root.remerge(files, _slave1);
145: System.out.println("remerging slave2");
146: _root.remerge(files2, _slave2);
147: System.out.println("slaves remerged");
148:
149: LinkedRemoteFileInterface file2 = _root
150: .getFile(new StaticRemoteFile(Collections.EMPTY_LIST,
151: "AddSlaveTest", 1000).getName());
152: assertEquals(file2, _root.getFile(file2.getName()));
153: assertEquals(file2, _root
154: .getFile(file2.getName().toUpperCase()));
155: assertEquals(file2, _root
156: .getFile(file2.getName().toLowerCase()));
157: System.out.println("file2slaves = "
158: + _root.getFile(file2.getName()).getSlaves());
159: System.out.println("files = " + _root.getFiles());
160: assertEquals(bothSlaves, _root.getFile(file2.getName())
161: .getSlaves());
162: }
163:
164: public void testEmptyRoot() throws FileNotFoundException {
165: _root = new LinkedRemoteFile(null);
166: assertEquals(0, _root.length());
167:
168: _root.addFile(new StaticRemoteFile(Collections.EMPTY_LIST,
169: "Test1", 1000));
170:
171: assertEquals(1000, _root.length());
172:
173: _root.addFile(new StaticRemoteFile(Collections.EMPTY_LIST,
174: "Test2", 10000));
175:
176: assertEquals(11000, _root.length());
177:
178: _root.getFile("Test1").delete();
179:
180: assertEquals(10000, _root.length());
181: }
182:
183: public void internalBuildLinks() {
184: _root = new LinkedRemoteFile(null);
185: _root.addFile(new StaticRemoteFile("dir", null));
186: _root.addFile(new StaticRemoteFile("link", null, "/"));
187: _root.addFile(new StaticRemoteFile("dirlinkrel", null, "dir"));
188: _root.addFile(new StaticRemoteFile("dirlinkabs", null, "/dir"));
189: }
190:
191: public void testLinkRecursive() throws FileNotFoundException {
192: internalBuildLinks();
193:
194: LinkedRemoteFile lrf = _root.lookupFile("/link/link/link");
195: assertEquals(lrf, _root);
196: }
197:
198: public void testLinkRelativeRel() throws FileNotFoundException {
199: internalBuildLinks();
200:
201: LinkedRemoteFile lrf = _root.lookupFile("dirlinkrel");
202: assertEquals(lrf, _root.getFile("dir"));
203: }
204:
205: public void testLinkRelativeAbs() throws FileNotFoundException {
206: internalBuildLinks();
207:
208: LinkedRemoteFile lrf = _root.lookupFile("dirlinkabs");
209: assertEquals(lrf, _root.getFile("dir"));
210: }
211:
212: public void testLookup() throws FileNotFoundException {
213: internalBuildLinks();
214: assertNotSame(_root, _root.lookupFile("/dir"));
215: assertNotSame(_root, _root.lookupFile("dir"));
216: }
217:
218: public void testConflict() throws IOException, SlaveFileException {
219: internalSetUp();
220: _root.addFile(new StaticRemoteFile(Collections
221: .singletonList(_slave1), "ConflictFile", "drftpd",
222: "drftpd", 1000));
223: CaseInsensitiveHashtable files = new CaseInsensitiveHashtable();
224: files.put("ConflictFile", new LightRemoteFile("ConflictFile",
225: System.currentTimeMillis(), 1001));
226: _root.remerge(files, _slave1);
227: LinkedRemoteFileInterface file = _root.getFile("ConflictFile");
228: assertNotNull(file);
229: assertEquals(1001, file.length());
230: }
231:
232: public void testRemerge() throws IOException, SlaveFileException {
233: System.out.println("testRemerge()");
234: internalSetUp();
235:
236: List slaveBothList = Arrays.asList(new RemoteSlave[] { _slave1,
237: _slave2 });
238:
239: // build like files.mlst does
240: buildRoot(_root, slaveBothList, Collections
241: .singletonList(_slave1), Collections
242: .singletonList(_slave2));
243:
244: // remerge slave 1
245: internalRemergeSlave1(_root, _slave1);
246: assertEquals(Collections.singletonList(_slave1), _root.getFile(
247: "AddSlaveTest").getSlaves());
248: assertTrue(_root.getFile("DirTest").getFile("TestFileInDir")
249: .getSlaves().contains(_slave1));
250:
251: try {
252: LinkedRemoteFileInterface file = _root.getFile("RemoveDir");
253: throw new AssertionFailedError(file.toString()
254: + " should be deleted");
255: } catch (FileNotFoundException success) {
256: }
257:
258: // remerge slave 2
259: internalRemergeSlave2(_root, _slave2);
260:
261: {
262: assertNotNull(_root.getFile("ConflictTest"));
263: assertNotNull(_root.getFile("ConflictTest.slave2.conflict"));
264: assertEquals(slaveBothList, _root.getFile("AddSlaveTest")
265: .getSlaves());
266: System.out.println(_root.getFile("RemoteSlaveTest"));
267: assertFalse(_root.getFile("RemoteSlaveTest").getSlaves()
268: .contains(_slave2));
269:
270: try {
271: LinkedRemoteFileInterface file = _root
272: .getFile("RemoveFile");
273: throw new AssertionFailedError(file.toString()
274: + " should be deleted");
275: } catch (FileNotFoundException success) {
276: }
277:
278: LinkedRemoteFileInterface masterdir = _root
279: .getFile("DirTest");
280: assertEquals(
281: masterdir.getFile("TestFileInDir").getSlaves(),
282: slaveBothList);
283: }
284: }
285:
286: public void testRename() throws IOException, SlaveFileException {
287: setUp();
288: internalSetUp();
289: DummyFtpConfig dfc = new DummyFtpConfig();
290: DummyGlobalContext dgc = new DummyGlobalContext();
291: dgc.setSlaveManager(new DummySlaveManager());
292: dfc.setGlobalContext(dgc);
293: _root = new LinkedRemoteFile(dfc);
294: _root.addFile(new StaticRemoteFile(null, "SourceDir", 0));
295: _root.addFile(new StaticRemoteFile(null, "DestDir", 0));
296: _root.getFile("SourceDir").addFile(
297: new StaticRemoteFile(null, "test", 0));
298: _root.getFile("SourceDir").getFile("test").renameTo("/DestDir",
299: "test2");
300: assertEquals("/DestDir/test2", _root.getFile("DestDir")
301: .getFile("test2").getPath());
302: }
303:
304: public void testRemergeRemoveDir() throws IOException,
305: SlaveFileException {
306: setUp();
307: internalSetUp();
308: DummyFtpConfig dfc = new DummyFtpConfig();
309: DummyGlobalContext dgc = new DummyGlobalContext();
310: dgc.setSlaveManager(new DummySlaveManager());
311: dfc.setGlobalContext(dgc);
312: RemoteSlave rslave = new DummyRemoteSlave("testslave", null);
313: ArrayList<RemoteSlave> slaveList = new ArrayList();
314: slaveList.add(rslave);
315: _root = new LinkedRemoteFile(dfc);
316: _root.addFile(new StaticRemoteFile(null, "DontRemoveMe", 0));
317: _root.getFile("DontRemoveMe").addFile(
318: new StaticRemoteFile(null, "empty", 0));
319: _root.remerge(new CaseInsensitiveHashtable(), rslave);
320: assertNotNull(_root.getFile("DontRemoveMe"));
321: _root.getFile("DontRemoveMe").getFile("empty").addFile(
322: new StaticRemoteFile(slaveList, "file", 100));
323: _root.getFile("DontRemoveMe").remerge(
324: new CaseInsensitiveHashtable(), rslave);
325: assertEquals(0, _root.getFiles().size());
326: }
327:
328: public void testRemergeRemoveLink() throws IOException,
329: SlaveFileException {
330: setUp();
331: internalSetUp();
332: DummyFtpConfig dfc = new DummyFtpConfig();
333: DummyGlobalContext dgc = new DummyGlobalContext();
334: dgc.setSlaveManager(new DummySlaveManager());
335: dfc.setGlobalContext(dgc);
336: RemoteSlave rslave = new DummyRemoteSlave("testslave", null);
337: _root = new LinkedRemoteFile(dfc);
338: _root.addFile(new StaticRemoteFile(null, "TargetForLink", 0));
339: _root.addFile(new StaticRemoteFile("Link", null,
340: "TargetForLink"));
341: _root.remerge(new CaseInsensitiveHashtable(), rslave);
342: _root.getFile("TargetForLink").remerge(
343: new CaseInsensitiveHashtable(), rslave);
344: assertNotNull(_root.getFile("Link"));
345: }
346: }
|