diff --git a/acceptance-tests/acceptance-pack/src/test/resources/car_timeout.btm b/acceptance-tests/acceptance-pack/src/test/resources/car_timeout.btm new file mode 100644 index 000000000..c8c132f90 --- /dev/null +++ b/acceptance-tests/acceptance-pack/src/test/resources/car_timeout.btm @@ -0,0 +1,35 @@ +# 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. + +############################################################## +# rules to timeout the car after invoking the services +# +############################################################### +RULE set the saga compensable timeout to 5s +INTERFACE org.apache.servicecomb.saga.omega.transaction.annotations.Compensable +METHOD timeout +AT EXIT +IF TRUE +DO RETURN 5 +ENDRULE + +RULE sleep when postCarBooking until timeout happens +CLASS org.apache.servicecomb.saga.demo.pack.car.CarBookingService +METHOD postCarBooking +AT ENTRY +IF TRUE +DO debug("delay 10s until the car booking timeout"), + Thread.sleep(10000) +ENDRULE diff --git a/acceptance-tests/acceptance-pack/src/test/resources/hotel_timeout.btm b/acceptance-tests/acceptance-pack/src/test/resources/hotel_timeout.btm new file mode 100644 index 000000000..5a7632e78 --- /dev/null +++ b/acceptance-tests/acceptance-pack/src/test/resources/hotel_timeout.btm @@ -0,0 +1,35 @@ +# 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. + +############################################################## +# rules to timeout the car after invoking the services +# +############################################################### +RULE set the saga compensable timeout to 2s +INTERFACE org.apache.servicecomb.saga.omega.transaction.annotations.Compensable +METHOD timeout +AT EXIT +IF TRUE +DO RETURN 2 +ENDRULE + +RULE sleep when postHotelBooking until timeout happens +CLASS org.apache.servicecomb.saga.demo.pack.hotel.HotelBookingService +METHOD postHotelBooking +AT ENTRY +IF TRUE +DO debug("delay 10s until the car booking timeout"), + Thread.sleep(4000) +ENDRULE diff --git a/acceptance-tests/acceptance-pack/src/test/resources/pack_car_timeout_scenario.feature b/acceptance-tests/acceptance-pack/src/test/resources/pack_car_timeout_scenario.feature new file mode 100644 index 000000000..278502fc0 --- /dev/null +++ b/acceptance-tests/acceptance-pack/src/test/resources/pack_car_timeout_scenario.feature @@ -0,0 +1,39 @@ +# 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. + +Feature: Alpha records transaction events + + Scenario: Car transaction timeout and will be compensated + 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 + + Given Install the byteman script car_timeout.btm to Car Service + + When User Jason requests to book 1 cars and 1 rooms + + Then Alpha records the following events + | serviceName | type | + | pack-booking | SagaStartedEvent | + | pack-car | TxStartedEvent | + | pack-car | TxAbortedEvent | + | pack-car | TxCompensatedEvent | + | pack-car | SagaEndedEvent | + | pack-car | TxEndedEvent | + + Then Car Service contains the following booking orders + | name | amount | confirmed | cancelled | + | Jason | 1 | true | false | \ No newline at end of file diff --git a/acceptance-tests/acceptance-pack/src/test/resources/pack_hotel_timeout_scenario.feature b/acceptance-tests/acceptance-pack/src/test/resources/pack_hotel_timeout_scenario.feature new file mode 100644 index 000000000..c272359d2 --- /dev/null +++ b/acceptance-tests/acceptance-pack/src/test/resources/pack_hotel_timeout_scenario.feature @@ -0,0 +1,47 @@ +# 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. + +Feature: Alpha records transaction events + + Scenario: Hotel transaction timeout and will be compensated + 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 + + Given Install the byteman script hotel_timeout.btm to Hotel Service + + When User Jason requests to book 1 cars and 1 rooms + + Then Alpha records the following events + | serviceName | type | + | pack-booking | SagaStartedEvent | + | pack-car | TxStartedEvent | + | pack-car | TxEndedEvent | + | pack-hotel | TxStartedEvent | + | pack-hotel | TxAbortedEvent | + | pack-car | TxCompensatedEvent | + | pack-hotel | TxCompensatedEvent | + | pack-hotel | SagaEndedEvent | + | pack-hotel | TxEndedEvent | + | pack-booking | SagaEndedEvent | + + Then Car Service contains the following booking orders + | name | amount | confirmed | cancelled | + | Jason | 1 | false | true | + + And Hotel Service contains the following booking orders + | name | amount | confirmed | cancelled | + | Jason | 1 | true | false | \ No newline at end of file diff --git a/saga-demo/booking/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBookingService.java b/saga-demo/booking/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBookingService.java index 3be4d36d9..6dcabce4d 100644 --- a/saga-demo/booking/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBookingService.java +++ b/saga-demo/booking/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBookingService.java @@ -30,6 +30,7 @@ class CarBookingService { @Compensable(compensationMethod = "cancel") void order(CarBooking booking) { + postCarBooking(); booking.confirm(); bookings.put(booking.getId(), booking); } @@ -48,4 +49,7 @@ Collection getAllBookings() { void clearAllBookings() { bookings.clear(); } + + //used by byteman to inject fault + private void postCarBooking(){} } diff --git a/saga-demo/booking/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBookingService.java b/saga-demo/booking/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBookingService.java index 9abf0407b..8a0d5453c 100644 --- a/saga-demo/booking/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBookingService.java +++ b/saga-demo/booking/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBookingService.java @@ -30,6 +30,7 @@ class HotelBookingService { @Compensable(compensationMethod = "cancel") void order(HotelBooking booking) { + postHotelBooking(); if (booking.getAmount() > 2) { throw new IllegalArgumentException("can not order the rooms large than two"); } @@ -51,4 +52,7 @@ Collection getAllBookings() { void clearAllBookings() { bookings.clear(); } + + //used by byteman to inject fault + private void postHotelBooking(){} }