21
21
import java .io .FileWriter ;
22
22
import java .io .IOException ;
23
23
import java .io .InputStreamReader ;
24
+ import java .lang .Runtime .Version ;
24
25
import java .nio .file .Files ;
25
26
import java .nio .file .LinkOption ;
26
27
import java .nio .file .attribute .BasicFileAttributeView ;
30
31
import java .time .temporal .ChronoUnit ;
31
32
import java .util .Arrays ;
32
33
import java .util .Collections ;
34
+ import java .util .EnumSet ;
33
35
import java .util .Iterator ;
34
36
import java .util .concurrent .TimeUnit ;
35
37
import java .util .function .Consumer ;
38
40
39
41
import org .junit .jupiter .api .BeforeEach ;
40
42
import org .junit .jupiter .api .Test ;
43
+ import org .junit .jupiter .api .condition .JRE ;
44
+ import org .junit .jupiter .api .condition .OS ;
41
45
import org .junit .jupiter .api .extension .ExtendWith ;
42
46
import org .junit .jupiter .api .io .TempDir ;
43
47
import org .mockito .Mock ;
59
63
@ ExtendWith (MockitoExtension .class )
60
64
class ExtractCommandTests {
61
65
62
- private static final FileTime CREATION_TIME = FileTime . from ( Instant .now (). minus ( 3 , ChronoUnit . DAYS ) );
66
+ private static final Instant NOW = Instant .now ();
63
67
64
- private static final FileTime LAST_MODIFIED_TIME = FileTime .from (Instant . now (). minus (2 , ChronoUnit .DAYS ));
68
+ private static final FileTime CREATION_TIME = FileTime .from (NOW . minus (3 , ChronoUnit .DAYS ));
65
69
66
- private static final FileTime LAST_ACCESS_TIME = FileTime .from (Instant .now ().minus (1 , ChronoUnit .DAYS ));
70
+ private static final FileTime LAST_MODIFIED_TIME = FileTime .from (NOW .minus (2 , ChronoUnit .DAYS ));
71
+
72
+ private static final FileTime LAST_ACCESS_TIME = FileTime .from (NOW .minus (1 , ChronoUnit .DAYS ));
67
73
68
74
@ TempDir
69
75
File temp ;
@@ -107,10 +113,11 @@ private void timeAttributes(File file) {
107
113
.readAttributes ();
108
114
assertThat (basicAttributes .lastModifiedTime ().to (TimeUnit .SECONDS ))
109
115
.isEqualTo (LAST_MODIFIED_TIME .to (TimeUnit .SECONDS ));
110
- assertThat (basicAttributes .creationTime ().to (TimeUnit .SECONDS )).satisfiesAnyOf (
111
- (creationTime ) -> assertThat (creationTime ).isEqualTo (CREATION_TIME .to (TimeUnit .SECONDS )),
112
- // On macOS (at least) the creation time is the last modified time
113
- (creationTime ) -> assertThat (creationTime ).isEqualTo (LAST_MODIFIED_TIME .to (TimeUnit .SECONDS )));
116
+ FileTime expectedCreationTime = expectedCreationTime ();
117
+ if (expectedCreationTime != null ) {
118
+ assertThat (basicAttributes .creationTime ().to (TimeUnit .SECONDS ))
119
+ .isEqualTo (expectedCreationTime .to (TimeUnit .SECONDS ));
120
+ }
114
121
assertThat (basicAttributes .lastAccessTime ().to (TimeUnit .SECONDS ))
115
122
.isEqualTo (LAST_ACCESS_TIME .to (TimeUnit .SECONDS ));
116
123
}
@@ -119,6 +126,22 @@ private void timeAttributes(File file) {
119
126
}
120
127
}
121
128
129
+ private FileTime expectedCreationTime () {
130
+ // macOS uses last modified time until Java 20 where it uses creation time.
131
+ // https://github.com/openjdk/jdk21u-dev/commit/6397d564a5dab07f81bf4c69b116ebfabb2446ba
132
+ if (OS .MAC .isCurrentOs ()) {
133
+ return (EnumSet .range (JRE .JAVA_17 , JRE .JAVA_19 ).contains (JRE .currentVersion ())) ? LAST_MODIFIED_TIME
134
+ : CREATION_TIME ;
135
+ }
136
+ if (OS .LINUX .isCurrentOs ()) {
137
+ // Linux uses the modified time until Java 21.0.2 where a bug means that it
138
+ // uses the birth time which it has not set, preventing us from verifying it.
139
+ // https://github.com/openjdk/jdk21u-dev/commit/4cf572e3b99b675418e456e7815fb6fd79245e30
140
+ return (Runtime .version ().compareTo (Version .parse ("21.0.2" )) >= 0 ) ? null : LAST_MODIFIED_TIME ;
141
+ }
142
+ return CREATION_TIME ;
143
+ }
144
+
122
145
@ Test
123
146
void runWhenHasDestinationOptionExtractsLayers () {
124
147
given (this .context .getArchiveFile ()).willReturn (this .jarFile );
0 commit comments