/**
* Copyright (C) 2016 Red Hat, Inc. and/or its affiliates.
*
* 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 org.jboss.errai.cdi.event.client.test;
import javax.inject.Named;
import org.jboss.errai.cdi.client.qualifier.Value;
import org.jboss.errai.cdi.client.qualifier.WithClazz;
import org.jboss.errai.cdi.client.qualifier.WithEnum;
import org.jboss.errai.cdi.client.qualifier.WithInt;
import org.jboss.errai.cdi.client.qualifier.WithMultiple;
import org.jboss.errai.cdi.event.client.FiredQualifierObserver;
import org.jboss.errai.cdi.event.client.shared.FiredQualifier;
import org.jboss.errai.cdi.event.client.shared.QualifiedMemberEventProducer;
import org.jboss.errai.enterprise.client.cdi.AbstractErraiCDITest;
import org.jboss.errai.enterprise.client.cdi.api.CDI;
import com.google.gwt.user.client.Timer;
/**
* Test sending and receiving events with qualifier members like {@code @Named("literal value")}.
*
* @author Max Barkley <mbarkley@redhat.com>
*/
public abstract class AbstractQualifierMemberIntegrationTest extends AbstractErraiCDITest {
protected static final int DURATION = 30000;
@Override
public String getModuleName() {
return "org.jboss.errai.cdi.event.EventObserverTestModule";
}
protected abstract FiredQualifierObserver getQualifierObserver();
protected abstract QualifiedMemberEventProducer getEventProducer();
protected abstract void setup(Runnable run);
public void testClazzMember() throws Exception {
delayTestFinish(DURATION);
CDI.addPostInitTask(() -> {
final QualifiedMemberEventProducer producer = getEventProducer();
final FiredQualifierObserver observer = getQualifierObserver();
assertEquals(0, observer.observedQualifiers.size());
assertUntil(DURATION - 1000,
() -> producer.fireClazzObject(),
() -> {
assertEquals(1, observer.observedQualifiers.size());
assertEquals(WithClazz.class.getName(), observer.observedQualifiers.get(0).getAnnoType());
assertEquals(Object.class.getName(), observer.observedQualifiers.get(0).getValues().get("value"));
});
});
}
public void testEnumMember() throws Exception {
delayTestFinish(DURATION);
CDI.addPostInitTask(() -> {
final QualifiedMemberEventProducer producer = getEventProducer();
final FiredQualifierObserver observer = getQualifierObserver();
assertEquals(0, observer.observedQualifiers.size());
assertUntil(DURATION - 1000,
() -> producer.fireEnumOne(),
() -> {
assertEquals(1, observer.observedQualifiers.size());
assertEquals(WithEnum.class.getName(), observer.observedQualifiers.get(0).getAnnoType());
assertEquals(Value.ONE, observer.observedQualifiers.get(0).getValues().get("value"));
},
() -> {
observer.observedQualifiers.clear();
producer.fireEnumTwo();
},
() -> {
assertEquals(1, observer.observedQualifiers.size());
assertEquals(WithEnum.class.getName(), observer.observedQualifiers.get(0).getAnnoType());
assertEquals(Value.TWO, observer.observedQualifiers.get(0).getValues().get("value"));
},
() -> {
observer.observedQualifiers.clear();
producer.fireEnumThree();
},
() -> assertEquals(0, observer.observedQualifiers.size()));
});
}
public void testIntMember() throws Exception {
delayTestFinish(DURATION);
CDI.addPostInitTask(() -> {
final QualifiedMemberEventProducer producer = getEventProducer();
final FiredQualifierObserver observer = getQualifierObserver();
assertEquals(0, observer.observedQualifiers.size());
assertUntil(DURATION - 1000,
() -> producer.fireInt0(),
() -> {
assertEquals(1, observer.observedQualifiers.size());
assertEquals(WithInt.class.getName(), observer.observedQualifiers.get(0).getAnnoType());
assertEquals(0, observer.observedQualifiers.get(0).getValues().get("value"));
},
() -> {
observer.observedQualifiers.clear();
producer.fireInt100();
},
() -> {
assertEquals(1, observer.observedQualifiers.size());
assertEquals(WithInt.class.getName(), observer.observedQualifiers.get(0).getAnnoType());
assertEquals(100, observer.observedQualifiers.get(0).getValues().get("value"));
},
() -> {
observer.observedQualifiers.clear();
producer.fireIntNeg1();
},
() -> assertEquals(0, observer.observedQualifiers.size()));
});
}
public void testNamedEvent() throws Exception {
delayTestFinish(DURATION);
CDI.addPostInitTask(() -> {
final QualifiedMemberEventProducer producer = getEventProducer();
final FiredQualifierObserver observer = getQualifierObserver();
assertEquals(0, observer.observedQualifiers.size());
assertUntil(DURATION - 1000,
() -> producer.fireNamedEvent(),
() -> {
assertEquals(1, observer.observedQualifiers.size());
assertEquals(Named.class.getName(), observer.observedQualifiers.get(0).getAnnoType());
assertEquals("foo", observer.observedQualifiers.get(0).getValues().get("value"));
});
});
}
public void testMultipleQualifiers() throws Exception {
delayTestFinish(DURATION);
CDI.addPostInitTask(() -> {
final QualifiedMemberEventProducer producer = getEventProducer();
final FiredQualifierObserver observer = getQualifierObserver();
assertEquals(0, observer.observedQualifiers.size());
assertUntil(DURATION - 1000,
() -> producer.fireEnumAndIntOne(),
() -> {
assertEquals(2, observer.observedQualifiers.size());
assertTrue(observer.observedQualifiers.toString(),
observer.observedQualifiers.get(0).getAnnoType().equals(WithEnum.class.getName())
|| observer.observedQualifiers.get(1).getAnnoType().equals(WithEnum.class.getName()));
assertTrue(observer.observedQualifiers.toString(),
observer.observedQualifiers.get(0).getAnnoType().equals(WithInt.class.getName())
|| observer.observedQualifiers.get(1).getAnnoType().equals(WithInt.class.getName()));
final FiredQualifier enumAnno = (observer.observedQualifiers.get(0).getAnnoType().equals(WithEnum.class.getName())
? observer.observedQualifiers.get(0) : observer.observedQualifiers.get(1));
final FiredQualifier intAnno = (observer.observedQualifiers.get(0).getAnnoType().equals(WithInt.class.getName())
? observer.observedQualifiers.get(0) : observer.observedQualifiers.get(1));
assertEquals(Value.ONE, enumAnno.getValues().get("value"));
assertEquals(0, intAnno.getValues().get("value"));
});
});
}
public void testQualifierWithMultipleMembers() throws Exception {
delayTestFinish(DURATION);
CDI.addPostInitTask(() -> {
final QualifiedMemberEventProducer producer = getEventProducer();
final FiredQualifierObserver observer = getQualifierObserver();
assertEquals(0, observer.observedQualifiers.size());
assertUntil(DURATION - 1000,
() -> producer.fireMultiple1(),
() -> {
assertEquals(1, observer.observedQualifiers.size());
assertEquals(WithMultiple.class.getName(), observer.observedQualifiers.get(0).getAnnoType());
assertEquals(Value.ONE, observer.observedQualifiers.get(0).getValues().get("enumValue"));
assertEquals(0, observer.observedQualifiers.get(0).getValues().get("intValue"));
assertEquals("", observer.observedQualifiers.get(0).getValues().get("strValue"));
},
() -> {
observer.observedQualifiers.clear();
producer.fireMultiple2();
},
() -> {
assertEquals(1, observer.observedQualifiers.size());
assertEquals(WithMultiple.class.getName(), observer.observedQualifiers.get(0).getAnnoType());
assertEquals(Value.ONE, observer.observedQualifiers.get(0).getValues().get("enumValue"));
assertEquals(1, observer.observedQualifiers.get(0).getValues().get("intValue"));
assertEquals("", observer.observedQualifiers.get(0).getValues().get("strValue"));
},
() -> {
observer.observedQualifiers.clear();
producer.fireMultiple3();
},
() -> {
assertEquals(1, observer.observedQualifiers.size());
assertEquals(WithMultiple.class.getName(), observer.observedQualifiers.get(0).getAnnoType());
assertEquals(Value.ONE, observer.observedQualifiers.get(0).getValues().get("enumValue"));
assertEquals(0, observer.observedQualifiers.get(0).getValues().get("intValue"));
assertEquals("foo", observer.observedQualifiers.get(0).getValues().get("strValue"));
},
() -> {
observer.observedQualifiers.clear();
producer.fireMultipleNone();
},
() -> assertEquals(0, observer.observedQualifiers.size()));
});
}
/**
* @param runnables A list of runnables alternating between assertions and setup.
*/
protected void assertUntil(final long duration, final Runnable... runnables) {
final long start = System.currentTimeMillis();
setup(() -> {
new Timer() {
int i = 0;
@Override
public void run() {
if (i < runnables.length) {
final Timer main = this;
final Runnable setup = runnables[i];
final Runnable assertions = runnables[i + 1];
try {
setup.run();
} catch (Throwable t) {
throw new AssertionError("Failure running setup.", t);
}
new Timer() {
@Override
public void run() {
boolean passed = false;
try {
assertions.run();
passed = true;
i += 2;
} catch (AssertionError ae) {
if (System.currentTimeMillis() - start > duration) {
throw new AssertionError(duration + "ms ellapsed without assertions passing." + ae.getMessage(), ae);
}
else {
schedule(1000);
}
}
if (passed) {
main.run();
}
}
}.run();
;
}
else {
finishTest();
}
}
}.run();
});
}
}