// Tags: JDK1.2
// Copyright (C) 2005 Audrius Meskauskas (AudriusA@Bioinformatics.org)
// Mauve 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; either version 2, or (at your option)
// any later version.
// Mauve 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.
// You should have received a copy of the GNU General Public License
// along with Mauve; see the file COPYING. If not, write to
// the Free Software Foundation, 59 Temple Place - Suite 330,
// Boston, MA 02111-1307, USA. */
package gnu.testlet.wonka.io.File;
import gnu.testlet.TestHarness;
import gnu.testlet.Testlet;
import java.io.File;
import java.io.IOException;
import java.util.TreeSet;
/**
* This test checks if the File.createTempFile may return the same file
* (wrong) if called from the parallel threads.
*/
public class createFile implements Testlet
{
// How many files to ask?
static int N_FILES = 100;
// How many threads?
static int N_THREADS = 10;
String[][] returned;
TestHarness harness;
int completed;
File tempDir;
public void test(TestHarness a_harness)
{
try
{
harness = a_harness;
harness.setclass("java.io.File");
tempDir = new File(harness.getTempDirectory());
returned = new String[N_THREADS][];
completed = 0;
// Start threads.
for (int thread = 0; thread < N_THREADS; thread++)
{
new tester(thread).start();
}
int n = 0;
// Wait:
while (completed < N_THREADS && (n++ < 600))
{
try
{
Thread.sleep(100);
}
catch (InterruptedException iex)
{
}
}
if (completed < N_THREADS)
harness.fail("Failed in 60 seconds. Probably hangs.");
// Check for shared occurences:
TreeSet allReturned = new TreeSet();
String x;
for (int thread = 0; thread < N_THREADS; thread++)
{
for (int file = 0; file < N_FILES; file++)
{
x = (String) returned[thread][file];
if (allReturned.contains(x))
{
harness.fail("Multiple occurence of " + x);
return;
}
else
allReturned.add(x);
}
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
class tester extends Thread
{
int thread_number;
tester(int a_thread_number)
{
thread_number = a_thread_number;
returned [thread_number] = new String[N_FILES];
}
public void run()
{
try
{
for (int file = 0; file < N_FILES; file++)
{
try
{
File tempFile = File.createTempFile("mauve", "cft", tempDir);
String s = tempFile.getAbsolutePath();
returned[thread_number][file] = s;
tempFile.delete();
}
catch (IOException ioex)
{
harness.fail("IOException " + ioex);
// Force termination.
completed = N_THREADS + 1;
}
}
}
finally
{
completed++;
}
}
}
}