#!/usr/bin/expect -f
#
#  Copyright (c) 2020, The OpenThread Authors.
#  All rights reserved.
#
#  Redistribution and use in source and binary forms, with or without
#  modification, are permitted provided that the following conditions are met:
#  1. Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
#  2. Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#  3. Neither the name of the copyright holder nor the
#     names of its contributors may be used to endorse or promote products
#     derived from this software without specific prior written permission.
#
#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
#  POSSIBILITY OF SUCH DAMAGE.
#

source "tests/scripts/expect/_common.exp"
source "tests/scripts/expect/_multinode.exp"

setup_two_nodes

switch_node 1
send "dataset active\n"
expect -re {Active Timestamp: \d+}
expect -re {Channel: (\d+)}
set channel $expect_out(1,string)
expect -re {Channel Mask: 0x[0-9a-f]{8}}
expect -re {Ext PAN ID: [0-9a-f]{16}}
expect -re {Mesh Local Prefix: ([0-9a-f]{1,4}:){3}[0-9a-f]{1,4}::\/64}
expect -re {Network Key: [0-9a-f]{32}}
expect -re {Network Name: [^\r\n]+}
expect -re {PAN ID: 0x[0-9a-f]{4}}
expect -re {PSKc: [0-9a-f]{32}}
expect -re {Security Policy: \d+ o?n?r?c?b?}
send "dataset active -ns\n"
expect -re {Active Timestamp: \d+}
expect -re {Channel: (\d+)}
expect -re {Channel Mask: 0x[0-9a-f]{8}}
expect -re {Ext PAN ID: [0-9a-f]{16}}
expect -re {Mesh Local Prefix: ([0-9a-f]{1,4}:){3}[0-9a-f]{1,4}::\/64}
expect -re {Network Key: \[Redacted\]}
expect -re {Network Name: [^\r\n]+}
expect -re {PAN ID: 0x[0-9a-f]{4}}
expect -re {PSKc: \[Redacted\]}
expect -re {Security Policy: \d+ o?n?r?c?b?}
send "dataset pending\n"
expect "Error 23: NotFound"
send "dataset init active\n"
expect_line "Done"
send "dataset activetimestamp 100\n"
expect_line "Done"
send "dataset activetimestamp\n"
expect "100"
expect_line "Done"
if {$channel == 11} {
    send "dataset channel 18\n"
    expect_line "Done"
    send "dataset channel\n"
    expect "18"
    expect_line "Done"
} else {
    send "dataset channel 11\n"
    expect_line "Done"
    send "dataset channel\n"
    expect "11"
    expect_line "Done"
}
send "dataset channelmask 0x03fff800\n"
expect_line "Done"
send "dataset channelmask\n"
expect "0x03fff800"
expect_line "Done"
send "dataset extpanid aabbccddeeff0011\n"
expect_line "Done"
send "dataset extpanid\n"
expect "aabbccddeeff0011"
expect_line "Done"
send "dataset networkkey aabbccddeeff00112233445566778899\n"
expect_line "Done"
send "dataset networkkey\n"
expect "aabbccddeeff00112233445566778899"
expect_line "Done"
send "dataset meshlocalprefix fdde:4860::\n"
expect_line "Done"
send "dataset meshlocalprefix\n"
expect "fdde:4860:0:0::/64"
expect_line "Done"
send "dataset networkname OT-network\n"
expect_line "Done"
send "dataset networkname\n"
expect "OT-network"
expect_line "Done"
send "dataset panid 0xface\n"
expect_line "Done"
send "dataset panid\n"
expect "0xface"
expect_line "Done"
send "dataset pskc 00112233445566778899aabbccddeeff\n"
expect_line "Done"
send "dataset pskc\n"
expect "00112233445566778899aabbccddeeff"
expect_line "Done"
send "dataset securitypolicy 678 onrc\n"
expect_line "Done"
send "dataset securitypolicy\n"
expect "678 onrc"
expect_line "Done"
send "dataset pendingtimestamp 100\n"
expect_line "Done"
send "dataset pendingtimestamp\n"
expect "100"
expect_line "Done"
send "dataset delay 30000\n"
expect_line "Done"
send "dataset delay\n"
expect "30000"
expect_line "Done"
send "dataset commit pending\n"
expect_line "Done"
send "dataset pending\n"
expect "Pending Timestamp: 100"
expect "Active Timestamp: 100"
if {$channel == 11} {
    expect "Channel: 18"
} else {
    expect "Channel: 11"
}
expect "Channel Mask: 0x03fff800"
expect -re {Delay: \d+}
expect "Ext PAN ID: aabbccddeeff0011"
expect "Mesh Local Prefix: fdde:4860:0:0::/64"
expect "Network Key: aabbccddeeff00112233445566778899"
expect "Network Name: OT-network"
expect "PAN ID: 0xface"
expect "PSKc: 00112233445566778899aabbccddeeff"
expect "Security Policy: 678 onrc"
expect_line "Done"
send "dataset pending -x\n"
expect "dataset pending -x"
set dataset_tlvs [expect_line {([0-9a-f]+)}]
expect_line "Done"
send "dataset clear\n"
expect_line "Done"
send "dataset init tlvs $dataset_tlvs\n"
expect_line "Done"
send "dataset\n"
expect "Pending Timestamp: 100"
expect "Active Timestamp: 100"
if {$channel == 11} {
    expect "Channel: 18"
} else {
    expect "Channel: 11"
}
expect "Channel Mask: 0x03fff800"
expect -re {Delay: \d+}
expect "Ext PAN ID: aabbccddeeff0011"
expect "Mesh Local Prefix: fdde:4860:0:0::/64"
expect "Network Key: aabbccddeeff00112233445566778899"
expect "Network Name: OT-network"
expect "PAN ID: 0xface"
expect "PSKc: 00112233445566778899aabbccddeeff"
expect "Security Policy: 678 onrc"
expect_line "Done"

