You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/01/28 05:53:23 UTC

[camel] branch main updated: CAMEL-17321: Add HuaweiCloud FaceRecognitionService(FRS) Component (#6838)

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

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new ae60bee  CAMEL-17321: Add HuaweiCloud FaceRecognitionService(FRS) Component (#6838)
ae60bee is described below

commit ae60bee3c1f8d66fa0ac0f605db4a936c79ac056
Author: Hokutor <hw...@huawei.com>
AuthorDate: Fri Jan 28 13:51:52 2022 +0800

    CAMEL-17321: Add HuaweiCloud FaceRecognitionService(FRS) Component (#6838)
    
    Co-Authored-By: Reji Mathews <co...@gmail.com>
    Co-Authored-By: lyndonmiao <ly...@qq.com>
---
 bom/camel-bom/pom.xml                              |   5 +
 catalog/camel-allcomponents/pom.xml                |   4 +
 .../camel-huawei/camel-huaweicloud-frs/pom.xml     |  81 ++++
 .../src/main/docs/hwcloud-frs-component.adoc       | 177 ++++++++
 .../huaweicloud/frs/FaceRecognitionComponent.java  |  32 ++
 .../huaweicloud/frs/FaceRecognitionEndpoint.java   | 412 ++++++++++++++++++
 .../huaweicloud/frs/FaceRecognitionProducer.java   | 459 +++++++++++++++++++++
 .../frs/constants/FaceRecognitionConstants.java    |  28 ++
 .../frs/constants/FaceRecognitionProperties.java   |  41 ++
 .../frs/models/ClientConfigurations.java           | 220 ++++++++++
 ...ceDetectionWithImageBae64AndMockClientTest.java |  70 ++++
 .../frs/FaceDetectionWithImageBae64Test.java       |  71 ++++
 ...aceDetectionWithImageFileAndMockClientTest.java |  70 ++++
 .../frs/FaceDetectionWithImageFileTest.java        |  71 ++++
 ...FaceDetectionWithImageUrlAndMockClientTest.java |  70 ++++
 .../frs/FaceDetectionWithImageUrlTest.java         |  71 ++++
 ...erificationWithImageBae64AndMockClientTest.java |  73 ++++
 .../frs/FaceVerificationWithImageBae64Test.java    |  73 ++++
 ...VerificationWithImageFileAndMockClientTest.java |  73 ++++
 .../frs/FaceVerificationWithImageFileTest.java     |  73 ++++
 ...eVerificationWithImageUrlAndMockClientTest.java |  73 ++++
 .../frs/FaceVerificationWithImageUrlTest.java      |  73 ++++
 .../component/huaweicloud/frs/FrsClientMock.java   |  98 +++++
 ...veDetectionWithVideoBae64AndMockClientTest.java |  71 ++++
 .../frs/LiveDetectionWithVideoBae64Test.java       |  71 ++++
 ...iveDetectionWithVideoFileAndMockClientTest.java |  70 ++++
 .../frs/LiveDetectionWithVideoFileTest.java        |  71 ++++
 ...LiveDetectionWithVideoUrlAndMockClientTest.java |  71 ++++
 .../frs/LiveDetectionWithVideoUrlTest.java         |  71 ++++
 .../component/huaweicloud/frs/MockResult.java      |  48 +++
 .../huaweicloud/frs/TestConfiguration.java         |  65 +++
 .../constants/FaceRecognitionPropertiesTest.java   |  39 ++
 .../frs/constants/FrsConstantsTest.java            |  31 ++
 .../src/test/resources/image_file                  |   1 +
 .../src/test/resources/log4j2.properties           |  28 ++
 .../test/resources/test_configuration.properties   |  31 ++
 .../src/test/resources/video_file                  |   1 +
 components/camel-huawei/pom.xml                    |   1 +
 parent/pom.xml                                     |   5 +
 39 files changed, 3093 insertions(+)

diff --git a/bom/camel-bom/pom.xml b/bom/camel-bom/pom.xml
index d220364..aadc93a 100644
--- a/bom/camel-bom/pom.xml
+++ b/bom/camel-bom/pom.xml
@@ -989,6 +989,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-huaweicloud-frs</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-huaweicloud-functiongraph</artifactId>
         <version>${project.version}</version>
       </dependency>
diff --git a/catalog/camel-allcomponents/pom.xml b/catalog/camel-allcomponents/pom.xml
index 3807f81..23369e9 100644
--- a/catalog/camel-allcomponents/pom.xml
+++ b/catalog/camel-allcomponents/pom.xml
@@ -643,6 +643,10 @@
 		</dependency>
 		<dependency>
 			<groupId>org.apache.camel</groupId>
+			<artifactId>camel-huaweicloud-frs</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.camel</groupId>
 			<artifactId>camel-huaweicloud-functiongraph</artifactId>
 		</dependency>
 		<dependency>
diff --git a/components/camel-huawei/camel-huaweicloud-frs/pom.xml b/components/camel-huawei/camel-huaweicloud-frs/pom.xml
new file mode 100644
index 0000000..73aaa14
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/pom.xml
@@ -0,0 +1,81 @@
+<?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:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <artifactId>camel-huawei-parent</artifactId>
+    <groupId>org.apache.camel</groupId>
+    <version>3.15.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>camel-huaweicloud-frs</artifactId>
+  <packaging>jar</packaging>
+  <name>Camel :: Huawei Cloud :: FaceRecognition</name>
+  <description>A Camel Huawei Face Recognition Service component</description>
+
+  <properties>
+    <firstVersion>3.15.0</firstVersion>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-huaweicloud-common</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>com.huaweicloud.sdk</groupId>
+      <artifactId>huaweicloud-sdk-core</artifactId>
+      <version>${huaweicloud-sdk-version}</version>
+    </dependency>
+    <dependency>
+      <groupId>com.huaweicloud.sdk</groupId>
+      <artifactId>huaweicloud-sdk-frs</artifactId>
+      <version>${huaweicloud-sdk-version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-support</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-core</artifactId>
+      <version>${jackson2-version}</version>
+    </dependency>
+
+    <!-- for testing -->
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-test-spring-junit5</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-slf4j-impl</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/main/docs/hwcloud-frs-component.adoc b/components/camel-huawei/camel-huaweicloud-frs/src/main/docs/hwcloud-frs-component.adoc
new file mode 100644
index 0000000..003c141
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/main/docs/hwcloud-frs-component.adoc
@@ -0,0 +1,177 @@
+= Huawei Cloud Face Recognition Service Component
+:doctitle: Huawei Cloud Face Recognition Service(FRS)
+:shortname: hwcloud-frs
+:artifactid: camel-huaweicloud-frs
+:description: Face Recognition Service(FRS) is an intelligent service that uses computers to process, analyze and understand facial images based on human facial features
+:since: 3.15.0
+:supportlevel: Stable
+:component-header: Only producer is supported
+//Manually maintained attributes
+:group: Huawei Cloud
+:camel-spring-boot-name: huaweicloud-frs
+
+*Since Camel {since}*
+
+*{component-header}*
+
+Huawei Cloud Face Recognition Service component allows you to integrate with https://support.huaweicloud.com/intl/en-us/productdesc-face/face_01_0001.html[Face Recognition Service] provided by Huawei Cloud.
+
+Maven users will need to add the following dependency to their `pom.xml`
+for this component:
+
+[source,xml]
+------------------------------------------------------------
+<dependency>
+    <groupId>org.apache.camel</groupId>
+    <artifactId>camel-huaweicloud-frs</artifactId>
+    <version>x.x.x</version>
+    <!-- use the same version as your Camel core version -->
+</dependency>
+------------------------------------------------------------
+
+== URI format
+
+[source,text]
+------------------------
+hwcloud-frs:operation[?options]
+------------------------
+
+// component-configure options: START
+
+// component-configure options: END
+
+// component options: START
+include::partial$component-configure-options.adoc[]
+include::partial$component-endpoint-options.adoc[]
+// component options: END
+
+// endpoint options: START
+
+// endpoint options: END
+
+[NOTE]
+====
+When using imageBase64 or videoBase64 option, we suggest you use RAW(base64_value) to avoid encoding issue.
+====
+
+== Usage
+
+=== Message properties evaluated by the Face Recognition Service producer
+
+[width="100%",cols="10%,10%,80%",options="header",]
+|=======================================================================
+|Header |Type |Description
+
+|`CamelHwCloudFrsImageBase64` |`String` |The Base64 character string converted from an image. This property can be used when the operation is faceDetection or faceVerification.
+
+|`CamelHwCloudFrsImageUrl` |`String` |The URL of an image. This property can be used when the operation is faceDetection or faceVerification.
+
+|`CamelHwCloudFrsImageFilePath` |`String` |The local file path of an image. This property can be used when the operation is faceDetection or faceVerification.
+
+|`CamelHwCloudFrsAnotherImageBase64` |`String` |The Base64 character string converted from another image. This property can be used when the operation is faceVerification.
+
+|`CamelHwCloudFrsAnotherImageUrl` |`String` |The URL of another image. This property can be used when the operation is faceVerification.
+
+|`CamelHwCloudFrsAnotherImageFilePath` |`String` |The local file path of another image. This property can be used when the operation is faceVerification.
+
+|`CamelHwCloudFrsVideoBase64` |`String` |The Base64 character string converted from a video. This property can be used when the operation is faceLiveDetection.
+
+|`CamelHwCloudFrsVideoUrl` |`String` |The URL of a video. This property can be used when the operation is faceLiveDetection.
+
+|`CamelHwCloudFrsVideoFilePath` |`String` |The local file path of a video. This property can be used when the operation is faceLiveDetection.
+
+|`CamelHwCloudFrsVideoActions` |`String` |The action code sequence list. This property can be used when the operation is faceLiveDetection.
+
+|`CamelHwCloudFrsVideoActionTimes` |`String` |The action time array. This property is used when the operation is faceLiveDetection.
+
+|=======================================================================
+
+== List of Supported Operations
+
+- faceDetection - detect, locate, and analyze the face in an input image, and output the key facial points and attributes.
+- faceVerification - compare two faces to verify whether they belong to the same person and return the confidence level
+- faceLiveDetection - determine whether a person in a video is alive by checking whether the person's actions in the video are consistent with those in the input action list
+
+== Inline Configuration of route
+
+=== faceDetection
+
+Java DSL
+
+[source,java]
+----
+from("direct:triggerRoute")
+  .setProperty(FaceRecognitionProperties.FACE_IMAGE_URL, constant("https://xxxx"))
+  .to("hwcloud-frs:faceDetection?accessKey=*********&secretKey=********&projectId=9071a38e7f6a4ba7b7bcbeb7d4ea6efc&region=cn-north-4")
+----
+
+XML DSL
+
+[source,xml]
+----
+<route>
+   <from uri="direct:triggerRoute" />
+   <setProperty name="CamelHwCloudFrsImageUrl">
+      <constant>https://xxxx</constant>
+   </setProperty>
+   <to uri="hwcloud-frs:faceDetection?accessKey=*********&amp;secretKey=********&amp;projectId=9071a38e7f6a4ba7b7bcbeb7d4ea6efc&amp;region=cn-north-4" />
+</route>
+----
+
+=== faceVerification
+
+Java DSL
+
+[source,java]
+----
+from("direct:triggerRoute")
+  .setProperty(FaceRecognitionProperties.FACE_IMAGE_BASE64, RAW("/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAA0JCgsKCA0LCgsODg0PEyAVExISEyccHhcgLikxMC4pLSwzOko+MzZGNywtQFdBRkxOUlNSMj5aYVpQYEpRUk..."))
+  .setProperty(FaceRecognitionProperties.ANOTHER_FACE_IMAGE_BASE64, RAW("/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgFBgcGBQgHBgcJCAgJDBMMDAsLDBgREg4THBgdHRsYGxofIywlHyEqIRobJjQnKi4vMTIxHiU2Os..."))
+  .to("hwcloud-frs:faceVerification?accessKey=*********&secretKey=********&projectId=9071a38e7f6a4ba7b7bcbeb7d4ea6efc&region=cn-north-4")
+----
+
+XML DSL
+
+[source,xml]
+----
+<route>
+    <from uri="direct:triggerRoute" />
+    <setProperty name="CamelHwCloudFrsImageBase64">
+        <constant>/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAA0JCgsKCA0LCgsODg0PEyAVExISEyccHhcgLikxMC4pLSwzOko+MzZGNywtQFdBRkxOUlNSMj5aYVpQYEpRUk...</constant>
+    </setProperty>
+    <setProperty name="CamelHwCloudFrsAnotherImageBase64">
+        <constant>/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgFBgcGBQgHBgcJCAgJDBMMDAsLDBgREg4THBgdHRsYGxofIywlHyEqIRobJjQnKi4vMTIxHiU2Os...</constant>
+    </setProperty>
+    <to uri="hwcloud-frs:faceVerification?accessKey=*********&amp;secretKey=********&amp;projectId=9071a38e7f6a4ba7b7bcbeb7d4ea6efc&amp;region=cn-north-4" />
+</route>
+----
+
+=== faceLiveDetection
+
+Java DSL
+
+[source,java]
+----
+from("direct:triggerRoute")
+  .setProperty(FaceRecognitionProperties.FACE_VIDEO_FILE_PATH, constant("/tmp/video.mp4"))
+  .setProperty(FaceRecognitionProperties.FACE_VIDEO_ACTIONS, constant("1,3,2"))
+  .to("hwcloud-frs:faceLiveDetection?accessKey=*********&secretKey=********&projectId=9071a38e7f6a4ba7b7bcbeb7d4ea6efc&region=cn-north-4")
+----
+
+XML DSL
+
+[source,xml]
+----
+<route>
+    <from uri="direct:triggerRoute" />
+    <setProperty name="CamelHwCloudFrsVideoFilePath">
+        <constant>/tmp/video.mp4</constant>
+    </setProperty>
+    <setProperty name="CamelHwCloudFrsVideoActions">
+        <constant>1,3,2</constant>
+    </setProperty>
+    <to uri="hwcloud-frs:faceLiveDetection?accessKey=*********&amp;secretKey=********&amp;projectId=9071a38e7f6a4ba7b7bcbeb7d4ea6efc&amp;region=cn-north-4" />
+</route>
+----
+
+include::spring-boot:partial$starter.adoc[]
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/FaceRecognitionComponent.java b/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/FaceRecognitionComponent.java
new file mode 100644
index 0000000..ce464c5
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/FaceRecognitionComponent.java
@@ -0,0 +1,32 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import java.util.*;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.support.DefaultComponent;
+
+@org.apache.camel.spi.annotations.Component("hwcloud-frs")
+public class FaceRecognitionComponent extends DefaultComponent {
+
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        Endpoint endpoint = new FaceRecognitionEndpoint(uri, remaining, this);
+        setProperties(endpoint, parameters);
+        return endpoint;
+    }
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/FaceRecognitionEndpoint.java b/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/FaceRecognitionEndpoint.java
new file mode 100644
index 0000000..4ba3a52
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/FaceRecognitionEndpoint.java
@@ -0,0 +1,412 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import com.huaweicloud.sdk.frs.v2.FrsClient;
+import org.apache.camel.Category;
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.component.huaweicloud.common.models.ServiceKeys;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriPath;
+import org.apache.camel.support.DefaultEndpoint;
+
+/**
+ * Face Recognition Service (FRS) is an intelligent service that uses computers to process, analyze, and understand
+ * facial images based on human facial features.
+ */
+@UriEndpoint(firstVersion = "3.15.0", scheme = "hwcloud-frs", title = "Huawei Cloud Face Recognition Service",
+             syntax = "hwcloud-frs:operation",
+             category = { Category.CLOUD, Category.MESSAGING }, producerOnly = true)
+public class FaceRecognitionEndpoint extends DefaultEndpoint {
+    @UriPath(
+             description = "Name of Face Recognition operation to perform, including faceDetection, faceVerification and faceLiveDetection",
+             displayName = "Operation name", label = "producer")
+    @Metadata(required = true)
+    private String operation;
+
+    @UriParam(description = "Configuration object for cloud service authentication",
+              displayName = "Service Configuration", secret = true)
+    @Metadata(required = false)
+    private ServiceKeys serviceKeys;
+
+    @UriParam(description = "Access key for the cloud user", displayName = "Account access key (AK)", secret = true)
+    @Metadata(required = true)
+    private String accessKey;
+
+    @UriParam(description = "Secret key for the cloud user", displayName = "Account secret key (SK)", secret = true)
+    @Metadata(required = true)
+    private String secretKey;
+
+    @UriParam(description = "Cloud project ID", displayName = "Project ID")
+    @Metadata(required = true)
+    private String projectId;
+
+    @UriParam(description = "Proxy server ip/hostname", displayName = "Proxy server host")
+    @Metadata(required = false)
+    private String proxyHost;
+
+    @UriParam(description = "Proxy server port", displayName = "Proxy server port")
+    @Metadata(required = false)
+    private int proxyPort;
+
+    @UriParam(description = "Proxy authentication user", displayName = "Proxy user", secret = true)
+    @Metadata(required = false)
+    private String proxyUser;
+
+    @UriParam(description = "Proxy authentication password", displayName = "Proxy password", secret = true)
+    @Metadata(required = false)
+    private String proxyPassword;
+
+    @UriParam(description = "Ignore SSL verification", displayName = "SSL Verification Ignored",
+              defaultValue = "false", label = "security")
+    @Metadata(required = false)
+    private boolean ignoreSslVerification;
+
+    @UriParam(
+              description = "Face Recognition service region. Currently only cn-north-1 and cn-north-4 are supported. This is lower precedence than endpoint based configuration.",
+              displayName = "Service region")
+    @Metadata(required = true)
+    private String region;
+
+    @UriParam(
+              description = "Fully qualified Face Recognition service url. Carries higher precedence than region based configuration.",
+              displayName = "Service endpoint")
+    @Metadata(required = false)
+    private String endpoint;
+
+    @UriParam(
+              description = "This param can be used when operation is faceDetection or faceVerification, indicating the Base64 character string converted from an image.\n"
+                            + "Any one of imageBase64, imageUrl and imageFilePath needs to be set, and the priority is imageBase64 > imageUrl > imageFilePath.\n"
+                            + "The Image size cannot exceed 10 MB. The image resolution of the narrow sides must be greater than 15 pixels, and that of the wide sides cannot exceed 4096 pixels.\n"
+                            + "The supported image formats include JPG, PNG, and BMP. \n",
+              displayName = "imageBase64")
+    @Metadata(required = false)
+    private String imageBase64;
+
+    @UriParam(description = "This param can be used when operation is faceDetection or faceVerification, indicating the URL of an image.\n"
+                            + "Any one of imageBase64, imageUrl and imageFilePath needs to be set, and the priority is imageBase64 > imageUrl > imageFilePath.\n"
+                            + "The options are as follows:\n"
+                            + "1.HTTP/HTTPS URLs on the public network\n"
+                            + "2.OBS URLs. To use OBS data, authorization is required, including service authorization, temporary authorization, and anonymous public authorization. For details, see Configuring the Access Permission of OBS. \n",
+              displayName = "imageUrl")
+    @Metadata(required = false)
+    private String imageUrl;
+
+    @UriParam(description = "This param can be used when operation is faceDetection or faceVerification, indicating the local image file path.\n"
+                            + "Any one of imageBase64, imageUrl and imageFilePath needs to be set, and the priority is imageBase64 > imageUrl > imageFilePath.\n"
+                            + "Image size cannot exceed 8 MB, and it is recommended that the image size be less than 1 MB.",
+              displayName = "imageFilePath")
+    @Metadata(required = false)
+    private String imageFilePath;
+
+    @UriParam(
+              description = "This param can be used when operation is faceVerification, indicating the Base64 character string converted from the other image.\n"
+                            + "It needs to be configured if imageBase64 is set.\n"
+                            + "The image size cannot exceed 10 MB. The image resolution of the narrow sides must be greater than 15 pixels, and that of the wide sides cannot exceed 4096 pixels.\n"
+                            + "The supported image formats include JPG, PNG, and BMP.",
+              displayName = "anotherImageBase64")
+    @Metadata(required = false)
+    private String anotherImageBase64;
+
+    @UriParam(description = "This param can be used when operation is faceVerification, indicating the URL of the other image.\n"
+                            + "It needs to be configured if imageUrl is set.\n"
+                            + "The options are as follows:\n"
+                            + "1.HTTP/HTTPS URLs on the public network\n"
+                            + "2.OBS URLs. To use OBS data, authorization is required, including service authorization, temporary authorization, and anonymous public authorization. For details, see Configuring the Access Permission of OBS. \n",
+              displayName = "anotherImageUrl")
+    @Metadata(required = false)
+    private String anotherImageUrl;
+
+    @UriParam(description = "This param can be used when operation is faceVerification, indicating the local file path of the other image.\n"
+                            + "It needs to be configured if imageFilePath is set.\n"
+                            + "Image size cannot exceed 8 MB, and it is recommended that the image size be less than 1 MB.",
+              displayName = "anotherImageFilePath")
+    @Metadata(required = false)
+    private String anotherImageFilePath;
+
+    @UriParam(
+              description = "This param can be used when operation is faceLiveDetection, indicating the Base64 character string converted from a video.\n"
+                            + "Any one of videoBase64, videoUrl and videoFilePath needs to be set, and the priority is videoBase64 > videoUrl > videoFilePath.\n"
+                            + "Requirements are as follows: \n"
+                            + "1.The video size after Base64 encoding cannot exceed 8 MB. It is recommended that the video file be compressed to 200 KB to 2 MB on the client. \n"
+                            + "2.The video duration must be 1 to 15 seconds. \n"
+                            + "3.The recommended frame rate is 10 fps to 30 fps. \n"
+                            + "4.The encapsulation format can be MP4, AVI, FLV, WEBM, ASF, or MOV. \n"
+                            + "5.The video encoding format can be H.261, H.263, H.264, HEVC, VC-1, VP8, VP9, or WMV3.",
+              displayName = "videoBase64")
+    @Metadata(required = false)
+    private String videoBase64;
+
+    @UriParam(description = "This param can be used when operation is faceLiveDetection, indicating the URL of a video.\n"
+                            + "Any one of videoBase64, videoUrl and videoFilePath needs to be set, and the priority is videoBase64 > videoUrl > videoFilePath.\n"
+                            + "Currently, only the URL of an OBS bucket on HUAWEI CLOUD is supported and FRS must have the permission to read data in the OBS bucket. For details about how to enable the read permission, see Service Authorization.\n"
+                            + "The video requirements are as follows: \n"
+                            + "1.The video size after Base64 encoding cannot exceed 8 MB.\n"
+                            + "2.The video duration must be 1 to 15 seconds.\n"
+                            + "3.The recommended frame rate is 10 fps to 30 fps.\n"
+                            + "4.The encapsulation format can be MP4, AVI, FLV, WEBM, ASF, or MOV.\n"
+                            + "5.The video encoding format can be H.261, H.263, H.264, HEVC, VC-1, VP8, VP9, or WMV3.",
+              displayName = "videoUrl")
+    @Metadata(required = false)
+    private String videoUrl;
+
+    @UriParam(description = "This param can be used when operation is faceLiveDetection, indicating the local video file path.\n"
+                            + "Any one of videoBase64, videoUrl and videoFilePath needs to be set, and the priority is videoBase64 > videoUrl > videoFilePath.\n"
+                            + "The video requirements are as follows:\n"
+                            + "1.The size of a video file cannot exceed 8 MB. It is recommended that the video file be compressed to 200 KB to 2 MB on the client.\n"
+                            + "2.The video duration must be 1 to 15 seconds.\n"
+                            + "3.The recommended frame rate is 10 fps to 30 fps.\n"
+                            + "4.The encapsulation format can be MP4, AVI, FLV, WEBM, ASF, or MOV.\n"
+                            + "5.The video encoding format can be H.261, H.263, H.264, HEVC, VC-1, VP8, VP9, or WMV3.",
+              displayName = "videoFilePath")
+    @Metadata(required = false)
+    private String videoFilePath;
+
+    @UriParam(description = "This param is mandatory when the operation is faceLiveDetection, indicating the action code sequence list.\n"
+                            + "Actions are separated by commas (,). Currently, the following actions are supported:\n"
+                            + "1: Shake the head to the left.\n"
+                            + "2: Shake the head to the right.\n"
+                            + "3: Nod the head.\n"
+                            + "4: Mouth movement.",
+              displayName = "actions")
+    @Metadata(required = false)
+    private String actions;
+
+    @UriParam(description = "This param can be used when the operation is faceLiveDetection, indicating the action time array.\n"
+                            + "The length of the array is the same as the number of actions.\n"
+                            + "Each item contains the start time and end time of the action in the corresponding sequence. The unit is the milliseconds from the video start time.",
+              displayName = "actionTime")
+    @Metadata(required = false)
+    private String actionTimes;
+
+    private FrsClient frsClient;
+
+    public FaceRecognitionEndpoint() {
+    }
+
+    public FaceRecognitionEndpoint(String uri, String operation, FaceRecognitionComponent component) {
+        super(uri, component);
+        this.operation = operation;
+    }
+
+    @Override
+    public Producer createProducer() throws Exception {
+        return new FaceRecognitionProducer(this);
+    }
+
+    @Override
+    public Consumer createConsumer(Processor processor) throws Exception {
+        throw new UnsupportedOperationException("consumer endpoint is not supported");
+    }
+
+    public String getOperation() {
+        return operation;
+    }
+
+    public void setOperation(String operation) {
+        this.operation = operation;
+    }
+
+    public ServiceKeys getServiceKeys() {
+        return serviceKeys;
+    }
+
+    public void setServiceKeys(ServiceKeys serviceKeys) {
+        this.serviceKeys = serviceKeys;
+    }
+
+    public String getAccessKey() {
+        return accessKey;
+    }
+
+    public void setAccessKey(String accessKey) {
+        this.accessKey = accessKey;
+    }
+
+    public String getSecretKey() {
+        return secretKey;
+    }
+
+    public void setSecretKey(String secretKey) {
+        this.secretKey = secretKey;
+    }
+
+    public String getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(String projectId) {
+        this.projectId = projectId;
+    }
+
+    public String getProxyHost() {
+        return proxyHost;
+    }
+
+    public void setProxyHost(String proxyHost) {
+        this.proxyHost = proxyHost;
+    }
+
+    public int getProxyPort() {
+        return proxyPort;
+    }
+
+    public void setProxyPort(int proxyPort) {
+        this.proxyPort = proxyPort;
+    }
+
+    public String getProxyUser() {
+        return proxyUser;
+    }
+
+    public void setProxyUser(String proxyUser) {
+        this.proxyUser = proxyUser;
+    }
+
+    public String getProxyPassword() {
+        return proxyPassword;
+    }
+
+    public void setProxyPassword(String proxyPassword) {
+        this.proxyPassword = proxyPassword;
+    }
+
+    public boolean isIgnoreSslVerification() {
+        return ignoreSslVerification;
+    }
+
+    public void setIgnoreSslVerification(boolean ignoreSslVerification) {
+        this.ignoreSslVerification = ignoreSslVerification;
+    }
+
+    public String getRegion() {
+        return region;
+    }
+
+    public void setRegion(String region) {
+        this.region = region;
+    }
+
+    public String getEndpoint() {
+        return endpoint;
+    }
+
+    public void setEndpoint(String endpoint) {
+        this.endpoint = endpoint;
+    }
+
+    public String getImageBase64() {
+        return imageBase64;
+    }
+
+    public void setImageBase64(String imageBase64) {
+        this.imageBase64 = imageBase64;
+    }
+
+    public String getImageUrl() {
+        return imageUrl;
+    }
+
+    public void setImageUrl(String imageUrl) {
+        this.imageUrl = imageUrl;
+    }
+
+    public String getImageFilePath() {
+        return imageFilePath;
+    }
+
+    public void setImageFilePath(String imageFilePath) {
+        this.imageFilePath = imageFilePath;
+    }
+
+    public String getAnotherImageBase64() {
+        return anotherImageBase64;
+    }
+
+    public void setAnotherImageBase64(String anotherImageBase64) {
+        this.anotherImageBase64 = anotherImageBase64;
+    }
+
+    public String getAnotherImageUrl() {
+        return anotherImageUrl;
+    }
+
+    public void setAnotherImageUrl(String anotherImageUrl) {
+        this.anotherImageUrl = anotherImageUrl;
+    }
+
+    public String getAnotherImageFilePath() {
+        return anotherImageFilePath;
+    }
+
+    public void setAnotherImageFilePath(String anotherImageFilePath) {
+        this.anotherImageFilePath = anotherImageFilePath;
+    }
+
+    public String getVideoBase64() {
+        return videoBase64;
+    }
+
+    public void setVideoBase64(String videoBase64) {
+        this.videoBase64 = videoBase64;
+    }
+
+    public String getVideoUrl() {
+        return videoUrl;
+    }
+
+    public void setVideoUrl(String videoUrl) {
+        this.videoUrl = videoUrl;
+    }
+
+    public String getVideoFilePath() {
+        return videoFilePath;
+    }
+
+    public void setVideoFilePath(String videoFilePath) {
+        this.videoFilePath = videoFilePath;
+    }
+
+    public String getActions() {
+        return actions;
+    }
+
+    public void setActions(String actions) {
+        this.actions = actions;
+    }
+
+    public String getActionTimes() {
+        return actionTimes;
+    }
+
+    public void setActionTimes(String actionTimes) {
+        this.actionTimes = actionTimes;
+    }
+
+    public FrsClient getFrsClient() {
+        return frsClient;
+    }
+
+    public void setFrsClient(FrsClient frsClient) {
+        this.frsClient = frsClient;
+    }
+
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/FaceRecognitionProducer.java b/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/FaceRecognitionProducer.java
new file mode 100644
index 0000000..dc5f87b
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/FaceRecognitionProducer.java
@@ -0,0 +1,459 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import java.io.*;
+
+import com.huaweicloud.sdk.core.SdkResponse;
+import com.huaweicloud.sdk.core.auth.BasicCredentials;
+import com.huaweicloud.sdk.core.http.HttpConfig;
+import com.huaweicloud.sdk.core.utils.StringUtils;
+import com.huaweicloud.sdk.frs.v2.FrsClient;
+import com.huaweicloud.sdk.frs.v2.model.CompareFaceByBase64Request;
+import com.huaweicloud.sdk.frs.v2.model.CompareFaceByFileRequest;
+import com.huaweicloud.sdk.frs.v2.model.CompareFaceByFileRequestBody;
+import com.huaweicloud.sdk.frs.v2.model.CompareFaceByUrlRequest;
+import com.huaweicloud.sdk.frs.v2.model.DetectFaceByBase64Request;
+import com.huaweicloud.sdk.frs.v2.model.DetectFaceByFileRequest;
+import com.huaweicloud.sdk.frs.v2.model.DetectFaceByFileRequestBody;
+import com.huaweicloud.sdk.frs.v2.model.DetectFaceByUrlRequest;
+import com.huaweicloud.sdk.frs.v2.model.DetectLiveByBase64Request;
+import com.huaweicloud.sdk.frs.v2.model.DetectLiveByFileRequest;
+import com.huaweicloud.sdk.frs.v2.model.DetectLiveByFileRequestBody;
+import com.huaweicloud.sdk.frs.v2.model.DetectLiveByUrlRequest;
+import com.huaweicloud.sdk.frs.v2.model.FaceCompareBase64Req;
+import com.huaweicloud.sdk.frs.v2.model.FaceCompareUrlReq;
+import com.huaweicloud.sdk.frs.v2.model.FaceDetectBase64Req;
+import com.huaweicloud.sdk.frs.v2.model.FaceDetectUrlReq;
+import com.huaweicloud.sdk.frs.v2.model.LiveDetectBase64Req;
+import com.huaweicloud.sdk.frs.v2.model.LiveDetectUrlReq;
+import com.huaweicloud.sdk.frs.v2.region.FrsRegion;
+import org.apache.camel.Exchange;
+import org.apache.camel.component.huaweicloud.frs.constants.FaceRecognitionConstants;
+import org.apache.camel.component.huaweicloud.frs.constants.FaceRecognitionProperties;
+import org.apache.camel.component.huaweicloud.frs.models.ClientConfigurations;
+import org.apache.camel.support.DefaultProducer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class FaceRecognitionProducer extends DefaultProducer {
+    private static final Logger LOG = LoggerFactory.getLogger(FaceRecognitionProducer.class);
+
+    private FrsClient frsClient;
+
+    private FaceRecognitionEndpoint endpoint;
+
+    public FaceRecognitionProducer(FaceRecognitionEndpoint endpoint) {
+        super(endpoint);
+        this.endpoint = endpoint;
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        super.doStart();
+    }
+
+    public void process(Exchange exchange) {
+        ClientConfigurations clientConfigurations = initializeConfigurations(endpoint);
+        if (frsClient == null) {
+            initializeSdkClient(endpoint, clientConfigurations);
+        }
+        String operation = endpoint.getOperation();
+        if (StringUtils.isEmpty(operation)) {
+            throw new IllegalStateException("operation cannot be empty");
+        }
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Performing frs operation: {}", operation);
+        }
+        switch (operation) {
+            case FaceRecognitionConstants.OPERATION_FACE_DETECTION:
+                performFaceDetectionOperation(exchange, clientConfigurations);
+                break;
+            case FaceRecognitionConstants.OPERATION_FACE_VERIFICATION:
+                performFaceVerificationOperation(exchange, clientConfigurations);
+                break;
+            case FaceRecognitionConstants.OPERATION_FACE_LIVE_DETECT:
+                performLiveDetectOperation(exchange, clientConfigurations);
+                break;
+            default:
+                throw new UnsupportedOperationException(
+                        "operation needs to be faceDetection, faceVerification or faceLiveDetection");
+        }
+    }
+
+    /**
+     * initialize clientConfigurations
+     *
+     * @param  endpoint FrsEndpoint
+     * @return          ClientConfigurations
+     */
+    private ClientConfigurations initializeConfigurations(FaceRecognitionEndpoint endpoint) {
+        ClientConfigurations clientConfigurations = new ClientConfigurations();
+        clientConfigurations.setAccessKey(getAccessKey(endpoint));
+        clientConfigurations.setSecretKey(getSecretKey(endpoint));
+        clientConfigurations.setProjectId(getProjectId(endpoint));
+        clientConfigurations.setEndpoint(getEndpoint(endpoint));
+
+        if (StringUtils.isEmpty(endpoint.getOperation())) {
+            throw new IllegalArgumentException("operation needs to be set");
+        }
+        clientConfigurations.setIgnoreSslVerification(endpoint.isIgnoreSslVerification());
+        if (clientConfigurations.isIgnoreSslVerification()) {
+            LOG.warn("SSL verification is ignored. This is unsafe in production environment");
+        }
+        if (!StringUtils.isEmpty(endpoint.getProxyHost())) {
+            clientConfigurations.setProxyHost(endpoint.getProxyHost());
+            clientConfigurations.setProxyPort(endpoint.getProxyPort());
+            clientConfigurations.setProxyUser(endpoint.getProxyUser());
+            clientConfigurations.setProxyPassword(endpoint.getProxyPassword());
+        }
+        return clientConfigurations;
+    }
+
+    /**
+     * initialize frs client. This is lazily initialized on the first message
+     *
+     * @param endpoint             camel frs endpoint
+     * @param clientConfigurations FrsClient configurations
+     */
+    private void initializeSdkClient(FaceRecognitionEndpoint endpoint, ClientConfigurations clientConfigurations) {
+        if (endpoint.getFrsClient() != null) {
+            LOG.info(
+                    "Instance of FrsClient was set on the endpoint. Skip creation of FrsClient from endpoint parameters");
+            this.frsClient = endpoint.getFrsClient();
+            return;
+        }
+        HttpConfig httpConfig
+                = HttpConfig.getDefaultHttpConfig().withIgnoreSSLVerification(clientConfigurations.isIgnoreSslVerification());
+        if (!StringUtils.isEmpty(clientConfigurations.getProxyHost())) {
+            httpConfig.setProxyHost(clientConfigurations.getProxyHost());
+            httpConfig.setProxyPort(clientConfigurations.getProxyPort());
+            if (!StringUtils.isEmpty(clientConfigurations.getProxyUser())) {
+                httpConfig.setProxyUsername(clientConfigurations.getProxyUser());
+                httpConfig.setProxyPassword(clientConfigurations.getProxyPassword());
+            }
+        }
+        BasicCredentials credentials = new BasicCredentials().withAk(clientConfigurations.getAccessKey())
+                .withSk(clientConfigurations.getSecretKey())
+                .withProjectId(clientConfigurations.getProjectId());
+
+        frsClient = FrsClient.newBuilder()
+                .withCredential(credentials)
+                .withHttpConfig(httpConfig)
+                .withEndpoint(clientConfigurations.getEndpoint())
+                .build();
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Successfully initialized FRS client");
+        }
+    }
+
+    /**
+     * detect all faces in an image
+     *
+     * @param exchange camel exchange
+     */
+    private void performFaceDetectionOperation(Exchange exchange, ClientConfigurations clientConfigurations) {
+        updateClientConfigurations(exchange, clientConfigurations);
+        SdkResponse result;
+        if (!StringUtils.isEmpty(clientConfigurations.getImageBase64())) {
+            FaceDetectBase64Req reqBody = new FaceDetectBase64Req().withImageBase64(clientConfigurations.getImageBase64());
+            result = this.frsClient.detectFaceByBase64(new DetectFaceByBase64Request().withBody(reqBody));
+        } else if (!StringUtils.isEmpty(clientConfigurations.getImageUrl())) {
+            FaceDetectUrlReq reqBody = new FaceDetectUrlReq().withImageUrl(clientConfigurations.getImageUrl());
+            result = this.frsClient.detectFaceByUrl(new DetectFaceByUrlRequest().withBody(reqBody));
+        } else {
+            File imageFile = getFile(clientConfigurations.getImageFilePath());
+            DetectFaceByFileRequestBody reqBody;
+            try {
+                reqBody = new DetectFaceByFileRequestBody().withImageFile(new FileInputStream(imageFile), imageFile.getName());
+            } catch (FileNotFoundException e) {
+                throw new IllegalArgumentException(
+                        String.format("Image file not found: %s", clientConfigurations.getImageFilePath()));
+            }
+            result = this.frsClient.detectFaceByFile(new DetectFaceByFileRequest().withBody(reqBody));
+        }
+        exchange.getMessage().setBody(result);
+    }
+
+    /**
+     * compare two faces
+     *
+     * @param exchange camel exchange
+     */
+    private void performFaceVerificationOperation(Exchange exchange, ClientConfigurations clientConfigurations) {
+        updateClientConfigurations(exchange, clientConfigurations);
+
+        SdkResponse result;
+        if (!StringUtils.isEmpty(clientConfigurations.getImageBase64())
+                && !StringUtils.isEmpty(clientConfigurations.getAnotherImageBase64())) {
+            FaceCompareBase64Req reqBody = new FaceCompareBase64Req().withImage1Base64(clientConfigurations.getImageBase64())
+                    .withImage2Base64(clientConfigurations.getAnotherImageBase64());
+            result = this.frsClient.compareFaceByBase64(new CompareFaceByBase64Request().withBody(reqBody));
+        } else if (!StringUtils.isEmpty(clientConfigurations.getImageUrl())
+                && !StringUtils.isEmpty(clientConfigurations.getAnotherImageUrl())) {
+            FaceCompareUrlReq reqBody = new FaceCompareUrlReq().withImage1Url(clientConfigurations.getImageUrl())
+                    .withImage2Url(clientConfigurations.getAnotherImageUrl());
+            result = this.frsClient.compareFaceByUrl(new CompareFaceByUrlRequest().withBody(reqBody));
+        } else {
+            File image1File = getFile(clientConfigurations.getImageFilePath());
+            File image2File = getFile(clientConfigurations.getAnotherImageFilePath());
+            CompareFaceByFileRequestBody reqBody;
+            try {
+                reqBody = new CompareFaceByFileRequestBody()
+                        .withImage1File(new FileInputStream(image1File), image1File.getName())
+                        .withImage2File(new FileInputStream(image2File), image2File.getName());
+            } catch (FileNotFoundException e) {
+                throw new IllegalArgumentException(
+                        String.format("Image file not found: %s", clientConfigurations.getImageFilePath()));
+            }
+            result = this.frsClient.compareFaceByFile(new CompareFaceByFileRequest().withBody(reqBody));
+        }
+        exchange.getMessage().setBody(result);
+    }
+
+    /**
+     * detect alive faces in a video
+     *
+     * @param exchange camel exchange
+     */
+    private void performLiveDetectOperation(Exchange exchange, ClientConfigurations clientConfigurations) {
+        updateClientConfigurations(exchange, clientConfigurations);
+        SdkResponse result;
+        if (!StringUtils.isEmpty(clientConfigurations.getVideoBase64())) {
+            LiveDetectBase64Req reqBody = new LiveDetectBase64Req().withVideoBase64(clientConfigurations.getVideoBase64())
+                    .withActions(clientConfigurations.getActions()).withActionTime(clientConfigurations.getActionTimes());
+            result = this.frsClient.detectLiveByBase64(new DetectLiveByBase64Request().withBody(reqBody));
+        } else if (!StringUtils.isEmpty(clientConfigurations.getVideoUrl())) {
+            LiveDetectUrlReq reqBody = new LiveDetectUrlReq().withVideoUrl(clientConfigurations.getVideoUrl())
+                    .withActions(clientConfigurations.getActions()).withActionTime(clientConfigurations.getActionTimes());
+            result = this.frsClient.detectLiveByUrl(new DetectLiveByUrlRequest().withBody(reqBody));
+        } else {
+            File videoFile = getFile(clientConfigurations.getVideoFilePath());
+            DetectLiveByFileRequestBody reqBody;
+            try {
+                reqBody = new DetectLiveByFileRequestBody().withVideoFile(new FileInputStream(videoFile), videoFile.getName())
+                        .withActions(clientConfigurations.getActions()).withActionTime(clientConfigurations.getActionTimes());
+            } catch (FileNotFoundException e) {
+                throw new IllegalArgumentException(
+                        String.format("Video file not found: %s", clientConfigurations.getImageFilePath()));
+            }
+            result = this.frsClient.detectLiveByFile(new DetectLiveByFileRequest().withBody(reqBody));
+        }
+        exchange.getMessage().setBody(result);
+    }
+
+    private File getFile(String filePath) {
+        File file = new File(filePath);
+        if (!file.exists() || !file.isFile()) {
+            throw new IllegalArgumentException(String.format("File path is invalid: %s", file));
+        }
+        return file;
+    }
+
+    /**
+     * Update dynamic client configurations. Some endpoint parameters (imageContent, imageUrl, tagLanguage, tagLimit and
+     * threshold) can also be passed via exchange properties, so they can be updated between each transaction. Since
+     * they can change, we must clear the previous transaction and update these parameters with their new values
+     *
+     * @param exchange             camel exchange
+     * @param clientConfigurations frs client configurations
+     */
+    private void updateClientConfigurations(Exchange exchange, ClientConfigurations clientConfigurations) {
+        if (FaceRecognitionConstants.OPERATION_FACE_DETECTION.equals(endpoint.getOperation())) {
+            updateFaceDetectionConfigurations(exchange, clientConfigurations);
+        } else if (FaceRecognitionConstants.OPERATION_FACE_VERIFICATION.equals(endpoint.getOperation())) {
+            updateFaceVerificationConfigurations(exchange, clientConfigurations);
+        } else if (FaceRecognitionConstants.OPERATION_FACE_LIVE_DETECT.equals(endpoint.getOperation())) {
+            updateLiveDetectConfigurations(exchange, clientConfigurations);
+        }
+    }
+
+    private void updateFaceDetectionConfigurations(Exchange exchange, ClientConfigurations clientConfigurations) {
+        boolean isImageBase64Set = true;
+        boolean isImageUrlSet = true;
+        boolean isImageFilePathSet = true;
+
+        String imageBase64 = exchange.getProperty(FaceRecognitionProperties.FACE_IMAGE_BASE64, String.class);
+        if (!StringUtils.isEmpty(imageBase64)) {
+            clientConfigurations.setImageBase64(imageBase64);
+        } else if (!StringUtils.isEmpty(this.endpoint.getImageBase64())) {
+            clientConfigurations.setImageBase64(this.endpoint.getImageBase64());
+        } else {
+            isImageBase64Set = false;
+        }
+
+        String imageUrl = exchange.getProperty(FaceRecognitionProperties.FACE_IMAGE_URL, String.class);
+        if (!StringUtils.isEmpty(imageUrl)) {
+            clientConfigurations.setImageUrl(imageUrl);
+        } else if (!StringUtils.isEmpty(this.endpoint.getImageUrl())) {
+            clientConfigurations.setImageUrl(this.endpoint.getImageUrl());
+        } else {
+            isImageUrlSet = false;
+        }
+
+        String imageFilePath = exchange.getProperty(FaceRecognitionProperties.FACE_IMAGE_FILE_PATH, String.class);
+        if (!StringUtils.isEmpty(imageFilePath)) {
+            clientConfigurations.setImageFilePath(imageFilePath);
+        } else if (!StringUtils.isEmpty(this.endpoint.getImageFilePath())) {
+            clientConfigurations.setImageFilePath(this.endpoint.getImageFilePath());
+        } else {
+            isImageFilePathSet = false;
+        }
+        if (!isImageBase64Set && !isImageUrlSet && !isImageFilePathSet) {
+            throw new IllegalArgumentException("any one of image base64, url and filePath needs to be set");
+        }
+    }
+
+    private void updateFaceVerificationConfigurations(Exchange exchange, ClientConfigurations clientConfigurations) {
+        boolean isImageBase64Set = true;
+        boolean isImageUrlSet = true;
+        boolean isImageFilePathSet = true;
+
+        String image1Base64 = exchange.getProperty(FaceRecognitionProperties.FACE_IMAGE_BASE64, String.class);
+        String image2Base64 = exchange.getProperty(FaceRecognitionProperties.ANOTHER_FACE_IMAGE_BASE64, String.class);
+        if (!StringUtils.isEmpty(image1Base64) && !StringUtils.isEmpty(image2Base64)) {
+            clientConfigurations.setImageBase64(image1Base64);
+            clientConfigurations.setAnotherImageBase64(image2Base64);
+        } else if (!StringUtils.isEmpty(this.endpoint.getImageBase64())
+                && !StringUtils.isEmpty(this.endpoint.getAnotherImageBase64())) {
+            clientConfigurations.setImageBase64(this.endpoint.getImageBase64());
+            clientConfigurations.setAnotherImageBase64(this.endpoint.getAnotherImageBase64());
+        } else {
+            isImageBase64Set = false;
+        }
+
+        String image1Url = exchange.getProperty(FaceRecognitionProperties.FACE_IMAGE_URL, String.class);
+        String image2Url = exchange.getProperty(FaceRecognitionProperties.ANOTHER_FACE_IMAGE_URL, String.class);
+        if (!StringUtils.isEmpty(image1Url) && !StringUtils.isEmpty(image2Url)) {
+            clientConfigurations.setImageUrl(image1Url);
+            clientConfigurations.setAnotherImageUrl(image2Url);
+        } else if (!StringUtils.isEmpty(this.endpoint.getImageUrl())
+                && !StringUtils.isEmpty(this.endpoint.getAnotherImageUrl())) {
+            clientConfigurations.setImageUrl(this.endpoint.getImageUrl());
+            clientConfigurations.setAnotherImageUrl(this.endpoint.getAnotherImageUrl());
+        } else {
+            isImageUrlSet = false;
+        }
+
+        String image1FilePath = exchange.getProperty(FaceRecognitionProperties.FACE_IMAGE_FILE_PATH, String.class);
+        String image2FilePath = exchange.getProperty(FaceRecognitionProperties.ANOTHER_FACE_IMAGE_FILE_PATH, String.class);
+        if (!StringUtils.isEmpty(image1FilePath) && !StringUtils.isEmpty(image2FilePath)) {
+            clientConfigurations.setImageFilePath(image1FilePath);
+            clientConfigurations.setAnotherImageFilePath(image2FilePath);
+        } else if (!StringUtils.isEmpty(this.endpoint.getImageFilePath())
+                && !StringUtils.isEmpty(this.endpoint.getAnotherImageFilePath())) {
+            clientConfigurations.setImageFilePath(this.endpoint.getImageFilePath());
+            clientConfigurations.setAnotherImageFilePath(this.endpoint.getAnotherImageFilePath());
+        } else {
+            isImageFilePathSet = false;
+        }
+
+        if (!isImageBase64Set && !isImageUrlSet && !isImageFilePathSet) {
+            throw new IllegalArgumentException("any one of image base64, url and filePath needs to be set");
+        }
+    }
+
+    private void updateLiveDetectConfigurations(Exchange exchange, ClientConfigurations clientConfigurations) {
+        boolean isVideoBase64Set = true;
+        boolean isVideoUrlSet = true;
+        boolean isVideoFilePathSet = true;
+
+        String videoBase64 = exchange.getProperty(FaceRecognitionProperties.FACE_VIDEO_BASE64, String.class);
+        if (!StringUtils.isEmpty(videoBase64)) {
+            clientConfigurations.setVideoBase64(videoBase64);
+        } else if (!StringUtils.isEmpty(this.endpoint.getVideoBase64())) {
+            clientConfigurations.setVideoBase64(this.endpoint.getVideoBase64());
+        } else {
+            isVideoBase64Set = false;
+        }
+
+        String videoUrl = exchange.getProperty(FaceRecognitionProperties.FACE_VIDEO_URL, String.class);
+        if (!StringUtils.isEmpty(videoUrl)) {
+            clientConfigurations.setVideoUrl(videoUrl);
+        } else if (!StringUtils.isEmpty(this.endpoint.getVideoUrl())) {
+            clientConfigurations.setVideoUrl(this.endpoint.getVideoUrl());
+        } else {
+            isVideoUrlSet = false;
+        }
+
+        String videoFilePath = exchange.getProperty(FaceRecognitionProperties.FACE_VIDEO_FILE_PATH, String.class);
+        if (!StringUtils.isEmpty(videoFilePath)) {
+            clientConfigurations.setVideoFilePath(videoFilePath);
+        } else if (!StringUtils.isEmpty(this.endpoint.getVideoFilePath())) {
+            clientConfigurations.setVideoFilePath(this.endpoint.getVideoFilePath());
+        } else {
+            isVideoFilePathSet = false;
+        }
+
+        if (!isVideoBase64Set && !isVideoUrlSet && !isVideoFilePathSet) {
+            throw new IllegalArgumentException("any one of video base64, url and filePath needs to be set");
+        }
+        String actions = exchange.getProperty(FaceRecognitionProperties.FACE_VIDEO_ACTIONS, String.class);
+        if (!StringUtils.isEmpty(actions)) {
+            clientConfigurations.setActions(actions);
+        } else if (!StringUtils.isEmpty(this.endpoint.getActions())) {
+            clientConfigurations.setActions(this.endpoint.getActions());
+        } else {
+            throw new IllegalArgumentException("actions needs to be set");
+        }
+
+        String actionTimes = exchange.getProperty(FaceRecognitionProperties.FACE_VIDEO_ACTION_TIMES, String.class);
+        clientConfigurations.setActionTimes(
+                StringUtils.isEmpty(actionTimes) ? this.endpoint.getActionTimes() : actionTimes);
+
+    }
+
+    private String getAccessKey(FaceRecognitionEndpoint endpoint) {
+        if (!StringUtils.isEmpty(endpoint.getAccessKey())) {
+            return endpoint.getAccessKey();
+        } else if (endpoint.getServiceKeys() != null
+                && !StringUtils.isEmpty(endpoint.getServiceKeys().getAccessKey())) {
+            return endpoint.getServiceKeys().getAccessKey();
+        } else {
+            throw new IllegalArgumentException("authentication parameter access key (AK) not found");
+        }
+    }
+
+    private String getSecretKey(FaceRecognitionEndpoint endpoint) {
+        if (!StringUtils.isEmpty(endpoint.getSecretKey())) {
+            return endpoint.getSecretKey();
+        } else if (endpoint.getServiceKeys() != null
+                && !StringUtils.isEmpty(endpoint.getServiceKeys().getSecretKey())) {
+            return endpoint.getServiceKeys().getSecretKey();
+        } else {
+            throw new IllegalArgumentException("authentication parameter secret key (SK) not found");
+        }
+    }
+
+    private String getProjectId(FaceRecognitionEndpoint endpoint) {
+        if (StringUtils.isEmpty(endpoint.getProjectId())) {
+            throw new IllegalArgumentException("Project id not found");
+        }
+        return endpoint.getProjectId();
+    }
+
+    private String getEndpoint(FaceRecognitionEndpoint endpoint) {
+        if (!StringUtils.isEmpty(endpoint.getEndpoint())) {
+            return endpoint.getEndpoint();
+        }
+        if (StringUtils.isEmpty(endpoint.getRegion())) {
+            throw new IllegalArgumentException("either endpoint or region needs to be set");
+        }
+        return FrsRegion.valueOf(endpoint.getRegion()).getEndpoint();
+    }
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/constants/FaceRecognitionConstants.java b/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/constants/FaceRecognitionConstants.java
new file mode 100644
index 0000000..cd38204
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/constants/FaceRecognitionConstants.java
@@ -0,0 +1,28 @@
+/*
+ * 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.camel.component.huaweicloud.frs.constants;
+
+public interface FaceRecognitionConstants {
+
+    String OPERATION_FACE_DETECTION = "faceDetection";
+
+    String OPERATION_FACE_VERIFICATION = "faceVerification";
+
+    String OPERATION_FACE_LIVE_DETECT = "faceLiveDetection";
+
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/constants/FaceRecognitionProperties.java b/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/constants/FaceRecognitionProperties.java
new file mode 100644
index 0000000..f69cc7c
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/constants/FaceRecognitionProperties.java
@@ -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.
+ */
+package org.apache.camel.component.huaweicloud.frs.constants;
+
+public interface FaceRecognitionProperties {
+    String FACE_IMAGE_BASE64 = "CamelHwCloudFrsImageBase64";
+
+    String FACE_IMAGE_URL = "CamelHwCloudFrsImageUrl";
+
+    String FACE_IMAGE_FILE_PATH = "CamelHwCloudFrsImageFilePath";
+
+    String ANOTHER_FACE_IMAGE_BASE64 = "CamelHwCloudFrsAnotherImageBase64";
+
+    String ANOTHER_FACE_IMAGE_URL = "CamelHwCloudFrsAnotherImageUrl";
+
+    String ANOTHER_FACE_IMAGE_FILE_PATH = "CamelHwCloudFrsAnotherImageFilePath";
+
+    String FACE_VIDEO_BASE64 = "CamelHwCloudFrsVideoBase64";
+
+    String FACE_VIDEO_URL = "CamelHwCloudFrsVideoUrl";
+
+    String FACE_VIDEO_FILE_PATH = "CamelHwCloudFrsVideoFilePath";
+
+    String FACE_VIDEO_ACTIONS = "CamelHwCloudFrsVideoActions";
+
+    String FACE_VIDEO_ACTION_TIMES = "CamelHwCloudFrsVideoActionTimes";
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/models/ClientConfigurations.java b/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/models/ClientConfigurations.java
new file mode 100644
index 0000000..7e1fd83
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/main/java/org/apache/camel/component/huaweicloud/frs/models/ClientConfigurations.java
@@ -0,0 +1,220 @@
+/*
+ * 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.camel.component.huaweicloud.frs.models;
+
+public class ClientConfigurations {
+
+    private String accessKey;
+
+    private String secretKey;
+
+    private String projectId;
+
+    private String proxyHost;
+
+    private int proxyPort;
+
+    private String proxyUser;
+
+    private String proxyPassword;
+
+    private boolean ignoreSslVerification;
+
+    private String endpoint;
+
+    private String imageBase64;
+
+    private String imageUrl;
+
+    private String imageFilePath;
+
+    private String anotherImageBase64;
+
+    private String anotherImageUrl;
+
+    private String anotherImageFilePath;
+
+    private String videoBase64;
+
+    private String videoUrl;
+
+    private String videoFilePath;
+
+    private String actions;
+
+    private String actionTimes;
+
+    public String getAccessKey() {
+        return accessKey;
+    }
+
+    public void setAccessKey(String accessKey) {
+        this.accessKey = accessKey;
+    }
+
+    public String getSecretKey() {
+        return secretKey;
+    }
+
+    public void setSecretKey(String secretKey) {
+        this.secretKey = secretKey;
+    }
+
+    public String getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(String projectId) {
+        this.projectId = projectId;
+    }
+
+    public String getProxyHost() {
+        return proxyHost;
+    }
+
+    public void setProxyHost(String proxyHost) {
+        this.proxyHost = proxyHost;
+    }
+
+    public int getProxyPort() {
+        return proxyPort;
+    }
+
+    public void setProxyPort(int proxyPort) {
+        this.proxyPort = proxyPort;
+    }
+
+    public String getProxyUser() {
+        return proxyUser;
+    }
+
+    public void setProxyUser(String proxyUser) {
+        this.proxyUser = proxyUser;
+    }
+
+    public String getProxyPassword() {
+        return proxyPassword;
+    }
+
+    public void setProxyPassword(String proxyPassword) {
+        this.proxyPassword = proxyPassword;
+    }
+
+    public boolean isIgnoreSslVerification() {
+        return ignoreSslVerification;
+    }
+
+    public void setIgnoreSslVerification(boolean ignoreSslVerification) {
+        this.ignoreSslVerification = ignoreSslVerification;
+    }
+
+    public String getEndpoint() {
+        return endpoint;
+    }
+
+    public void setEndpoint(String endpoint) {
+        this.endpoint = endpoint;
+    }
+
+    public String getImageBase64() {
+        return imageBase64;
+    }
+
+    public void setImageBase64(String imageBase64) {
+        this.imageBase64 = imageBase64;
+    }
+
+    public String getImageUrl() {
+        return imageUrl;
+    }
+
+    public void setImageUrl(String imageUrl) {
+        this.imageUrl = imageUrl;
+    }
+
+    public String getImageFilePath() {
+        return imageFilePath;
+    }
+
+    public void setImageFilePath(String imageFilePath) {
+        this.imageFilePath = imageFilePath;
+    }
+
+    public String getAnotherImageBase64() {
+        return anotherImageBase64;
+    }
+
+    public void setAnotherImageBase64(String anotherImageBase64) {
+        this.anotherImageBase64 = anotherImageBase64;
+    }
+
+    public String getAnotherImageUrl() {
+        return anotherImageUrl;
+    }
+
+    public void setAnotherImageUrl(String anotherImageUrl) {
+        this.anotherImageUrl = anotherImageUrl;
+    }
+
+    public String getAnotherImageFilePath() {
+        return anotherImageFilePath;
+    }
+
+    public void setAnotherImageFilePath(String anotherImageFilePath) {
+        this.anotherImageFilePath = anotherImageFilePath;
+    }
+
+    public String getVideoBase64() {
+        return videoBase64;
+    }
+
+    public void setVideoBase64(String videoBase64) {
+        this.videoBase64 = videoBase64;
+    }
+
+    public String getVideoUrl() {
+        return videoUrl;
+    }
+
+    public void setVideoUrl(String videoUrl) {
+        this.videoUrl = videoUrl;
+    }
+
+    public String getVideoFilePath() {
+        return videoFilePath;
+    }
+
+    public void setVideoFilePath(String videoFilePath) {
+        this.videoFilePath = videoFilePath;
+    }
+
+    public String getActions() {
+        return actions;
+    }
+
+    public void setActions(String actions) {
+        this.actions = actions;
+    }
+
+    public String getActionTimes() {
+        return actionTimes;
+    }
+
+    public void setActionTimes(String actionTimes) {
+        this.actionTimes = actionTimes;
+    }
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceDetectionWithImageBae64AndMockClientTest.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceDetectionWithImageBae64AndMockClientTest.java
new file mode 100644
index 0000000..917ac9d
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceDetectionWithImageBae64AndMockClientTest.java
@@ -0,0 +1,70 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import com.huaweicloud.sdk.frs.v2.model.DetectFaceByBase64Response;
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.huaweicloud.frs.constants.FaceRecognitionProperties;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class FaceDetectionWithImageBae64AndMockClientTest extends CamelTestSupport {
+    TestConfiguration testConfiguration = new TestConfiguration();
+
+    @BindToRegistry("frsClient")
+    FrsClientMock frsClient = new FrsClientMock(null);
+
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:trigger_route")
+                        .setProperty(FaceRecognitionProperties.FACE_IMAGE_BASE64,
+                                constant(testConfiguration.getProperty("imageContent")))
+                        .to("hwcloud-frs:faceDetection?"
+                                + "accessKey=" + testConfiguration.getProperty("accessKey")
+                                + "&secretKey=" + testConfiguration.getProperty("secretKey")
+                                + "&projectId=" + testConfiguration.getProperty("projectId")
+                                + "&region=" + testConfiguration.getProperty("region")
+                                + "&ignoreSslVerification=true"
+                                + "&frsClient=#frsClient")
+                        .log("perform faceDetection successful")
+                        .to("mock:perform_face_detection_result");
+            }
+        };
+    }
+
+    @Test
+    public void testFaceDetection() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:perform_face_detection_result");
+        mock.expectedMinimumMessageCount(1);
+        template.sendBody("direct:trigger_route", "");
+        Exchange responseExchange = mock.getExchanges().get(0);
+
+        mock.assertIsSatisfied();
+
+        assertTrue(responseExchange.getIn().getBody() instanceof DetectFaceByBase64Response);
+        DetectFaceByBase64Response response = (DetectFaceByBase64Response) responseExchange.getIn().getBody();
+        assertEquals(response.getFaces(), MockResult.getFaceDetectionResult());
+    }
+
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceDetectionWithImageBae64Test.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceDetectionWithImageBae64Test.java
new file mode 100644
index 0000000..4db4056
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceDetectionWithImageBae64Test.java
@@ -0,0 +1,71 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import com.huaweicloud.sdk.frs.v2.model.DetectFaceByBase64Response;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.huaweicloud.frs.constants.FaceRecognitionProperties;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class FaceDetectionWithImageBae64Test extends CamelTestSupport {
+    TestConfiguration testConfiguration = new TestConfiguration();
+
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:trigger_route")
+                        .setProperty(FaceRecognitionProperties.FACE_IMAGE_BASE64,
+                                constant(testConfiguration.getProperty("imageBase64")))
+                        .to("hwcloud-frs:faceDetection?"
+                            + "accessKey=" + testConfiguration.getProperty("accessKey")
+                            + "&secretKey=" + testConfiguration.getProperty("secretKey")
+                            + "&projectId=" + testConfiguration.getProperty("projectId")
+                            + "&region=" + testConfiguration.getProperty("region")
+                            + "&ignoreSslVerification=true")
+                        .log("perform faceDetection successful")
+                        .to("mock:perform_face_detection_result");
+            }
+        };
+    }
+
+    /**
+     * Following test cases should be manually enabled to perform test against the actual Huawei Cloud Face Recognition
+     * service with real user credentials. To perform this test, manually comment out the @Disabled annotation and enter
+     * relevant service parameters in the placeholders above (static variables of this test class)
+     *
+     * @throws Exception Exception
+     */
+    @Test
+    @Disabled("Manually comment out this line once you configure service parameters in placeholders above")
+    public void testCelebrityRecognition() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:perform_face_detection_result");
+        mock.expectedMinimumMessageCount(1);
+        template.sendBody("direct:trigger_route", "");
+        Exchange responseExchange = mock.getExchanges().get(0);
+
+        mock.assertIsSatisfied();
+
+        assertTrue(responseExchange.getIn().getBody() instanceof DetectFaceByBase64Response);
+    }
+
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceDetectionWithImageFileAndMockClientTest.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceDetectionWithImageFileAndMockClientTest.java
new file mode 100644
index 0000000..b95e991
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceDetectionWithImageFileAndMockClientTest.java
@@ -0,0 +1,70 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import com.huaweicloud.sdk.frs.v2.model.DetectFaceByFileResponse;
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.huaweicloud.frs.constants.FaceRecognitionProperties;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class FaceDetectionWithImageFileAndMockClientTest extends CamelTestSupport {
+    TestConfiguration testConfiguration = new TestConfiguration();
+
+    @BindToRegistry("frsClient")
+    FrsClientMock frsClient = new FrsClientMock(null);
+
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:trigger_route")
+                        .setProperty(FaceRecognitionProperties.FACE_IMAGE_FILE_PATH,
+                                constant(testConfiguration.getProperty("imageFilePath")))
+                        .to("hwcloud-frs:faceDetection?"
+                            + "accessKey=" + testConfiguration.getProperty("accessKey")
+                            + "&secretKey=" + testConfiguration.getProperty("secretKey")
+                            + "&projectId=" + testConfiguration.getProperty("projectId")
+                            + "&region=" + testConfiguration.getProperty("region")
+                            + "&ignoreSslVerification=true"
+                            + "&frsClient=#frsClient")
+                        .log("perform faceDetection successful")
+                        .to("mock:perform_face_detection_result");
+            }
+        };
+    }
+
+    @Test
+    public void testFaceDetection() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:perform_face_detection_result");
+        mock.expectedMinimumMessageCount(1);
+        template.sendBody("direct:trigger_route", "");
+        Exchange responseExchange = mock.getExchanges().get(0);
+
+        mock.assertIsSatisfied();
+
+        assertTrue(responseExchange.getIn().getBody() instanceof DetectFaceByFileResponse);
+        DetectFaceByFileResponse response = (DetectFaceByFileResponse) responseExchange.getIn().getBody();
+        assertEquals(response.getFaces(), MockResult.getFaceDetectionResult());
+    }
+
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceDetectionWithImageFileTest.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceDetectionWithImageFileTest.java
new file mode 100644
index 0000000..2b776d7
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceDetectionWithImageFileTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import com.huaweicloud.sdk.frs.v2.model.DetectFaceByFileResponse;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.huaweicloud.frs.constants.FaceRecognitionProperties;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class FaceDetectionWithImageFileTest extends CamelTestSupport {
+    TestConfiguration testConfiguration = new TestConfiguration();
+
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:trigger_route")
+                        .setProperty(FaceRecognitionProperties.FACE_IMAGE_FILE_PATH,
+                                constant(testConfiguration.getProperty("imageFilePath")))
+                        .to("hwcloud-frs:faceDetection?"
+                            + "accessKey=" + testConfiguration.getProperty("accessKey")
+                            + "&secretKey=" + testConfiguration.getProperty("secretKey")
+                            + "&projectId=" + testConfiguration.getProperty("projectId")
+                            + "&region=" + testConfiguration.getProperty("region")
+                            + "&ignoreSslVerification=true")
+                        .log("perform faceDetection successful")
+                        .to("mock:perform_face_detection_result");
+            }
+        };
+    }
+
+    /**
+     * Following test cases should be manually enabled to perform test against the actual Huawei Cloud Face Recognition
+     * service with real user credentials. To perform this test, manually comment out the @Disabled annotation and enter
+     * relevant service parameters in the placeholders above (static variables of this test class)
+     *
+     * @throws Exception Exception
+     */
+    @Test
+    @Disabled("Manually comment out this line once you configure service parameters in placeholders above")
+    public void testCelebrityRecognition() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:perform_face_detection_result");
+        mock.expectedMinimumMessageCount(1);
+        template.sendBody("direct:trigger_route", "");
+        Exchange responseExchange = mock.getExchanges().get(0);
+
+        mock.assertIsSatisfied();
+
+        assertTrue(responseExchange.getIn().getBody() instanceof DetectFaceByFileResponse);
+    }
+
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceDetectionWithImageUrlAndMockClientTest.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceDetectionWithImageUrlAndMockClientTest.java
new file mode 100644
index 0000000..c868de7
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceDetectionWithImageUrlAndMockClientTest.java
@@ -0,0 +1,70 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import com.huaweicloud.sdk.frs.v2.model.DetectFaceByUrlResponse;
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.huaweicloud.frs.constants.FaceRecognitionProperties;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class FaceDetectionWithImageUrlAndMockClientTest extends CamelTestSupport {
+    TestConfiguration testConfiguration = new TestConfiguration();
+
+    @BindToRegistry("frsClient")
+    FrsClientMock frsClient = new FrsClientMock(null);
+
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:trigger_route")
+                        .setProperty(FaceRecognitionProperties.FACE_IMAGE_URL,
+                                constant(testConfiguration.getProperty("imageUrl")))
+                        .to("hwcloud-frs:faceDetection?"
+                            + "accessKey=" + testConfiguration.getProperty("accessKey")
+                            + "&secretKey=" + testConfiguration.getProperty("secretKey")
+                            + "&projectId=" + testConfiguration.getProperty("projectId")
+                            + "&region=" + testConfiguration.getProperty("region")
+                            + "&ignoreSslVerification=true"
+                            + "&frsClient=#frsClient")
+                        .log("perform faceDetection successful")
+                        .to("mock:perform_face_detection_result");
+            }
+        };
+    }
+
+    @Test
+    public void testFaceDetection() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:perform_face_detection_result");
+        mock.expectedMinimumMessageCount(1);
+        template.sendBody("direct:trigger_route", "");
+        Exchange responseExchange = mock.getExchanges().get(0);
+
+        mock.assertIsSatisfied();
+
+        assertTrue(responseExchange.getIn().getBody() instanceof DetectFaceByUrlResponse);
+        DetectFaceByUrlResponse response = (DetectFaceByUrlResponse) responseExchange.getIn().getBody();
+        assertEquals(response.getFaces(), MockResult.getFaceDetectionResult());
+    }
+
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceDetectionWithImageUrlTest.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceDetectionWithImageUrlTest.java
new file mode 100644
index 0000000..66f5bef
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceDetectionWithImageUrlTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import com.huaweicloud.sdk.frs.v2.model.DetectFaceByUrlResponse;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.huaweicloud.frs.constants.FaceRecognitionProperties;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class FaceDetectionWithImageUrlTest extends CamelTestSupport {
+    TestConfiguration testConfiguration = new TestConfiguration();
+
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:trigger_route")
+                        .setProperty(FaceRecognitionProperties.FACE_IMAGE_URL,
+                                constant(testConfiguration.getProperty("imageUrl")))
+                        .to("hwcloud-frs:faceDetection?"
+                            + "accessKey=" + testConfiguration.getProperty("accessKey")
+                            + "&secretKey=" + testConfiguration.getProperty("secretKey")
+                            + "&projectId=" + testConfiguration.getProperty("projectId")
+                            + "&region=" + testConfiguration.getProperty("region")
+                            + "&ignoreSslVerification=true")
+                        .log("perform faceDetection successful")
+                        .to("mock:perform_face_detection_result");
+            }
+        };
+    }
+
+    /**
+     * Following test cases should be manually enabled to perform test against the actual Huawei Cloud Face Recognition
+     * service with real user credentials. To perform this test, manually comment out the @Disabled annotation and enter
+     * relevant service parameters in the placeholders above (static variables of this test class)
+     *
+     * @throws Exception Exception
+     */
+    @Test
+    @Disabled("Manually comment out this line once you configure service parameters in placeholders above")
+    public void testCelebrityRecognition() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:perform_face_detection_result");
+        mock.expectedMinimumMessageCount(1);
+        template.sendBody("direct:trigger_route", "");
+        Exchange responseExchange = mock.getExchanges().get(0);
+
+        mock.assertIsSatisfied();
+
+        assertTrue(responseExchange.getIn().getBody() instanceof DetectFaceByUrlResponse);
+    }
+
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceVerificationWithImageBae64AndMockClientTest.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceVerificationWithImageBae64AndMockClientTest.java
new file mode 100644
index 0000000..51d7a9b
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceVerificationWithImageBae64AndMockClientTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import com.huaweicloud.sdk.frs.v2.model.CompareFaceByBase64Response;
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.huaweicloud.frs.constants.FaceRecognitionProperties;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class FaceVerificationWithImageBae64AndMockClientTest extends CamelTestSupport {
+    TestConfiguration testConfiguration = new TestConfiguration();
+
+    @BindToRegistry("frsClient")
+    FrsClientMock frsClient = new FrsClientMock(null);
+
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:trigger_route")
+                        .setProperty(FaceRecognitionProperties.FACE_IMAGE_BASE64,
+                                constant(testConfiguration.getProperty("imageBase64")))
+                        .setProperty(FaceRecognitionProperties.ANOTHER_FACE_IMAGE_BASE64,
+                                constant(testConfiguration.getProperty("anotherImageBase64")))
+                        .to("hwcloud-frs:faceVerification?"
+                            + "accessKey=" + testConfiguration.getProperty("accessKey")
+                            + "&secretKey=" + testConfiguration.getProperty("secretKey")
+                            + "&projectId=" + testConfiguration.getProperty("projectId")
+                            + "&region=" + testConfiguration.getProperty("region")
+                            + "&ignoreSslVerification=true"
+                            + "&frsClient=#frsClient")
+                        .log("perform faceVerification successfully")
+                        .to("mock:perform_face_verification_result");
+            }
+        };
+    }
+
+    @Test
+    public void testFaceVerification() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:perform_face_verification_result");
+        mock.expectedMinimumMessageCount(1);
+        template.sendBody("direct:trigger_route", "");
+        Exchange responseExchange = mock.getExchanges().get(0);
+        mock.assertIsSatisfied();
+
+        assertTrue(responseExchange.getIn().getBody() instanceof CompareFaceByBase64Response);
+        CompareFaceByBase64Response response = (CompareFaceByBase64Response) responseExchange.getIn().getBody();
+        assertEquals(response.getImage1Face(), MockResult.getCompareFaceResult());
+        assertEquals(response.getImage2Face(), MockResult.getCompareFaceResult());
+        assertEquals(response.getSimilarity(), 1.0);
+    }
+
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceVerificationWithImageBae64Test.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceVerificationWithImageBae64Test.java
new file mode 100644
index 0000000..06c1efd
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceVerificationWithImageBae64Test.java
@@ -0,0 +1,73 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import com.huaweicloud.sdk.frs.v2.model.CompareFaceByBase64Response;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.huaweicloud.frs.constants.FaceRecognitionProperties;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class FaceVerificationWithImageBae64Test extends CamelTestSupport {
+    TestConfiguration testConfiguration = new TestConfiguration();
+
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:trigger_route")
+                        .setProperty(FaceRecognitionProperties.FACE_IMAGE_BASE64,
+                                constant(testConfiguration.getProperty("imageBase64")))
+                        .setProperty(FaceRecognitionProperties.ANOTHER_FACE_IMAGE_BASE64,
+                                constant(testConfiguration.getProperty("anotherImageBase64")))
+                        .to("hwcloud-frs:faceVerification?"
+                            + "accessKey=" + testConfiguration.getProperty("accessKey")
+                            + "&secretKey=" + testConfiguration.getProperty("secretKey")
+                            + "&projectId=" + testConfiguration.getProperty("projectId")
+                            + "&region=" + testConfiguration.getProperty("region")
+                            + "&ignoreSslVerification=true")
+                        .log("perform faceVerification successfully")
+                        .to("mock:perform_face_verification_result");
+            }
+        };
+    }
+
+    /**
+     * Following test cases should be manually enabled to perform test against the actual Huawei Cloud Face Recognition
+     * service with real user credentials. To perform this test, manually comment out the @Disabled annotation and enter
+     * relevant service parameters in the placeholders above (static variables of this test class)
+     *
+     * @throws Exception Exception
+     */
+    @Test
+    @Disabled("Manually comment out this line once you configure service parameters in placeholders above")
+    public void testCelebrityRecognition() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:perform_face_verification_result");
+        mock.expectedMinimumMessageCount(1);
+        template.sendBody("direct:trigger_route", "");
+        Exchange responseExchange = mock.getExchanges().get(0);
+
+        mock.assertIsSatisfied();
+
+        assertTrue(responseExchange.getIn().getBody() instanceof CompareFaceByBase64Response);
+    }
+
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceVerificationWithImageFileAndMockClientTest.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceVerificationWithImageFileAndMockClientTest.java
new file mode 100644
index 0000000..ade011d
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceVerificationWithImageFileAndMockClientTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import com.huaweicloud.sdk.frs.v2.model.CompareFaceByFileResponse;
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.huaweicloud.frs.constants.FaceRecognitionProperties;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class FaceVerificationWithImageFileAndMockClientTest extends CamelTestSupport {
+    TestConfiguration testConfiguration = new TestConfiguration();
+
+    @BindToRegistry("frsClient")
+    FrsClientMock frsClient = new FrsClientMock(null);
+
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:trigger_route")
+                        .setProperty(FaceRecognitionProperties.FACE_IMAGE_FILE_PATH,
+                                constant(testConfiguration.getProperty("imageFilePath")))
+                        .setProperty(FaceRecognitionProperties.ANOTHER_FACE_IMAGE_FILE_PATH,
+                                constant(testConfiguration.getProperty("anotherImageFilePath")))
+                        .to("hwcloud-frs:faceVerification?"
+                            + "accessKey=" + testConfiguration.getProperty("accessKey")
+                            + "&secretKey=" + testConfiguration.getProperty("secretKey")
+                            + "&projectId=" + testConfiguration.getProperty("projectId")
+                            + "&region=" + testConfiguration.getProperty("region")
+                            + "&ignoreSslVerification=true"
+                            + "&frsClient=#frsClient")
+                        .log("perform faceVerification successfully")
+                        .to("mock:perform_face_verification_result");
+            }
+        };
+    }
+
+    @Test
+    public void testFaceVerification() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:perform_face_verification_result");
+        mock.expectedMinimumMessageCount(1);
+        template.sendBody("direct:trigger_route", "");
+        Exchange responseExchange = mock.getExchanges().get(0);
+        mock.assertIsSatisfied();
+
+        assertTrue(responseExchange.getIn().getBody() instanceof CompareFaceByFileResponse);
+        CompareFaceByFileResponse response = (CompareFaceByFileResponse) responseExchange.getIn().getBody();
+        assertEquals(response.getImage1Face(), MockResult.getCompareFaceResult());
+        assertEquals(response.getImage2Face(), MockResult.getCompareFaceResult());
+        assertEquals(response.getSimilarity(), 1.0);
+    }
+
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceVerificationWithImageFileTest.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceVerificationWithImageFileTest.java
new file mode 100644
index 0000000..1127001
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceVerificationWithImageFileTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import com.huaweicloud.sdk.frs.v2.model.CompareFaceByFileResponse;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.huaweicloud.frs.constants.FaceRecognitionProperties;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class FaceVerificationWithImageFileTest extends CamelTestSupport {
+    TestConfiguration testConfiguration = new TestConfiguration();
+
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:trigger_route")
+                        .setProperty(FaceRecognitionProperties.FACE_IMAGE_FILE_PATH,
+                                constant(testConfiguration.getProperty("imageFilePath")))
+                        .setProperty(FaceRecognitionProperties.ANOTHER_FACE_IMAGE_FILE_PATH,
+                                constant(testConfiguration.getProperty("anotherImageFilePath")))
+                        .to("hwcloud-frs:faceVerification?"
+                            + "accessKey=" + testConfiguration.getProperty("accessKey")
+                            + "&secretKey=" + testConfiguration.getProperty("secretKey")
+                            + "&projectId=" + testConfiguration.getProperty("projectId")
+                            + "&region=" + testConfiguration.getProperty("region")
+                            + "&ignoreSslVerification=true")
+                        .log("perform faceVerification successfully")
+                        .to("mock:perform_face_verification_result");
+            }
+        };
+    }
+
+    /**
+     * Following test cases should be manually enabled to perform test against the actual Huawei Cloud Face Recognition
+     * service with real user credentials. To perform this test, manually comment out the @Disabled annotation and enter
+     * relevant service parameters in the placeholders above (static variables of this test class)
+     *
+     * @throws Exception Exception
+     */
+    @Test
+    @Disabled("Manually comment out this line once you configure service parameters in placeholders above")
+    public void testCelebrityRecognition() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:perform_face_verification_result");
+        mock.expectedMinimumMessageCount(1);
+        template.sendBody("direct:trigger_route", "");
+        Exchange responseExchange = mock.getExchanges().get(0);
+
+        mock.assertIsSatisfied();
+
+        assertTrue(responseExchange.getIn().getBody() instanceof CompareFaceByFileResponse);
+    }
+
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceVerificationWithImageUrlAndMockClientTest.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceVerificationWithImageUrlAndMockClientTest.java
new file mode 100644
index 0000000..1f2a5da
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceVerificationWithImageUrlAndMockClientTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import com.huaweicloud.sdk.frs.v2.model.CompareFaceByUrlResponse;
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.huaweicloud.frs.constants.FaceRecognitionProperties;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class FaceVerificationWithImageUrlAndMockClientTest extends CamelTestSupport {
+    TestConfiguration testConfiguration = new TestConfiguration();
+
+    @BindToRegistry("frsClient")
+    FrsClientMock frsClient = new FrsClientMock(null);
+
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:trigger_route")
+                        .setProperty(FaceRecognitionProperties.FACE_IMAGE_URL,
+                                constant(testConfiguration.getProperty("imageUrl")))
+                        .setProperty(FaceRecognitionProperties.ANOTHER_FACE_IMAGE_URL,
+                                constant(testConfiguration.getProperty("anotherImageUrl")))
+                        .to("hwcloud-frs:faceVerification?"
+                            + "accessKey=" + testConfiguration.getProperty("accessKey")
+                            + "&secretKey=" + testConfiguration.getProperty("secretKey")
+                            + "&projectId=" + testConfiguration.getProperty("projectId")
+                            + "&region=" + testConfiguration.getProperty("region")
+                            + "&ignoreSslVerification=true"
+                            + "&frsClient=#frsClient")
+                        .log("perform faceVerification successfully")
+                        .to("mock:perform_face_verification_result");
+            }
+        };
+    }
+
+    @Test
+    public void testFaceVerification() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:perform_face_verification_result");
+        mock.expectedMinimumMessageCount(1);
+        template.sendBody("direct:trigger_route", "");
+        Exchange responseExchange = mock.getExchanges().get(0);
+        mock.assertIsSatisfied();
+
+        assertTrue(responseExchange.getIn().getBody() instanceof CompareFaceByUrlResponse);
+        CompareFaceByUrlResponse response = (CompareFaceByUrlResponse) responseExchange.getIn().getBody();
+        assertEquals(response.getImage1Face(), MockResult.getCompareFaceResult());
+        assertEquals(response.getImage2Face(), MockResult.getCompareFaceResult());
+        assertEquals(response.getSimilarity(), 1.0);
+    }
+
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceVerificationWithImageUrlTest.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceVerificationWithImageUrlTest.java
new file mode 100644
index 0000000..7e7a423
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FaceVerificationWithImageUrlTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import com.huaweicloud.sdk.frs.v2.model.CompareFaceByUrlResponse;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.huaweicloud.frs.constants.FaceRecognitionProperties;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class FaceVerificationWithImageUrlTest extends CamelTestSupport {
+    TestConfiguration testConfiguration = new TestConfiguration();
+
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:trigger_route")
+                        .setProperty(FaceRecognitionProperties.FACE_IMAGE_URL,
+                                constant(testConfiguration.getProperty("imageUrl")))
+                        .setProperty(FaceRecognitionProperties.ANOTHER_FACE_IMAGE_URL,
+                                constant(testConfiguration.getProperty("anotherImageUrl")))
+                        .to("hwcloud-frs:faceVerification?"
+                            + "accessKey=" + testConfiguration.getProperty("accessKey")
+                            + "&secretKey=" + testConfiguration.getProperty("secretKey")
+                            + "&projectId=" + testConfiguration.getProperty("projectId")
+                            + "&region=" + testConfiguration.getProperty("region")
+                            + "&ignoreSslVerification=true")
+                        .log("perform faceVerification successfully")
+                        .to("mock:perform_face_verification_result");
+            }
+        };
+    }
+
+    /**
+     * Following test cases should be manually enabled to perform test against the actual Huawei Cloud Face Recognition
+     * service with real user credentials. To perform this test, manually comment out the @Disabled annotation and enter
+     * relevant service parameters in the placeholders above (static variables of this test class)
+     *
+     * @throws Exception Exception
+     */
+    @Test
+    @Disabled("Manually comment out this line once you configure service parameters in placeholders above")
+    public void testCelebrityRecognition() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:perform_face_verification_result");
+        mock.expectedMinimumMessageCount(1);
+        template.sendBody("direct:trigger_route", "");
+        Exchange responseExchange = mock.getExchanges().get(0);
+
+        mock.assertIsSatisfied();
+
+        assertTrue(responseExchange.getIn().getBody() instanceof CompareFaceByUrlResponse);
+    }
+
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FrsClientMock.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FrsClientMock.java
new file mode 100644
index 0000000..2c6ecc5
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/FrsClientMock.java
@@ -0,0 +1,98 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import java.util.*;
+
+import com.huaweicloud.sdk.core.HcClient;
+import com.huaweicloud.sdk.frs.v2.FrsClient;
+import com.huaweicloud.sdk.frs.v2.model.CompareFaceByBase64Request;
+import com.huaweicloud.sdk.frs.v2.model.CompareFaceByBase64Response;
+import com.huaweicloud.sdk.frs.v2.model.CompareFaceByFileRequest;
+import com.huaweicloud.sdk.frs.v2.model.CompareFaceByFileResponse;
+import com.huaweicloud.sdk.frs.v2.model.CompareFaceByUrlRequest;
+import com.huaweicloud.sdk.frs.v2.model.CompareFaceByUrlResponse;
+import com.huaweicloud.sdk.frs.v2.model.DetectFaceByBase64Request;
+import com.huaweicloud.sdk.frs.v2.model.DetectFaceByBase64Response;
+import com.huaweicloud.sdk.frs.v2.model.DetectFaceByFileRequest;
+import com.huaweicloud.sdk.frs.v2.model.DetectFaceByFileResponse;
+import com.huaweicloud.sdk.frs.v2.model.DetectFaceByUrlRequest;
+import com.huaweicloud.sdk.frs.v2.model.DetectFaceByUrlResponse;
+import com.huaweicloud.sdk.frs.v2.model.DetectLiveByBase64Request;
+import com.huaweicloud.sdk.frs.v2.model.DetectLiveByBase64Response;
+import com.huaweicloud.sdk.frs.v2.model.DetectLiveByFileRequest;
+import com.huaweicloud.sdk.frs.v2.model.DetectLiveByFileResponse;
+import com.huaweicloud.sdk.frs.v2.model.DetectLiveByUrlRequest;
+import com.huaweicloud.sdk.frs.v2.model.DetectLiveByUrlResponse;
+
+public class FrsClientMock extends FrsClient {
+    public FrsClientMock(HcClient hcClient) {
+        super(null);
+    }
+
+    @Override
+    public DetectFaceByBase64Response detectFaceByBase64(DetectFaceByBase64Request request) {
+        return new DetectFaceByBase64Response().withFaces(MockResult.getFaceDetectionResult());
+    }
+
+    @Override
+    public DetectFaceByFileResponse detectFaceByFile(DetectFaceByFileRequest request) {
+        return new DetectFaceByFileResponse().withFaces(MockResult.getFaceDetectionResult());
+    }
+
+    @Override
+    public DetectFaceByUrlResponse detectFaceByUrl(DetectFaceByUrlRequest request) {
+        return new DetectFaceByUrlResponse().withFaces(MockResult.getFaceDetectionResult());
+    }
+
+    @Override
+    public CompareFaceByBase64Response compareFaceByBase64(CompareFaceByBase64Request request) {
+        return new CompareFaceByBase64Response().withImage1Face(MockResult.getCompareFaceResult())
+                .withImage2Face(MockResult.getCompareFaceResult()).withSimilarity(1.0);
+    }
+
+    @Override
+    public CompareFaceByUrlResponse compareFaceByUrl(CompareFaceByUrlRequest request) {
+        return new CompareFaceByUrlResponse().withImage1Face(MockResult.getCompareFaceResult())
+                .withImage2Face(MockResult.getCompareFaceResult()).withSimilarity(1.0);
+    }
+
+    @Override
+    public CompareFaceByFileResponse compareFaceByFile(CompareFaceByFileRequest request) {
+        return new CompareFaceByFileResponse().withImage1Face(MockResult.getCompareFaceResult())
+                .withImage2Face(MockResult.getCompareFaceResult()).withSimilarity(1.0);
+    }
+
+    @Override
+    public DetectLiveByBase64Response detectLiveByBase64(DetectLiveByBase64Request request) {
+        return new DetectLiveByBase64Response().withVideoResult(MockResult.getLiveDetectResult())
+                .withWarningList(Collections.emptyList());
+    }
+
+    @Override
+    public DetectLiveByUrlResponse detectLiveByUrl(DetectLiveByUrlRequest request) {
+        return new DetectLiveByUrlResponse().withVideoResult(MockResult.getLiveDetectResult())
+                .withWarningList(Collections.emptyList());
+    }
+
+    @Override
+    public DetectLiveByFileResponse detectLiveByFile(DetectLiveByFileRequest request) {
+        return new DetectLiveByFileResponse().withVideoResult(MockResult.getLiveDetectResult())
+                .withWarningList(Collections.emptyList());
+    }
+
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/LiveDetectionWithVideoBae64AndMockClientTest.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/LiveDetectionWithVideoBae64AndMockClientTest.java
new file mode 100644
index 0000000..7f56bcd
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/LiveDetectionWithVideoBae64AndMockClientTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import com.huaweicloud.sdk.frs.v2.model.DetectLiveByBase64Response;
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.huaweicloud.frs.constants.FaceRecognitionProperties;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class LiveDetectionWithVideoBae64AndMockClientTest extends CamelTestSupport {
+    TestConfiguration testConfiguration = new TestConfiguration();
+
+    @BindToRegistry("frsClient")
+    FrsClientMock frsClient = new FrsClientMock(null);
+
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:trigger_route")
+                        .setProperty(FaceRecognitionProperties.FACE_VIDEO_BASE64,
+                                constant(testConfiguration.getProperty("videoBase64")))
+                        .to("hwcloud-frs:faceLiveDetection?"
+                            + "accessKey=" + testConfiguration.getProperty("accessKey")
+                            + "&secretKey=" + testConfiguration.getProperty("secretKey")
+                            + "&projectId=" + testConfiguration.getProperty("projectId")
+                            + "&region=" + testConfiguration.getProperty("region")
+                            + "&ignoreSslVerification=true"
+                            + "&frsClient=#frsClient")
+                        .log("perform faceLiveDetection successful")
+                        .to("mock:perform_live_detection_result");
+            }
+        };
+    }
+
+    @Test
+    public void testFaceDetection() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:perform_live_detection_result");
+        mock.expectedMinimumMessageCount(1);
+        template.sendBody("direct:trigger_route", "");
+        Exchange responseExchange = mock.getExchanges().get(0);
+
+        mock.assertIsSatisfied();
+
+        assertTrue(responseExchange.getIn().getBody() instanceof DetectLiveByBase64Response);
+        DetectLiveByBase64Response response = (DetectLiveByBase64Response) responseExchange.getIn().getBody();
+        assertEquals(response.getVideoResult(), MockResult.getLiveDetectResult());
+        assertEquals(response.getWarningList().size(), 0);
+    }
+
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/LiveDetectionWithVideoBae64Test.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/LiveDetectionWithVideoBae64Test.java
new file mode 100644
index 0000000..a3ec0e1
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/LiveDetectionWithVideoBae64Test.java
@@ -0,0 +1,71 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import com.huaweicloud.sdk.frs.v2.model.DetectLiveByBase64Response;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.huaweicloud.frs.constants.FaceRecognitionProperties;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class LiveDetectionWithVideoBae64Test extends CamelTestSupport {
+    TestConfiguration testConfiguration = new TestConfiguration();
+
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:trigger_route")
+                        .setProperty(FaceRecognitionProperties.FACE_VIDEO_BASE64,
+                                constant(testConfiguration.getProperty("videoBase64")))
+                        .to("hwcloud-frs:faceLiveDetection?"
+                            + "accessKey=" + testConfiguration.getProperty("accessKey")
+                            + "&secretKey=" + testConfiguration.getProperty("secretKey")
+                            + "&projectId=" + testConfiguration.getProperty("projectId")
+                            + "&region=" + testConfiguration.getProperty("region")
+                            + "&ignoreSslVerification=true")
+                        .log("perform faceLiveDetection successful")
+                        .to("mock:perform_live_detection_result");
+            }
+        };
+    }
+
+    /**
+     * Following test cases should be manually enabled to perform test against the actual Huawei Cloud Face Recognition
+     * service with real user credentials. To perform this test, manually comment out the @Disabled annotation and enter
+     * relevant service parameters in the placeholders above (static variables of this test class)
+     *
+     * @throws Exception Exception
+     */
+    @Test
+    @Disabled("Manually comment out this line once you configure service parameters in placeholders above")
+    public void testCelebrityRecognition() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:perform_live_detection_result");
+        mock.expectedMinimumMessageCount(1);
+        template.sendBody("direct:trigger_route", "");
+        Exchange responseExchange = mock.getExchanges().get(0);
+
+        mock.assertIsSatisfied();
+
+        assertTrue(responseExchange.getIn().getBody() instanceof DetectLiveByBase64Response);
+    }
+
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/LiveDetectionWithVideoFileAndMockClientTest.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/LiveDetectionWithVideoFileAndMockClientTest.java
new file mode 100644
index 0000000..b3def5d
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/LiveDetectionWithVideoFileAndMockClientTest.java
@@ -0,0 +1,70 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import com.huaweicloud.sdk.frs.v2.model.DetectLiveByFileResponse;
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.huaweicloud.frs.constants.FaceRecognitionProperties;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class LiveDetectionWithVideoFileAndMockClientTest extends CamelTestSupport {
+    TestConfiguration testConfiguration = new TestConfiguration();
+
+    @BindToRegistry("frsClient")
+    FrsClientMock frsClient = new FrsClientMock(null);
+
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:trigger_route")
+                        .setProperty(FaceRecognitionProperties.FACE_VIDEO_FILE_PATH,
+                                constant(testConfiguration.getProperty("videoFilePath")))
+                        .to("hwcloud-frs:faceLiveDetection?"
+                            + "accessKey=" + testConfiguration.getProperty("accessKey")
+                            + "&secretKey=" + testConfiguration.getProperty("secretKey")
+                            + "&projectId=" + testConfiguration.getProperty("projectId")
+                            + "&region=" + testConfiguration.getProperty("region")
+                            + "&ignoreSslVerification=true"
+                            + "&frsClient=#frsClient")
+                        .log("perform faceLiveDetection successful")
+                        .to("mock:perform_live_detection_result");
+            }
+        };
+    }
+
+    @Test
+    public void testFaceDetection() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:perform_live_detection_result");
+        mock.expectedMinimumMessageCount(1);
+        template.sendBody("direct:trigger_route", "");
+        Exchange responseExchange = mock.getExchanges().get(0);
+
+        mock.assertIsSatisfied();
+
+        assertTrue(responseExchange.getIn().getBody() instanceof DetectLiveByFileResponse);
+        DetectLiveByFileResponse response = (DetectLiveByFileResponse) responseExchange.getIn().getBody();
+        assertEquals(response.getVideoResult(), MockResult.getLiveDetectResult());
+        assertEquals(response.getWarningList().size(), 0);
+    }
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/LiveDetectionWithVideoFileTest.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/LiveDetectionWithVideoFileTest.java
new file mode 100644
index 0000000..a20584f
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/LiveDetectionWithVideoFileTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import com.huaweicloud.sdk.frs.v2.model.DetectLiveByFileResponse;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.huaweicloud.frs.constants.FaceRecognitionProperties;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class LiveDetectionWithVideoFileTest extends CamelTestSupport {
+    TestConfiguration testConfiguration = new TestConfiguration();
+
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:trigger_route")
+                        .setProperty(FaceRecognitionProperties.FACE_VIDEO_FILE_PATH,
+                                constant(testConfiguration.getProperty("videoFilePath")))
+                        .to("hwcloud-frs:faceLiveDetection?"
+                            + "accessKey=" + testConfiguration.getProperty("accessKey")
+                            + "&secretKey=" + testConfiguration.getProperty("secretKey")
+                            + "&projectId=" + testConfiguration.getProperty("projectId")
+                            + "&region=" + testConfiguration.getProperty("region")
+                            + "&ignoreSslVerification=true")
+                        .log("perform faceLiveDetection successful")
+                        .to("mock:perform_live_detection_result");
+            }
+        };
+    }
+
+    /**
+     * Following test cases should be manually enabled to perform test against the actual Huawei Cloud Face Recognition
+     * service with real user credentials. To perform this test, manually comment out the @Disabled annotation and enter
+     * relevant service parameters in the placeholders above (static variables of this test class)
+     *
+     * @throws Exception Exception
+     */
+    @Test
+    @Disabled("Manually comment out this line once you configure service parameters in placeholders above")
+    public void testCelebrityRecognition() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:perform_live_detection_result");
+        mock.expectedMinimumMessageCount(1);
+        template.sendBody("direct:trigger_route", "");
+        Exchange responseExchange = mock.getExchanges().get(0);
+
+        mock.assertIsSatisfied();
+
+        assertTrue(responseExchange.getIn().getBody() instanceof DetectLiveByFileResponse);
+    }
+
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/LiveDetectionWithVideoUrlAndMockClientTest.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/LiveDetectionWithVideoUrlAndMockClientTest.java
new file mode 100644
index 0000000..7f3e8b3
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/LiveDetectionWithVideoUrlAndMockClientTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import com.huaweicloud.sdk.frs.v2.model.DetectLiveByUrlResponse;
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.huaweicloud.frs.constants.FaceRecognitionProperties;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class LiveDetectionWithVideoUrlAndMockClientTest extends CamelTestSupport {
+    TestConfiguration testConfiguration = new TestConfiguration();
+
+    @BindToRegistry("frsClient")
+    FrsClientMock frsClient = new FrsClientMock(null);
+
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:trigger_route")
+                        .setProperty(FaceRecognitionProperties.FACE_VIDEO_URL,
+                                constant(testConfiguration.getProperty("videoUrl")))
+                        .to("hwcloud-frs:faceLiveDetection?"
+                            + "accessKey=" + testConfiguration.getProperty("accessKey")
+                            + "&secretKey=" + testConfiguration.getProperty("secretKey")
+                            + "&projectId=" + testConfiguration.getProperty("projectId")
+                            + "&region=" + testConfiguration.getProperty("region")
+                            + "&ignoreSslVerification=true"
+                            + "&frsClient=#frsClient")
+                        .log("perform faceLiveDetection successful")
+                        .to("mock:perform_live_detection_result");
+            }
+        };
+    }
+
+    @Test
+    public void testFaceDetection() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:perform_live_detection_result");
+        mock.expectedMinimumMessageCount(1);
+        template.sendBody("direct:trigger_route", "");
+        Exchange responseExchange = mock.getExchanges().get(0);
+
+        mock.assertIsSatisfied();
+
+        assertTrue(responseExchange.getIn().getBody() instanceof DetectLiveByUrlResponse);
+        DetectLiveByUrlResponse response = (DetectLiveByUrlResponse) responseExchange.getIn().getBody();
+        assertEquals(response.getVideoResult(), MockResult.getLiveDetectResult());
+        assertEquals(response.getWarningList().size(), 0);
+    }
+
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/LiveDetectionWithVideoUrlTest.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/LiveDetectionWithVideoUrlTest.java
new file mode 100644
index 0000000..84bfe52
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/LiveDetectionWithVideoUrlTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import com.huaweicloud.sdk.frs.v2.model.DetectLiveByUrlResponse;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.huaweicloud.frs.constants.FaceRecognitionProperties;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class LiveDetectionWithVideoUrlTest extends CamelTestSupport {
+    TestConfiguration testConfiguration = new TestConfiguration();
+
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:trigger_route")
+                        .setProperty(FaceRecognitionProperties.FACE_VIDEO_URL,
+                                constant(testConfiguration.getProperty("videoUrl")))
+                        .to("hwcloud-frs:faceLiveDetection?"
+                            + "accessKey=" + testConfiguration.getProperty("accessKey")
+                            + "&secretKey=" + testConfiguration.getProperty("secretKey")
+                            + "&projectId=" + testConfiguration.getProperty("projectId")
+                            + "&region=" + testConfiguration.getProperty("region")
+                            + "&ignoreSslVerification=true")
+                        .log("perform faceLiveDetection successful")
+                        .to("mock:perform_live_detection_result");
+            }
+        };
+    }
+
+    /**
+     * Following test cases should be manually enabled to perform test against the actual Huawei Cloud Face Recognition
+     * service with real user credentials. To perform this test, manually comment out the @Disabled annotation and enter
+     * relevant service parameters in the placeholders above (static variables of this test class)
+     *
+     * @throws Exception Exception
+     */
+    @Test
+    @Disabled("Manually comment out this line once you configure service parameters in placeholders above")
+    public void testCelebrityRecognition() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:perform_live_detection_result");
+        mock.expectedMinimumMessageCount(1);
+        template.sendBody("direct:trigger_route", "");
+        Exchange responseExchange = mock.getExchanges().get(0);
+
+        mock.assertIsSatisfied();
+
+        assertTrue(responseExchange.getIn().getBody() instanceof DetectLiveByUrlResponse);
+    }
+
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/MockResult.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/MockResult.java
new file mode 100644
index 0000000..ea2832b
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/MockResult.java
@@ -0,0 +1,48 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import java.util.*;
+
+import com.huaweicloud.sdk.frs.v2.model.ActionsList;
+import com.huaweicloud.sdk.frs.v2.model.BoundingBox;
+import com.huaweicloud.sdk.frs.v2.model.CompareFace;
+import com.huaweicloud.sdk.frs.v2.model.DetectFace;
+import com.huaweicloud.sdk.frs.v2.model.LiveDetectRespVideoresult;
+
+public final class MockResult {
+    private MockResult() {
+    }
+
+    public static List<DetectFace> getFaceDetectionResult() {
+        BoundingBox faceBox = new BoundingBox().withWidth(170).withHeight(150).withTopLeftX(30).withTopLeftY(20);
+        return Collections.singletonList(new DetectFace().withBoundingBox(faceBox));
+    }
+
+    public static CompareFace getCompareFaceResult() {
+        BoundingBox faceBox = new BoundingBox().withWidth(170).withHeight(150).withTopLeftX(30).withTopLeftY(20);
+        return new CompareFace().withBoundingBox(faceBox);
+    }
+
+    public static LiveDetectRespVideoresult getLiveDetectResult() {
+        List<ActionsList> actions = new ArrayList<>();
+        actions.add(new ActionsList().withAction(1).withConfidence(0.8));
+        actions.add(new ActionsList().withAction(3).withConfidence(0.9));
+
+        return new LiveDetectRespVideoresult().withAlive(true).withPicture("test_face_picture_base_64").withActions(actions);
+    }
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/TestConfiguration.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/TestConfiguration.java
new file mode 100644
index 0000000..05a08e0
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/TestConfiguration.java
@@ -0,0 +1,65 @@
+/*
+ * 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.camel.component.huaweicloud.frs;
+
+import java.io.*;
+import java.util.*;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TestConfiguration {
+    private static final Logger LOGGER = LoggerFactory.getLogger(TestConfiguration.class.getName());
+
+    private static Map<String, String> propertyMap;
+
+    public TestConfiguration() {
+        initPropertyMap();
+    }
+
+    public void initPropertyMap() {
+        Properties properties = null;
+        if (propertyMap == null) {
+            propertyMap = new HashMap<>();
+            String propertyFileName = "test_configuration.properties";
+            try {
+                properties = new Properties();
+                InputStream inputStream = getClass().getClassLoader().getResourceAsStream(propertyFileName);
+                if (inputStream != null) {
+                    properties.load(inputStream);
+                } else {
+                    throw new FileNotFoundException(
+                            "property file '" + propertyFileName + "' not found in the classpath");
+                }
+
+                for (String key : properties.stringPropertyNames()) {
+                    propertyMap.put(key, properties.getProperty(key));
+                }
+            } catch (Exception e) {
+                LOGGER.error("Cannot load property file {}, reason {}", propertyFileName, e.getMessage());
+            }
+
+        }
+    }
+
+    public String getProperty(String key) {
+        if (propertyMap == null) {
+            initPropertyMap();
+        }
+        return propertyMap.get(key);
+    }
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/constants/FaceRecognitionPropertiesTest.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/constants/FaceRecognitionPropertiesTest.java
new file mode 100644
index 0000000..363d9c8
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/constants/FaceRecognitionPropertiesTest.java
@@ -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.
+ */
+
+package org.apache.camel.component.huaweicloud.frs.constants;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class FaceRecognitionPropertiesTest {
+    @Test
+    public void testPropertyNames() {
+        assertEquals("CamelHwCloudFrsImageBase64", FaceRecognitionProperties.FACE_IMAGE_BASE64);
+        assertEquals("CamelHwCloudFrsImageUrl", FaceRecognitionProperties.FACE_IMAGE_URL);
+        assertEquals("CamelHwCloudFrsImageFilePath", FaceRecognitionProperties.FACE_IMAGE_FILE_PATH);
+        assertEquals("CamelHwCloudFrsAnotherImageBase64", FaceRecognitionProperties.ANOTHER_FACE_IMAGE_BASE64);
+        assertEquals("CamelHwCloudFrsAnotherImageUrl", FaceRecognitionProperties.ANOTHER_FACE_IMAGE_URL);
+        assertEquals("CamelHwCloudFrsAnotherImageFilePath", FaceRecognitionProperties.ANOTHER_FACE_IMAGE_FILE_PATH);
+        assertEquals("CamelHwCloudFrsVideoBase64", FaceRecognitionProperties.FACE_VIDEO_BASE64);
+        assertEquals("CamelHwCloudFrsVideoUrl", FaceRecognitionProperties.FACE_VIDEO_URL);
+        assertEquals("CamelHwCloudFrsVideoFilePath", FaceRecognitionProperties.FACE_VIDEO_FILE_PATH);
+        assertEquals("CamelHwCloudFrsVideoActions", FaceRecognitionProperties.FACE_VIDEO_ACTIONS);
+        assertEquals("CamelHwCloudFrsVideoActionTimes", FaceRecognitionProperties.FACE_VIDEO_ACTION_TIMES);
+    }
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/constants/FrsConstantsTest.java b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/constants/FrsConstantsTest.java
new file mode 100644
index 0000000..4e85baa
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/java/org/apache/camel/component/huaweicloud/frs/constants/FrsConstantsTest.java
@@ -0,0 +1,31 @@
+/*
+ * 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.camel.component.huaweicloud.frs.constants;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class FrsConstantsTest {
+    @Test
+    public void testConstants() {
+        assertEquals("faceDetection", FaceRecognitionConstants.OPERATION_FACE_DETECTION);
+        assertEquals("faceVerification", FaceRecognitionConstants.OPERATION_FACE_VERIFICATION);
+        assertEquals("faceLiveDetection", FaceRecognitionConstants.OPERATION_FACE_LIVE_DETECT);
+    }
+}
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/resources/image_file b/components/camel-huawei/camel-huaweicloud-frs/src/test/resources/image_file
new file mode 100644
index 0000000..bb2e19a
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/resources/image_file
@@ -0,0 +1 @@
+this file is for test
\ No newline at end of file
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/resources/log4j2.properties b/components/camel-huawei/camel-huaweicloud-frs/src/test/resources/log4j2.properties
new file mode 100644
index 0000000..efb7083
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/resources/log4j2.properties
@@ -0,0 +1,28 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+appender.file.type = File
+appender.file.name = file
+appender.file.fileName = target/camel-huaweicloud-frs-test.log
+appender.file.layout.type = PatternLayout
+appender.file.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+appender.stdout.type = Console
+appender.stdout.name = stdout
+appender.stdout.layout.type = PatternLayout
+appender.stdout.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+rootLogger.level = INFO
+rootLogger.appenderRef.file.ref = file
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/resources/test_configuration.properties b/components/camel-huawei/camel-huaweicloud-frs/src/test/resources/test_configuration.properties
new file mode 100644
index 0000000..dffb549
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/resources/test_configuration.properties
@@ -0,0 +1,31 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+## Test configurations
+accessKey=test_access_key
+secretKey=test_secret_key
+projectId=9071a38e7f6a4ba7b7bcbeb7d4ea6efc
+region=cn-north-4
+endpoint=test_endpoint
+imageBase64=FSZPNS01T09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0//wAARCA57PwAycDAS
+imageUrl=http://image1_url
+imageFilePath=image_file
+anotherImageBase64=FSZPNS01T09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0//wAARCA57PwAycDAS
+anotherImageUrl=http://image2_url
+anotherImageFilePath=image_file
+videoBase64=FSZPNS01T09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0//wAARCA57PwAycDAS
+videoUrl=http://image1_url
+videoFilePath=video_file
\ No newline at end of file
diff --git a/components/camel-huawei/camel-huaweicloud-frs/src/test/resources/video_file b/components/camel-huawei/camel-huaweicloud-frs/src/test/resources/video_file
new file mode 100644
index 0000000..bb2e19a
--- /dev/null
+++ b/components/camel-huawei/camel-huaweicloud-frs/src/test/resources/video_file
@@ -0,0 +1 @@
+this file is for test
\ No newline at end of file
diff --git a/components/camel-huawei/pom.xml b/components/camel-huawei/pom.xml
index d993b1e..5d0481d 100644
--- a/components/camel-huawei/pom.xml
+++ b/components/camel-huawei/pom.xml
@@ -41,6 +41,7 @@
         <module>camel-huaweicloud-imagerecognition</module>
 	    <module>camel-huaweicloud-obs</module>
         <module>camel-huaweicloud-smn</module>
+        <module>camel-huaweicloud-frs</module>
     </modules>
 
 </project>
diff --git a/parent/pom.xml b/parent/pom.xml
index 605dcae..468c306 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -1595,6 +1595,11 @@
 			</dependency>
 			<dependency>
 				<groupId>org.apache.camel</groupId>
+				<artifactId>camel-huaweicloud-frs</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.camel</groupId>
 				<artifactId>camel-huaweicloud-functiongraph</artifactId>
 				<version>${project.version}</version>
 			</dependency>