You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ni...@apache.org on 2018/01/24 15:12:46 UTC

[incubator-servicecomb-saga] branch master updated (f5f0b31 -> 22ea88d)

This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-saga.git.


    from f5f0b31  SCB-151 Update to add the pack-demo
     new 7100b79  SCB-237 skeleton for pack acceptance tests
     new 3cc6b80  SCB-237 added rudimentary steps definitions and test data
     new 09301ac  SCB-237 filled car & hotel services testing steps
     new e5ffbb2  SCB-237 added alpha controller to query events
     new 99172eb  SCB-237 linked pack demos with cucumber test
     new 6b4d589  SCB-237 included acceptance test into CI build
     new 22ea88d  SCB-237 checked availability of alpha and booking before testing

The 7 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .travis.yml                                        |   1 +
 .../acceptance-pack}/pom.xml                       | 195 +++++++++++----------
 .../org/apache/servicecomb/saga/PackStepdefs.java  | 138 +++++++++++++++
 .../org/apache/servicecomb/saga/RunCucumberIT.java |  17 +-
 .../src/test/resources/log4j2-test.xml             |   0
 .../test/resources/pack_success_scenario.feature   |  26 +++
 {alpha/alpha-core => acceptance-tests}/pom.xml     |  63 ++++---
 .../servicecomb/saga/alpha/core/EventScanner.java  |   1 -
 .../servicecomb/saga/alpha/core/TxEvent.java       |  13 ++
 alpha/alpha-server/pom.xml                         |   8 +
 .../saga/alpha/server/AlphaEventController.java    |  66 +++++++
 .../src/main/resources/application.yaml            |   3 +
 .../alpha/server/AlphaEventControllerTest.java     |  83 +++++++++
 pom.xml                                            |   2 +
 .../servicecomb/saga/demo/pack/car/CarBooking.java |  48 ++---
 .../saga/demo/pack/car/CarBookingController.java   |  11 +-
 .../saga/demo/pack/car/CarBookingService.java      |  22 +--
 .../saga/demo/pack/hotel/HotelBooking.java         |  48 ++---
 .../demo/pack/hotel/HotelBookingController.java    |  11 +-
 .../saga/demo/pack/hotel/HotelBookingService.java  |  24 +--
 saga-demo/pack-demo/pom.xml                        |   6 +
 saga-format/pom.xml                                |   4 +-
 22 files changed, 584 insertions(+), 206 deletions(-)
 copy {integration-tests/pack-tests => acceptance-tests/acceptance-pack}/pom.xml (64%)
 create mode 100644 acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
 copy omega/omega-transaction/src/main/java/org/apache/servicecomb/saga/omega/transaction/AlphaResponse.java => acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/RunCucumberIT.java (73%)
 copy {saga-spring => acceptance-tests/acceptance-pack}/src/test/resources/log4j2-test.xml (100%)
 create mode 100644 acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature
 copy {alpha/alpha-core => acceptance-tests}/pom.xml (73%)
 create mode 100644 alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/AlphaEventController.java
 create mode 100644 alpha/alpha-server/src/test/java/org/apache/servicecomb/saga/alpha/server/AlphaEventControllerTest.java

-- 
To stop receiving notification emails like this one, please contact
ningjiang@apache.org.

[incubator-servicecomb-saga] 02/07: SCB-237 added rudimentary steps definitions and test data

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-saga.git

commit 3cc6b80b16efd85499503b91e1d933b115701ce5
Author: seanyinx <se...@huawei.com>
AuthorDate: Tue Jan 23 16:15:48 2018 +0800

    SCB-237 added rudimentary steps definitions and test data
    
    Signed-off-by: seanyinx <se...@huawei.com>
---
 acceptance-tests/acceptance-pack/pom.xml           | 162 +++++++++++++++++++++
 .../org/apache/servicecomb/saga/PackStepdefs.java  |  35 +++--
 .../{RunCucumberTest.java => RunCucumberIT.java}   |   2 +-
 .../test/resources/log4j2-test.xml}                |  25 ++--
 .../test/resources/pack_success_scenario.feature   |  24 ++-
 acceptance-tests/pom.xml                           |  20 +++
 6 files changed, 235 insertions(+), 33 deletions(-)

diff --git a/acceptance-tests/acceptance-pack/pom.xml b/acceptance-tests/acceptance-pack/pom.xml
index 5401ab5..67938f6 100644
--- a/acceptance-tests/acceptance-pack/pom.xml
+++ b/acceptance-tests/acceptance-pack/pom.xml
@@ -28,4 +28,166 @@
 
   <artifactId>acceptance-pack</artifactId>
 
+  <profiles>
+    <profile>
+      <id>docker</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>io.fabric8</groupId>
+            <artifactId>docker-maven-plugin</artifactId>
+            <configuration>
+              <images>
+                <image>
+                  <name>postgres</name>
+                  <alias>postgres</alias>
+                  <run>
+                    <env>
+                      <POSTGRES_DB>saga</POSTGRES_DB>
+                      <POSTGRES_USER>saga</POSTGRES_USER>
+                      <POSTGRES_PASSWORD>password</POSTGRES_PASSWORD>
+                    </env>
+                    <wait>
+                      <log>database system is ready to accept connections</log>
+                      <tcp>
+                        <ports>
+                          <port>5432</port>
+                        </ports>
+                      </tcp>
+                      <time>60000</time>
+                    </wait>
+                    <ports>
+                      <port>postgres.port:5432</port>
+                    </ports>
+                  </run>
+                </image>
+                <image>
+                  <name>alpha-server:${project.version}</name>
+                  <alias>alpha</alias>
+                  <run>
+                    <env>
+                      <JAVA_OPTS>
+                        -Dspring.profiles.active=prd
+                      </JAVA_OPTS>
+                    </env>
+                    <links>
+                      <link>postgres:postgresql.servicecomb.io</link>
+                    </links>
+                    <wait>
+                      <log>Started [a-zA-Z]+ in [0-9.]+ seconds</log>
+                      <tcp>
+                        <ports>
+                          <port>8080</port>
+                        </ports>
+                      </tcp>
+                      <time>120000</time>
+                    </wait>
+                    <ports>
+                      <port>alpha.port:8080</port>
+                    </ports>
+                    <dependsOn>
+                      <dependsOn>postgres</dependsOn>
+                    </dependsOn>
+                  </run>
+                </image>
+              </images>
+            </configuration>
+            <executions>
+              <execution>
+                <id>start</id>
+                <phase>pre-integration-test</phase>
+                <goals>
+                  <goal>start</goal>
+                </goals>
+              </execution>
+              <execution>
+                <id>stop</id>
+                <phase>post-integration-test</phase>
+                <goals>
+                  <goal>stop</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
+            <groupId>org.codehaus.gmaven</groupId>
+            <artifactId>gmaven-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>add-default-properties</id>
+                <phase>initialize</phase>
+                <goals>
+                  <goal>execute</goal>
+                </goals>
+                <configuration>
+                  <source>
+                    project.properties.setProperty('docker.hostname', 'localhost')
+                    log.info("Docker hostname is " + project.properties['docker.hostname'])
+                  </source>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-failsafe-plugin</artifactId>
+            <version>${maven.failsafe.version}</version>
+            <configuration>
+              <systemPropertyVariables>
+                <alpha.cluster.address>
+                  ${docker.hostname}:${alpha.port}
+                </alpha.cluster.address>
+                <spring.datasource.url>
+                  jdbc:postgresql://${docker.hostname}:${postgres.port}/saga?useSSL=false
+                </spring.datasource.url>
+              </systemPropertyVariables>
+              <argLine>${jacoco.failsafe.argLine}</argLine>
+            </configuration>
+            <executions>
+              <execution>
+                <goals>
+                  <goal>integration-test</goal>
+                  <goal>verify</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
+            <groupId>com.ethlo.persistence.tools</groupId>
+            <artifactId>eclipselink-maven-plugin</artifactId>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>docker-machine</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.codehaus.gmaven</groupId>
+            <artifactId>gmaven-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>add-dynamic-properties</id>
+                <phase>prepare-package</phase>
+                <goals>
+                  <goal>execute</goal>
+                </goals>
+                <configuration>
+                  <source>
+                    def process = "docker-machine ip default".execute()
+                    process.waitFor()
+                    project.properties.setProperty('docker.hostname', process.in.text.trim())
+
+                    log.info("Docker hostname is " + project.properties['docker.hostname'])
+                  </source>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+
 </project>
