blob: d8d4b2652099886f911520ae299a80f214236c1a [file] [log] [blame]
#!/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"