• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 The Guava Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.common.io;
18 
19 import com.google.common.collect.Sets;
20 
21 import junit.framework.TestCase;
22 
23 import java.io.File;
24 import java.io.FileOutputStream;
25 import java.io.IOException;
26 import java.io.InputStream;
27 import java.io.OutputStream;
28 import java.net.URL;
29 import java.util.Set;
30 import java.util.logging.Level;
31 import java.util.logging.Logger;
32 
33 /**
34  * Base test case class for I/O tests.
35  *
36  * @author Chris Nokleberg
37  * @author Colin Decker
38  */
39 public abstract class IoTestCase extends TestCase {
40 
41   private static final Logger logger = Logger.getLogger(IoTestCase.class.getName());
42 
43   static final String I18N
44       = "\u00CE\u00F1\u0163\u00E9\u0072\u00F1\u00E5\u0163\u00EE\u00F6"
45       + "\u00F1\u00E5\u013C\u00EE\u017E\u00E5\u0163\u00EE\u00F6\u00F1";
46 
47   static final String ASCII
48       = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"
49       + "[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
50 
51   private File testDir;
52   private File tempDir;
53 
54   private final Set<File> filesToDelete = Sets.newHashSet();
55 
56   @Override
tearDown()57   protected void tearDown() {
58     for (File file : filesToDelete) {
59       if (file.exists()) {
60         delete(file);
61       }
62     }
63     filesToDelete.clear();
64   }
65 
getTestDir()66   private File getTestDir() throws IOException {
67     if (testDir != null) {
68       return testDir;
69     }
70 
71     URL testFileUrl = IoTestCase.class.getResource("testdata/i18n.txt");
72     if (testFileUrl == null) {
73       throw new RuntimeException("unable to locate testdata directory");
74     }
75 
76     if (testFileUrl.getProtocol().equals("file")) {
77       try {
78         File testFile = new File(testFileUrl.toURI());
79         testDir = testFile.getParentFile(); // the testdata directory
80       } catch (Exception ignore) {
81         // probably URISyntaxException or IllegalArgumentException
82         // fall back to copying URLs to files in the testDir == null block below
83       }
84     }
85 
86     if (testDir == null) {
87       // testdata resources aren't file:// urls, so create a directory to store them in and then
88       // copy the resources to the filesystem as needed
89       testDir = createTempDir();
90     }
91 
92     return testDir;
93   }
94 
95   /**
96    * Returns the file with the given name under the testdata directory.
97    */
getTestFile(String name)98   protected final File getTestFile(String name) throws IOException {
99     File file = new File(getTestDir(), name);
100     if (!file.exists()) {
101       URL resourceUrl = IoTestCase.class.getResource("testdata/" + name);
102       if (resourceUrl == null) {
103         return null;
104       }
105       copy(resourceUrl, file);
106     }
107 
108     return file;
109   }
110 
111   /**
112    * Creates a new temp dir for testing. The returned directory and all contents of it will be
113    * deleted in the tear-down for this test.
114    */
createTempDir()115   protected final File createTempDir() throws IOException {
116     File tempFile = File.createTempFile("IoTestCase", "");
117     if (!tempFile.delete() || !tempFile.mkdir()) {
118       throw new IOException("failed to create temp dir");
119     }
120     filesToDelete.add(tempFile);
121     return tempFile;
122   }
123 
124   /**
125    * Gets a temp dir for testing. The returned directory and all contents of it will be deleted in
126    * the tear-down for this test. Subsequent invocations of this method will return the same
127    * directory.
128    */
getTempDir()129   protected final File getTempDir() throws IOException {
130     if (tempDir == null) {
131       tempDir = createTempDir();
132     }
133 
134     return tempDir;
135   }
136 
137   /**
138    * Creates a new temp file in the temp directory returned by {@link #getTempDir()}. The file will
139    * be deleted in the tear-down for this test.
140    */
createTempFile()141   protected final File createTempFile() throws IOException {
142     return File.createTempFile("test", null, getTempDir());
143   }
144 
145   /**
146    * Returns a byte array of length size that has values 0 .. size - 1.
147    */
newPreFilledByteArray(int size)148   static byte[] newPreFilledByteArray(int size) {
149     return newPreFilledByteArray(0, size);
150   }
151 
152   /**
153    * Returns a byte array of length size that has values offset .. offset + size - 1.
154    */
newPreFilledByteArray(int offset, int size)155   static byte[] newPreFilledByteArray(int offset, int size) {
156     byte[] array = new byte[size];
157     for (int i = 0; i < size; i++) {
158       array[i] = (byte) (offset + i);
159     }
160     return array;
161   }
162 
copy(URL url, File file)163   private static void copy(URL url, File file) throws IOException {
164     InputStream in = url.openStream();
165     try {
166       OutputStream out = new FileOutputStream(file);
167       try {
168         byte[] buf = new byte[4096];
169         for (int read = in.read(buf); read != -1; read = in.read(buf)) {
170           out.write(buf, 0, read);
171         }
172       } finally {
173         out.close();
174       }
175     } finally {
176       in.close();
177     }
178   }
179 
delete(File file)180   private boolean delete(File file) {
181     if (file.isDirectory()) {
182       File[] files = file.listFiles();
183       if (files != null) {
184         for (File f : files) {
185           if (!delete(f)) {
186             return false;
187           }
188         }
189       }
190     }
191 
192     if (!file.delete()) {
193       logger.log(Level.WARNING, "couldn't delete file: {0}", new Object[] {file});
194       return false;
195     }
196 
197     return true;
198   }
199 }
200