Skip to content

Commit 5c30bf9

Browse files
authored
Enable access to the ProtocolConfiguration info from the TestDeployment. (#555)
Fixes #554 Signed-off-by: Scott M Stark <[email protected]>
1 parent 76ba193 commit 5c30bf9

File tree

3 files changed

+157
-12
lines changed

3 files changed

+157
-12
lines changed

container/test-impl-base/src/main/java/org/jboss/arquillian/container/test/impl/client/deployment/DeploymentGenerator.java

Lines changed: 63 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@
1919
import java.util.ArrayList;
2020
import java.util.Collection;
2121
import java.util.List;
22+
23+
import org.jboss.arquillian.config.descriptor.api.ProtocolDef;
2224
import org.jboss.arquillian.container.spi.Container;
2325
import org.jboss.arquillian.container.spi.ContainerRegistry;
26+
import org.jboss.arquillian.container.spi.client.container.DeployableContainer;
2427
import org.jboss.arquillian.container.spi.client.deployment.Deployment;
2528
import org.jboss.arquillian.container.spi.client.deployment.DeploymentDescription;
2629
import org.jboss.arquillian.container.spi.client.deployment.DeploymentScenario;
@@ -38,6 +41,7 @@
3841
import org.jboss.arquillian.container.test.spi.client.deployment.DeploymentScenarioGenerator;
3942
import org.jboss.arquillian.container.test.spi.client.deployment.ProtocolArchiveProcessor;
4043
import org.jboss.arquillian.container.test.spi.client.protocol.Protocol;
44+
import org.jboss.arquillian.container.test.spi.client.protocol.ProtocolConfiguration;
4145
import org.jboss.arquillian.core.api.Instance;
4246
import org.jboss.arquillian.core.api.InstanceProducer;
4347
import org.jboss.arquillian.core.api.annotation.Inject;
@@ -154,13 +158,58 @@ private void buildTestableDeployments(DeploymentScenario scenario, TestClass tes
154158
}
155159
List<Archive<?>> auxiliaryArchives = loadAuxiliaryArchives(description);
156160

157-
ProtocolDefinition protocolDefinition = protoReg.getProtocol(description.getProtocol());
158-
if (protocolDefinition == null) {
159-
protocolDefinition = protoReg.getProtocol(
160-
containerRegistry.get()
161-
.getContainer(description.getTarget())
162-
.getDeployableContainer()
163-
.getDefaultProtocol());
161+
// First look to the target container
162+
Container container = containerRegistry.get().getContainer(description.getTarget());
163+
if(container == null) {
164+
throwNoContainerFound(description.getTarget());
165+
}
166+
ProtocolDefinition protocolDefinition = null;
167+
ProtocolConfiguration protocolConfig = null;
168+
ProtocolDescription protocolDescription = description.getProtocol();
169+
if(protocolDescription == ProtocolDescription.DEFAULT) {
170+
// Map to the actual ProtocolDescription if this is the DEFAULT placeholder
171+
ProtocolDefinition defaultDef = protoReg.getProtocol(protocolDescription);
172+
// There may not be any default protocol
173+
if(defaultDef != null) {
174+
protocolDescription = defaultDef.getProtocolDescription();
175+
}
176+
}
177+
if(container.hasProtocolConfiguration(protocolDescription)) {
178+
ProtocolDef pdef = container.getProtocolConfiguration(protocolDescription);
179+
try {
180+
protocolDefinition = protoReg.getProtocol(protocolDescription);
181+
protocolConfig = protocolDefinition.createProtocolConfiguration(pdef.getProtocolProperties());
182+
} catch (Exception e) {
183+
ValidationException ve = new ValidationException("Unable to create protocol configuration for protocol " + protocolDescription.getName());
184+
ve.initCause(e);
185+
throw ve;
186+
}
187+
}
188+
// If the container had no protocol, try the protocol registry
189+
if(protocolDefinition == null) {
190+
protocolDefinition = protoReg.getProtocol(protocolDescription);
191+
if(protocolDefinition != null) {
192+
try {
193+
protocolConfig = protocolDefinition.createProtocolConfiguration();
194+
} catch (Exception e) {
195+
ValidationException ve = new ValidationException("Unable to create protocol configuration for protocol " + protocolDescription.getName());
196+
ve.initCause(e);
197+
throw ve;
198+
}
199+
}
200+
}
201+
// Lastly see if there is a default protocol on the DeployableContainer
202+
if(protocolDefinition == null) {
203+
DeployableContainer<?> deployableContainer = container.getDeployableContainer();
204+
ProtocolDescription defaultDef = deployableContainer.getDefaultProtocol();
205+
protocolDefinition = protoReg.getProtocol(defaultDef);
206+
try {
207+
protocolConfig = protocolDefinition.createProtocolConfiguration();
208+
} catch (Exception e) {
209+
ValidationException ve = new ValidationException("Unable to create protocol configuration for protocol " + protocolDescription.getName());
210+
ve.initCause(e);
211+
throw ve;
212+
}
164213
}
165214
Protocol<?> protocol = protocolDefinition.getProtocol();
166215
DeploymentPackager packager = protocol.getPackager();
@@ -184,10 +233,13 @@ private void buildTestableDeployments(DeploymentScenario scenario, TestClass tes
184233
* ContianerBase implements it. Check the Archive Interface..
185234
*/
186235
}
187-
description.setTestableArchive(
188-
packager.generateDeployment(
189-
new TestDeployment(deployment.getDescription(), applicationArchive, auxiliaryArchives),
190-
serviceLoader.get().all(ProtocolArchiveProcessor.class)));
236+
// Load the ProtocolArchiveProcessors
237+
Collection<ProtocolArchiveProcessor> archiveProcessors = serviceLoader.get().all(ProtocolArchiveProcessor.class);
238+
// Create the testable archive
239+
TestDeployment testDeployment = new TestDeployment(deployment.getDescription(), applicationArchive, auxiliaryArchives);
240+
testDeployment.setProtocolConfiguration(protocolConfig);
241+
Archive<?> testArchive = packager.generateDeployment(testDeployment, archiveProcessors);
242+
description.setTestableArchive(testArchive);
191243
}
192244
}
193245

