Skip to content

Commit c1ed602

Browse files
committed
Fixed heap space problem in tests
1 parent 0b1bb38 commit c1ed602

File tree

2 files changed

+67
-88
lines changed

2 files changed

+67
-88
lines changed

src/test/java/com/mapcode/EncodeDecodeTest.java

Lines changed: 57 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ public class EncodeDecodeTest {
3737
new GsonBuilder().serializeSpecialFloatingPointValues().create();
3838

3939
private static final int NUMBER_OF_POINTS = 5000;
40-
private static final int NUMBER_OF_TASKS = NUMBER_OF_POINTS * Territory.values().length;
4140
private static final int LOG_LINE_EVERY = 500;
4241

4342
@Test
@@ -61,12 +60,9 @@ private static void doEncodeDecode(final long seed) throws InterruptedException
6160
final AtomicInteger errors = new AtomicInteger(0);
6261
final AtomicInteger tasks = new AtomicInteger(0);
6362

64-
final int threads = Runtime.getRuntime().availableProcessors();
63+
final int threads = Runtime.getRuntime().availableProcessors() * 2;
6564
LOG.info("encodeDecodeTest: Starting {} threads...", threads);
66-
final ExecutorService executor = new ThreadPoolExecutor(
67-
threads, threads, // Fixed number of threads.
68-
0L, TimeUnit.MILLISECONDS, // No keep-alive.
69-
new LinkedBlockingQueue<Runnable>(25000)); // Reasonable-size blocking queue.
65+
final ExecutorService executor = Executors.newFixedThreadPool(threads);
7066

7167
final Random randomGenerator = new Random(seed);
7268
for (int i = 0; i < NUMBER_OF_POINTS; i++) {
@@ -85,84 +81,70 @@ private static void doEncodeDecode(final long seed) throws InterruptedException
8581
assertEquals("encodeToInternational failed, result=" + resultsAll,
8682
resultsAll.get(resultsAll.size() - 1), mapcodeInternational);
8783

88-
// Walk through the list in reverse order to get International first.
89-
for (final Territory territory : Territory.values()) {
90-
while (true) {
91-
try {
92-
executor.execute(new Runnable() {
93-
94-
@Override
95-
public void run() {
96-
try {
97-
final int count = tasks.incrementAndGet();
98-
if ((count % LOG_LINE_EVERY) == 0) {
99-
LOG.info("encodeDecodeTest: #{}/{}", count, NUMBER_OF_TASKS);
100-
}
84+
executor.execute(new Runnable() {
10185

102-
final List<Mapcode> resultsLimited = MapcodeCodec.encode(latDeg, lonDeg, territory);
103-
for (final Mapcode mapcode : resultsLimited) {
104-
105-
// Check if the territory matches.
106-
assertEquals(territory, mapcode.getTerritory());
107-
108-
// Check max distance.
109-
final String codePrecision0 = mapcode.getCode(0);
110-
final String codePrecision1 = mapcode.getCode(1);
111-
final String codePrecision2 = mapcode.getCode(2);
112-
113-
final Point decodeLocationPrecision0 = MapcodeCodec.decode(codePrecision0, territory);
114-
final Point decodeLocationPrecision1 = MapcodeCodec.decode(codePrecision1, territory);
115-
final Point decodeLocationPrecision2 = MapcodeCodec.decode(codePrecision2, territory);
116-
117-
final double distancePrecision0Meters = Point.distanceInMeters(encode, decodeLocationPrecision0);
118-
final double distancePrecision1Meters = Point.distanceInMeters(encode, decodeLocationPrecision1);
119-
final double distancePrecision2Meters = Point.distanceInMeters(encode, decodeLocationPrecision2);
120-
121-
if (distancePrecision0Meters >= Mapcode.getSafeMaxOffsetInMeters(0)) {
122-
LOG.error("encodeDecodeTest: " + mapcode + " distancePrecision0Meters = " + distancePrecision0Meters + " >= " + Mapcode.getSafeMaxOffsetInMeters(0));
123-
errors.getAndIncrement();
124-
}
125-
if (distancePrecision1Meters >= Mapcode.getSafeMaxOffsetInMeters(1)) {
126-
LOG.error("encodeDecodeTest: " + mapcode + " distancePrecision1Meters = " + distancePrecision1Meters + " >= " + Mapcode.getSafeMaxOffsetInMeters(1));
127-
errors.getAndIncrement();
128-
}
129-
if (distancePrecision2Meters >= Mapcode.getSafeMaxOffsetInMeters(2)) {
130-
LOG.error("encodeDecodeTest: " + mapcode + " distancePrecision2Meters = " + distancePrecision2Meters + " >= " + Mapcode.getSafeMaxOffsetInMeters(2));
131-
errors.getAndIncrement();
132-
}
133-
134-
// Check conversion from/to alphabets.
135-
for (final Alphabet alphabet : Alphabet.values()) {
136-
final String mapcodeAlphabet = mapcode.getCode(alphabet);
137-
final String mapcodeAscii = Mapcode.convertStringToPlainAscii(mapcodeAlphabet);
138-
if (!codePrecision0.equals(mapcodeAscii)) {
139-
LOG.error("encodeDecodeTest: " + mapcode + " alphabet=" + alphabet + ", original=" + codePrecision0 +
140-
", mapcodeAlphabet=" + mapcodeAlphabet + ", mapcodeAscii=" + mapcodeAscii);
141-
}
142-
}
143-
}
144-
} catch (final Exception e) {
145-
LOG.error("encodeDecodeTest: Unexpected exception: ", e);
146-
errors.getAndIncrement();
147-
}
148-
}
149-
});
86+
@Override
87+
public void run() {
88+
final int count = tasks.getAndIncrement();
89+
if ((count % LOG_LINE_EVERY) == 0) {
90+
LOG.info("encodeDecodeTest: #{}/{}", count, NUMBER_OF_POINTS);
91+
}
92+
93+
// Walk through the list in reverse order to get International first.
94+
for (final Territory territory : Territory.values()) {
95+
try {
96+
final List<Mapcode> resultsLimited = MapcodeCodec.encode(latDeg, lonDeg, territory);
97+
for (final Mapcode mapcode : resultsLimited) {
98+
99+
// Check if the territory matches.
100+
assertEquals(territory, mapcode.getTerritory());
150101

151-
// Break out of loop and process next value.
152-
break;
102+
// Check max distance.
103+
final String codePrecision0 = mapcode.getCode(0);
104+
final String codePrecision1 = mapcode.getCode(1);
105+
final String codePrecision2 = mapcode.getCode(2);
153106

154-
} catch (final RejectedExecutionException ignored) {
107+
final Point decodeLocationPrecision0 = MapcodeCodec.decode(codePrecision0, territory);
108+
final Point decodeLocationPrecision1 = MapcodeCodec.decode(codePrecision1, territory);
109+
final Point decodeLocationPrecision2 = MapcodeCodec.decode(codePrecision2, territory);
155110

156-
// Perfectly fine; buffer is full. Just wait a bit and re-enter while loop.
157-
LOG.info("encodeDecodeTest: buffer full, waiting, executed {} tasks so far", tasks);
158-
Thread.sleep(1000);
111+
final double distancePrecision0Meters = Point.distanceInMeters(encode, decodeLocationPrecision0);
112+
final double distancePrecision1Meters = Point.distanceInMeters(encode, decodeLocationPrecision1);
113+
final double distancePrecision2Meters = Point.distanceInMeters(encode, decodeLocationPrecision2);
114+
115+
if (distancePrecision0Meters >= Mapcode.getSafeMaxOffsetInMeters(0)) {
116+
LOG.error("encodeDecodeTest: " + mapcode + " distancePrecision0Meters = " + distancePrecision0Meters + " >= " + Mapcode.getSafeMaxOffsetInMeters(0));
117+
errors.getAndIncrement();
118+
}
119+
if (distancePrecision1Meters >= Mapcode.getSafeMaxOffsetInMeters(1)) {
120+
LOG.error("encodeDecodeTest: " + mapcode + " distancePrecision1Meters = " + distancePrecision1Meters + " >= " + Mapcode.getSafeMaxOffsetInMeters(1));
121+
errors.getAndIncrement();
122+
}
123+
if (distancePrecision2Meters >= Mapcode.getSafeMaxOffsetInMeters(2)) {
124+
LOG.error("encodeDecodeTest: " + mapcode + " distancePrecision2Meters = " + distancePrecision2Meters + " >= " + Mapcode.getSafeMaxOffsetInMeters(2));
125+
errors.getAndIncrement();
126+
}
127+
128+
// Check conversion from/to alphabets.
129+
for (final Alphabet alphabet : Alphabet.values()) {
130+
final String mapcodeAlphabet = mapcode.getCode(alphabet);
131+
final String mapcodeAscii = Mapcode.convertStringToPlainAscii(mapcodeAlphabet);
132+
if (!codePrecision0.equals(mapcodeAscii)) {
133+
LOG.error("encodeDecodeTest: " + mapcode + " alphabet=" + alphabet + ", original=" + codePrecision0 +
134+
", mapcodeAlphabet=" + mapcodeAlphabet + ", mapcodeAscii=" + mapcodeAscii);
135+
}
136+
}
137+
}
138+
} catch (final Exception e) {
139+
LOG.error("encodeDecodeTest: Unexpected exception: ", e);
140+
errors.getAndIncrement();
141+
}
159142
}
160143
}
161-
}
144+
});
162145
}
163146
executor.shutdown();
164147
executor.awaitTermination(60, TimeUnit.SECONDS);
165148
assertEquals("Found errors", 0, errors.get());
166-
LOG.info("encodeDecodeTest: executed {} tasks", tasks);
167149
}
168150
}

src/test/java/com/mapcode/ReferenceFileTest.java

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -115,38 +115,35 @@ private static void checkFile(@Nonnull final String baseFileName) throws Excepti
115115
// Reset error count.
116116
final AtomicLong deltaNm = new AtomicLong(0);
117117
final AtomicInteger errors = new AtomicInteger(0);
118-
final int threads = Runtime.getRuntime().availableProcessors();
118+
final AtomicInteger tasks = new AtomicInteger(0);
119+
final int threads = Runtime.getRuntime().availableProcessors() * 2;
119120
LOG.info("checkFile: Starting {} threads...", threads);
120-
final ExecutorService executor = new ThreadPoolExecutor(
121-
threads, threads, // Fixed number of threads.
122-
0L, TimeUnit.MILLISECONDS, // No keep-alive.
123-
new LinkedBlockingQueue<Runnable>(1000)); // Reasonable-size blocking queue.
121+
final ExecutorService executor = Executors.newFixedThreadPool(threads);
124122

125123
// Open data file.
126124
final ChunkedFile chunkedFile = new ChunkedFile(baseFileName);
127125
try {
128126

129-
int i = 1;
130127
//noinspection InfiniteLoopStatement
131128
while (true) {
132129

133130
// Get next record.
134131
@Nonnull final ReferenceRec reference = getNextReferenceRecord(chunkedFile);
135132

136-
if (((i % LOG_LINE_EVERY) == 0)) {
137-
LOG.debug("checkFile: #{}, file={}", i, chunkedFile.fileName);
138-
LOG.debug("checkFile: lat/lon = {}", reference.point);
139-
LOG.debug("checkFile: expected = #{}: {}", reference.mapcodes.size(), GSON.toJson(reference.mapcodes));
140-
}
141-
++i;
142-
143133
while (true) {
144134
try {
145135
// Add task. This may throw an exception if the queue is full. Retry in that case.
146136
executor.execute(new Runnable() {
147137

148138
@Override
149139
public void run() {
140+
final int count = tasks.getAndIncrement();
141+
if (((count % LOG_LINE_EVERY) == 0)) {
142+
LOG.debug("checkFile: #{}, file={}", count, chunkedFile.fileName);
143+
LOG.debug("checkFile: lat/lon = {}", reference.point);
144+
LOG.debug("checkFile: expected = #{}: {}", reference.mapcodes.size(), GSON.toJson(reference.mapcodes));
145+
}
146+
150147
// Encode lat/lon to series of mapcodes and check the resulting mapcodes.
151148
final List<Mapcode> results = MapcodeCodec.encode(
152149
reference.point.getLatDeg(), reference.point.getLonDeg());

0 commit comments

Comments
 (0)