/**
* Copyright 2015 Netflix, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.netflix.hystrix;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import org.junit.Test;
import rx.Observable;
import rx.Subscriber;
import com.netflix.hystrix.strategy.concurrency.HystrixConcurrencyStrategy;
import com.netflix.hystrix.strategy.concurrency.HystrixConcurrencyStrategyDefault;
import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;
import rx.Subscription;
import rx.subjects.ReplaySubject;
public class HystrixRequestCacheTest {
@Test
public void testCache() {
HystrixConcurrencyStrategy strategy = HystrixConcurrencyStrategyDefault.getInstance();
HystrixRequestContext context = HystrixRequestContext.initializeContext();
try {
HystrixRequestCache cache1 = HystrixRequestCache.getInstance(HystrixCommandKey.Factory.asKey("command1"), strategy);
cache1.putIfAbsent("valueA", new TestObservable("a1"));
cache1.putIfAbsent("valueA", new TestObservable("a2"));
cache1.putIfAbsent("valueB", new TestObservable("b1"));
HystrixRequestCache cache2 = HystrixRequestCache.getInstance(HystrixCommandKey.Factory.asKey("command2"), strategy);
cache2.putIfAbsent("valueA", new TestObservable("a3"));
assertEquals("a1", cache1.get("valueA").toObservable().toBlocking().last());
assertEquals("b1", cache1.get("valueB").toObservable().toBlocking().last());
assertEquals("a3", cache2.get("valueA").toObservable().toBlocking().last());
assertNull(cache2.get("valueB"));
} catch (Exception e) {
fail("Exception: " + e.getMessage());
e.printStackTrace();
} finally {
context.shutdown();
}
context = HystrixRequestContext.initializeContext();
try {
// with a new context the instance should have nothing in it
HystrixRequestCache cache = HystrixRequestCache.getInstance(HystrixCommandKey.Factory.asKey("command1"), strategy);
assertNull(cache.get("valueA"));
assertNull(cache.get("valueB"));
} finally {
context.shutdown();
}
}
@Test(expected = IllegalStateException.class)
public void testCacheWithoutContext() {
HystrixRequestCache.getInstance(
HystrixCommandKey.Factory.asKey("command1"),
HystrixConcurrencyStrategyDefault.getInstance()
).get("any");
}
@Test
public void testClearCache() {
HystrixConcurrencyStrategy strategy = HystrixConcurrencyStrategyDefault.getInstance();
HystrixRequestContext context = HystrixRequestContext.initializeContext();
try {
HystrixRequestCache cache1 = HystrixRequestCache.getInstance(HystrixCommandKey.Factory.asKey("command1"), strategy);
cache1.putIfAbsent("valueA", new TestObservable("a1"));
assertEquals("a1", cache1.get("valueA").toObservable().toBlocking().last());
cache1.clear("valueA");
assertNull(cache1.get("valueA"));
} catch (Exception e) {
fail("Exception: " + e.getMessage());
e.printStackTrace();
} finally {
context.shutdown();
}
}
@Test
public void testCacheWithoutRequestContext() {
HystrixConcurrencyStrategy strategy = HystrixConcurrencyStrategyDefault.getInstance();
//HystrixRequestContext context = HystrixRequestContext.initializeContext();
try {
HystrixRequestCache cache1 = HystrixRequestCache.getInstance(HystrixCommandKey.Factory.asKey("command1"), strategy);
//this should fail, as there's no HystrixRequestContext instance to place the cache into
cache1.putIfAbsent("valueA", new TestObservable("a1"));
fail("should throw an exception on cache put");
} catch (Exception e) {
//expected
e.printStackTrace();
}
}
private static class TestObservable extends HystrixCachedObservable<String> {
public TestObservable(String arg) {
super(Observable.just(arg));
}
}
}