Skip to content

Commit 84e523f

Browse files
committed
Merge pull request #849 from mattrjacobs/subclass-cmd
Added unit tests proving that request log, request caching and fallback work as expected when there is a class hierarchy of HystrixCommands
2 parents fd59207 + 9037c7c commit 84e523f

File tree

1 file changed

+172
-0
lines changed

1 file changed

+172
-0
lines changed
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
/**
2+
* Copyright 2015 Netflix, Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.netflix.hystrix;
18+
19+
import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;
20+
import org.junit.After;
21+
import org.junit.Before;
22+
import org.junit.Test;
23+
24+
import java.util.ArrayList;
25+
import java.util.List;
26+
27+
import static org.junit.Assert.assertEquals;
28+
29+
public class HystrixSubclassCommandTest {
30+
31+
private final static HystrixCommandGroupKey groupKey = HystrixCommandGroupKey.Factory.asKey("GROUP");
32+
private HystrixRequestContext requestContext;
33+
34+
@Before
35+
public void setUp() {
36+
requestContext = HystrixRequestContext.initializeContext();
37+
}
38+
39+
@After
40+
public void tearDown() {
41+
requestContext.shutdown();
42+
}
43+
44+
@Test
45+
public void testFallback() {
46+
HystrixCommand<Integer> superCmd = new SuperCommand("cache", false);
47+
assertEquals(2, superCmd.execute().intValue());
48+
49+
HystrixCommand<Integer> subNoOverridesCmd = new SubCommandNoOverride("cache", false);
50+
assertEquals(2, subNoOverridesCmd.execute().intValue());
51+
52+
HystrixCommand<Integer> subOverriddenFallbackCmd = new SubCommandOverrideFallback("cache", false);
53+
assertEquals(3, subOverriddenFallbackCmd.execute().intValue());
54+
}
55+
56+
@Test
57+
public void testRequestCacheSuperClass() {
58+
HystrixCommand<Integer> superCmd1 = new SuperCommand("cache", true);
59+
assertEquals(1, superCmd1.execute().intValue());
60+
HystrixCommand<Integer> superCmd2 = new SuperCommand("cache", true);
61+
assertEquals(1, superCmd2.execute().intValue());
62+
HystrixCommand<Integer> superCmd3 = new SuperCommand("no-cache", true);
63+
assertEquals(1, superCmd3.execute().intValue());
64+
System.out.println("REQ LOG : " + HystrixRequestLog.getCurrentRequest().getExecutedCommandsAsString());
65+
HystrixRequestLog reqLog = HystrixRequestLog.getCurrentRequest();
66+
assertEquals(3, reqLog.getAllExecutedCommands().size());
67+
List<HystrixInvokableInfo<?>> infos = new ArrayList<HystrixInvokableInfo<?>>(reqLog.getAllExecutedCommands());
68+
HystrixInvokableInfo<?> info1 = infos.get(0);
69+
assertEquals("SuperCommand", info1.getCommandKey().name());
70+
assertEquals(1, info1.getExecutionEvents().size());
71+
HystrixInvokableInfo<?> info2 = infos.get(1);
72+
assertEquals("SuperCommand", info2.getCommandKey().name());
73+
assertEquals(2, info2.getExecutionEvents().size());
74+
assertEquals(HystrixEventType.RESPONSE_FROM_CACHE, info2.getExecutionEvents().get(1));
75+
HystrixInvokableInfo<?> info3 = infos.get(2);
76+
assertEquals("SuperCommand", info3.getCommandKey().name());
77+
assertEquals(1, info3.getExecutionEvents().size());
78+
}
79+
80+
@Test
81+
public void testRequestCacheSubclassNoOverrides() {
82+
HystrixCommand<Integer> subCmd1 = new SubCommandNoOverride("cache", true);
83+
assertEquals(1, subCmd1.execute().intValue());
84+
HystrixCommand<Integer> subCmd2 = new SubCommandNoOverride("cache", true);
85+
assertEquals(1, subCmd2.execute().intValue());
86+
HystrixCommand<Integer> subCmd3 = new SubCommandNoOverride("no-cache", true);
87+
assertEquals(1, subCmd3.execute().intValue());
88+
System.out.println("REQ LOG : " + HystrixRequestLog.getCurrentRequest().getExecutedCommandsAsString());
89+
HystrixRequestLog reqLog = HystrixRequestLog.getCurrentRequest();
90+
assertEquals(3, reqLog.getAllExecutedCommands().size());
91+
List<HystrixInvokableInfo<?>> infos = new ArrayList<HystrixInvokableInfo<?>>(reqLog.getAllExecutedCommands());
92+
HystrixInvokableInfo<?> info1 = infos.get(0);
93+
assertEquals("SubCommandNoOverride", info1.getCommandKey().name());
94+
assertEquals(1, info1.getExecutionEvents().size());
95+
HystrixInvokableInfo<?> info2 = infos.get(1);
96+
assertEquals("SubCommandNoOverride", info2.getCommandKey().name());
97+
assertEquals(2, info2.getExecutionEvents().size());
98+
assertEquals(HystrixEventType.RESPONSE_FROM_CACHE, info2.getExecutionEvents().get(1));
99+
HystrixInvokableInfo<?> info3 = infos.get(2);
100+
assertEquals("SubCommandNoOverride", info3.getCommandKey().name());
101+
assertEquals(1, info3.getExecutionEvents().size());
102+
}
103+
104+
@Test
105+
public void testRequestLogSuperClass() {
106+
HystrixCommand<Integer> superCmd = new SuperCommand("cache", true);
107+
assertEquals(1, superCmd.execute().intValue());
108+
System.out.println("REQ LOG : " + HystrixRequestLog.getCurrentRequest().getExecutedCommandsAsString());
109+
HystrixRequestLog reqLog = HystrixRequestLog.getCurrentRequest();
110+
assertEquals(1, reqLog.getAllExecutedCommands().size());
111+
HystrixInvokableInfo<?> info = reqLog.getAllExecutedCommands().iterator().next();
112+
assertEquals("SuperCommand", info.getCommandKey().name());
113+
}
114+
115+
@Test
116+
public void testRequestLogSubClassNoOverrides() {
117+
HystrixCommand<Integer> subCmd = new SubCommandNoOverride("cache", true);
118+
assertEquals(1, subCmd.execute().intValue());
119+
System.out.println("REQ LOG : " + HystrixRequestLog.getCurrentRequest().getExecutedCommandsAsString());
120+
HystrixRequestLog reqLog = HystrixRequestLog.getCurrentRequest();
121+
assertEquals(1, reqLog.getAllExecutedCommands().size());
122+
HystrixInvokableInfo<?> info = reqLog.getAllExecutedCommands().iterator().next();
123+
assertEquals("SubCommandNoOverride", info.getCommandKey().name());
124+
}
125+
126+
public static class SuperCommand extends HystrixCommand<Integer> {
127+
private final String uniqueArg;
128+
private final boolean shouldSucceed;
129+
130+
SuperCommand(String uniqueArg, boolean shouldSucceed) {
131+
super(Setter.withGroupKey(groupKey));
132+
this.uniqueArg = uniqueArg;
133+
this.shouldSucceed = shouldSucceed;
134+
}
135+
136+
@Override
137+
protected Integer run() throws Exception {
138+
if (shouldSucceed) {
139+
return 1;
140+
} else {
141+
throw new RuntimeException("unit test failure");
142+
}
143+
}
144+
145+
@Override
146+
protected Integer getFallback() {
147+
return 2;
148+
}
149+
150+
@Override
151+
protected String getCacheKey() {
152+
return uniqueArg;
153+
}
154+
}
155+
156+
public static class SubCommandNoOverride extends SuperCommand {
157+
SubCommandNoOverride(String uniqueArg, boolean shouldSucceed) {
158+
super(uniqueArg, shouldSucceed);
159+
}
160+
}
161+
162+
public static class SubCommandOverrideFallback extends SuperCommand {
163+
SubCommandOverrideFallback(String uniqueArg, boolean shouldSucceed) {
164+
super(uniqueArg, shouldSucceed);
165+
}
166+
167+
@Override
168+
protected Integer getFallback() {
169+
return 3;
170+
}
171+
}
172+
}

0 commit comments

Comments
 (0)