arquillian / arquillian-algeron

12 stars 8 forks source link

Running Provider Test on Windows #90

Closed PMT87 closed 6 years ago

PMT87 commented 6 years ago
Issue Overview

I created a Pact with pact-jvm-consumer-junit5_2.12. After that i wanted to use an arquillian test to verify my provider and started with a minimal exmaple.

@RunWith(Arquillian.class)
@org.arquillian.algeron.pact.provider.spi.Provider("test_provider")
public class FirstProviderTest {

  @ArquillianResource
  URL baseUri;

  @ArquillianResource
  Target target;

  @Test
  public void satisfiesContracts() {
    assertThat(target).withUrl(baseUri).satisfiesContract();
  }
}

The folder is configured inside the arquillian.xml.

<?xml version="1.0"?>
<arquillian xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns="http://jboss.org/schema/arquillian"
            xsi:schemaLocation="http://jboss.org/schema/arquillian
    http://jboss.org/schema/arquillian/arquillian_1_0.xsd">

  <extension qualifier="algeron-provider">
    <property name="retrieverConfiguration">
      provider: folder
      contractsFolder: consumer-contracts
    </property>
  </extension>

</arquillian>
Expected Behaviour

Run provider against pact. Fail for all tests since their are no solutions implemented.

Current Behaviour

`java.lang.IllegalArgumentException: Illegal character in authority at index 7: file://C:\projects\pact-project\test-application\target\test-classes\consumer-contracts\test_consumer-test_provider.json

at java.net.URI.create(URI.java:852)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at org.arquillian.algeron.provider.core.retriever.ContractsFolderLoader.retrieve(ContractsFolderLoader.java:55)
at org.arquillian.algeron.pact.provider.core.PactsRetriever.getPacts(PactsRetriever.java:72)
at org.arquillian.algeron.pact.provider.core.PactsRetriever.retrievePacts(PactsRetriever.java:49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:86)
at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:103)
at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:90)
at org.jboss.arquillian.test.impl.TestContextHandler.createClassContext(TestContextHandler.java:83)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:86)
at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:95)
at org.jboss.arquillian.test.impl.TestContextHandler.createSuiteContext(TestContextHandler.java:69)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:86)
at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:95)
at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:133)
at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:105)
at org.jboss.arquillian.test.impl.EventTestRunnerAdaptor.beforeClass(EventTestRunnerAdaptor.java:80)
at org.jboss.arquillian.junit.Arquillian$2.evaluate(Arquillian.java:179)
at org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:384)
at org.jboss.arquillian.junit.Arquillian.access$200(Arquillian.java:54)
at org.jboss.arquillian.junit.Arquillian$3.evaluate(Arquillian.java:193)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.jboss.arquillian.junit.Arquillian.run(Arquillian.java:148)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

Caused by: java.net.URISyntaxException: Illegal character in authority at index 7: file://C:\projects\pact-project\test-application\target\test-classes\consumer-contracts\test_consumer-test_provider.json at java.net.URI$Parser.fail(URI.java:2848) at java.net.URI$Parser.parseAuthority(URI.java:3186) at java.net.URI$Parser.parseHierarchical(URI.java:3097) at java.net.URI$Parser.parse(URI.java:3053) at java.net.URI.(URI.java:588) at java.net.URI.create(URI.java:850) ... 46 more

Test ignored. Disconnected from the target VM, address: '127.0.0.1:61589', transport: 'socket'

Process finished with exit code -1`

Steps To Reproduce
Additional Information

Running on Windows 10

PMT87 commented 6 years ago

The Problem seems to be in ContractsFolderLoader. my quickfix is the following for the retrieve function in ContractsFolderLoader.

  @Override
  public List<URI> retrieve() throws IOException {
    File rootDirectory = resolvePath();
    return Arrays.stream(rootDirectory.listFiles())
        .map(File::toURI)
        .collect(Collectors.toList());
  }
lordofthejars commented 6 years ago

Thank you very much, I think that the problem is how Windows treats slashes. I have no windows machine to test it but could you add one line in the project, build locally and check if it is working or not?

Just add at this line https://github.com/arquillian/arquillian-algeron/blob/master/provider/core/src/main/java/org/arquillian/algeron/provider/core/retriever/ContractsFolderLoader.java#L53

return Arrays.stream(rootDirectory.listFiles())
            .map(file -> file.replace("\\", "/")
            .map(file -> "file://" + file.getAbsolutePath())
            .map(URI::create)
            .collect(Collectors.toList());

Notice the addition of .map(file -> file.replace("\\", "/") It should work, but if you can give a try it would be better.

Thank you so much.

PMT87 commented 6 years ago

file.getAbsolutePath().replace wouldnt do it. In case of Windows and a absolutePath (C:/...), we also need "file:///" with three slashes. File::toUri does that for you and also works on Unix (already tested it).

There was one more Problem with ContractsGitLoader also Windows specific.

PR: https://github.com/arquillian/arquillian-algeron/pull/92