This is an automated email from the ASF dual-hosted git repository. shenlin pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/rocketmq-eventbridge.git
commit 5426245f2652e7c4ea2c274bea5b4f92eccb783e Author: wangkai <wang...@zhongan.com> AuthorDate: Sat Oct 21 11:21:33 2023 +0800 [e2eTest] add e2eTest model --- .../{maven-publish.yml => maven-package.yml} | 6 ++- {start => dist}/pom.xml | 57 ++++++++++++++------ dist/src/main/assembly/assembly.xml | 35 ++++++++++++ {bin => dist/src/main/bin}/eventbridge.sh | 0 {bin => dist/src/main/bin}/runserver.sh | 3 +- dist/src/main/resources/application.properties | 41 ++++++++++++++ dist/src/main/resources/logback.xml | 63 ++++++++++++++++++++++ pom.xml | 1 + start/pom.xml | 26 ++++----- test/rocketmq-eventbridge-e2etest/pom.xml | 2 +- .../controller/ApplicationTagControllerTest.java | 38 ++++++++++--- .../rocketmq/eventbridge/e2etest/util/Utils.java | 43 ++++++--------- 12 files changed, 243 insertions(+), 72 deletions(-) diff --git a/.github/workflows/maven-publish.yml b/.github/workflows/maven-package.yml similarity index 95% rename from .github/workflows/maven-publish.yml rename to .github/workflows/maven-package.yml index fd183e2..37eb4dc 100644 --- a/.github/workflows/maven-publish.yml +++ b/.github/workflows/maven-package.yml @@ -1,7 +1,11 @@ # This workflow will build a package using Maven and then publish it to GitHub packages when a release is created # For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#apache-maven-with-a-settings-path name: Redis runner example -on: push +on: + pull_request: + types: [ opened, reopened, synchronize ] + release: + types: [ created ] jobs: # Label of the runner job diff --git a/start/pom.xml b/dist/pom.xml similarity index 74% copy from start/pom.xml copy to dist/pom.xml index a7e115d..8990d41 100644 --- a/start/pom.xml +++ b/dist/pom.xml @@ -1,15 +1,6 @@ -<!-- 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" +<?xml version="1.0" encoding="UTF-8"?> +<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>rocketmq-eventbridge</artifactId> @@ -18,7 +9,7 @@ </parent> <modelVersion>4.0.0</modelVersion> - <artifactId>rocketmq-eventbridge-start</artifactId> + <artifactId>rocketmq-eventbridge-dist</artifactId> <properties> <maven.compiler.source>8</maven.compiler.source> @@ -56,7 +47,7 @@ </dependency> <dependency> <groupId>org.apache.rocketmq</groupId> - <artifactId>rocketmq-test-demo</artifactId> + <artifactId>rocketmq-eventbridge-start</artifactId> </dependency> <!-- Framework --> <dependency> @@ -91,8 +82,7 @@ </dependency> </dependencies> - <!-- <build> - <finalName>rocketmq-eventbridge</finalName> + <build> <resources> <resource> <directory>src/main/resources</directory> @@ -131,5 +121,38 @@ </executions> </plugin> </plugins> - </build>--> + </build> + + <profiles> + <profile> + <id>local</id> + <activation> + <activeByDefault>true</activeByDefault> + </activation> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-assembly-plugin</artifactId> + <configuration> + <appendAssemblyId>false</appendAssemblyId> + <descriptors> + <descriptor>src/main/assembly/assembly.xml</descriptor> + </descriptors> + </configuration> + <executions> + <execution> + <id>assembly</id> + <phase>package</phase> + <goals> + <goal>single</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> + </profile> + + </profiles> </project> \ No newline at end of file diff --git a/dist/src/main/assembly/assembly.xml b/dist/src/main/assembly/assembly.xml new file mode 100644 index 0000000..26b0cc6 --- /dev/null +++ b/dist/src/main/assembly/assembly.xml @@ -0,0 +1,35 @@ +<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd"> + <id>assembly</id> + <formats> + <format>dir</format> + </formats> + + <includeBaseDirectory>true</includeBaseDirectory> + <baseDirectory>rocketmq-eventbridge</baseDirectory> + <dependencySets> + <dependencySet> + <outputDirectory>/</outputDirectory> + <includes> + <include>org.apache.rocketmq:rocketmq-eventbridge-dist:jar</include> + </includes> + <outputFileNameMapping>rocketmq-eventbridge.jar</outputFileNameMapping> + </dependencySet> + </dependencySets> + + <fileSets> + <fileSet> + <directory>src/main/bin</directory> + <outputDirectory>bin/</outputDirectory> + <fileMode>0755</fileMode> + <lineEnding>unix</lineEnding> + <filtered>true</filtered> + </fileSet> + <fileSet> + <directory>src/main/resources</directory> + <outputDirectory>config/</outputDirectory> + <fileMode>0755</fileMode> + </fileSet> + </fileSets> +</assembly> \ No newline at end of file diff --git a/bin/eventbridge.sh b/dist/src/main/bin/eventbridge.sh similarity index 100% rename from bin/eventbridge.sh rename to dist/src/main/bin/eventbridge.sh diff --git a/bin/runserver.sh b/dist/src/main/bin/runserver.sh similarity index 97% rename from bin/runserver.sh rename to dist/src/main/bin/runserver.sh index de9541c..dfa7221 100755 --- a/bin/runserver.sh +++ b/dist/src/main/bin/runserver.sh @@ -87,7 +87,6 @@ JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib:$ #JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n" JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}" JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}" - -JAVA_OPT="${JAVA_OPT} -Dlogback.configurationFile=${BASE_DIR}/conf/logback.xml" +JAVA_OPT="${JAVA_OPT} -Dlogback.configurationFile=${BASE_DIR}/config/logback.xml -Dspring.config.location=${BASE_DIR}/config/application.properties" $JAVA ${JAVA_OPT} $@ \ No newline at end of file diff --git a/dist/src/main/resources/application.properties b/dist/src/main/resources/application.properties new file mode 100644 index 0000000..5911b30 --- /dev/null +++ b/dist/src/main/resources/application.properties @@ -0,0 +1,41 @@ +# 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. + +server.port=7001 +management.server.port=7002 +management.endpoints.web.base-path=/ +spring.profiles.active=local +## database +#spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/eventBridge?useUnicode=true&characterEncoding=utf8&useSSL=false +#spring.datasource.hikari.driver-class-name=com.mysql.jdbc.Driver +#spring.datasource.hikari.username=xxxxx +#spring.datasource.hikari.password=xxxxx +mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl +## flyway +## rocketmq +rocketmq.namesrvAddr=localhost:9876 + +rocketmq.cluster.name=DefaultCluster +## runtime +runtime.config.mode=DB +runtime.storage.mode=ROCKETMQ +rumtime.name=eventbridge-runtimer +runtime.pluginpath=~/eventbridge/plugin + + +## log +app.name=rocketmqeventbridge +log.level=INFO +log.path=~/logs \ No newline at end of file diff --git a/dist/src/main/resources/logback.xml b/dist/src/main/resources/logback.xml new file mode 100644 index 0000000..c86f339 --- /dev/null +++ b/dist/src/main/resources/logback.xml @@ -0,0 +1,63 @@ +<!-- 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. --> + +<configuration> + <jmxConfigurator/> + + <springProperty scope="context" name="app.name" source="app.name"/> + <springProperty scope="context" name="log.path" source="log.path"/> + <springProperty scope="context" name="log.level" source="log.level"/> + + <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> + <target>System.out</target> + <encoder> + <pattern>%d{yyyy-MM-dd + HH:mm:ss.SSS}@@%X{traceId:-}@@%X{parentId:-}@@%X{spanId:-}@@[%thread]@@%level@@%logger{36}[%line]@@%msg%n + </pattern> + </encoder> + </appender> + + <appender name="PROJECT" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${log.path}/${app.name}/${app.name}.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>${log.path}/${app.name}/${app.name}.%d{yyyy-MM-dd}.log</fileNamePattern> + <maxHistory>30</maxHistory> + <totalSizeCap>10GB</totalSizeCap> + </rollingPolicy> + <encoder> + <pattern>%d{yyyy-MM-dd + HH:mm:ss.SSS}@@%X{traceId:-}@@%X{parentId:-}@@%X{spanId:-}@@[%thread]@@%level@@%logger{36}[%line]@@%msg%n + </pattern> + </encoder> + </appender> + + <appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${log.path}/${app.name}/access.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>${log.path}/${app.name}/access.%d{yyyy-MM-dd}.log</fileNamePattern> + <maxHistory>30</maxHistory> + <totalSizeCap>3GB</totalSizeCap> + </rollingPolicy> + <encoder> + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}@@%X{traceId:-}@@%X{parentId:-}@@%X{spanId:-}@@[%thread]@@%level@@%logger{36}[%line]@@%msg%n</pattern> + </encoder> + </appender> + + <logger name="accessLog" level="${log.level}" additivity="false"> + <appender-ref ref="ACCESS"/> + <appender-ref ref="STDOUT"/> + </logger> + + <root level="${log.level}"> + <appender-ref ref="STDOUT"/> + <appender-ref ref="PROJECT"/> + </root> +</configuration> \ No newline at end of file diff --git a/pom.xml b/pom.xml index dd83d24..b60d031 100644 --- a/pom.xml +++ b/pom.xml @@ -106,6 +106,7 @@ <module>common</module> <module>infrastructure</module> <module>test</module> + <module>dist</module> </modules> <dependencyManagement> diff --git a/start/pom.xml b/start/pom.xml index a7e115d..b07569a 100644 --- a/start/pom.xml +++ b/start/pom.xml @@ -91,8 +91,7 @@ </dependency> </dependencies> - <!-- <build> - <finalName>rocketmq-eventbridge</finalName> + <build> <resources> <resource> <directory>src/main/resources</directory> @@ -114,22 +113,15 @@ </resource> </resources> <plugins> + <!-- java编译插件 --> <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - <version>2.2.10.RELEASE</version> - <executions> - <execution> - <id>repackage</id> - <goals> - <goal>repackage</goal> - </goals> - <configuration> - <mainClass>org.apache.rocketmq.eventbridge.StartMain</mainClass> - </configuration> - </execution> - </executions> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <version>3.3.0</version> + <configuration> + <finalName>rocketmq-eventbridge-start-1.0.0</finalName> + </configuration> </plugin> </plugins> - </build>--> + </build> </project> \ No newline at end of file diff --git a/test/rocketmq-eventbridge-e2etest/pom.xml b/test/rocketmq-eventbridge-e2etest/pom.xml index 8ded330..ac82308 100644 --- a/test/rocketmq-eventbridge-e2etest/pom.xml +++ b/test/rocketmq-eventbridge-e2etest/pom.xml @@ -27,6 +27,7 @@ <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> + <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> @@ -36,7 +37,6 @@ <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> - <scope>test</scope> <exclusions> <exclusion> <groupId>org.ow2.asm</groupId> diff --git a/test/rocketmq-eventbridge-e2etest/src/test/java/org/apache/rocketmq/eventbridge/e2etest/controller/ApplicationTagControllerTest.java b/test/rocketmq-eventbridge-e2etest/src/test/java/org/apache/rocketmq/eventbridge/e2etest/controller/ApplicationTagControllerTest.java index 0f5446e..bac500b 100644 --- a/test/rocketmq-eventbridge-e2etest/src/test/java/org/apache/rocketmq/eventbridge/e2etest/controller/ApplicationTagControllerTest.java +++ b/test/rocketmq-eventbridge-e2etest/src/test/java/org/apache/rocketmq/eventbridge/e2etest/controller/ApplicationTagControllerTest.java @@ -1,5 +1,7 @@ package org.apache.rocketmq.eventbridge.e2etest.controller; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FileUtils; import org.apache.rocketmq.eventbridge.Main; import org.apache.rocketmq.eventbridge.e2etest.BaseTest; import org.apache.rocketmq.eventbridge.e2etest.util.Utils; @@ -11,21 +13,45 @@ import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringRunner; +import java.io.File; import java.util.HashMap; import java.util.Map; +@Slf4j @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Main.class) public class ApplicationTagControllerTest extends BaseTest { @Test - public void testGetAllApplicationTags() { - String url = String.format("%s/bus/createEventBus", baseUrl); - Map<String, String> maps = new HashMap<>(); - maps.put("eventBusName", "demo-bus"); - maps.put("description", "a demo bus."); - ResponseEntity<Void> response = Utils.request(template, url, HttpMethod.POST, maps, Void.class); + public void testGetAllApplicationTags() throws Exception { + + String url = String.format("%s/putEvents", baseUrl); + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json; charset=UTF-8"); + headers.put("ce-specversion","1.0"); + headers.put("ce-type", "com.github.pull_request.opened"); + headers.put("ce-source", "https://github.com/cloudevents/spec/pull"); + headers.put("ce-subject", "demo"); + headers.put("ce-id", "1234-1234-1234"); + headers.put("ce-datacontenttype", "application/json"); + headers.put("ce-time","2018-04-05T17:31:00Z"); + headers.put("ce-eventbusname", "demo-bus"); + + ResponseEntity<Void> response = Utils.request(template, url, HttpMethod.POST, "A test recrod.", Void.class, headers); Assert.assertTrue(response.getStatusCode().is2xxSuccessful()); + + File file = new File(System.getProperty("user.home") + "/demo"); + String data = null; + long current = System.currentTimeMillis(); + while((System.currentTimeMillis() - current)/1000 <300 ) { + data = FileUtils.readFileToString(file, "UTF-8"); + if (data != null) { + break; + } + Thread.sleep(1000); + } + + Assert.assertEquals("A test recrod.\n", data); } diff --git a/test/rocketmq-eventbridge-e2etest/src/test/java/org/apache/rocketmq/eventbridge/e2etest/util/Utils.java b/test/rocketmq-eventbridge-e2etest/src/test/java/org/apache/rocketmq/eventbridge/e2etest/util/Utils.java index cc29fe7..6627ffe 100644 --- a/test/rocketmq-eventbridge-e2etest/src/test/java/org/apache/rocketmq/eventbridge/e2etest/util/Utils.java +++ b/test/rocketmq-eventbridge-e2etest/src/test/java/org/apache/rocketmq/eventbridge/e2etest/util/Utils.java @@ -15,10 +15,9 @@ import java.util.Map; public class Utils { - public static <T> ResponseEntity<T> request(TestRestTemplate template, String url, HttpMethod method, Object body, Class<T> clazz) { - HttpHeaders headers = devHeaders(); - - HttpEntity entity = new HttpEntity(body, headers); + public static <T> ResponseEntity<T> request(TestRestTemplate template, String url, HttpMethod method, Object body, Class<T> clazz, Map<String, String> headers) { + HttpHeaders httpHeaders = devHeaders(headers); + HttpEntity entity = new HttpEntity(body, httpHeaders); return template.exchange(url, method, entity, clazz); } @@ -26,37 +25,25 @@ public class Utils { return template.getForEntity(url, clazz ,args); } - public static <T> ResponseEntity<T> requestAsAdmin(TestRestTemplate template, String url, HttpMethod method, Object body, Class<T> clazz) { - HttpHeaders headers = new HttpHeaders(); - headers.add("X-AI-USER", "admin"); - - HttpEntity entity = new HttpEntity(body, headers); - return template.exchange(url, method, entity, clazz); - } - - public static <T> ResponseEntity<T> request(TestRestTemplate template, String url, String fileKey, String file, Class<T> clazz, Object... urlVariables) throws IOException { - HttpHeaders headers = devHeaders(); - headers.setContentType(MediaType.MULTIPART_FORM_DATA); + public static <T> ResponseEntity<T> requestByPost(TestRestTemplate template, String url, String fileKey, String file, Class<T> clazz, Map<String, String> headers, Object... urlVariables) throws IOException { + HttpHeaders httpHeaders = devHeaders(headers); + httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA); MultiValueMap<String, Object> multipartRequest = new LinkedMultiValueMap<>(); multipartRequest.add(fileKey, new ClassPathResource(file)); - HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(multipartRequest, headers); + HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(multipartRequest, httpHeaders); return template.exchange(url, HttpMethod.POST, entity, clazz, urlVariables); } - private static HttpHeaders devHeaders() { - HttpHeaders headers = new HttpHeaders(); - headers.add("X-AI-USER", "developer"); - - return headers; + private static HttpHeaders devHeaders(Map<String, String> headers) { + HttpHeaders httpHeaders = new HttpHeaders(); + if (headers != null && !headers.isEmpty()) { + for (Map.Entry<String, String> entry : headers.entrySet()) { + httpHeaders.add(entry.getKey(), entry.getValue()); + } + } + return httpHeaders; } - public static <T> ResponseEntity<T> requestAsWanyaWu(TestRestTemplate template, String url, HttpMethod method, Object body, Class<T> clazz) { - HttpHeaders headers = new HttpHeaders(); - headers.add("X-AI-USER", "vanya.wu"); - - HttpEntity entity = new HttpEntity(body, headers); - return template.exchange(url, method, entity, clazz); - } }