1+ package com .mirth .connect .server .launcher ;
2+
3+ import static org .junit .Assert .assertEquals ;
4+ import static org .junit .Assert .assertFalse ;
5+ import static org .junit .Assert .assertTrue ;
6+
7+ import java .io .ByteArrayOutputStream ;
8+ import java .io .File ;
9+ import java .io .PrintStream ;
10+ import java .nio .charset .StandardCharsets ;
11+ import java .nio .file .Files ;
12+ import java .nio .file .attribute .FileTime ;
13+
14+ import org .junit .Test ;
15+
16+ public class Log4jMigrationsTest {
17+
18+ @ Test
19+ public void testMigrateLog4jRemovesDirLogs () throws Exception {
20+ File file = File .createTempFile ("log4j2" , ".properties" );
21+ file .deleteOnExit ();
22+ Files .writeString (file .toPath (), String .join (System .lineSeparator (),
23+ "rootLogger = ERROR,stdout,fout" ,
24+ "dir.logs = logs" ,
25+ "property.log.dir = logs" ,
26+ "appender.rolling.fileName = ${log.dir}/mirth.log" ), StandardCharsets .UTF_8 );
27+
28+ Log4jMigrations .migrateConfiguration (file );
29+
30+ String fileContents = Files .readString (file .toPath (), StandardCharsets .UTF_8 );
31+ assertFalse (fileContents .contains ("dir.logs" ));
32+ assertTrue (fileContents .contains ("property.log.dir = logs" ));
33+ assertTrue (fileContents .contains ("appender.rolling.fileName = ${log.dir}/mirth.log" ));
34+ }
35+
36+ @ Test
37+ public void testMigrateLog4jDoesNotRewriteCleanFile () throws Exception {
38+ File file = File .createTempFile ("log4j2-clean" , ".properties" );
39+ file .deleteOnExit ();
40+ String contents = String .join (System .lineSeparator (),
41+ "rootLogger = ERROR,stdout,fout" ,
42+ "property.log.dir = logs" ,
43+ "appender.rolling.fileName = ${log.dir}/mirth.log" );
44+ Files .writeString (file .toPath (), contents , StandardCharsets .UTF_8 );
45+
46+ FileTime expectedModifiedTime = FileTime .fromMillis (1_700_000_000_000L );
47+ Files .setLastModifiedTime (file .toPath (), expectedModifiedTime );
48+
49+ Log4jMigrations .migrateConfiguration (file );
50+
51+ assertEquals (expectedModifiedTime , Files .getLastModifiedTime (file .toPath ()));
52+ assertEquals (contents , Files .readString (file .toPath (), StandardCharsets .UTF_8 ));
53+ }
54+
55+ @ Test
56+ public void testMigrateLog4jFailsGracefullyWithReadOnlyFile () throws Exception {
57+ File file = File .createTempFile ("log4j2-readonly" , ".properties" );
58+ file .deleteOnExit ();
59+ String contents = String .join (System .lineSeparator (),
60+ "rootLogger = ERROR,stdout,fout" ,
61+ "dir.logs = logs" ,
62+ "property.log.dir = logs" );
63+ Files .writeString (file .toPath (), contents , StandardCharsets .UTF_8 );
64+
65+ ByteArrayOutputStream errBytes = new ByteArrayOutputStream ();
66+ PrintStream originalErr = System .err ;
67+
68+ try {
69+ assertTrue (file .setWritable (false , false ));
70+ System .setErr (new PrintStream (errBytes , true , StandardCharsets .UTF_8 .name ()));
71+
72+ Log4jMigrations .migrateConfiguration (file );
73+ } finally {
74+ file .setWritable (true , false );
75+ System .setErr (originalErr );
76+ }
77+
78+ String errOutput = errBytes .toString (StandardCharsets .UTF_8 .name ());
79+ assertTrue (errOutput .contains ("Failed to Migrate Log4j configuration" ));
80+ assertEquals (contents , Files .readString (file .toPath (), StandardCharsets .UTF_8 ));
81+ }
82+
83+ @ Test
84+ public void testMigrateLog4jIgnoresMissingFile () throws Exception {
85+ File parentDir = Files .createTempDirectory ("log4j2-missing" ).toFile ();
86+ parentDir .deleteOnExit ();
87+ File file = new File (parentDir , "missing-log4j2.properties" );
88+
89+ assertFalse (file .exists ());
90+
91+ Log4jMigrations .migrateConfiguration (file );
92+
93+ assertFalse (file .exists ());
94+ }
95+ }
0 commit comments