Skip to content

Commit ac3cdfb

Browse files
committed
1) Updated test cases to use Junit Assert method as compared to assert keyword 2) Proper testing of RemoteService using RandomProvider interface. Introduced RandomProvider interface so that randomness can be controlled from test cases. 3) For readability used constant for representing FAILURE
1 parent db33cc5 commit ac3cdfb

File tree

8 files changed

+270
-14
lines changed

8 files changed

+270
-14
lines changed

ambassador.patch

Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
diff --git a/ambassador/src/main/java/com/iluwatar/ambassador/RemoteService.java b/ambassador/src/main/java/com/iluwatar/ambassador/RemoteService.java
2+
index 225e033..52b792b 100644
3+
--- a/ambassador/src/main/java/com/iluwatar/ambassador/RemoteService.java
4+
+++ b/ambassador/src/main/java/com/iluwatar/ambassador/RemoteService.java
5+
@@ -22,6 +22,7 @@
6+
*/
7+
package com.iluwatar.ambassador;
8+
9+
+import com.iluwatar.ambassador.util.RandomProvider;
10+
import org.slf4j.Logger;
11+
import org.slf4j.LoggerFactory;
12+
13+
@@ -31,9 +32,10 @@ import static java.lang.Thread.sleep;
14+
* A remote legacy application represented by a Singleton implementation.
15+
*/
16+
public class RemoteService implements RemoteServiceInterface {
17+
-
18+
+ static final int THRESHOLD = 200;
19+
private static final Logger LOGGER = LoggerFactory.getLogger(RemoteService.class);
20+
private static RemoteService service = null;
21+
+ private final RandomProvider randomProvider;
22+
23+
static synchronized RemoteService getRemoteService() {
24+
if (service == null) {
25+
@@ -42,24 +44,33 @@ public class RemoteService implements RemoteServiceInterface {
26+
return service;
27+
}
28+
29+
- private RemoteService() {}
30+
+ private RemoteService() {
31+
+ this(Math::random);
32+
+ }
33+
34+
/**
35+
+ * This constuctor is used for testing purposes only.
36+
+ */
37+
+ RemoteService(RandomProvider randomProvider) {
38+
+ this.randomProvider = randomProvider;
39+
+ }
40+
+ /**
41+
* Remote function takes a value and multiplies it by 10 taking a random amount of time.
42+
* Will sometimes return -1. This imitates connectivity issues a client might have to account for.
43+
* @param value integer value to be multiplied.
44+
- * @return if waitTime is more than 200ms, it returns value * 10, otherwise -1.
45+
+ * @return if waitTime is less than {@link RemoteService#THRESHOLD}, it returns value * 10,
46+
+ * otherwise {@link RemoteServiceInterface#FAILURE}.
47+
*/
48+
@Override
49+
public long doRemoteFunction(int value) {
50+
51+
- long waitTime = (long) Math.floor(Math.random() * 1000);
52+
+ long waitTime = (long) Math.floor(randomProvider.random() * 1000);
53+
54+
try {
55+
sleep(waitTime);
56+
} catch (InterruptedException e) {
57+
LOGGER.error("Thread sleep state interrupted", e);
58+
}
59+
- return waitTime >= 200 ? value * 10 : -1;
60+
+ return waitTime <= THRESHOLD ? value * 10 : FAILURE;
61+
}
62+
}
63+
diff --git a/ambassador/src/main/java/com/iluwatar/ambassador/RemoteServiceInterface.java b/ambassador/src/main/java/com/iluwatar/ambassador/RemoteServiceInterface.java
64+
index 940313d..e228271 100644
65+
--- a/ambassador/src/main/java/com/iluwatar/ambassador/RemoteServiceInterface.java
66+
+++ b/ambassador/src/main/java/com/iluwatar/ambassador/RemoteServiceInterface.java
67+
@@ -26,6 +26,7 @@ package com.iluwatar.ambassador;
68+
* Interface shared by ({@link RemoteService}) and ({@link ServiceAmbassador}).
69+
*/
70+
interface RemoteServiceInterface {
71+
-
72+
+ int FAILURE = -1;
73+
+
74+
long doRemoteFunction(int value) throws Exception;
75+
}
76+
diff --git a/ambassador/src/main/java/com/iluwatar/ambassador/ServiceAmbassador.java b/ambassador/src/main/java/com/iluwatar/ambassador/ServiceAmbassador.java
77+
index 4be1dfc..52cd7df 100644
78+
--- a/ambassador/src/main/java/com/iluwatar/ambassador/ServiceAmbassador.java
79+
+++ b/ambassador/src/main/java/com/iluwatar/ambassador/ServiceAmbassador.java
80+
@@ -59,15 +59,15 @@ public class ServiceAmbassador implements RemoteServiceInterface {
81+
private long safeCall(int value) {
82+
83+
int retries = 0;
84+
- long result = -1;
85+
+ long result = FAILURE;
86+
87+
for (int i = 0; i < RETRIES; i++) {
88+
89+
if (retries >= RETRIES) {
90+
- return -1;
91+
+ return FAILURE;
92+
}
93+
94+
- if ((result = checkLatency(value)) == -1) {
95+
+ if ((result = checkLatency(value)) == FAILURE) {
96+
LOGGER.info("Failed to reach remote: (" + (i + 1) + ")");
97+
retries++;
98+
try {
99+
diff --git a/ambassador/src/main/java/com/iluwatar/ambassador/util/RandomProvider.java b/ambassador/src/main/java/com/iluwatar/ambassador/util/RandomProvider.java
100+
new file mode 100644
101+
index 0000000..3afa3a6
102+
--- /dev/null
103+
+++ b/ambassador/src/main/java/com/iluwatar/ambassador/util/RandomProvider.java
104+
@@ -0,0 +1,8 @@
105+
+package com.iluwatar.ambassador.util;
106+
+
107+
+/**
108+
+ * An interface for randomness. Useful for testing purposes.
109+
+ */
110+
+public interface RandomProvider {
111+
+ double random();
112+
+}
113+
diff --git a/ambassador/src/test/java/com/iluwatar/ambassador/ClientTest.java b/ambassador/src/test/java/com/iluwatar/ambassador/ClientTest.java
114+
index 9354c4f..1d69a6a 100644
115+
--- a/ambassador/src/test/java/com/iluwatar/ambassador/ClientTest.java
116+
+++ b/ambassador/src/test/java/com/iluwatar/ambassador/ClientTest.java
117+
@@ -24,6 +24,8 @@ package com.iluwatar.ambassador;
118+
119+
import org.junit.jupiter.api.Test;
120+
121+
+import static org.junit.jupiter.api.Assertions.assertTrue;
122+
+
123+
/**
124+
* Test for {@link Client}
125+
*/
126+
@@ -35,6 +37,6 @@ public class ClientTest {
127+
Client client = new Client();
128+
long result = client.useService(10);
129+
130+
- assert result == 100 || result == -1;
131+
+ assertTrue(result == 100 || result == -1);
132+
}
133+
}
134+
diff --git a/ambassador/src/test/java/com/iluwatar/ambassador/RemoteServiceTest.java b/ambassador/src/test/java/com/iluwatar/ambassador/RemoteServiceTest.java
135+
index e0b297a..7d01469 100644
136+
--- a/ambassador/src/test/java/com/iluwatar/ambassador/RemoteServiceTest.java
137+
+++ b/ambassador/src/test/java/com/iluwatar/ambassador/RemoteServiceTest.java
138+
@@ -22,16 +22,43 @@
139+
*/
140+
package com.iluwatar.ambassador;
141+
142+
+import com.iluwatar.ambassador.util.RandomProvider;
143+
import org.junit.jupiter.api.Test;
144+
145+
+import static org.junit.jupiter.api.Assertions.assertEquals;
146+
+import static org.junit.jupiter.api.Assertions.assertTrue;
147+
+
148+
/**
149+
* Test for {@link RemoteService}
150+
*/
151+
public class RemoteServiceTest {
152+
153+
@Test
154+
- public void test() {
155+
- long result = RemoteService.getRemoteService().doRemoteFunction(10);
156+
- assert result == 100 || result == -1;
157+
+ public void testFailedCall() {
158+
+ RemoteService remoteService = new RemoteService(
159+
+ new StaticRandomProvider(0.21));
160+
+ long result = remoteService.doRemoteFunction(10);
161+
+ assertEquals(RemoteServiceInterface.FAILURE, result);
162+
+ }
163+
+
164+
+ @Test
165+
+ public void testSuccessfulCall() {
166+
+ RemoteService remoteService = new RemoteService(
167+
+ new StaticRandomProvider(0.2));
168+
+ long result = remoteService.doRemoteFunction(10);
169+
+ assertEquals(100, result);
170+
+ }
171+
+
172+
+ private class StaticRandomProvider implements RandomProvider {
173+
+ private double value;
174+
+
175+
+ StaticRandomProvider(double value) {
176+
+ this.value = value;
177+
+ }
178+
+
179+
+ @Override
180+
+ public double random() {
181+
+ return value;
182+
+ }
183+
}
184+
}
185+
diff --git a/ambassador/src/test/java/com/iluwatar/ambassador/ServiceAmbassadorTest.java b/ambassador/src/test/java/com/iluwatar/ambassador/ServiceAmbassadorTest.java
186+
index 432df9f..72e7106 100644
187+
--- a/ambassador/src/test/java/com/iluwatar/ambassador/ServiceAmbassadorTest.java
188+
+++ b/ambassador/src/test/java/com/iluwatar/ambassador/ServiceAmbassadorTest.java
189+
@@ -24,6 +24,8 @@ package com.iluwatar.ambassador;
190+
191+
import org.junit.jupiter.api.Test;
192+
193+
+import static org.junit.jupiter.api.Assertions.assertTrue;
194+
+
195+
/**
196+
* Test for {@link ServiceAmbassador}
197+
*/
198+
@@ -32,6 +34,6 @@ public class ServiceAmbassadorTest {
199+
@Test
200+
public void test() {
201+
long result = new ServiceAmbassador().doRemoteFunction(10);
202+
- assert result == 100 || result == -1;
203+
+ assertTrue(result == 100 || result == RemoteServiceInterface.FAILURE);
204+
}
205+
}

ambassador/src/main/java/com/iluwatar/ambassador/RemoteService.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
*/
2323
package com.iluwatar.ambassador;
2424

25+
import com.iluwatar.ambassador.util.RandomProvider;
2526
import org.slf4j.Logger;
2627
import org.slf4j.LoggerFactory;
2728

@@ -31,9 +32,10 @@
3132
* A remote legacy application represented by a Singleton implementation.
3233
*/
3334
public class RemoteService implements RemoteServiceInterface {
34-
35+
static final int THRESHOLD = 200;
3536
private static final Logger LOGGER = LoggerFactory.getLogger(RemoteService.class);
3637
private static RemoteService service = null;
38+
private final RandomProvider randomProvider;
3739

3840
static synchronized RemoteService getRemoteService() {
3941
if (service == null) {
@@ -42,24 +44,33 @@ static synchronized RemoteService getRemoteService() {
4244
return service;
4345
}
4446

45-
private RemoteService() {}
47+
private RemoteService() {
48+
this(Math::random);
49+
}
4650

51+
/**
52+
* This constuctor is used for testing purposes only.
53+
*/
54+
RemoteService(RandomProvider randomProvider) {
55+
this.randomProvider = randomProvider;
56+
}
4757
/**
4858
* Remote function takes a value and multiplies it by 10 taking a random amount of time.
4959
* Will sometimes return -1. This imitates connectivity issues a client might have to account for.
5060
* @param value integer value to be multiplied.
51-
* @return if waitTime is more than 200ms, it returns value * 10, otherwise -1.
61+
* @return if waitTime is less than {@link RemoteService#THRESHOLD}, it returns value * 10,
62+
* otherwise {@link RemoteServiceInterface#FAILURE}.
5263
*/
5364
@Override
5465
public long doRemoteFunction(int value) {
5566

56-
long waitTime = (long) Math.floor(Math.random() * 1000);
67+
long waitTime = (long) Math.floor(randomProvider.random() * 1000);
5768

5869
try {
5970
sleep(waitTime);
6071
} catch (InterruptedException e) {
6172
LOGGER.error("Thread sleep state interrupted", e);
6273
}
63-
return waitTime >= 200 ? value * 10 : -1;
74+
return waitTime <= THRESHOLD ? value * 10 : FAILURE;
6475
}
6576
}

ambassador/src/main/java/com/iluwatar/ambassador/RemoteServiceInterface.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
* Interface shared by ({@link RemoteService}) and ({@link ServiceAmbassador}).
2727
*/
2828
interface RemoteServiceInterface {
29-
29+
int FAILURE = -1;
30+
3031
long doRemoteFunction(int value) throws Exception;
3132
}

ambassador/src/main/java/com/iluwatar/ambassador/ServiceAmbassador.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,15 @@ private long checkLatency(int value) {
5959
private long safeCall(int value) {
6060

6161
int retries = 0;
62-
long result = -1;
62+
long result = FAILURE;
6363

6464
for (int i = 0; i < RETRIES; i++) {
6565

6666
if (retries >= RETRIES) {
67-
return -1;
67+
return FAILURE;
6868
}
6969

70-
if ((result = checkLatency(value)) == -1) {
70+
if ((result = checkLatency(value)) == FAILURE) {
7171
LOGGER.info("Failed to reach remote: (" + (i + 1) + ")");
7272
retries++;
7373
try {
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.iluwatar.ambassador.util;
2+
3+
/**
4+
* An interface for randomness. Useful for testing purposes.
5+
*/
6+
public interface RandomProvider {
7+
double random();
8+
}

ambassador/src/test/java/com/iluwatar/ambassador/ClientTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424

2525
import org.junit.jupiter.api.Test;
2626

27+
import static org.junit.jupiter.api.Assertions.assertTrue;
28+
2729
/**
2830
* Test for {@link Client}
2931
*/
@@ -35,6 +37,6 @@ public void test() {
3537
Client client = new Client();
3638
long result = client.useService(10);
3739

38-
assert result == 100 || result == -1;
40+
assertTrue(result == 100 || result == -1);
3941
}
4042
}

ambassador/src/test/java/com/iluwatar/ambassador/RemoteServiceTest.java

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,43 @@
2222
*/
2323
package com.iluwatar.ambassador;
2424

25+
import com.iluwatar.ambassador.util.RandomProvider;
2526
import org.junit.jupiter.api.Test;
2627

28+
import static org.junit.jupiter.api.Assertions.assertEquals;
29+
import static org.junit.jupiter.api.Assertions.assertTrue;
30+
2731
/**
2832
* Test for {@link RemoteService}
2933
*/
3034
public class RemoteServiceTest {
3135

3236
@Test
33-
public void test() {
34-
long result = RemoteService.getRemoteService().doRemoteFunction(10);
35-
assert result == 100 || result == -1;
37+
public void testFailedCall() {
38+
RemoteService remoteService = new RemoteService(
39+
new StaticRandomProvider(0.21));
40+
long result = remoteService.doRemoteFunction(10);
41+
assertEquals(RemoteServiceInterface.FAILURE, result);
42+
}
43+
44+
@Test
45+
public void testSuccessfulCall() {
46+
RemoteService remoteService = new RemoteService(
47+
new StaticRandomProvider(0.2));
48+
long result = remoteService.doRemoteFunction(10);
49+
assertEquals(100, result);
50+
}
51+
52+
private class StaticRandomProvider implements RandomProvider {
53+
private double value;
54+
55+
StaticRandomProvider(double value) {
56+
this.value = value;
57+
}
58+
59+
@Override
60+
public double random() {
61+
return value;
62+
}
3663
}
3764
}

ambassador/src/test/java/com/iluwatar/ambassador/ServiceAmbassadorTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424

2525
import org.junit.jupiter.api.Test;
2626

27+
import static org.junit.jupiter.api.Assertions.assertTrue;
28+
2729
/**
2830
* Test for {@link ServiceAmbassador}
2931
*/
@@ -32,6 +34,6 @@ public class ServiceAmbassadorTest {
3234
@Test
3335
public void test() {
3436
long result = new ServiceAmbassador().doRemoteFunction(10);
35-
assert result == 100 || result == -1;
37+
assertTrue(result == 100 || result == RemoteServiceInterface.FAILURE);
3638
}
3739
}

0 commit comments

Comments
 (0)