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

mssun pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/incubator-teaclave.git


The following commit(s) were added to refs/heads/develop by this push:
     new 6b91c73  [tests] Add End-to-End echo function test (#253)
6b91c73 is described below

commit 6b91c734605850c9af9dedd8aa918306b8b09f2d
Author: Zhaofeng Chen <[email protected]>
AuthorDate: Fri Mar 27 14:00:00 2020 -0700

    [tests] Add End-to-End echo function test (#253)
---
 cmake/scripts/test.sh                              |   2 +
 services/execution/enclave/src/service.rs          |  19 ++--
 services/management/enclave/src/service.rs         |  16 +++
 .../src/proto/teaclave_frontend_service.proto      |   4 +-
 services/proto/src/teaclave_frontend_service.rs    |   6 +
 tests/functional/enclave/src/end_to_end.rs         | 121 +++++++++++++++++++++
 tests/functional/enclave/src/lib.rs                |   2 +
 types/src/task.rs                                  |   2 +-
 8 files changed, 160 insertions(+), 12 deletions(-)

diff --git a/cmake/scripts/test.sh b/cmake/scripts/test.sh
index c9ef7e8..a4ee77a 100755
--- a/cmake/scripts/test.sh
+++ b/cmake/scripts/test.sh
@@ -97,6 +97,8 @@ run_functional_tests() {
 
   ./teaclave_functional_tests -t execution_service
 
+  ./teaclave_functional_tests -t end_to_end
+
   # Run script tests
   ./scripts/functional_tests.py -v
 
diff --git a/services/execution/enclave/src/service.rs 
b/services/execution/enclave/src/service.rs
index 86fa19b..829a7c9 100644
--- a/services/execution/enclave/src/service.rs
+++ b/services/execution/enclave/src/service.rs
@@ -27,7 +27,6 @@ use teaclave_types::{ExecutionResult, StagedFunction, 
StagedTask, TaskStatus};
 use teaclave_worker::Worker;
 
 use anyhow::Result;
-use log::debug;
 use uuid::Uuid;
 
 #[derive(Clone)]
@@ -64,7 +63,7 @@ impl TeaclaveExecutionService {
             let mut client = match scheduler_client.lock() {
                 Ok(client) => client,
                 Err(e) => {
-                    log::error!("Error: {:?}", e);
+                    log::error!("Start Error: {:?}", e);
                     continue;
                 }
             };
@@ -74,7 +73,7 @@ impl TeaclaveExecutionService {
             let response = match client.pull_task(request) {
                 Ok(response) => response,
                 Err(e) => {
-                    log::error!("Error: {:?}", e);
+                    log::error!("PullTask Error: {:?}", e);
                     continue;
                 }
             };
@@ -83,18 +82,18 @@ impl TeaclaveExecutionService {
             log::debug!("response: {:?}", response);
             let staged_task = response.staged_task;
             let result = self.invoke_task(&staged_task).unwrap();
-            debug!("result: {:?}", result);
+            log::debug!("result: {:?}", result);
             match self.update_task_status(&staged_task.task_id, 
TaskStatus::Finished) {
                 Ok(_) => (),
                 Err(e) => {
-                    log::error!("Error: {:?}", e);
+                    log::error!("UpdateTask Error: {:?}", e);
                     continue;
                 }
             }
             match self.update_task_result(&staged_task.task_id, result) {
                 Ok(_) => (),
                 Err(e) => {
-                    log::error!("Error: {:?}", e);
+                    log::error!("UpdateResult Error: {:?}", e);
                     continue;
                 }
             }
@@ -102,12 +101,12 @@ impl TeaclaveExecutionService {
     }
 
     fn invoke_task(&mut self, task: &StagedTask) -> Result<ExecutionResult> {
-        debug!("invoke_task");
+        log::debug!("invoke_task");
         self.update_task_status(&task.task_id, TaskStatus::Running)?;
         let invocation = prepare_task(&task);
         let worker = Worker::default();
         let summary = worker.invoke_function(invocation)?;
-        debug!("summary: {:?}", summary);
+        log::debug!("summary: {:?}", summary);
         finalize_task(&task)?;
         let mut result = ExecutionResult::default();
         result.return_value = summary.as_bytes().to_vec();
@@ -116,7 +115,7 @@ impl TeaclaveExecutionService {
     }
 
     fn update_task_result(&mut self, task_id: &Uuid, result: ExecutionResult) 
-> Result<()> {
-        debug!("update_task_result");
+        log::debug!("update_task_result");
         let request = UpdateTaskResultRequest::new(
             task_id.to_owned(),
             &result.return_value,
@@ -133,7 +132,7 @@ impl TeaclaveExecutionService {
     }
 
     fn update_task_status(&mut self, task_id: &Uuid, task_status: TaskStatus) 
-> Result<()> {
-        debug!("update_task_status");
+        log::debug!("update_task_status");
         let request = UpdateTaskStatusRequest::new(task_id.to_owned(), 
task_status);
         let _response = self
             .scheduler_client
diff --git a/services/management/enclave/src/service.rs 
b/services/management/enclave/src/service.rs
index 081b9a3..425a71d 100644
--- a/services/management/enclave/src/service.rs
+++ b/services/management/enclave/src/service.rs
@@ -343,6 +343,9 @@ impl TeaclaveManagement for TeaclaveManagementService {
             request.output_data_owner_list,
         )
         .map_err(|_| TeaclaveManagementError::BadTask)?;
+
+        log::info!("CreateTask: {:?}", task);
+
         self.write_to_db(&task)
             .map_err(|_| TeaclaveManagementError::StorageError)?;
         Ok(CreateTaskResponse {
@@ -384,6 +387,8 @@ impl TeaclaveManagement for TeaclaveManagementService {
             approved_user_list: task.approved_user_list,
             input_map: task.input_map,
             output_map: task.output_map,
+            return_value: task.return_value,
+            output_file_hash: task.output_file_hash,
             status: task.status,
         };
         Ok(response)
@@ -484,6 +489,9 @@ impl TeaclaveManagement for TeaclaveManagementService {
         }
         task.approved_user_list.insert(user_id);
         try_update_task_to_approved_status(&mut task);
+
+        log::info!("ApproveTask: try approve:{:?}", task);
+
         self.write_to_db(&task)
             .map_err(|_| TeaclaveManagementError::StorageError)?;
         Ok(ApproveTaskResponse)
@@ -506,10 +514,13 @@ impl TeaclaveManagement for TeaclaveManagementService {
             Task::match_prefix(&request.task_id),
             TeaclaveManagementError::PermissionDenied
         );
+
         let mut task: Task = self
             .read_from_db(request.task_id.as_bytes())
             .map_err(|_| TeaclaveManagementError::PermissionDenied)?;
 
+        log::info!("InvokeTask: get task: {:?}", task);
+
         ensure!(
             task.creator == user_id,
             TeaclaveManagementError::PermissionDenied
@@ -526,6 +537,8 @@ impl TeaclaveManagement for TeaclaveManagementService {
             .read_from_db(task.function_id.as_bytes())
             .map_err(|_| TeaclaveManagementError::PermissionDenied)?;
 
+        log::info!("InvokeTask: get function: {:?}", function);
+
         let function_arguments = task.function_arguments.clone();
         let mut input_map: HashMap<String, FunctionInputFile> = HashMap::new();
         let mut output_map: HashMap<String, FunctionOutputFile> = 
HashMap::new();
@@ -567,6 +580,9 @@ impl TeaclaveManagement for TeaclaveManagementService {
             .output_data(output_map);
         self.enqueue_to_db(StagedTask::get_queue_key().as_bytes(), 
&staged_task)?;
         task.status = TaskStatus::Running;
+
+        log::info!("InvokeTask: staged task: {:?}", task);
+
         self.write_to_db(&task)
             .map_err(|_| TeaclaveManagementError::StorageError)?;
         Ok(InvokeTaskResponse)
diff --git a/services/proto/src/proto/teaclave_frontend_service.proto 
b/services/proto/src/proto/teaclave_frontend_service.proto
index 0ecbce2..b85bc33 100644
--- a/services/proto/src/proto/teaclave_frontend_service.proto
+++ b/services/proto/src/proto/teaclave_frontend_service.proto
@@ -133,7 +133,9 @@ message GetTaskResponse {
   repeated string approved_user_list = 9;
   repeated DataMap input_map = 10;
   repeated DataMap output_map = 11;
-  teaclave_common_proto.TaskStatus status = 12;
+  bytes return_value = 12;
+  map<string, string> output_file_hash = 13;
+  teaclave_common_proto.TaskStatus status = 14;
 }
 
 message AssignDataRequest {
diff --git a/services/proto/src/teaclave_frontend_service.rs 
b/services/proto/src/teaclave_frontend_service.rs
index 2bb0e27..29c47e4 100644
--- a/services/proto/src/teaclave_frontend_service.rs
+++ b/services/proto/src/teaclave_frontend_service.rs
@@ -329,6 +329,8 @@ pub struct GetTaskResponse {
     pub approved_user_list: HashSet<String>,
     pub input_map: HashMap<String, String>,
     pub output_map: HashMap<String, String>,
+    pub return_value: Option<Vec<u8>>,
+    pub output_file_hash: HashMap<String, String>,
     pub status: TaskStatus,
 }
 
@@ -974,6 +976,8 @@ impl std::convert::TryFrom<proto::GetTaskResponse> for 
GetTaskResponse {
             approved_user_list: proto.approved_user_list.into_iter().collect(),
             input_map,
             output_map,
+            return_value: Some(proto.return_value),
+            output_file_hash: proto.output_file_hash,
             status,
         };
 
@@ -1001,6 +1005,8 @@ impl From<GetTaskResponse> for proto::GetTaskResponse {
             approved_user_list: 
response.approved_user_list.into_iter().collect(),
             input_map,
             output_map,
+            return_value: response.return_value.unwrap_or_default(),
+            output_file_hash: response.output_file_hash,
             status,
         }
     }
diff --git a/tests/functional/enclave/src/end_to_end.rs 
b/tests/functional/enclave/src/end_to_end.rs
new file mode 100644
index 0000000..918e3de
--- /dev/null
+++ b/tests/functional/enclave/src/end_to_end.rs
@@ -0,0 +1,121 @@
+use std::collections::HashMap;
+use std::prelude::v1::*;
+use teaclave_attestation::verifier;
+use teaclave_config::RuntimeConfig;
+use teaclave_config::BUILD_CONFIG;
+use teaclave_proto::teaclave_authentication_service::*;
+use teaclave_proto::teaclave_common::*;
+use teaclave_proto::teaclave_frontend_service::*;
+use teaclave_rpc::config::SgxTrustedTlsClientConfig;
+use teaclave_rpc::endpoint::Endpoint;
+use teaclave_types::*;
+
+pub fn run_tests() -> bool {
+    use teaclave_test_utils::*;
+
+    run_tests!(test_echo_task,)
+}
+
+fn get_credential() -> UserCredential {
+    let runtime_config = 
RuntimeConfig::from_toml("runtime.config.toml").expect("runtime");
+    let enclave_info =
+        
EnclaveInfo::from_bytes(&runtime_config.audit.enclave_info_bytes.as_ref().unwrap());
+    let enclave_attr = enclave_info
+        .get_enclave_attr("teaclave_authentication_service")
+        .expect("authentication");
+    let config = SgxTrustedTlsClientConfig::new().attestation_report_verifier(
+        vec![enclave_attr],
+        BUILD_CONFIG.as_root_ca_cert,
+        verifier::universal_quote_verifier,
+    );
+    let channel = Endpoint::new("localhost:7776")
+        .config(config)
+        .connect()
+        .unwrap();
+    let mut api_client = 
TeaclaveAuthenticationApiClient::new(channel).unwrap();
+
+    let request = UserRegisterRequest::new("frontend_user", "test_password");
+    let _response_result = api_client.user_register(request);
+
+    let request = UserLoginRequest::new("frontend_user", "test_password");
+    let response_result = api_client.user_login(request);
+    assert!(response_result.is_ok());
+    UserCredential::new("frontend_user", response_result.unwrap().token)
+}
+
+fn get_frontend_client() -> TeaclaveFrontendClient {
+    let user_credential = get_credential();
+    let runtime_config = 
RuntimeConfig::from_toml("runtime.config.toml").expect("runtime");
+    let port = &runtime_config.api_endpoints.frontend.listen_address.port();
+    let channel = Endpoint::new(&format!("localhost:{}", port))
+        .connect()
+        .unwrap();
+
+    let mut metadata = HashMap::new();
+    metadata.insert("id".to_string(), user_credential.id);
+    metadata.insert("token".to_string(), user_credential.token);
+
+    TeaclaveFrontendClient::new_with_metadata(channel, metadata).unwrap()
+}
+
+fn test_echo_task() {
+    let mut client = get_frontend_client();
+
+    let request = RegisterFunctionRequest {
+        name: "echo".to_string(),
+        description: "Native Echo Function".to_string(),
+        payload: vec![],
+        is_public: true,
+        arg_list: vec!["message".to_string()],
+        input_list: vec![],
+        output_list: vec![],
+    };
+    let response = client.register_function(request).unwrap();
+
+    log::info!("Resgister function: {:?}", response);
+
+    let function_id = response.function_id;
+    let function_arguments = FunctionArguments::new(hashmap!("message" => 
"Hello From Teaclave!"));
+    let request = CreateTaskRequest {
+        function_id,
+        function_arguments,
+        input_data_owner_list: HashMap::new(),
+        output_data_owner_list: HashMap::new(),
+    };
+    let response = client.create_task(request).unwrap();
+
+    log::info!("Create task: {:?}", response);
+
+    let task_id = response.task_id;
+    let request = AssignDataRequest {
+        task_id: task_id.clone(),
+        input_map: HashMap::new(),
+        output_map: HashMap::new(),
+    };
+    let response = client.assign_data(request).unwrap();
+
+    log::info!("Assign data: {:?}", response);
+
+    let request = ApproveTaskRequest::new(&task_id);
+    let response = client.approve_task(request).unwrap();
+
+    log::info!("Approve task: {:?}", response);
+
+    let request = InvokeTaskRequest::new(&task_id);
+    let response = client.invoke_task(request).unwrap();
+
+    log::info!("Invoke task: {:?}", response);
+
+    loop {
+        let request = GetTaskRequest::new(&task_id);
+        let response = client.get_task(request).unwrap();
+        log::info!("Get task: {:?}", response);
+        std::thread::sleep(std::time::Duration::from_secs(1));
+        if response.status != TaskStatus::Running {
+            let ret_val = 
String::from_utf8(response.return_value.unwrap()).unwrap();
+            log::info!("Task returns: {:?}", ret_val);
+            assert_eq!(&ret_val, "Hello From Teaclave!");
+            break;
+        }
+    }
+}
diff --git a/tests/functional/enclave/src/lib.rs 
b/tests/functional/enclave/src/lib.rs
index 5476e03..24a0a40 100644
--- a/tests/functional/enclave/src/lib.rs
+++ b/tests/functional/enclave/src/lib.rs
@@ -37,6 +37,7 @@ use teaclave_types::TeeServiceResult;
 
 mod access_control_service;
 mod authentication_service;
+mod end_to_end;
 mod execution_service;
 mod frontend_service;
 mod management_service;
@@ -66,6 +67,7 @@ fn handle_run_test(input: &RunTestInput) -> 
TeeServiceResult<RunTestOutput> {
         ),
         ("scheduler_service", Box::new(scheduler_service::run_tests)),
         ("execution_service", Box::new(execution_service::run_tests)),
+        ("end_to_end", Box::new(end_to_end::run_tests)),
     ];
     let test_map: HashMap<_, BoxedFnTest> =
         v.into_iter().map(|(k, v)| (k.to_string(), v)).collect();
diff --git a/types/src/task.rs b/types/src/task.rs
index a16a5e2..5778de0 100644
--- a/types/src/task.rs
+++ b/types/src/task.rs
@@ -37,7 +37,7 @@ pub enum TaskStatus {
     Finished,
 }
 
-const TASK_PREFIX: &str = "task-";
+const TASK_PREFIX: &str = "task";
 
 #[derive(Debug, Deserialize, Serialize)]
 pub struct Task {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to