container/test-impl-base/src/test/java/org/jboss/arquillian/container/test/impl/client/deployment/DeploymentGeneratorTestCase.java

Lines changed: 83 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
import java.util.List;
2626
import java.util.Map;
2727
import java.util.Set;
28+
29+
import org.jboss.arquillian.config.descriptor.api.ContainerDef;
30+
import org.jboss.arquillian.config.descriptor.api.ProtocolDef;
2831
import org.jboss.arquillian.config.descriptor.impl.ContainerDefImpl;
2932
import org.jboss.arquillian.container.impl.LocalContainerRegistry;
3033
import org.jboss.arquillian.container.spi.Container;
@@ -44,7 +47,9 @@
4447
import org.jboss.arquillian.container.test.spi.client.deployment.AuxiliaryArchiveProcessor;
4548
import org.jboss.arquillian.container.test.spi.client.deployment.DeploymentPackager;
4649
import org.jboss.arquillian.container.test.spi.client.deployment.DeploymentScenarioGenerator;
50+
import org.jboss.arquillian.container.test.spi.client.deployment.ProtocolArchiveProcessor;
4751
import org.jboss.arquillian.container.test.spi.client.protocol.Protocol;
52+
import org.jboss.arquillian.container.test.spi.client.protocol.ProtocolConfiguration;
4853
import org.jboss.arquillian.container.test.test.AbstractContainerTestTestBase;
4954
import org.jboss.arquillian.core.api.Injector;
5055
import org.jboss.arquillian.core.api.Instance;
@@ -137,6 +142,41 @@ public void shouldUseDefaultDefinedProtocolIfFound() {
137142
verify(deployableContainer, times(0)).getDefaultProtocol();
138143
}
139144

