| #!/usr/bin/expect -f |
| |
| # 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. |
| |
| # Expect script for OP-TEE CI Test |
| # |
| # This script starts QEMU, loads and boots Linux/OP-TEE, then runs |
| # Rust applications in the guest. The return code is 0 for success, |
| # >0 for error. |
| # It is invoked in OP-TEE/build/qemu_v8.mk and can be triggered by |
| # "$ cd OPTEE_DIR/build && make CFG_TEE_CORE_LOG_LEVEL=0 check-rust" |
| |
| set bios "../out/bios-qemu/bios.bin" |
| set quiet 0 |
| set timeout 900 |
| |
| # Parse command line |
| set myargs $argv |
| while {[llength $myargs]} { |
| set myargs [lassign $myargs arg] |
| switch -exact -- $arg { |
| "--bios" {set myargs [lassign $myargs ::bios]} |
| "--timeout" {set myargs [lassign $myargs ::timeout]} |
| "-q" {set ::quiet 1} |
| } |
| } |
| |
| proc info arg { |
| if {$::quiet==1} { return } |
| puts -nonewline $arg |
| flush stdout |
| } |
| |
| # Disable echoing of guest output |
| log_user 0 |
| # Save guest console output to a file |
| log_file -a -noappend "serial0.log" |
| info "Starting QEMU...\n" |
| open "serial1.log" "w+" |
| spawn -open [open "|tail -f serial1.log"] |
| set teecore $spawn_id |
| if {[string first "aarch64" $::env(QEMU)] != -1} { |
| spawn $::env(QEMU) -nographic -serial mon:stdio -serial file:serial1.log -smp $::env(QEMU_SMP) -machine virt,secure=on,gic-version=$::env(QEMU_GIC) -cpu cortex-a57 -d unimp -semihosting-config enable=on,target=native -m $::env(QEMU_MEM) -bios bl1.bin -initrd rootfs.cpio.gz -kernel Image -no-acpi -append "console=ttyAMA0,38400 keep_bootcon root=/dev/vda2" |
| } else { |
| spawn $::env(QEMU) -nographic -monitor none -machine virt -machine secure=on -cpu cortex-a15 -smp $::env(QEMU_SMP) -d unimp -semihosting-config enable=on,target=native -m 1057 -serial stdio -serial file:serial1.log -bios $bios |
| } |
| expect { |
| "Kernel panic" { |
| info "!!! Kernel panic\n" |
| exit 1 |
| } |
| timeout { |
| info "!!! Timeout\n" |
| exit 1 |
| } |
| "ogin:" |
| } |
| send -- "root\r\r" |
| expect "# " |
| info " done, guest is booted" |
| info ".\n" |
| |
| # Test Rust applications |
| info "Test Rust applications:\n" |
| info "Running acipher-rs...\n" |
| send -- "acipher-rs 256 teststring\r" |
| expect { |
| -re "Success decrypt the above ciphertext as (\\d+) bytes plain text:" { |
| info "Test success\n" |
| } |
| timeout { |
| info "!!! Timeout: Test failed\n" |
| exit 1 |
| } |
| } |
| |
| expect "# " |
| info "Running aes-rs...\n" |
| send -- "aes-rs\r" |
| expect { |
| -re "Prepare encode operation.*Encode buffer from TA.*Clear text and decoded text match" { |
| info "Test success\n" |
| } |
| timeout { |
| info "!!! Timeout: Test failed\n" |
| exit 1 |
| } |
| } |
| |
| expect "# " |
| info "Running authentication-rs...\n" |
| send -- "authentication-rs\r" |
| expect { |
| -re "Clear text and decoded text match.*Success" { |
| info "Test success\n" |
| } |
| timeout { |
| info "!!! Timeout: Test failed\n" |
| exit 1 |
| } |
| } |
| |
| expect "# " |
| info "Running big_int-rs...\n" |
| send -- "big_int-rs\r" |
| expect { |
| "Success" { |
| info "Test success\n" |
| } |
| timeout { |
| info "!!! Timeout: Test failed\n" |
| exit 1 |
| } |
| } |
| |
| expect "# " |
| info "Running diffie_hellman-rs...\n" |
| send -- "diffie_hellman-rs\r" |
| expect { |
| -re "get key (\\d+) pair as public:.*private.*Derived share key as.*Success" { |
| info "Test success\n" |
| } |
| timeout { |
| info "!!! Timeout: Test failed\n" |
| exit 1 |
| } |
| } |
| |
| expect "# " |
| info "Running digest-rs...\n" |
| send -- "digest-rs message1 message2\r" |
| expect { |
| -re "Get message hash as:.*Success" { |
| info "Test success\n" |
| } |
| timeout { |
| info "!!! Timeout: Test failed\n" |
| exit 1 |
| } |
| } |
| |
| expect "# " |
| info "Running hello_world-rs...\n" |
| send -- "hello_world-rs\r" |
| expect { |
| -re "original value is 29.*inc value is 129.*dec value is 29.*Success" { |
| info "Test success\n" |
| } |
| timeout { |
| info "!!! Timeout: Test failed\n" |
| exit 1 |
| } |
| } |
| |
| expect "# " |
| info "Running hotp-rs...\n" |
| send -- "hotp-rs\r" |
| expect { |
| -re "Get HOTP.*Success" { |
| info "Test success\n" |
| } |
| timeout { |
| info "!!! Timeout: Test failed\n" |
| exit 1 |
| } |
| } |
| |
| expect "# " |
| info "Running message_passing_interface-rs...\n" |
| send -- "message_passing_interface-rs\r" |
| expect { |
| -re "Hello, World" { |
| info "Test success\n" |
| } |
| timeout { |
| info "!!! Timeout: Test failed\n" |
| exit 1 |
| } |
| } |
| |
| expect "# " |
| info "Running random-rs...\n" |
| send -- "random-rs\r" |
| expect { |
| -re "Generate random UUID: \[a-z0-9]*-\[a-z0-9]*-\[a-z0-9]*-\[a-z0-9]*.*Success" { |
| info "Test success\n" |
| } |
| timeout { |
| info "!!! Timeout: Test failed\n" |
| exit 1 |
| } |
| } |
| |
| expect "# " |
| info "Running secure_storage-rs...\n" |
| send -- "secure_storage-rs\r" |
| expect { |
| -re "We're done, close and release TEE resources" { |
| info "Test success\n" |
| } |
| timeout { |
| info "!!! Timeout: Test failed\n" |
| exit 1 |
| } |
| } |
| |
| expect "# " |
| info "Running serde-rs...\n" |
| send -- "serde-rs\r" |
| expect { |
| "Success" { |
| info "Test success\n" |
| } |
| timeout { |
| info "!!! Timeout: Test failed\n" |
| exit 1 |
| } |
| } |
| |
| expect "# " |
| info "Running supp_plugin-rs...\n" |
| send -- "supp_plugin-rs\r" |
| expect { |
| -re "invoke commmand finished" { |
| info "Test success\n" |
| } |
| timeout { |
| info "!!! Timeout: Test failed\n" |
| exit 1 |
| } |
| } |
| |
| expect "# " |
| info "Running tcp_client-rs...\n" |
| send -- "tcp_client-rs\r" |
| expect { |
| "Success" { |
| info "Test success\n" |
| } |
| timeout { |
| info "!!! Timeout: Test failed\n" |
| exit 1 |
| } |
| } |
| |
| expect "# " |
| info "Running time-rs...\n" |
| send -- "time-rs\r" |
| expect { |
| "Success" { |
| info "Test success\n" |
| } |
| timeout { |
| info "!!! Timeout: Test failed\n" |
| exit 1 |
| } |
| } |
| |
| expect "# " |
| info "Running udp_socket-rs...\n" |
| send -- "udp_socket-rs\r" |
| expect { |
| "Success" { |
| info "Test success\n" |
| } |
| timeout { |
| info "!!! Timeout: Test failed\n" |
| exit 1 |
| } |
| } |
| |
| expect "# " |
| info "Running signature_verification-rs...\n" |
| send -- "signature_verification-rs\r" |
| expect { |
| "Success" { |
| info "Test success\n" |
| } |
| timeout { |
| info "!!! Timeout: Test failed\n" |
| exit 1 |
| } |
| } |
| |
| info "Test Rust application finished\n" |