blob: 9d770a41104535217d839c6576b555306bb57f7b [file] [log] [blame]
// ***************************************************************************************************************************
// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file *
// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file *
// * to you 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 org.apache.juneau;
import static org.apache.juneau.testutils.TestUtils.*;
import static org.junit.Assert.*;
import org.apache.juneau.annotation.*;
import org.junit.*;
/**
* Tests the ContextCache class.
*/
public class ContextCacheTest {
//-------------------------------------------------------------------------------------------------------------------
// Basic tests
//-------------------------------------------------------------------------------------------------------------------
@Test
public void testBasic() {
PropertyStoreBuilder psb = PropertyStore.create();
PropertyStore ps = psb.build();
A a = ContextCache.INSTANCE.create(A.class, ps);
B b = ContextCache.INSTANCE.create(B.class, ps);
C c = ContextCache.INSTANCE.create(C.class, ps);
assertObjectEquals("{f1:'xxx'}", a);
assertObjectEquals("{f1:'xxx',f2:-1}", b);
assertObjectEquals("{f1:'xxx',f2:-1,f3:false}", c);
A a2 = ContextCache.INSTANCE.create(A.class, ps);
B b2 = ContextCache.INSTANCE.create(B.class, ps);
C c2 = ContextCache.INSTANCE.create(C.class, ps);
assertTrue(a == a2);
assertTrue(b == b2);
assertTrue(c == c2);
psb.set("A.f1", "foo");
ps = psb.build();
a2 = ContextCache.INSTANCE.create(A.class, ps);
b2 = ContextCache.INSTANCE.create(B.class, ps);
c2 = ContextCache.INSTANCE.create(C.class, ps);
assertObjectEquals("{f1:'foo'}", a2);
assertObjectEquals("{f1:'foo',f2:-1}", b2);
assertObjectEquals("{f1:'foo',f2:-1,f3:false}", c2);
assertTrue(a != a2);
assertTrue(b != b2);
assertTrue(c != c2);
a = a2; b = b2; c = c2;
ps = psb.set("B.f2.i", 123).build();
a2 = ContextCache.INSTANCE.create(A.class, ps);
b2 = ContextCache.INSTANCE.create(B.class, ps);
c2 = ContextCache.INSTANCE.create(C.class, ps);
assertObjectEquals("{f1:'foo'}", a2);
assertObjectEquals("{f1:'foo',f2:123}", b2);
assertObjectEquals("{f1:'foo',f2:123,f3:false}", c2);
assertTrue(a == a2);
assertTrue(b != b2);
assertTrue(c != c2);
a = a2; b = b2; c = c2;
ps = psb.set("C.f3.b", true).build();
a2 = ContextCache.INSTANCE.create(A.class, ps);
b2 = ContextCache.INSTANCE.create(B.class, ps);
c2 = ContextCache.INSTANCE.create(C.class, ps);
assertObjectEquals("{f1:'foo'}", a2);
assertObjectEquals("{f1:'foo',f2:123}", b2);
assertObjectEquals("{f1:'foo',f2:123,f3:true}", c2);
assertTrue(a == a2);
assertTrue(b == b2);
assertTrue(c != c2);
a = a2; b = b2; c = c2;
ps = psb.set("D.bad.o", "xxx").build();
a2 = ContextCache.INSTANCE.create(A.class, ps);
b2 = ContextCache.INSTANCE.create(B.class, ps);
c2 = ContextCache.INSTANCE.create(C.class, ps);
assertObjectEquals("{f1:'foo'}", a2);
assertObjectEquals("{f1:'foo',f2:123}", b2);
assertObjectEquals("{f1:'foo',f2:123,f3:true}", c2);
assertTrue(a == a2);
assertTrue(b == b2);
assertTrue(c == c2);
assertTrue(a.getPropertyStore() == a2.getPropertyStore());
assertTrue(b.getPropertyStore() == b2.getPropertyStore());
assertTrue(c.getPropertyStore() == c2.getPropertyStore());
a2 = ContextCache.INSTANCE.create(A.class, a.getPropertyStore().builder().set("A.f1", "foo").build());
assertTrue(a == a2);
a2 = ContextCache.INSTANCE.create(A.class, a.getPropertyStore().builder().set("A.f1", "bar").build());
assertTrue(a != a2);
}
@ConfigurableContext
public static class A extends Context {
public final String f1;
public A(PropertyStore ps) {
super(ps, true);
f1 = getStringProperty("A.f1", "xxx");
}
@Override
public Session createSession(SessionArgs args) {
return null;
}
@Override
public SessionArgs createDefaultSessionArgs() {
return null;
}
@Override
public ObjectMap toMap() {
return new ObjectMap().append("f1", f1);
}
}
@ConfigurableContext
public static class B extends A {
public int f2;
public B(PropertyStore ps) {
super(ps);
f2 = getIntegerProperty("B.f2.i", -1);
}
@Override
public ObjectMap toMap() {
return super.toMap().append("f2", f2);
}
}
@ConfigurableContext
public static class C extends B {
public boolean f3;
public C(PropertyStore ps) {
super(ps);
f3 = getBooleanProperty("C.f3.b", false);
}
@Override
public ObjectMap toMap() {
return super.toMap().append("f3", f3);
}
}
@Test
public void testBadConstructor() {
PropertyStoreBuilder psb = PropertyStore.create();
PropertyStore ps = psb.build();
try {
ContextCache.INSTANCE.create(D1.class, ps);
fail("Exception expected");
} catch (Exception e) {
assertEquals("Could not create instance of class 'org.apache.juneau.ContextCacheTest$D1'", e.getLocalizedMessage());
}
try {
ContextCache.INSTANCE.create(D2.class, ps);
fail("Exception expected");
} catch (Exception e) {
assertEquals("Could not create instance of class 'org.apache.juneau.ContextCacheTest$D2'", e.getLocalizedMessage());
}
}
public static class D1 extends A {
protected D1(PropertyStore ps) {
super(ps);
}
}
public static class D2 extends A {
public D2(PropertyStore ps) {
super(ps);
throw new RuntimeException("Error!");
}
}
}