Skip to content

Commit 1b89280

Browse files
bsideuprnorth
authored andcommitted
Fix number overflow in the disk space detection. Closes #379 (#380)
* Fix number overflow in the disk space detection. Closes #379
1 parent ed63472 commit 1b89280

3 files changed

Lines changed: 23 additions & 7 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file.
33

44
## UNRELEASED
55
### Fixed
6+
- Fixed the case when disk's size is bigger than Integer's max value (#379, #380)
67

78
### Changed
89
- Added support for Docker networks (#372)

core/src/main/java/org/testcontainers/DockerClientFactory.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.github.dockerjava.api.model.*;
99
import com.github.dockerjava.core.command.ExecStartResultCallback;
1010
import com.github.dockerjava.core.command.PullImageResultCallback;
11+
import com.google.common.annotations.VisibleForTesting;
1112
import lombok.Synchronized;
1213
import lombok.extern.slf4j.Slf4j;
1314
import org.apache.commons.io.IOUtils;
@@ -235,21 +236,24 @@ private <T> T runInsideDocker(DockerClient client, Consumer<CreateContainerCmd>
235236
}
236237
}
237238
}
238-
239-
private static class DiskSpaceUsage {
240-
Optional<Integer> availableMB = Optional.empty();
239+
240+
@VisibleForTesting
241+
static class DiskSpaceUsage {
242+
Optional<Long> availableMB = Optional.empty();
241243
Optional<Integer> usedPercent = Optional.empty();
242244
}
243-
244-
private DiskSpaceUsage parseAvailableDiskSpace(String dfOutput) {
245+
246+
@VisibleForTesting
247+
DiskSpaceUsage parseAvailableDiskSpace(String dfOutput) {
245248
DiskSpaceUsage df = new DiskSpaceUsage();
246249
String[] lines = dfOutput.split("\n");
247250
for (String line : lines) {
248251
String[] fields = line.split("\\s+");
249252
if (fields.length > 5 && fields[5].equals("/")) {
250-
int availableKB = Integer.valueOf(fields[3]);
251-
df.availableMB = Optional.of(availableKB / 1024);
253+
long availableKB = Long.valueOf(fields[3]);
254+
df.availableMB = Optional.of(availableKB / 1024L);
252255
df.usedPercent = Optional.of(Integer.valueOf(fields[4].replace("%", "")));
256+
break;
253257
}
254258
}
255259
return df;

core/src/test/java/org/testcontainers/DockerClientFactoryTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.testcontainers;
22

33
import org.junit.Test;
4+
import org.rnorth.visibleassertions.VisibleAssertions;
5+
import org.testcontainers.DockerClientFactory.DiskSpaceUsage;
46
import org.testcontainers.dockerclient.LogToStringContainerCallback;
57
import org.testcontainers.utility.TestcontainersConfiguration;
68

@@ -27,4 +29,13 @@ public void runCommandInsideDockerShouldNotFailIfImageDoesNotExistsLocally() {
2729
.toString()
2830
);
2931
}
32+
33+
@Test
34+
public void shouldHandleBigDiskSize() throws Exception {
35+
String dfOutput = "/dev/disk1 2982480572 1491240286 2982480572 31% /";
36+
DiskSpaceUsage usage = DockerClientFactory.instance().parseAvailableDiskSpace(dfOutput);
37+
38+
VisibleAssertions.assertEquals("Available MB is correct", 2982480572L / 1024L, usage.availableMB.orElse(0L));
39+
VisibleAssertions.assertEquals("Available percentage is correct", 31, usage.usedPercent.orElse(0));
40+
}
3041
}

0 commit comments

Comments
 (0)