View Javadoc
1   /*
2    * Copyright (C) 2010, Robin Rosenberg
3    * and other copyright owners as documented in the project's IP log.
4    *
5    * This program and the accompanying materials are made available
6    * under the terms of the Eclipse Distribution License v1.0 which
7    * accompanies this distribution, is reproduced below, and is
8    * available at http://www.eclipse.org/org/documents/edl-v10.php
9    *
10   * All rights reserved.
11   *
12   * Redistribution and use in source and binary forms, with or
13   * without modification, are permitted provided that the following
14   * conditions are met:
15   *
16   * - Redistributions of source code must retain the above copyright
17   *   notice, this list of conditions and the following disclaimer.
18   *
19   * - Redistributions in binary form must reproduce the above
20   *   copyright notice, this list of conditions and the following
21   *   disclaimer in the documentation and/or other materials provided
22   *   with the distribution.
23   *
24   * - Neither the name of the Eclipse Foundation, Inc. nor the
25   *   names of its contributors may be used to endorse or promote
26   *   products derived from this software without specific prior
27   *   written permission.
28   *
29   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
30   * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
31   * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
32   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
33   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
34   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
35   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
36   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
37   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
38   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
40   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
41   * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42   */
43  package org.eclipse.jgit.internal.storage.file;
44  
45  import static org.junit.Assert.assertFalse;
46  import static org.junit.Assert.assertTrue;
47  
48  import java.io.File;
49  import java.io.FileOutputStream;
50  import java.io.IOException;
51  import java.util.ArrayList;
52  import java.util.List;
53  
54  import org.eclipse.jgit.internal.storage.file.FileSnapshot;
55  import org.eclipse.jgit.util.FileUtils;
56  import org.junit.After;
57  import org.junit.Before;
58  import org.junit.Test;
59  
60  public class FileSnapshotTest {
61  
62  	private List<File> files = new ArrayList<File>();
63  
64  	private File trash;
65  
66  	@Before
67  	public void setUp() throws Exception {
68  		trash = File.createTempFile("tmp_", "");
69  		trash.delete();
70  		assertTrue("mkdir " + trash, trash.mkdir());
71  	}
72  
73  	@Before
74  	@After
75  	public void tearDown() throws Exception {
76  		FileUtils.delete(trash, FileUtils.RECURSIVE | FileUtils.SKIP_MISSING);
77  	}
78  
79  	private static void waitNextSec(File f) {
80  		long initialLastModified = f.lastModified();
81  		do {
82  			f.setLastModified(System.currentTimeMillis());
83  		} while (f.lastModified() == initialLastModified);
84  	}
85  
86  	/**
87  	 * Change data and time stamp.
88  	 *
89  	 * @throws Exception
90  	 */
91  	@Test
92  	public void testActuallyIsModifiedTrivial() throws Exception {
93  		File f1 = createFile("simple");
94  		waitNextSec(f1);
95  		FileSnapshot save = FileSnapshot.save(f1);
96  		append(f1, (byte) 'x');
97  		waitNextSec(f1);
98  		assertTrue(save.isModified(f1));
99  	}
100 
101 	/**
102 	 * Create a file, wait long enough and verify that it has not been modified.
103 	 * 3.5 seconds mean any difference between file system timestamp and system
104 	 * clock should be significant.
105 	 *
106 	 * @throws Exception
107 	 */
108 	@Test
109 	public void testOldFile() throws Exception {
110 		File f1 = createFile("oldfile");
111 		waitNextSec(f1);
112 		FileSnapshot save = FileSnapshot.save(f1);
113 		Thread.sleep(3500);
114 		assertFalse(save.isModified(f1));
115 	}
116 
117 	/**
118 	 * Create a file, but don't wait long enough for the difference between file
119 	 * system clock and system clock to be significant. Assume the file may have
120 	 * been modified. It may have been, but the clock alone cannot determine
121 	 * this
122 	 *
123 	 * @throws Exception
124 	 */
125 	@Test
126 	public void testNewFileWithWait() throws Exception {
127 		File f1 = createFile("newfile");
128 		waitNextSec(f1);
129 		FileSnapshot save = FileSnapshot.save(f1);
130 		Thread.sleep(1500);
131 		assertTrue(save.isModified(f1));
132 	}
133 
134 	/**
135 	 * Same as {@link #testNewFileWithWait()} but do not wait at all
136 	 *
137 	 * @throws Exception
138 	 */
139 	@Test
140 	public void testNewFileNoWait() throws Exception {
141 		File f1 = createFile("newfile");
142 		waitNextSec(f1);
143 		FileSnapshot save = FileSnapshot.save(f1);
144 		Thread.sleep(1500);
145 		assertTrue(save.isModified(f1));
146 	}
147 
148 	private File createFile(String string) throws IOException {
149 		trash.mkdirs();
150 		File f = File.createTempFile(string, "tdat", trash);
151 		files.add(f);
152 		return f;
153 	}
154 
155 	private static void append(File f, byte b) throws IOException {
156 		FileOutputStream os = new FileOutputStream(f, true);
157 		try {
158 			os.write(b);
159 		} finally {
160 			os.close();
161 		}
162 	}
163 
164 }