145+
@Test
146+
public void shouldUseContainerProtocolIfFound() {
147+
Container container = addContainer("test-contianer-with-protocol");
148+
ContainerDef containerDef = container.getContainerConfiguration();
149+
containerDef.setMode("suite");
150+
AltDeploymentPackager packager1 = new AltDeploymentPackager();
151+
addProtocolWithPackager(PROTOCOL_NAME_1, false, packager1, Collections.singletonMap("mode", "default"));
152+
// Now add a container local protocol with a custom config
153+
ProtocolDef protocolDef = containerDef.protocol(PROTOCOL_NAME_1)
154+
.property("mode", "custom");
155+
156+
fire(createEvent(DeploymentWithProtocol.class));
157+
158+
verify(deployableContainer, times(0)).getDefaultProtocol();
159+
TheProtocolConfiguration config = (TheProtocolConfiguration) packager1.getConfig();
160+
Assert.assertEquals("custom", config.getMode());
161+
}
162+
@Test
163+
public void shouldUseContainerDefaultProtocolIfFound() {
164+
Container container = addContainer("test-contianer-with-protocol");
165+
ContainerDef containerDef = container.getContainerConfiguration();
166+
containerDef.setMode("suite");
167+
AltDeploymentPackager packager1 = new AltDeploymentPackager();
168+
addProtocolWithPackager(PROTOCOL_NAME_1, true, packager1, Collections.singletonMap("mode", "default"));
169+
// Now add a container local protocol with a custom config
170+
ProtocolDef protocolDef = containerDef.protocol(PROTOCOL_NAME_1)
171+
.property("mode", "custom");
172+
173+
fire(createEvent(DeploymentWithDefaults.class));
174+
175+
verify(deployableContainer, times(0)).getDefaultProtocol();
176+
TheProtocolConfiguration config = (TheProtocolConfiguration) packager1.getConfig();
177+
Assert.assertEquals("custom", config.getMode());
178+
}
179+
140180
@Test
141181
public void shouldAddAdditionalObserverClasses() {
142182
addContainer("test-contianer").getContainerConfiguration().setMode("suite");
@@ -339,14 +379,25 @@ private Container addContainer(String name) {
339379
}
340380

341381
private ProtocolDefinition addProtocol(String name, boolean shouldBeDefault) {
342-
Protocol<?> protocol = mock(Protocol.class);
382+
Protocol<TheProtocolConfiguration> protocol = mock(Protocol.class);
343383
when(protocol.getPackager()).thenReturn(packager);
344384
when(protocol.getDescription()).thenReturn(new ProtocolDescription(name));
385+
when(protocol.getProtocolConfigurationClass()).thenReturn(TheProtocolConfiguration.class);
345386

346387
Map<String, String> config = Collections.emptyMap();
347388
return protocolRegistry.addProtocol(new ProtocolDefinition(protocol, config, shouldBeDefault))
348389
.getProtocol(new ProtocolDescription(name));
349390
}
391+
private ProtocolDefinition addProtocolWithPackager(String name, boolean shouldBeDefault,
392+
DeploymentPackager packager, Map<String, String> config) {
393+
Protocol<TheProtocolConfiguration> protocol = mock(Protocol.class);
394+
when(protocol.getPackager()).thenReturn(packager);
395+
when(protocol.getDescription()).thenReturn(new ProtocolDescription(name));
396+
when(protocol.getProtocolConfigurationClass()).thenReturn(TheProtocolConfiguration.class);
397+
398+
return protocolRegistry.addProtocol(new ProtocolDefinition(protocol, config, shouldBeDefault))
399+
.getProtocol(new ProtocolDescription(name));
400+
}
350401

351402
private <T> Collection<T> create(Class<T> type, T... instances) {
352403
List<T> list = new ArrayList<T>();
@@ -365,6 +416,15 @@ public static JavaArchive deploy() {
365416
return ShrinkWrap.create(JavaArchive.class);
366417
}
367418
}
419+
private static class DeploymentWithProtocol {
420+
@SuppressWarnings("unused")
421+
@Deployment
422+
@OverProtocol(PROTOCOL_NAME_1)
423+
public static JavaArchive deploy() {
424+
return ShrinkWrap.create(JavaArchive.class);
425+
}
426+
}
427+
368428

369429
@Observer({ObserverClass.class, SecondObserverClass.class})
370430
private static class DeploymentWithObserver {
@@ -519,4 +579,26 @@ public void process(Archive<?> applicationArchive, TestClass testClass) {
519579
called();
520580
}
521581
}
582+
583+
public static class TheProtocolConfiguration implements ProtocolConfiguration {
584+
private String mode;
585+
586+
public String getMode() {
587+
return mode;
588+
}
589+
public void setMode(String mode) {
590+
this.mode = mode;
591+
}
592+
}
593+
private static class AltDeploymentPackager implements DeploymentPackager {
594+
private ProtocolConfiguration config = null;
595+
@Override
596+
public Archive<?> generateDeployment(TestDeployment testDeployment, Collection<ProtocolArchiveProcessor> processors) {
597+
config = testDeployment.getProtocolConfiguration();
598+
return testDeployment.getApplicationArchive();
599+
}
600+
public ProtocolConfiguration getConfig() {
601+
return config;
602+
}
603+
}
522604
}

container/test-spi/src/main/java/org/jboss/arquillian/container/test/spi/TestDeployment.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.jboss.arquillian.container.spi.client.deployment.DeploymentDescription;
2222
import org.jboss.arquillian.container.spi.client.deployment.TargetDescription;
2323
import org.jboss.arquillian.container.spi.client.protocol.ProtocolDescription;
24+
import org.jboss.arquillian.container.test.spi.client.protocol.ProtocolConfiguration;
2425
import org.jboss.arquillian.container.test.api.Testable;
2526
import org.jboss.shrinkwrap.api.Archive;
2627
import org.jboss.shrinkwrap.api.ArchivePath;
@@ -38,6 +39,8 @@
3839
*/
3940
public class TestDeployment {
4041
private DeploymentDescription deploymentDescription;
42+
// The optional ProtocolConfiguration associated with the deployment
43+
private ProtocolConfiguration protocolConfiguration;
4144

4245
private Archive<?> applicationArchive;
4346

@@ -129,4 +132,12 @@ public Archive<?> getApplicationArchive() {
129132
public Collection<Archive<?>> getAuxiliaryArchives() {
130133
return auxiliaryArchives;
131134
}
135+
136+
public ProtocolConfiguration getProtocolConfiguration() {
137+
return protocolConfiguration;
138+
}
139+
140+
public void setProtocolConfiguration(ProtocolConfiguration protocolConfiguration) {
141+
this.protocolConfiguration = protocolConfiguration;
142+
}
132143
}

0 commit comments

Comments
 (0)