diff --git a/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java b/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
index fd98536..71c0887 100644
--- a/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
+++ b/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
@@ -17,29 +17,42 @@
 
 package org.apache.servicecomb.saga;
 
-import cucumber.api.PendingException;
+import java.lang.invoke.MethodHandles;
+import java.util.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import cucumber.api.DataTable;
 import cucumber.api.java8.En;
 
 public class PackStepdefs implements En {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
   public PackStepdefs() {
     Given("^Car Service is up and running$", () -> {
-      // Write code here that turns the phrase above into concrete actions
-      throw new PendingException();
     });
 
     And("^Hotel Service is up and running$", () -> {
-      // Write code here that turns the phrase above into concrete actions
-      throw new PendingException();
     });
 
-    When("^A booking transaction is received$", () -> {
-      // Write code here that turns the phrase above into concrete actions
-      throw new PendingException();
+    When("^User ([A-Za-z]+) requests to book ([0-9]+) cars and ([0-9]+) rooms$", (username, cars, rooms) -> {
+      log.info("Received request from user {} to book {} cars and {} rooms", username, cars, rooms);
     });
 
-    Then("^Alpha records the following events$", () -> {
-      // Write code here that turns the phrase above into concrete actions
-      throw new PendingException();
+    Then("^Alpha records the following events$", (DataTable dataTable) -> {
+      List<Map<String, String>> maps = dataTable.asMaps(String.class, String.class);
+      log.info("events {}", maps);
+    });
+
+    And("^Car Service contains the following booking orders$", (DataTable dataTable) -> {
+      List<Map<String, String>> maps = dataTable.asMaps(String.class, String.class);
+      log.info("car orders {}", maps);
+    });
+    And("^Hotel Service contains the following booking orders$", (DataTable dataTable) -> {
+      List<Map<String, String>> maps = dataTable.asMaps(String.class, String.class);
+      log.info("hotel orders {}", maps);
     });
   }
 }
diff --git a/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/RunCucumberTest.java b/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/RunCucumberIT.java
similarity index 97%
rename from acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/RunCucumberTest.java
rename to acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/RunCucumberIT.java
index d4e2b43..d4fc9ee 100644
--- a/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/RunCucumberTest.java
+++ b/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/RunCucumberIT.java
@@ -25,5 +25,5 @@ import cucumber.api.junit.Cucumber;
 @RunWith(Cucumber.class)
 @CucumberOptions(plugin = {"pretty", "html:target/cucumber"},
     features = "src/test/resources")
-public class RunCucumberTest {
+public class RunCucumberIT {
 }
diff --git a/acceptance-tests/acceptance-pack/pom.xml b/acceptance-tests/acceptance-pack/src/test/resources/log4j2-test.xml
similarity index 65%
copy from acceptance-tests/acceptance-pack/pom.xml
copy to acceptance-tests/acceptance-pack/src/test/resources/log4j2-test.xml
index 5401ab5..58924c6 100644
--- a/acceptance-tests/acceptance-pack/pom.xml
+++ b/acceptance-tests/acceptance-pack/src/test/resources/log4j2-test.xml
@@ -16,16 +16,15 @@
   ~ limitations under the License.
   -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <parent>
-    <artifactId>acceptance-tests</artifactId>
-    <groupId>org.apache.servicecomb.saga</groupId>
-    <version>0.0.3-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>acceptance-pack</artifactId>
-
-</project>
+<Configuration status="WARN">
+  <Appenders>
+    <Console name="Console" target="SYSTEM_OUT">
+      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+    </Console>
+  </Appenders>
+  <Loggers>
+    <Root level="info">
+      <AppenderRef ref="Console"/>
+    </Root>
+  </Loggers>
+</Configuration>
diff --git a/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature b/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature
index 270e8ba..da233b0 100644
--- a/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature
+++ b/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature
@@ -4,13 +4,21 @@ Feature: Alpha records transaction events
     Given Car Service is up and running
     And Hotel Service is up and running
 
-    When A booking transaction is received
+    When User Sean requests to book 2 cars and 1 rooms
 
     Then Alpha records the following events
-      | event type       |
-      | SagaStartedEvent |
-      | TxStartedEvent   |
-      | TxEndedEvent     |
-      | TxStartedEvent   |
-      | TxEndedEvent     |
-      | SagaEndedEvent   |
+      | service name | event type       |
+      | pack-booking | SagaStartedEvent |
+      | pack-car     | TxStartedEvent   |
+      | pack-car     | TxEndedEvent     |
+      | pack-hotel   | TxStartedEvent   |
+      | pack-hotel   | TxEndedEvent     |
+      | pack-booking | SagaEndedEvent   |
+
+    And Car Service contains the following booking orders
+      | user name | amount | confirmed |
+      | Sean      | 2      | true      |
+
+    And Hotel Service contains the following booking orders
+      | user name | amount | confirmed |
+      | Sean      | 1      | true      |
diff --git a/acceptance-tests/pom.xml b/acceptance-tests/pom.xml
index 0c41f81..2a5f12b 100644
--- a/acceptance-tests/pom.xml
+++ b/acceptance-tests/pom.xml
@@ -53,6 +53,26 @@
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-slf4j-impl</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-core</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
 </project>

-- 
To stop receiving notification emails like this one, please contact
ningjiang@apache.org.

[incubator-servicecomb-saga] 04/07: SCB-237 added alpha controller to query events

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-saga.git

commit e5ffbb25c53d5d8b472ab0454edf2f5f5a9b2e6a
Author: seanyinx <se...@huawei.com>
AuthorDate: Tue Jan 23 18:39:30 2018 +0800

    SCB-237 added alpha controller to query events
    
    Signed-off-by: seanyinx <se...@huawei.com>
---
 .../servicecomb/saga/alpha/core/TxEvent.java       | 13 ++++
 alpha/alpha-server/pom.xml                         |  4 ++
 .../saga/alpha/server/AlphaEventController.java    | 59 +++++++++++++++
 .../alpha/server/AlphaEventControllerTest.java     | 83 ++++++++++++++++++++++
 4 files changed, 159 insertions(+)

diff --git a/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/TxEvent.java b/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/TxEvent.java
index b654689..1364cb7 100644
--- a/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/TxEvent.java
+++ b/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/TxEvent.java
@@ -43,6 +43,19 @@ public class TxEvent {
   private TxEvent() {
   }
 
+  public TxEvent(TxEvent event) {
+    this(event.surrogateId,
+        event.serviceName,
+        event.instanceId,
+        event.creationTime,
+        event.globalTxId,
+        event.localTxId,
+        event.parentTxId,
+        event.type,
+        event.compensationMethod,
+        event.payloads);
+  }
+
   public TxEvent(
       String serviceName,
       String instanceId,
diff --git a/alpha/alpha-server/pom.xml b/alpha/alpha-server/pom.xml
index 9efdf78..54f9cef 100644
--- a/alpha/alpha-server/pom.xml
+++ b/alpha/alpha-server/pom.xml
@@ -87,6 +87,10 @@
       <artifactId>postgresql</artifactId>
       <scope>runtime</scope>
     </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+    </dependency>
 
     <dependency>
       <groupId>org.springframework.boot</groupId>
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/AlphaEventController.java b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/AlphaEventController.java
new file mode 100644
index 0000000..0f6e139
--- /dev/null
+++ b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/AlphaEventController.java
@@ -0,0 +1,59 @@
+/*
+ * 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.servicecomb.saga.alpha.server;
+
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.servicecomb.saga.alpha.core.TxEvent;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+
+@Controller
+@RequestMapping("/")
+class AlphaEventController {
+
+  private final TxEventEnvelopeRepository eventRepository;
+
+  AlphaEventController(TxEventEnvelopeRepository eventRepository) {
+    this.eventRepository = eventRepository;
+  }
+
+  @GetMapping(value = "/events")
+  ResponseEntity<Collection<TxEventVo>> events() {
+    Iterable<TxEvent> events = eventRepository.findAll();
+
+    List<TxEventVo> eventVos = new LinkedList<>();
+    events.forEach(event -> eventVos.add(new TxEventVo(event)));
+
+    return ResponseEntity.ok(eventVos);
+  }
+
+  @JsonAutoDetect(fieldVisibility = Visibility.ANY)
+  private static class TxEventVo extends TxEvent {
+    private TxEventVo(TxEvent event) {
+      super(event);
+    }
+  }
+}
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/saga/alpha/server/AlphaEventControllerTest.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/saga/alpha/server/AlphaEventControllerTest.java
new file mode 100644
index 0000000..a479e2b
--- /dev/null
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/saga/alpha/server/AlphaEventControllerTest.java
@@ -0,0 +1,83 @@
+/*
+ * 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.servicecomb.saga.alpha.server;
+
+import static com.seanyinx.github.unit.scaffolding.Randomness.uniquify;
+import static java.util.Collections.singletonList;
+import static org.apache.servicecomb.saga.common.EventType.TxStartedEvent;
+import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
+import static org.hamcrest.core.Is.is;
+import static org.mockito.Mockito.when;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import java.util.Date;
+import java.util.UUID;
+
+import org.apache.servicecomb.saga.alpha.core.TxEvent;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@RunWith(SpringRunner.class)
+@WebMvcTest(AlphaEventController.class)
+public class AlphaEventControllerTest {
+  private final TxEvent someEvent = someEvent();
+  private final ObjectMapper mapper = new ObjectMapper();
+
+  @Autowired
+  private MockMvc mockMvc;
+
+  @MockBean
+  private TxEventEnvelopeRepository eventRepository;
+
+  @Before
+  public void setUp() throws Exception {
+    when(eventRepository.findAll()).thenReturn(singletonList(someEvent));
+  }
+
+  @Test
+  public void retrievesEventsFromRepo() throws Exception {
+    mockMvc.perform(get("/events"))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$", hasSize(1)))
+        .andExpect(jsonPath("$.[0].globalTxId", is(someEvent.globalTxId())))
+        .andExpect(jsonPath("$.[0].localTxId", is(someEvent.localTxId())));
+  }
+
+  private TxEvent someEvent() {
+    return new TxEvent(
+        uniquify("serviceName"),
+        uniquify("instanceId"),
+        new Date(),
+        uniquify("globalTxId"),
+        uniquify("localTxId"),
+        UUID.randomUUID().toString(),
+        TxStartedEvent.name(),
+        this.getClass().getCanonicalName(),
+        uniquify("blah").getBytes());
+  }
+}

-- 
To stop receiving notification emails like this one, please contact
ningjiang@apache.org.

[incubator-servicecomb-saga] 06/07: SCB-237 included acceptance test into CI build

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-saga.git

commit 6b4d5891b699ce57b91b351b673553200aad5911
Author: seanyinx <se...@huawei.com>
AuthorDate: Wed Jan 24 17:38:50 2018 +0800

    SCB-237 included acceptance test into CI build
    
    Signed-off-by: seanyinx <se...@huawei.com>
---
 .travis.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.travis.yml b/.travis.yml
index deecf73..87847e4 100755
--- a/.travis.yml
+++ b/.travis.yml
@@ -26,6 +26,7 @@ script:
 - set -e
 - mvn clean install -Pjacoco -Pdocker coveralls:report
 - mvn clean verify -f saga-demo -Pdemo -Pdocker -Ddocker.useColor=false -Ddocker.showLogs
+- mvn clean verify -f acceptance-tests -Pdemo -Pdocker -Ddocker.useColor=false -Ddocker.showLogs
 after_success:
 - if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then mvn deploy -DskipTests --settings .travis.settings.xml; fi
 env:

-- 
To stop receiving notification emails like this one, please contact
ningjiang@apache.org.

[incubator-servicecomb-saga] 07/07: SCB-237 checked availability of alpha and booking before testing

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-saga.git

commit 22ea88d2d1371a87dc5abab5e90daa20e315d98c
Author: seanyinx <se...@huawei.com>
AuthorDate: Wed Jan 24 17:57:40 2018 +0800

    SCB-237 checked availability of alpha and booking before testing
    
    Signed-off-by: seanyinx <se...@huawei.com>
---
 .../src/test/java/org/apache/servicecomb/saga/PackStepdefs.java  | 9 +++++++++
 .../src/test/resources/pack_success_scenario.feature             | 2 ++
 alpha/alpha-server/pom.xml                                       | 4 ++++
 3 files changed, 15 insertions(+)

diff --git a/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java b/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
index 0d73423..42e9f90 100644
--- a/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
+++ b/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
@@ -38,6 +38,7 @@ public class PackStepdefs implements En {
   private static final String ALPHA_REST_ADDRESS = "alpha.rest.address";
   private static final String CAR_SERVICE_ADDRESS = "car.service.address";
   private static final String HOTEL_SERVICE_ADDRESS = "hotel.service.address";
+  private static final String BOOKING_SERVICE_ADDRESS = "booking.service.address";
   private static final String[] addresses = {CAR_SERVICE_ADDRESS, HOTEL_SERVICE_ADDRESS};
 
   private static final Consumer<Map<String, String>[]> NO_OP_CONSUMER = (dataMap) -> {
@@ -52,6 +53,14 @@ public class PackStepdefs implements En {
       probe(System.getProperty(HOTEL_SERVICE_ADDRESS));
     });
 
+    And("^Booking Service is up and running$", () -> {
+      probe(System.getProperty(BOOKING_SERVICE_ADDRESS));
+    });
+
+    And("^Alpha is up and running$", () -> {
+      probe(System.getProperty(ALPHA_REST_ADDRESS));
+    });
+
     When("^User ([A-Za-z]+) requests to book ([0-9]+) cars and ([0-9]+) rooms$", (username, cars, rooms) -> {
       log.info("Received request from user {} to book {} cars and {} rooms", username, cars, rooms);
 
diff --git a/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature b/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature
index 5013cb9..c326e71 100644
--- a/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature
+++ b/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature
@@ -3,6 +3,8 @@ Feature: Alpha records transaction events
   Scenario: Everything is normal
     Given Car Service is up and running
     And Hotel Service is up and running
+    And Booking Service is up and running
+    And Alpha is up and running
 
     When User Sean requests to book 2 cars and 1 rooms
 
diff --git a/alpha/alpha-server/pom.xml b/alpha/alpha-server/pom.xml
index 54f9cef..0f49262 100644
--- a/alpha/alpha-server/pom.xml
+++ b/alpha/alpha-server/pom.xml
@@ -91,6 +91,10 @@
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-actuator</artifactId>
+    </dependency>
 
     <dependency>
       <groupId>org.springframework.boot</groupId>

-- 
To stop receiving notification emails like this one, please contact
ningjiang@apache.org.

[incubator-servicecomb-saga] 05/07: SCB-237 linked pack demos with cucumber test

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-saga.git

commit 99172eb3cf32795062120153181ff764db5e19b8
Author: seanyinx <se...@huawei.com>
AuthorDate: Wed Jan 24 17:36:11 2018 +0800

    SCB-237 linked pack demos with cucumber test
    
    Signed-off-by: seanyinx <se...@huawei.com>
---
 acceptance-tests/acceptance-pack/pom.xml           | 103 ++++++++++++++++++++-
 .../org/apache/servicecomb/saga/PackStepdefs.java  |  68 ++++++++++----
 .../test/resources/pack_success_scenario.feature   |  10 +-
 .../servicecomb/saga/alpha/core/EventScanner.java  |   1 -
 .../saga/alpha/server/AlphaEventController.java    |   7 ++
 .../src/main/resources/application.yaml            |   3 +
 pom.xml                                            |   3 +-
 .../servicecomb/saga/demo/pack/car/CarBooking.java |  48 ++++++----
 .../saga/demo/pack/car/CarBookingController.java   |  11 ++-
 .../saga/demo/pack/car/CarBookingService.java      |  22 +++--
 .../saga/demo/pack/hotel/HotelBooking.java         |  48 ++++++----
 .../demo/pack/hotel/HotelBookingController.java    |  11 ++-
 .../saga/demo/pack/hotel/HotelBookingService.java  |  24 ++---
 saga-demo/pack-demo/pom.xml                        |   6 ++
 saga-format/pom.xml                                |   4 +-
 15 files changed, 274 insertions(+), 95 deletions(-)

diff --git a/acceptance-tests/acceptance-pack/pom.xml b/acceptance-tests/acceptance-pack/pom.xml
index 67938f6..cc4a384 100644
--- a/acceptance-tests/acceptance-pack/pom.xml
+++ b/acceptance-tests/acceptance-pack/pom.xml
@@ -28,6 +28,19 @@
 
   <artifactId>acceptance-pack</artifactId>
 
+  <dependencies>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-core</artifactId>
+      <version>${jackson.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+      <version>${jackson.version}</version>
+    </dependency>
+  </dependencies>
+
   <profiles>
     <profile>
       <id>docker</id>
@@ -78,18 +91,94 @@
                       <tcp>
                         <ports>
                           <port>8080</port>
+                          <port>8090</port>
                         </ports>
                       </tcp>
                       <time>120000</time>
                     </wait>
                     <ports>
                       <port>alpha.port:8080</port>
+                      <port>alpha.rest.port:8090</port>
                     </ports>
                     <dependsOn>
                       <dependsOn>postgres</dependsOn>
                     </dependsOn>
                   </run>
                 </image>
+                <image>
+                  <name>pack-car:${project.version}</name>
+                  <alias>car</alias>
+                  <run>
+                    <env>
+                      <JAVA_OPTS />
+                    </env>
+                    <wait>
+                      <log>Started [a-zA-Z]+ in [0-9.]+ seconds</log>
+                      <tcp>
+                        <ports>
+                          <port>8080</port>
+                        </ports>
+                      </tcp>
+                      <time>120000</time>
+                    </wait>
+                    <links>
+                      <link>alpha:alpha-server.servicecomb.io</link>
+                    </links>
+                    <ports>
+                      <port>car.port:8080</port>
+                    </ports>
+                  </run>
+                </image>
+                <image>
+                  <name>pack-hotel:${project.version}</name>
+                  <alias>hotel</alias>
+                  <run>
+                    <env>
+                      <JAVA_OPTS />
+                    </env>
+                    <wait>
+                      <log>Started [a-zA-Z]+ in [0-9.]+ seconds</log>
+                      <tcp>
+                        <ports>
+                          <port>8080</port>
+                        </ports>
+                      </tcp>
+                      <time>120000</time>
+                    </wait>
+                    <links>
+                      <link>alpha:alpha-server.servicecomb.io</link>
+                    </links>
+                    <ports>
+                      <port>hotel.port:8080</port>
+                    </ports>
+                  </run>
+                </image>
+                <image>
+                  <name>pack-booking:${project.version}</name>
+                  <alias>booking</alias>
+                  <run>
+                    <env>
+                      <JAVA_OPTS />
+                    </env>
+                    <wait>
+                      <log>Started [a-zA-Z]+ in [0-9.]+ seconds</log>
+                      <tcp>
+                        <ports>
+                          <port>8080</port>
+                        </ports>
+                      </tcp>
+                      <time>120000</time>
+                    </wait>
+                    <links>
+                      <link>alpha:alpha-server.servicecomb.io</link>
+                      <link>car:pack-car.servicecomb.io</link>
+                      <link>hotel:pack-hotel.servicecomb.io</link>
+                    </links>
+                    <ports>
+                      <port>booking.port:8080</port>
+                    </ports>
+                  </run>
+                </image>
               </images>
             </configuration>
             <executions>
@@ -135,8 +224,20 @@
             <configuration>
               <systemPropertyVariables>
                 <alpha.cluster.address>
-                  ${docker.hostname}:${alpha.port}
+                  http://${docker.hostname}:${alpha.port}
                 </alpha.cluster.address>
+                <alpha.rest.address>
+                  http://${docker.hostname}:${alpha.rest.port}
+                </alpha.rest.address>
+                <car.service.address>
+                  http://${docker.hostname}:${car.port}
+                </car.service.address>
+                <hotel.service.address>
+                  http://${docker.hostname}:${hotel.port}
+                </hotel.service.address>
+                <booking.service.address>
+                  http://${docker.hostname}:${booking.port}
+                </booking.service.address>
                 <spring.datasource.url>
                   jdbc:postgresql://${docker.hostname}:${postgres.port}/saga?useSSL=false
                 </spring.datasource.url>
diff --git a/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java b/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
index 0cd13a9..0d73423 100644
--- a/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
+++ b/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
@@ -18,30 +18,38 @@
 package org.apache.servicecomb.saga;
 
 import static io.restassured.RestAssured.given;
+import static java.util.Arrays.asList;
 import static org.hamcrest.core.Is.is;
 
 import java.lang.invoke.MethodHandles;
-import java.util.Arrays;
-import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
+import java.util.function.Consumer;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import cucumber.api.DataTable;
+import cucumber.api.java.After;
 import cucumber.api.java8.En;
 
 public class PackStepdefs implements En {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
+  private static final String ALPHA_REST_ADDRESS = "alpha.rest.address";
+  private static final String CAR_SERVICE_ADDRESS = "car.service.address";
+  private static final String HOTEL_SERVICE_ADDRESS = "hotel.service.address";
+  private static final String[] addresses = {CAR_SERVICE_ADDRESS, HOTEL_SERVICE_ADDRESS};
+
+  private static final Consumer<Map<String, String>[]> NO_OP_CONSUMER = (dataMap) -> {
+  };
+
   public PackStepdefs() {
     Given("^Car Service is up and running$", () -> {
-      probe(System.getProperty("car.service.address"));
+      probe(System.getProperty(CAR_SERVICE_ADDRESS));
     });
 
     And("^Hotel Service is up and running$", () -> {
-      probe(System.getProperty("hotel.service.address"));
+      probe(System.getProperty(HOTEL_SERVICE_ADDRESS));
     });
 
     When("^User ([A-Za-z]+) requests to book ([0-9]+) cars and ([0-9]+) rooms$", (username, cars, rooms) -> {
@@ -58,43 +66,63 @@ public class PackStepdefs implements En {
     });
 
     Then("^Alpha records the following events$", (DataTable dataTable) -> {
-      List<Map<String, String>> maps = dataTable.asMaps(String.class, String.class);
-      log.info("events {}", maps);
+      Consumer<Map<String, String>[]> columnStrippingConsumer = dataMap -> {
+        for (Map<String, String> map : dataMap)
+          map.keySet().retainAll(dataTable.topCells());
+      };
+
+      dataMatches(System.getProperty(ALPHA_REST_ADDRESS) + "/events", dataTable, columnStrippingConsumer);
     });
 
     And("^Car Service contains the following booking orders$", (DataTable dataTable) -> {
-      List<Map<String, String>> maps = dataTable.asMaps(String.class, String.class);
-      log.info("car orders {}", maps);
-
-      bookingsMatches(dataTable, "car.service.address");
+      dataMatches(System.getProperty(CAR_SERVICE_ADDRESS) + "/bookings", dataTable, NO_OP_CONSUMER);
     });
 
     And("^Hotel Service contains the following booking orders$", (DataTable dataTable) -> {
-      List<Map<String, String>> maps = dataTable.asMaps(String.class, String.class);
-      log.info("hotel orders {}", maps);
-
-      bookingsMatches(dataTable, "hotel.service.address");
+      dataMatches(System.getProperty(HOTEL_SERVICE_ADDRESS) + "/bookings", dataTable, NO_OP_CONSUMER);
     });
   }
 
+  @After
+  public void cleanUp() {
+    log.info("Cleaning up services");
+    for (String address : addresses) {
+      given()
+          .when()
+          .delete(System.getProperty(address) + "/bookings")
+          .then()
+          .statusCode(is(200));
+    }
+
+    given()
+        .when()
+        .delete(System.getProperty(ALPHA_REST_ADDRESS) + "/events")
+        .then()
+        .statusCode(is(200));
+  }
+
   @SuppressWarnings("unchecked")
-  private void bookingsMatches(DataTable dataTable, String address) {
-    Map<String, String>[] bookings = given()
+  private void dataMatches(String address, DataTable dataTable, Consumer<Map<String, String>[]> dataProcessor) {
+    Map<String, String>[] dataMap = given()
         .when()
-        .post(System.getProperty(address) + "/bookings")
+        .get(address)
         .then()
         .statusCode(is(200))
         .extract()
         .body()
         .as(Map[].class);
 
-    dataTable.diff(Arrays.stream(bookings).collect(Collectors.toList()));
+    dataProcessor.accept(dataMap);
+
+    log.info("Retrieved data {} from service", dataMap);
+    dataTable.diff(DataTable.create(asList(dataMap)));
   }
 
   private void probe(String address) {
+    log.info("Connecting to service address {}", address);
     given()
         .when()
-        .post(address + "/info")
+        .get(address + "/info")
         .then()
         .statusCode(is(200));
   }
diff --git a/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature b/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature
index da233b0..5013cb9 100644
--- a/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature
+++ b/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature
@@ -7,7 +7,7 @@ Feature: Alpha records transaction events
     When User Sean requests to book 2 cars and 1 rooms
 
     Then Alpha records the following events
-      | service name | event type       |
+      | serviceName  | type             |
       | pack-booking | SagaStartedEvent |
       | pack-car     | TxStartedEvent   |
       | pack-car     | TxEndedEvent     |
@@ -16,9 +16,9 @@ Feature: Alpha records transaction events
       | pack-booking | SagaEndedEvent   |
 
     And Car Service contains the following booking orders
-      | user name | amount | confirmed |
-      | Sean      | 2      | true      |
+      | name | amount | confirmed | cancelled |
+      | Sean | 2      | true      | false     |
 
     And Hotel Service contains the following booking orders
-      | user name | amount | confirmed |
-      | Sean      | 1      | true      |
+      | name | amount | confirmed | cancelled |
+      | Sean | 1      | true      | false     |
diff --git a/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/EventScanner.java b/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/EventScanner.java
index 80deeb3..2d51a74 100644
--- a/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/EventScanner.java
+++ b/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/EventScanner.java
@@ -133,7 +133,6 @@ public class EventScanner implements Runnable {
         EMPTY_PAYLOAD);
   }
 
-  // TODO: 2018/1/19 potentially compensation may be out of order if we don't wait till received compensated event for the previous one, since compensation is async
   private void compensate() {
     commandRepository.findFirstCommandToCompensate()
         .forEach(command -> {
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/AlphaEventController.java b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/AlphaEventController.java
index 0f6e139..aa469c4 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/AlphaEventController.java
+++ b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/AlphaEventController.java
@@ -24,6 +24,7 @@ import java.util.List;
 import org.apache.servicecomb.saga.alpha.core.TxEvent;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 
@@ -50,6 +51,12 @@ class AlphaEventController {
     return ResponseEntity.ok(eventVos);
   }
 
+  @DeleteMapping("/events")
+  ResponseEntity<String> clear() {
+    eventRepository.deleteAll();
+    return ResponseEntity.ok("All events deleted");
+  }
+
   @JsonAutoDetect(fieldVisibility = Visibility.ANY)
   private static class TxEventVo extends TxEvent {
     private TxEventVo(TxEvent event) {
diff --git a/alpha/alpha-server/src/main/resources/application.yaml b/alpha/alpha-server/src/main/resources/application.yaml
index cf3c896..a4790e2 100644
--- a/alpha/alpha-server/src/main/resources/application.yaml
+++ b/alpha/alpha-server/src/main/resources/application.yaml
@@ -22,3 +22,6 @@ spring:
     url: jdbc:postgresql://postgresql.servicecomb.io:5432/saga?useSSL=false
     platform: postgresql
 #    continue-on-error: true
+
+server:
+  port: 8090
diff --git a/pom.xml b/pom.xml
index 9939b7f..13e9ca0 100755
--- a/pom.xml
+++ b/pom.xml
@@ -44,7 +44,6 @@
     <module>pack-common</module>
     <module>integration-tests</module>
     <module>saga-persistence</module>
-    <module>acceptance-tests</module>
   </modules>
 
   <properties>
@@ -64,6 +63,7 @@
     <kryo.version>4.0.1</kryo.version>
     <javax.transaction.version>1.2</javax.transaction.version>
     <eclipse.link.version>2.7.1</eclipse.link.version>
+    <jackson.version>2.9.0</jackson.version>
   </properties>
 
   <name>ServiceComb Saga</name>
@@ -710,6 +710,7 @@
       <id>demo</id>
       <modules>
         <module>saga-demo</module>
+        <module>acceptance-tests</module>
       </modules>
     </profile>
     <profile>
diff --git a/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBooking.java b/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBooking.java
index 11b936d..94f40d4 100644
--- a/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBooking.java
+++ b/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBooking.java
@@ -17,50 +17,58 @@
 
 package org.apache.servicecomb.saga.demo.pack.car;
 
-public class CarBooking {
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+@JsonAutoDetect(fieldVisibility = Visibility.ANY)
+class CarBooking {
+  @JsonIgnore
   private Integer id;
   private String name;
-  private Integer cars;
-  private boolean confirm;
-  private boolean cancel;
+  private Integer amount;
+  private boolean confirmed;
+  private boolean cancelled;
 
-  public Integer getId() {
+  Integer getId() {
     return id;
   }
 
-  public void setId(Integer id) {
+  void setId(Integer id) {
     this.id = id;
   }
 
-  public String getName() {
+  String getName() {
     return name;
   }
 
-  public void setName(String name) {
+  void setName(String name) {
     this.name = name;
   }
 
-  public Integer getCars() {
-    return cars;
+  Integer getAmount() {
+    return amount;
   }
 
-  public void setCars(Integer cars) {
-    this.cars = cars;
+  void setAmount(Integer amount) {
+    this.amount = amount;
   }
 
-  public boolean isConfirm() {
-    return confirm;
+  boolean isConfirmed() {
+    return confirmed;
   }
 
-  public void setConfirm(boolean confirm) {
-    this.confirm = confirm;
+  void confirm() {
+    this.confirmed = true;
+    this.cancelled = false;
   }
 
-  public boolean isCancel() {
-    return cancel;
+  boolean isCancelled() {
+    return cancelled;
   }
 
-  public void setCancel(boolean cancel) {
-    this.cancel = cancel;
+  void cancel() {
+    this.confirmed = false;
+    this.cancelled = true;
   }
 }
diff --git a/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBookingController.java b/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBookingController.java
index 60849aa..4528c22 100644
--- a/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBookingController.java
+++ b/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBookingController.java
@@ -18,6 +18,7 @@
 package org.apache.servicecomb.saga.demo.pack.car;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -32,7 +33,7 @@ public class CarBookingController {
   @Autowired
   private CarBookingService service;
 
-  private AtomicInteger id = new AtomicInteger(0);
+  private final AtomicInteger id = new AtomicInteger(0);
 
   @GetMapping("/bookings") List<CarBooking> getAll() {
     return new ArrayList<>(service.getAllBookings());
@@ -43,8 +44,14 @@ public class CarBookingController {
     CarBooking booking = new CarBooking();
     booking.setId(id.incrementAndGet());
     booking.setName(name);
-    booking.setCars(cars);
+    booking.setAmount(cars);
     service.order(booking);
     return booking;
   }
+
+  @DeleteMapping("/bookings")
+  void clear() {
+    service.clearAllBookings();
+    id.set(0);
+  }
 }
diff --git a/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBookingService.java b/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBookingService.java
index 8c3f8f4..3be4d36 100644
--- a/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBookingService.java
+++ b/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBookingService.java
@@ -21,29 +21,31 @@ import org.apache.servicecomb.saga.omega.transaction.annotations.Compensable;
 import org.springframework.stereotype.Service;
 
 import java.util.Collection;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 @Service
-public class CarBookingService {
-  private ConcurrentHashMap<Integer, CarBooking> bookings = new ConcurrentHashMap<>();
+class CarBookingService {
+  private Map<Integer, CarBooking> bookings = new ConcurrentHashMap<>();
 
   @Compensable(compensationMethod = "cancel")
-  public void order(CarBooking booking) {
-    booking.setConfirm(true);
-    booking.setCancel(false);
+  void order(CarBooking booking) {
+    booking.confirm();
     bookings.put(booking.getId(), booking);
   }
 
-  public void cancel(CarBooking booking) {
+  void cancel(CarBooking booking) {
     Integer id = booking.getId();
     if (bookings.containsKey(id)) {
-      CarBooking origin = bookings.get(id);
-      origin.setConfirm(false);
-      origin.setCancel(true);
+      bookings.get(id).cancel();
     }
   }
 
-  public Collection<CarBooking> getAllBookings() {
+  Collection<CarBooking> getAllBookings() {
     return bookings.values();
   }
+
+  void clearAllBookings() {
+    bookings.clear();
+  }
 }
diff --git a/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBooking.java b/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBooking.java
index e7c748c..e621b23 100644
--- a/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBooking.java
+++ b/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBooking.java
@@ -17,50 +17,58 @@
 
 package org.apache.servicecomb.saga.demo.pack.hotel;
 
-public class HotelBooking {
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+@JsonAutoDetect(fieldVisibility = Visibility.ANY)
+class HotelBooking {
+  @JsonIgnore
   private Integer id;
   private String name;
-  private Integer rooms;
-  private boolean confirm;
-  private boolean cancel;
+  private Integer amount;
+  private boolean confirmed;
+  private boolean cancelled;
 
-  public Integer getId() {
+  Integer getId() {
     return id;
   }
 
-  public void setId(Integer id) {
+  void setId(Integer id) {
     this.id = id;
   }
 
-  public String getName() {
+  String getName() {
     return name;
   }
 
-  public void setName(String name) {
+  void setName(String name) {
     this.name = name;
   }
 
-  public Integer getRooms() {
-    return rooms;
+  Integer getAmount() {
+    return amount;
   }
 
-  public void setRooms(Integer rooms) {
-    this.rooms = rooms;
+  void setAmount(Integer amount) {
+    this.amount = amount;
   }
 
-  public boolean isConfirm() {
-    return confirm;
+  boolean isConfirmed() {
+    return confirmed;
   }
 
-  public void setConfirm(boolean confirm) {
-    this.confirm = confirm;
+  void confirm() {
+    this.confirmed = true;
+    this.cancelled = false;
   }
 
-  public boolean isCancel() {
-    return cancel;
+  boolean isCancelled() {
+    return cancelled;
   }
 
-  public void setCancel(boolean cancel) {
-    this.cancel = cancel;
+  void cancel() {
+    this.confirmed = false;
+    this.cancelled = true;
   }
 }
diff --git a/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBookingController.java b/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBookingController.java
index 0474d71..22f9b2c 100644
--- a/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBookingController.java
+++ b/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBookingController.java
@@ -18,6 +18,7 @@
 package org.apache.servicecomb.saga.demo.pack.hotel;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -32,7 +33,7 @@ public class HotelBookingController {
   @Autowired
   private HotelBookingService service;
 
-  private AtomicInteger id = new AtomicInteger(0);
+  private final AtomicInteger id = new AtomicInteger(0);
 
   @GetMapping("/bookings")
   List<HotelBooking> getAll() {
@@ -44,8 +45,14 @@ public class HotelBookingController {
     HotelBooking booking = new HotelBooking();
     booking.setId(id.incrementAndGet());
     booking.setName(name);
-    booking.setRooms(rooms);
+    booking.setAmount(rooms);
     service.order(booking);
     return booking;
   }
+
+  @DeleteMapping("/bookings")
+  void clear() {
+    service.clearAllBookings();
+    id.set(0);
+  }
 }
diff --git a/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBookingService.java b/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBookingService.java
index d819843..9abf040 100644
--- a/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBookingService.java
+++ b/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBookingService.java
@@ -21,32 +21,34 @@ import org.apache.servicecomb.saga.omega.transaction.annotations.Compensable;
 import org.springframework.stereotype.Service;
 
 import java.util.Collection;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 @Service
-public class HotelBookingService {
-  private ConcurrentHashMap<Integer, HotelBooking> bookings = new ConcurrentHashMap<>();
+class HotelBookingService {
+  private Map<Integer, HotelBooking> bookings = new ConcurrentHashMap<>();
 
   @Compensable(compensationMethod = "cancel")
-  public void order(HotelBooking booking) {
-    if (booking.getRooms() > 2) {
+  void order(HotelBooking booking) {
+    if (booking.getAmount() > 2) {
       throw new IllegalArgumentException("can not order the rooms large than two");
     }
-    booking.setConfirm(true);
-    booking.setCancel(false);
+    booking.confirm();
     bookings.put(booking.getId(), booking);
   }
 
-  public void cancel(HotelBooking booking) {
+  void cancel(HotelBooking booking) {
     Integer id = booking.getId();
     if (bookings.containsKey(id)) {
-      HotelBooking origin = bookings.get(id);
-      origin.setConfirm(false);
-      origin.setCancel(true);
+      bookings.get(id).cancel();
     }
   }
 
-  public Collection<HotelBooking> getAllBookings() {
+  Collection<HotelBooking> getAllBookings() {
     return bookings.values();
   }
+
+  void clearAllBookings() {
+    bookings.clear();
+  }
 }
diff --git a/saga-demo/pack-demo/pom.xml b/saga-demo/pack-demo/pom.xml
index 3b3453e..8deb910 100644
--- a/saga-demo/pack-demo/pom.xml
+++ b/saga-demo/pack-demo/pom.xml
@@ -34,4 +34,10 @@
     <module>hotel</module>
   </modules>
 
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-actuator</artifactId>
+    </dependency>
+  </dependencies>
 </project>
diff --git a/saga-format/pom.xml b/saga-format/pom.xml
index 4d3952f..a6c0457 100644
--- a/saga-format/pom.xml
+++ b/saga-format/pom.xml
@@ -35,12 +35,12 @@
     <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-core</artifactId>
-      <version>2.9.0</version>
+      <version>${jackson.version}</version>
     </dependency>
     <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
-      <version>2.9.0</version>
+      <version>${jackson.version}</version>
     </dependency>
     <dependency>
       <groupId>io.kamon</groupId>

-- 
To stop receiving notification emails like this one, please contact
ningjiang@apache.org.

[incubator-servicecomb-saga] 03/07: SCB-237 filled car & hotel services testing steps

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-saga.git

commit 09301acf729d9422107eb38569c598ca81c6955d
Author: seanyinx <se...@huawei.com>
AuthorDate: Tue Jan 23 16:58:09 2018 +0800

    SCB-237 filled car & hotel services testing steps
    
    Signed-off-by: seanyinx <se...@huawei.com>
---
 .../org/apache/servicecomb/saga/PackStepdefs.java  | 43 ++++++++++++++++++++++
 acceptance-tests/pom.xml                           |  5 +++
 2 files changed, 48 insertions(+)

diff --git a/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java b/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
index 71c0887..0cd13a9 100644
--- a/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
+++ b/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
@@ -17,9 +17,14 @@
 
 package org.apache.servicecomb.saga;
 
+import static io.restassured.RestAssured.given;
+import static org.hamcrest.core.Is.is;
+
 import java.lang.invoke.MethodHandles;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -32,13 +37,24 @@ public class PackStepdefs implements En {
 
   public PackStepdefs() {
     Given("^Car Service is up and running$", () -> {
+      probe(System.getProperty("car.service.address"));
     });
 
     And("^Hotel Service is up and running$", () -> {
+      probe(System.getProperty("hotel.service.address"));
     });
 
     When("^User ([A-Za-z]+) requests to book ([0-9]+) cars and ([0-9]+) rooms$", (username, cars, rooms) -> {
       log.info("Received request from user {} to book {} cars and {} rooms", username, cars, rooms);
+
+      given()
+          .pathParam("name", username)
+          .pathParam("rooms", rooms)
+          .pathParam("cars", cars)
+          .when()
+          .post(System.getProperty("booking.service.address") + "/booking/{name}/{rooms}/{cars}")
+          .then()
+          .statusCode(is(200));
     });
 
     Then("^Alpha records the following events$", (DataTable dataTable) -> {
@@ -49,10 +65,37 @@ public class PackStepdefs implements En {
     And("^Car Service contains the following booking orders$", (DataTable dataTable) -> {
       List<Map<String, String>> maps = dataTable.asMaps(String.class, String.class);
       log.info("car orders {}", maps);
+
+      bookingsMatches(dataTable, "car.service.address");
     });
+
     And("^Hotel Service contains the following booking orders$", (DataTable dataTable) -> {
       List<Map<String, String>> maps = dataTable.asMaps(String.class, String.class);
       log.info("hotel orders {}", maps);
+
+      bookingsMatches(dataTable, "hotel.service.address");
     });
   }
+
+  @SuppressWarnings("unchecked")
+  private void bookingsMatches(DataTable dataTable, String address) {
+    Map<String, String>[] bookings = given()
+        .when()
+        .post(System.getProperty(address) + "/bookings")
+        .then()
+        .statusCode(is(200))
+        .extract()
+        .body()
+        .as(Map[].class);
+
+    dataTable.diff(Arrays.stream(bookings).collect(Collectors.toList()));
+  }
+
+  private void probe(String address) {
+    given()
+        .when()
+        .post(address + "/info")
+        .then()
+        .statusCode(is(200));
+  }
 }
diff --git a/acceptance-tests/pom.xml b/acceptance-tests/pom.xml
index 2a5f12b..7e1ebbf 100644
--- a/acceptance-tests/pom.xml
+++ b/acceptance-tests/pom.xml
@@ -54,6 +54,11 @@
       <artifactId>junit</artifactId>
     </dependency>
     <dependency>
+      <groupId>io.rest-assured</groupId>
+      <artifactId>rest-assured</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
       <scope>test</scope>

-- 
To stop receiving notification emails like this one, please contact
ningjiang@apache.org.

[incubator-servicecomb-saga] 01/07: SCB-237 skeleton for pack acceptance tests

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-saga.git

commit 7100b7942ea4336ac0994522d5a78a331dc594e5
Author: seanyinx <se...@huawei.com>
AuthorDate: Tue Jan 23 15:25:13 2018 +0800

    SCB-237 skeleton for pack acceptance tests
    
    Signed-off-by: seanyinx <se...@huawei.com>
---
 acceptance-tests/acceptance-pack/pom.xml           | 31 ++++++++++++
 .../org/apache/servicecomb/saga/PackStepdefs.java  | 45 +++++++++++++++++
 .../apache/servicecomb/saga/RunCucumberTest.java   | 29 +++++++++++
 .../test/resources/pack_success_scenario.feature   | 16 ++++++
 acceptance-tests/pom.xml                           | 58 ++++++++++++++++++++++
 pom.xml                                            |  1 +
 6 files changed, 180 insertions(+)

diff --git a/acceptance-tests/acceptance-pack/pom.xml b/acceptance-tests/acceptance-pack/pom.xml
new file mode 100644
index 0000000..5401ab5
--- /dev/null
+++ b/acceptance-tests/acceptance-pack/pom.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>acceptance-tests</artifactId>
+    <groupId>org.apache.servicecomb.saga</groupId>
+    <version>0.0.3-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>acceptance-pack</artifactId>
+
+</project>
diff --git a/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java b/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
new file mode 100644
index 0000000..fd98536
--- /dev/null
+++ b/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
@@ -0,0 +1,45 @@
+/*
+ * 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.servicecomb.saga;
+
+import cucumber.api.PendingException;
+import cucumber.api.java8.En;
+
+public class PackStepdefs implements En {
+  public PackStepdefs() {
+    Given("^Car Service is up and running$", () -> {
+      // Write code here that turns the phrase above into concrete actions
+      throw new PendingException();
+    });
+
+    And("^Hotel Service is up and running$", () -> {
+      // Write code here that turns the phrase above into concrete actions
+      throw new PendingException();
+    });
+
+    When("^A booking transaction is received$", () -> {
+      // Write code here that turns the phrase above into concrete actions
+      throw new PendingException();
+    });
+
+    Then("^Alpha records the following events$", () -> {
+      // Write code here that turns the phrase above into concrete actions
+      throw new PendingException();
+    });
+  }
+}
diff --git a/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/RunCucumberTest.java b/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/RunCucumberTest.java
new file mode 100644
index 0000000..d4e2b43
--- /dev/null
+++ b/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/RunCucumberTest.java
@@ -0,0 +1,29 @@
+/*
+ * 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.servicecomb.saga;
+
+import org.junit.runner.RunWith;
+
+import cucumber.api.CucumberOptions;
+import cucumber.api.junit.Cucumber;
+
+@RunWith(Cucumber.class)
+@CucumberOptions(plugin = {"pretty", "html:target/cucumber"},
+    features = "src/test/resources")
+public class RunCucumberTest {
+}
diff --git a/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature b/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature
new file mode 100644
index 0000000..270e8ba
--- /dev/null
+++ b/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature
@@ -0,0 +1,16 @@
+Feature: Alpha records transaction events
+
+  Scenario: Everything is normal
+    Given Car Service is up and running
+    And Hotel Service is up and running
+
+    When A booking transaction is received
+
+    Then Alpha records the following events
+      | event type       |
+      | SagaStartedEvent |
+      | TxStartedEvent   |
+      | TxEndedEvent     |
+      | TxStartedEvent   |
+      | TxEndedEvent     |
+      | SagaEndedEvent   |
diff --git a/acceptance-tests/pom.xml b/acceptance-tests/pom.xml
new file mode 100644
index 0000000..0c41f81
--- /dev/null
+++ b/acceptance-tests/pom.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>saga</artifactId>
+    <groupId>org.apache.servicecomb.saga</groupId>
+    <version>0.0.3-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>acceptance-tests</artifactId>
+  <packaging>pom</packaging>
+  <modules>
+    <module>acceptance-pack</module>
+  </modules>
+
+  <properties>
+    <cucumber.version>2.3.1</cucumber.version>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>io.cucumber</groupId>
+      <artifactId>cucumber-java8</artifactId>
+      <version>${cucumber.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>io.cucumber</groupId>
+      <artifactId>cucumber-junit</artifactId>
+      <version>${cucumber.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/pom.xml b/pom.xml
index dbd748e..9939b7f 100755
--- a/pom.xml
+++ b/pom.xml
@@ -44,6 +44,7 @@
     <module>pack-common</module>
     <module>integration-tests</module>
     <module>saga-persistence</module>
+    <module>acceptance-tests</module>
   </modules>
 
   <properties>

-- 
To stop receiving notification emails like this one, please contact
ningjiang@apache.org.