sleep 30

switch_node 2
wait_for "dataset active" "Active Timestamp: 100"
expect_line "Done"
send "dataset active\n"
expect "Active Timestamp: 100"
if {$channel == 11} {
    expect "Channel: 18"
} else {
    expect "Channel: 11"
}
expect "Channel Mask: 0x03fff800"
expect "Ext PAN ID: aabbccddeeff0011"
expect "Mesh Local Prefix: fdde:4860:0:0::/64"
expect "Network Key: aabbccddeeff00112233445566778899"
expect "Network Name: OT-network"
expect "PAN ID: 0xface"
expect "PSKc: 00112233445566778899aabbccddeeff"
expect "Security Policy: 678 onrc"
expect_line "Done"
send "dataset clear\n"
expect_line "Done"
send "dataset init active\n"
expect_line "Done"
send "dataset\n"
expect "Active Timestamp: 100"
if {$channel == 11} {
    expect "Channel: 18"
} else {
    expect "Channel: 11"
}
expect "Channel Mask: 0x03fff800"
expect "Ext PAN ID: aabbccddeeff0011"
expect "Mesh Local Prefix: fdde:4860:0:0::/64"
expect "Network Key: aabbccddeeff00112233445566778899"
expect "Network Name: OT-network"
expect "PAN ID: 0xface"
expect "PSKc: 00112233445566778899aabbccddeeff"
expect "Security Policy: 678 onrc"
expect_line "Done"
send "dataset init pending\n"
expect "Error 23: NotFound"

switch_node 1
set addr [get_ipaddr mleid]

switch_node 2
send "dataset mgmtgetcommand active \
activetimestamp pendingtimestamp networkkey networkname extpanid \
localprefix delaytimer panid channel \
-x 000102030405060708090a0b0e0f0c333435 \
address $addr\n"
expect_line "Done"
send "dataset mgmtgetcommand pending \
activetimestamp pendingtimestamp networkkey networkname extpanid \
localprefix delaytimer panid channel \
-x 000102030405060708090a0b0e0f0c333435 \
address $addr\n"
expect_line "Done"

switch_node 1
send "dataset init active\n"
expect_line "Done"
send "dataset networkname Thread\\ 网络\n"
expect_line "Done"
send "dataset commit active\n"
expect_line "Done"
send "dataset active -x\n"
expect "54687265616420e7bd91e7bb9c" ;# UTF-8 of "Thread 网络"
expect_line "Done"
send "dataset active -x\n"
expect "dataset active -x"
expect -re {([0-9a-f]+)[\r\n]+Done}
set binary $expect_out(1,string)
send "dataset set pending $binary\n"
expect_line "Done"
send "dataset pending -x\n"
expect $binary
expect_line "Done"
send "dataset pending\n"
expect "Network Name: Thread 网络"
expect_line "Done"
send "dataset set active $binary\n"
expect_line "Done"
send "dataset mgmtsetcommand active activetimestamp 200 -x 030d54687265616420e7bd91e7bb9c\n"
expect_line "Done"
send "dataset active\n"
expect "Network Name: Thread 网络"
expect_line "Done"
send "dataset mgmtsetcommand active activetimestamp 210 -x 0301ff\n"
expect_line "Done"
send "dataset active\n"
expect "Active Timestamp: 200"
expect "Network Name: Thread 网络"
expect_line "Done"
send "dataset set active 03023432\n"
expect_line "Done"
send "dataset active\n"
expect "Network Name: 42"
expect_line "Done"
send "dataset set active 0301bf\n"
expect "Error 7: InvalidArgs"
send "dataset help\n"
expect_line "Done"
send "dataset\n"
expect_line "Done"
send "dataset init something_invalid\n"
expect "Error 7: InvalidArgs"
send "dataset active something_invalid\n"
expect "Error 7: InvalidArgs"
send "dataset pending something_invalid\n"
expect "Error 7: InvalidArgs"
send "dataset commit something_invalid\n"
expect "Error 7: InvalidArgs"
send "dataset mgmtsetcommand something_invalid\n"
expect "Error 7: InvalidArgs"
send "dataset mgmtsetcommand active something_invalid\n"
expect "Error 7: InvalidArgs"
send "dataset mgmtgetcommand something_invalid\n"
expect "Error 7: InvalidArgs"
send "dataset mgmtgetcommand active something_invalid\n"
expect "Error 7: InvalidArgs"
send "dataset pskc -p 123456\n"
expect_line "Done"
send "dataset securitypolicy 678 something_invalid\n"
expect "Error 7: InvalidArgs"
send "dataset set something_invalid 00\n"
expect "Error 7: InvalidArgs"
send "dataset init tlvs something_invalid\n"
expect "Error 7: InvalidArgs"

dispose_all
