9 Replies Latest reply on Oct 11, 2017 6:26 PM by David Matejcek

    Arquillian Persistence does not play along with EclEmma Code Coverage in Eclipse

    koski Newbie

      Hi, all. I don't know if this is a problem with EclEmma or with Arquillian Persistence. It is difficult to pinpoint the problem, since running EclEmma in debug mode is not possible, AFAIK.

       

      I have a unit test which uses Arquillian Persistence. It uses the @UsingDataSet annotation to load test data from an Excel into the Derby table which is created at startup of the test by EclipseLink via the "drop-and-create" value of the "eclipselink.ddl-generation" parameter.

       

      When running this as a unit test (in Eclipse, "Run As ..." -> JUnit test) all goes well and the test passes. The test contains a call to an EJB which performs a query into the table and asserts that the results are what was expected.

       

      When running this test via EclEmma (in Eclipse, "Coverage As ..." -> JUnit test), the test fails with the following exception (see below). I'm using EclEmma version 2.2.0.201210261515 and the 1.0.0.Alpha6 version of arquillian-persistence-impl.

       

      I'm able to set a break point in the class in which the exception is thrown and I'm able to step through the ok behaviour when running as a simple JUnit test. However, I'm not able to debug while running as an EclEmma coverage analysis to see what happens.

       

      In the same project, I have other tests which are pure integration tests which use live database and real data (not @UsingDataSet). These and other much simpler tests run fine with EclEmma. I have configured the arquillian.xml to point to a file which contains the glassfish resources which I need for the tests ran against the live database.

       

      In another project, I have no integration tests and therefore, no need for the arquillian.xml. In this project, @UsingDataSet works fine with EclEmma.

       

      Any ideas?

       

      To me, it seems like I'm missing something in my arquillian.xml which is mandatory in this file if the file is present. What are the mandatory properties which needs to be specified in arquillian.xml in order for EclEmma to be able to run the unit tests which use arquillian persistence?

       

       

      Regards,

      koski

       

      Here's the stack trace:

       

      org.jboss.arquillian.persistence.core.exception.PersistenceExtensionInitializationException: Unable to load Arquillian properties in container. Missing file arquillian.extension.persistence.properties

                at org.jboss.arquillian.persistence.core.configuration.ConfigurationImporter.loadFromPropertyFile(ConfigurationImporter.java:84)

                at org.jboss.arquillian.persistence.core.container.PersistenceConfigurationRemoteProducer.configure(PersistenceConfigurationRemoteProducer.java:44)

                at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

                at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

                at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

                at java.lang.reflect.Method.invoke(Method.java:597)

                at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)

                at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99)

                at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81)

                at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:135)

                at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:115)

                at org.jboss.arquillian.core.impl.EventImpl.fire(EventImpl.java:67)

                at org.jboss.arquillian.persistence.core.lifecycle.PersistenceTestTrigger.beforeClass(PersistenceTestTrigger.java:99)

                at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

                at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

                at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

                at java.lang.reflect.Method.invoke(Method.java:597)

                at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)

                at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99)

                at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81)

                at org.jboss.arquillian.test.impl.TestContextHandler.createClassContext(TestContextHandler.java:75)

                at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

                at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

                at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

                at java.lang.reflect.Method.invoke(Method.java:597)

                at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)

                at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)

                at org.jboss.arquillian.test.impl.TestContextHandler.createSuiteContext(TestContextHandler.java:60)

                at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

                at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

                at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

                at java.lang.reflect.Method.invoke(Method.java:597)

                at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)

                at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)

                at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:135)

                at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:115)

                at org.jboss.arquillian.test.impl.EventTestRunnerAdaptor.beforeClass(EventTestRunnerAdaptor.java:80)

                at org.jboss.arquillian.junit.Arquillian$2.evaluate(Arquillian.java:182)

                at org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:314)

                at org.jboss.arquillian.junit.Arquillian.access$100(Arquillian.java:46)

                at org.jboss.arquillian.junit.Arquillian$3.evaluate(Arquillian.java:199)

                at org.junit.runners.ParentRunner.run(ParentRunner.java:236)

                at org.jboss.arquillian.junit.Arquillian.run(Arquillian.java:147)

                at org.junit.runner.JUnitCore.run(JUnitCore.java:157)

                at org.junit.runner.JUnitCore.run(JUnitCore.java:136)

                at org.jboss.arquillian.junit.container.JUnitTestRunner.execute(JUnitTestRunner.java:65)

                at org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner.executeTest(ServletTestRunner.java:160)

                at org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner.execute(ServletTestRunner.java:126)

                at org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner.doGet(ServletTestRunner.java:90)

                at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)

                at javax.servlet.http.HttpServlet.service(HttpServlet.java:770)

                at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1542)

                at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)

                at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)

                at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)

                at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)

                at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)

                at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)

                at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)

                at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)

                at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)

                at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849)

                at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746)

                at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045)

                at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228)

                at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)

                at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)

                at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)

                at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)

                at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)

                at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)

                at com.sun.grizzly.ContextTask.run(ContextTask.java:71)

                at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)

                at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)

                at java.lang.Thread.run(Thread.java:662)

      Caused by: org.jboss.arquillian.persistence.core.exception.PersistenceExtensionInitializationException: Unable to create persistence configuration.

                at org.jboss.arquillian.persistence.core.configuration.ConfigurationImporter.createConfiguration(ConfigurationImporter.java:162)

                at org.jboss.arquillian.persistence.core.configuration.ConfigurationImporter.createFrom(ConfigurationImporter.java:105)

                at org.jboss.arquillian.persistence.core.configuration.ConfigurationImporter.loadFromPropertyFile(ConfigurationImporter.java:80)

                ... 74 more

      Caused by: java.lang.IllegalArgumentException: Unable to convert value [[Z@8b60a] to a class [[Z].

                at org.jboss.arquillian.persistence.core.configuration.ConfigurationTypeConverter.convert(ConfigurationTypeConverter.java:196)

                at org.jboss.arquillian.persistence.core.configuration.ConfigurationImporter.createConfiguration(ConfigurationImporter.java:153)

                ... 76 more

      Caused by: java.lang.ClassNotFoundException: [Z@8b60a

                at java.lang.Class.forName0(Native Method)

                at java.lang.Class.forName(Class.java:169)

                at org.jboss.arquillian.persistence.core.configuration.ConfigurationTypeConverter.convert(ConfigurationTypeConverter.java:191)

                ... 77 more

        • 1. Re: Arquillian Persistence does not play along with EclEmma Code Coverage in Eclipse
          Bartosz Majsak Master

          I think EclEmma simply instruments the file with something weird which APE cannot handle... "[Z@8b60a] to a class [[Z]"

           

          I will have a look at it. Can you try to export the full test deployment and share "arquillian.extension.persistence.properties" file? You can do it through arquillian.xml like this:

          <arquillian xmlns="http://jboss.org/schema/arquillian"
             
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             
          xsi:schemaLocation="
                  http://jboss.org/schema/arquillian
                  http://jboss.org/schema/arquillian/arquillian_1_0.xsd"
          >
             
          <engine>
                 
          <property name="deploymentExportPath">target/deployments</property>
             
          </engine>

          ...
          </arquillian>

          • 2. Re: Arquillian Persistence does not play along with EclEmma Code Coverage in Eclipse
            koski Newbie

            I still can't find the cause for the problem and I would appreciate if you'd take a look at this. Here's the content of arquillian.extension.persistence.properties

             

            (I found this in: target\deployments\_DEFAULT__DEFAULT_test.war\WEB-INF\lib\arquillian-persistence-extension-additional-resources.jar)

             

            arquillian.extension.persistence.default.data.seed.strategy=INSERT

            arquillian.extension.persistence.default.transaction.mode=COMMIT

            arquillian.extension.persistence.default.cleanup.phase=AFTER

            arquillian.extension.persistence.dump.directory=C:\\Users\\xxx\\AppData\\Local\\Temp\\

            arquillian.extension.persistence.default.data.source=jdbc/__default

            arquillian.extension.persistence.$jacoco.data=[Z@1589d3d

            arquillian.extension.persistence.default.cleanup.strategy=STRICT

            arquillian.extension.persistence.dump.data=false

             

            When running a test which does NOT have the @UsingDataSet annotation, there is no such property file in the WAR-package (because there is no arquillian-persistence-extension-additional-resources.jar)

             

            Regards,

            koski

            • 3. Re: Arquillian Persistence does not play along with EclEmma Code Coverage in Eclipse
              Bartosz Majsak Master

              Hey Koski,

               

              thx for looking at the details. This should be fixed now on the master branch and will go with the next release very soon.

              https://issues.jboss.org/browse/ARQ-1309

              • 4. Re: Arquillian Persistence does not play along with EclEmma Code Coverage in Eclipse
                koski Newbie

                Hi.

                 

                I still can' get it to work, but the error is now different. Was I supposed to or do I have to wait for a release?

                 

                I added the dependency:

                 

                <dependency>

                                          <groupId>org.jacoco</groupId>

                                          <artifactId>org.jacoco.core</artifactId>

                                          <version>0.6.0.201210061924</version>

                                          <scope>test</scope>

                                    </dependency>

                 

                Then I excluded jacoco from the arquillian-persistence dependency:

                 

                 



                <dependency>



                <groupId>org.jboss.arquillian.extension</groupId>



                <artifactId>arquillian-persistence-impl</artifactId>



                <version>1.0.0.Alpha6</version>



                <exclusions>




                <exclusion>  <!-- declare the exclusion here -->





                <groupId>org.slf4j</groupId>





                <artifactId>slf4j-api</artifactId>




                </exclusion>




                <exclusion>  <!-- declare the exclusion here -->


                     
                <groupId>org.jacoco</groupId>


                     
                <artifactId>org.jacoco.core</artifactId>




                </exclusion>



                </exclusions>



                <scope>test</scope>


                </dependency>

                 

                 

                Now the exception is:

                 

                java.lang.IllegalArgumentException: ArquillianServletRunner not found. Could not determine ContextRoot from ProtocolMetadata, please contact DeployableContainer developer.

                • 5. Re: Arquillian Persistence does not play along with EclEmma Code Coverage in Eclipse
                  Bartosz Majsak Master

                  koski wrote:

                   

                  Hi.

                   

                  I still can' get it to work, but the error is now different. Was I supposed to or do I have to wait for a release?

                   

                  Yes, this will be shipped shortly with Alpha7. Matter of days.

                   

                  Cheers,

                  Bartosz

                  • 6. Re: Re: Arquillian Persistence does not play along with EclEmma Code Coverage in Eclipse
                    Juan Casta Newbie

                    Hello.

                     

                    I am facing same problem.

                    • Arquillian 1.1.3.Final.
                    • Arquillian Persistence Extension 1.0.0.Alpha7. Important, this release is supposed to solve the problem.
                    • Arquillian jacoco extensión 1.0.0.Alpha6
                    • Arquillian Persistence Extension 1.0.0.Alpha7 doesn`t carry any other dependency to jacoco as explained in this post.
                    • Glassfish embedded 3.1.2.2.

                     

                    I have already set up my pom to work with jacoco, I have configured jacoco plugin and modified maven-surefire-plugin to work with jacoco:

                     

                    
                    <plugin>
                      <groupId>org.jacoco</groupId>
                      <artifactId>jacoco-maven-plugin</artifactId>
                      <version>0.6.3.201306030806</version>
                      <executions>
                      <!--
                        Prepares the property pointing to the JaCoCo runtime agent which
                        is passed as VM argument when Maven the Surefire plugin is executed.
                        -->
                      <execution>
                      <id>pre-unit-test</id>
                      <goals>
                      <goal>prepare-agent</goal>
                      </goals>
                      <configuration>
                      <!-- Sets the path to the file which contains the execution data. -->
                      <destFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</destFile>
                      <!--
                        Sets the name of the property containing the settings
                        for JaCoCo runtime agent.
                        -->
                      <propertyName>surefireArgLine</propertyName>
                      </configuration>
                      </execution>
                      <!--
                        Ensures that the code coverage report for unit tests is created after
                        unit tests have been run.
                        -->
                      <execution>
                      <id>post-unit-test</id>
                      <phase>test</phase>
                      <goals>
                      <goal>report</goal>
                      </goals>
                      <configuration>
                      <!-- Sets the path to the file which contains the execution data. -->
                      <dataFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</dataFile>
                      <!-- Sets the output directory for the code coverage report. -->
                      <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
                      </configuration>
                      </execution>
                      </executions>
                      </plugin>
                    
                    
                    <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-surefire-plugin</artifactId>
                      <version>2.12</version>
                      <configuration>
                      <argLine>${surefireArgLine} -Xms800m -Xmx800m -XX:MaxPermSize=500m</argLine>
                      <systemPropertyVariables>
                      <arquillian.launch>glassfish-embedded</arquillian.launch>
                      <java.util.logging.config.file>
                      ${project.build.testOutputDirectory}/glassfish-embedded/logging.properties
                      </java.util.logging.config.file>
                      <derby.stream.error.file>
                      ${project.build.directory}/derby.log
                      </derby.stream.error.file>
                      </systemPropertyVariables>
                      <classpathDependencyExcludes>
                                             <classpathDependencyExcludes>org.apache.openjpa:openjpa-all</classpathDependencyExcludes>
                                         </classpathDependencyExcludes>
                      </configuration>
                      </plugin>
                    
                    ${surefiredArgLine
                    
                    
                    
                    

                    sureFireArgLine is where the jacoco agent is located.

                     

                    Questions:

                     

                    1. Do I have to have configured jacoco plugin in my project? Or is it enough to have jacoco extension arquillian?

                    2. With the written conditions, I can`t execute mvn test with jacoco. In all the tests what use arquillian persistence extension I get next error:

                     

                    org.jboss.arquillian.persistence.core.exception.PersistenceExtensionInitializationException: Unable to load Arquillian properties in container. Missing file arquillian.extension.persistence.properties

                      at org.jboss.arquillian.persistence.core.configuration.ConfigurationImporter.loadFromPropertyFile(ConfigurationImporter.java:80)

                      at org.jboss.arquillian.persistence.core.container.PersistenceConfigurationRemoteProducer.configure(PersistenceConfigurationRemoteProducer.java:44)

                      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

                      a

                     

                    I have checked the generated war, and if I test - run coverage with Emma Plugin Eclipse, it works:

                     

                    arquillian.extension.persistence.default.data.seed.strategy=INSERT

                    arquillian.extension.persistence.default.transaction.mode=COMMIT

                    arquillian.extension.persistence.default.cleanup.phase=AFTER

                    arquillian.extension.persistence.dump.directory=d:\\Profiles\\JCASTA~1\\AppData\\Local\\Temp\\

                    arquillian.extension.persistence.default.data.source=jdbc/arquillian

                    arquillian.extension.persistence.default.cleanup.strategy=STRICT

                    arquillian.extension.persistence.dump.data=false

                     

                    Running the test with mvn test:

                     

                    arquillian.extension.persistence.default.data.seed.strategy=INSERT

                    arquillian.extension.persistence.default.transaction.mode=COMMIT

                    arquillian.extension.persistence.default.cleanup.phase=AFTER

                    arquillian.extension.persistence.dump.directory=d:\\Profiles\\JCASTA~1\\AppData\\Local\\Temp\\

                    arquillian.extension.persistence.default.data.source=jdbc/arquillian

                    arquillian.extension.persistence.$jacoco.data=[Z@1cfc277

                    arquillian.extension.persistence.default.cleanup.strategy=STRICT

                    arquillian.extension.persistence.dump.data=false

                     

                    Doesn`t work.

                     

                    Any help would be apreciated.

                     

                    Now, I am getting this error:

                     

                    : /WEB-INF/classes/com/gneis/ebkextracto/jpa/CateConPersonalizadoJPAPK.class

                      at org.jboss.shrinkwrap.impl.base.exporter.AbstractOnDemandInputStream.read(AbstractOnDemandInputStream.java:132)

                      at java.io.InputStream.read(InputStream.java:151)

                      at java.io.InputStream.read(InputStream.java:82)

                      at org.jboss.shrinkwrap.impl.base.io.IOUtil.copy(IOUtil.java:138)

                      at org.jboss.shrinkwrap.impl.base.exporter.AbstractStreamExporterImpl.exportTo(AbstractStreamExporterImpl.java:120)

                      at org.jboss.shrinkwrap.impl.base.exporter.AbstractStreamExporterImpl.exportTo(AbstractStreamExporterImpl.java:148)

                      at org.jboss.arquillian.container.impl.client.deployment.ArchiveDeploymentExporter.callback(ArchiveDeploymentExporter.java:82)

                      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

                      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

                      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

                      at java.lang.reflect.Method.invoke(Method.java:597)

                      at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)

                      at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99)

                      at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81)

                      at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:135)

                      at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:115)

                     

                    Sounds like he isn`t able to find-locate-write the result of the test, but it makes the coverage...

                     

                    Regards

                     

                    I have done another test.

                     

                    I have configured the application with:

                     

                    • Arquillian 1.1.3.Final.
                    • Arquillian Persistence Extension 1.0.0.Alpha7. Important, this release is supposed to solve the problem.
                    • Glassfish embedded 3.1.2.2.

                    Without JACOCO extension. In this case, all the tests go fine, except those test related to Arquillian Persistence Extension. Error messages are:

                     

                    Unable to load Arquillian properties in container. Missing file arquillian.extension.persistence.properties

                     

                    arquillian.extension.persistence.default.data.seed.strategy=INSERT

                    arquillian.extension.persistence.default.transaction.mode=COMMIT

                    arquillian.extension.persistence.default.cleanup.phase=AFTER

                    arquillian.extension.persistence.dump.directory=d:\\Profiles\\JCASTA~1\\AppData\\Local\\Temp\\

                    arquillian.extension.persistence.default.data.source=jdbc/arquillian

                    arquillian.extension.persistence.$jacoco.data=[Z@9d10ab

                    arquillian.extension.persistence.default.cleanup.strategy=STRICT

                    arquillian.extension.persistence.dump.data=false

                     

                    bmajsak

                     

                    Regards

                    • 8. Re: Arquillian Persistence does not play along with EclEmma Code Coverage in Eclipse
                      David Matejcek Newbie

                      Any success?

                       

                      EmbeddedPayara+DbUnit+Arquillian ... OK

                      EmbeddedPayara+DBUnit+Arquilllian+EclEmma ... all failed right after successful deployment.

                       

                      I added fake arquillian.extension.persistence.properties into src/test/resources ... and came another exception, DataSource not defined. It seems EclEmma somehow breaks thread's classloaders or their scopes ...

                      ... ... after a while ...

                      PowerMock disables EclEmma code coverage · Issue #15 · jacoco/eclemma · GitHub - it seems it is the same or similar problem ... but I don't have any idea how to avoid it ...

                      • 9. Re: Arquillian Persistence does not play along with EclEmma Code Coverage in Eclipse
                        David Matejcek Newbie

                        Ha, I got it!

                         

                        Eclipse - Preferences - Java - Code Coverage - and I added org.jboss.arquillian.* to the Excludes field, clicked on Apply And Close ... and run tests ... and they are green and the coverage is 86%. Perfect!