Class LocalDiskRepositoryTestCase
- Direct Known Subclasses:
CLIRepositoryTestCase
,HttpTestCase
,RepositoryTestCase
A temporary directory is created for each test, allowing each test to use a fresh environment. The temporary directory is cleaned up after the test ends.
Callers should not use RepositoryCache
from
within these tests as it may wedge file descriptors open past the end of the
test.
A system property jgit.junit.usemmap
defines whether memory mapping
is used. Memory mapping has an effect on the file system, in that memory
mapped files in Java cannot be deleted as long as the mapped arrays have not
been reclaimed by the garbage collector. The programmer cannot control this
with precision, so temporary files may hang around longer than desired during
a test, or tests may fail altogether if there is insufficient file
descriptors or address space for the test process.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprivate static final class
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final int
ConstantASSUME_UNCHANGED=32
protected PersonIdent
A fake (but stable) identity for author fields in the test.protected PersonIdent
A fake (but stable) identity for committer fields in the test.static final int
ConstantCONTENT=16
static final int
ConstantCONTENT_ID=8
static final int
ConstantLENGTH=4
protected MockSystemReader
ASystemReader
used to coordinate time, envars, etc.static final int
ConstantMOD_TIME=1
static final int
ConstantSMUDGE=2
private File
private final Set
<Repository> private static final boolean
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoid
Adds a repository to the list of repositories which is closed at the end of the testsprivate void
ceilTestDirectories
(List<File> ceilings) cloneEnv()
protected FileRepository
Creates a new empty bare repository.protected FileRepository
createRepository
(boolean bare) Creates a new empty repository.createRepository
(boolean bare, boolean autoClose) Deprecated.protected File
createTempDirectory
(String name) Creates a unique directory for a testprotected File
Allocates a new unique file path that does not exist.protected File
createUniqueTestGitDir
(boolean bare) Creates a new unique directory for a test repositoryprotected FileRepository
Creates a new empty repository within a new empty working directory.Get list of ceiling directoriesprotected File
Get temporary directory.static String
indexState
(Repository repo, int includedOptions) Represent the state of the index in one String.private static String
private static void
putPersonIdent
(Map<String, String> env, String type, PersonIdent who) protected String
Read a file's contentprotected void
recursiveDelete
(File dir) Recursively delete a directory, failing the test if the delete fails.private static boolean
recursiveDelete
(File dir, boolean silent, boolean failOnError) private static void
reportDeleteFailure
(boolean failOnError, File f, Exception cause) protected int
runHook
(Repository db, File hook, String... args) Run a hook script in the repository, returning the exit status.void
setUp()
Setup testvoid
tearDown()
Tear down the testprotected void
tick()
private static String[]
toEnvArray
(Map<String, String> env) protected void
Write a string as a UTF-8 file.protected File
Create a string to a UTF-8 temporary file and return the path.
-
Field Details
-
useMMAP
private static final boolean useMMAP -
author
A fake (but stable) identity for author fields in the test. -
committer
A fake (but stable) identity for committer fields in the test. -
mockSystemReader
ASystemReader
used to coordinate time, envars, etc.- Since:
- 4.2
-
toClose
-
tmp
-
MOD_TIME
public static final int MOD_TIMEConstantMOD_TIME=1
- See Also:
-
SMUDGE
public static final int SMUDGEConstantSMUDGE=2
- See Also:
-
LENGTH
public static final int LENGTHConstantLENGTH=4
- See Also:
-
CONTENT_ID
public static final int CONTENT_IDConstantCONTENT_ID=8
- See Also:
-
CONTENT
public static final int CONTENTConstantCONTENT=16
- See Also:
-
ASSUME_UNCHANGED
public static final int ASSUME_UNCHANGEDConstantASSUME_UNCHANGED=32
- See Also:
-
-
Constructor Details
-
LocalDiskRepositoryTestCase
public LocalDiskRepositoryTestCase()
-
-
Method Details
-
setUp
Setup test- Throws:
Exception
-
getTemporaryDirectory
Get temporary directory.- Returns:
- the temporary directory
-
getCeilings
Get list of ceiling directories- Returns:
- list of ceiling directories
-
ceilTestDirectories
-
makePath
-
tearDown
Tear down the test- Throws:
Exception
-
tick
protected void tick() -
recursiveDelete
Recursively delete a directory, failing the test if the delete fails.- Parameters:
dir
- the recursively directory to delete, if present.
-
recursiveDelete
-
reportDeleteFailure
-
indexState
public static String indexState(Repository repo, int includedOptions) throws IllegalStateException, IOException Represent the state of the index in one String. This representation is useful when writing tests which do assertions on the state of the index. By default information about path, mode, stage (if different from 0) is included. A bitmask controls which additional info about modificationTimes, smudge state and length is included.The format of the returned string is described with this BNF:
result = ( "[" path mode stage? time? smudge? length? sha1? content? "]" )* . mode = ", mode:" number . stage = ", stage:" number . time = ", time:t" timestamp-index . smudge = "" | ", smudged" . length = ", length:" number . sha1 = ", sha1:" hex-sha1 . content = ", content:" blob-data .
'stage' is only presented when the stage is different from 0. All reported time stamps are mapped to strings like "t0", "t1", ... "tn". The smallest reported time-stamp will be called "t0". This allows to write assertions against the string although the concrete value of the time stamps is unknown.- Parameters:
repo
- the repository the index state should be determined forincludedOptions
- a bitmask constructed out of the constantsMOD_TIME
,SMUDGE
,LENGTH
,CONTENT_ID
andCONTENT
controlling which info is present in the resulting string.- Returns:
- a string encoding the index state
- Throws:
IllegalStateException
IOException
-
createBareRepository
Creates a new empty bare repository.- Returns:
- the newly created bare repository, opened for access. The
repository will not be closed in
tearDown()
; the caller is responsible for closing it. - Throws:
IOException
- the repository could not be created in the temporary area
-
createWorkRepository
Creates a new empty repository within a new empty working directory.- Returns:
- the newly created repository, opened for access. The repository
will not be closed in
tearDown()
; the caller is responsible for closing it. - Throws:
IOException
- the repository could not be created in the temporary area
-
createRepository
Creates a new empty repository.- Parameters:
bare
- true to create a bare repository; false to make a repository within its working directory- Returns:
- the newly created repository, opened for access. The repository
will not be closed in
tearDown()
; the caller is responsible for closing it. - Throws:
IOException
- the repository could not be created in the temporary area- Since:
- 5.3
-
createRepository
@Deprecated public FileRepository createRepository(boolean bare, boolean autoClose) throws IOException Deprecated.usecreateRepository(boolean)
insteadCreates a new empty repository.- Parameters:
bare
- true to create a bare repository; false to make a repository within its working directoryautoClose
- auto close the repository intearDown()
- Returns:
- the newly created repository, opened for access
- Throws:
IOException
- the repository could not be created in the temporary area
-
addRepoToClose
Adds a repository to the list of repositories which is closed at the end of the tests- Parameters:
r
- the repository to be closed
-
createTempDirectory
Creates a unique directory for a test- Parameters:
name
- a subdirectory- Returns:
- a unique directory for a test
- Throws:
IOException
-
createUniqueTestGitDir
Creates a new unique directory for a test repository- Parameters:
bare
- true for a bare repository; false for a repository with a working directory- Returns:
- a unique directory for a test repository
- Throws:
IOException
-
createTempFile
Allocates a new unique file path that does not exist.Unlike the standard
File.createTempFile
the returned path does not exist, but may be created by another thread in a race with the caller. Good luck.This method is inherently unsafe due to a race condition between creating the name and the first use that reserves it.
- Returns:
- a unique path that does not exist.
- Throws:
IOException
-
runHook
protected int runHook(Repository db, File hook, String... args) throws IOException, InterruptedException Run a hook script in the repository, returning the exit status.- Parameters:
db
- repository the script should see in GIT_DIR environmenthook
- path of the hook script to execute, must be executable file type on this platformargs
- arguments to pass to the hook script- Returns:
- exit status code of the invoked hook
- Throws:
IOException
- the hook could not be executedInterruptedException
- the caller was interrupted before the hook completed
-
putPersonIdent
-
write
Create a string to a UTF-8 temporary file and return the path.- Parameters:
body
- complete content to write to the file. If the file should end with a trailing LF, the string should end with an LF.- Returns:
- path of the temporary file created within the trash area.
- Throws:
IOException
- the file could not be written.
-
write
Write a string as a UTF-8 file.- Parameters:
f
- file to write the string to. Caller is responsible for making sure it is in the trash directory or will otherwise be cleaned up at the end of the test. If the parent directory does not exist, the missing parent directories are automatically created.body
- content to write to the file.- Throws:
IOException
- the file could not be written.
-
read
Read a file's content- Parameters:
f
- the file- Returns:
- the content of the file
- Throws:
IOException
-
toEnvArray
-
cloneEnv
-
createRepository(boolean)
instead