summaryrefslogtreecommitdiff
path: root/test/e2e-go/cli/goal/expect/goalAppAccountAddressTest.exp
blob: 6146fa17209b041eade86956cc8aed1496ebe5ff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
#!/usr/bin/expect -f
#exp_internal 1
set err 0
log_user 1

###
# * The test creates four additional accounts, opt-in one to the app, then passes the four accounts
#   as --app-account flag to goal app call.
# * The teal program writes the four passed account addresses into the local state of the caller and one
# * additional account.
# * The test verifies the correct addresses are written to the local states of both.
# * It also tests for the error when one flag is missing
###

source  goalExpectCommon.exp


set TEST_ALGO_DIR [lindex $argv 0]
set TEST_DATA_DIR [lindex $argv 1]

proc goalAppAccountAddress { TEST_ALGO_DIR TEST_DATA_DIR} {

    # Setup the test
    set timeout 60
    set TIME_STAMP [clock seconds]

    # Setup the network
    set TEST_ROOT_DIR $TEST_ALGO_DIR/root_$TIME_STAMP
    set TEST_PRIMARY_NODE_DIR $TEST_ROOT_DIR/Primary/
    set NETWORK_NAME test_net_expect_$TIME_STAMP
    set NETWORK_TEMPLATE "$TEST_DATA_DIR/nettemplates/TwoNodes50EachFuture.json"

    set TEAL_PROGRAM "appAccountParams.teal"

    exec cp $TEST_DATA_DIR/../../installer/genesis/devnet/genesis.json $TEST_ALGO_DIR

    # Create network
    ::AlgorandGoal::CreateNetwork $NETWORK_NAME $NETWORK_TEMPLATE $TEST_ALGO_DIR $TEST_ROOT_DIR

    # Start network
    ::AlgorandGoal::StartNetwork $NETWORK_NAME $NETWORK_TEMPLATE $TEST_ROOT_DIR

    set PRIMARY_NODE_ADDRESS [ ::AlgorandGoal::GetAlgodNetworkAddress $TEST_PRIMARY_NODE_DIR ]
    puts "Primary Node Address: $PRIMARY_NODE_ADDRESS"

    set PRIMARY_WALLET_NAME unencrypted-default-wallet

    # Determine primary account
    set PRIMARY_ACCOUNT_ADDRESS [::AlgorandGoal::GetHighestFundedAccountForWallet $PRIMARY_WALLET_NAME  $TEST_PRIMARY_NODE_DIR]

    # Check the balance of the primary account
    set PRIMARY_ACCOUNT_BALANCE [::AlgorandGoal::GetAccountBalance $PRIMARY_WALLET_NAME $PRIMARY_ACCOUNT_ADDRESS $TEST_PRIMARY_NODE_DIR]
    puts "Primary Account Balance: $PRIMARY_ACCOUNT_BALANCE"

    ::AlgorandGoal::WaitForRound 1 $TEST_PRIMARY_NODE_DIR

    # Create wallet #1
    set WALLET_1_NAME Wallet_1_$TIME_STAMP
    set WALLET_1_PASSWORD 1234
    set WALLET_1_PASSPHRASE [::AlgorandGoal::CreateWallet $WALLET_1_NAME $WALLET_1_PASSWORD $TEST_PRIMARY_NODE_DIR]
    puts "WALLET_1_PASSPHRASE: $WALLET_1_PASSPHRASE"
    ::AlgorandGoal::VerifyWallet $WALLET_1_NAME  $TEST_PRIMARY_NODE_DIR

    # Associate 4 new accounts with the wallet
    set ACCOUNT_1_ADDRESS [::AlgorandGoal::CreateAccountForWallet $WALLET_1_NAME $WALLET_1_PASSWORD $TEST_PRIMARY_NODE_DIR]
    set ACCOUNT_2_ADDRESS [::AlgorandGoal::CreateAccountForWallet $WALLET_1_NAME $WALLET_1_PASSWORD $TEST_PRIMARY_NODE_DIR]
    set ACCOUNT_3_ADDRESS [::AlgorandGoal::CreateAccountForWallet $WALLET_1_NAME $WALLET_1_PASSWORD $TEST_PRIMARY_NODE_DIR]
    set ACCOUNT_4_ADDRESS [::AlgorandGoal::CreateAccountForWallet $WALLET_1_NAME $WALLET_1_PASSWORD $TEST_PRIMARY_NODE_DIR]

    # Transfer Algos from primary account to accounts 1-4
    set MIN_BALANCE 1000000
    set TRANSFER_AMOUNT  [expr {1000 * $MIN_BALANCE}]
    set FEE_AMOUNT 1000
    set TRANSACTION_ID [::AlgorandGoal::AccountTransfer $PRIMARY_WALLET_NAME "" $PRIMARY_ACCOUNT_ADDRESS $TRANSFER_AMOUNT $ACCOUNT_1_ADDRESS $FEE_AMOUNT $TEST_PRIMARY_NODE_DIR ""]
    set TRANSACTION_ID [::AlgorandGoal::AccountTransfer $PRIMARY_WALLET_NAME "" $PRIMARY_ACCOUNT_ADDRESS $TRANSFER_AMOUNT $ACCOUNT_2_ADDRESS $FEE_AMOUNT $TEST_PRIMARY_NODE_DIR ""]
    set TRANSACTION_ID [::AlgorandGoal::AccountTransfer $PRIMARY_WALLET_NAME "" $PRIMARY_ACCOUNT_ADDRESS $TRANSFER_AMOUNT $ACCOUNT_3_ADDRESS $FEE_AMOUNT $TEST_PRIMARY_NODE_DIR ""]
    set TRANSACTION_ID [::AlgorandGoal::AccountTransfer $PRIMARY_WALLET_NAME "" $PRIMARY_ACCOUNT_ADDRESS $TRANSFER_AMOUNT $ACCOUNT_4_ADDRESS $FEE_AMOUNT $TEST_PRIMARY_NODE_DIR ""]

    set TEAL_PROGS_DIR "$TEST_DATA_DIR/../scripts/e2e_subs/tealprogs"
    set GLOBAL_BYTE_SLICES 0
    set LOCAL_BYTE_SLICES 5

    # Create the app
    puts "calling goal app create"
    set APP_ID [::AlgorandGoal::AppCreateOnCompletion \
		    $PRIMARY_WALLET_NAME \
		    "" \
		    $PRIMARY_ACCOUNT_ADDRESS \
		    ${TEAL_PROGS_DIR}/${TEAL_PROGRAM} \
		    "" \
		    $GLOBAL_BYTE_SLICES \
		    $LOCAL_BYTE_SLICES \
		    ${TEAL_PROGS_DIR}/clear_program_state.teal \
		    $TEST_PRIMARY_NODE_DIR \
		    "OptIn"]

    # Let account 2 opt in so it's local state is also written
    ::AlgorandGoal::AppOptIn $APP_ID $WALLET_1_NAME $WALLET_1_PASSWORD $ACCOUNT_2_ADDRESS "" $TEST_PRIMARY_NODE_DIR

    # call the app
    puts "Calling goal app call to get the local state params"
    spawn goal app call --app-id $APP_ID --from $PRIMARY_ACCOUNT_ADDRESS -w $PRIMARY_WALLET_NAME -d $TEST_PRIMARY_NODE_DIR \
	--app-account $ACCOUNT_1_ADDRESS \
	--app-account $ACCOUNT_2_ADDRESS \
	--app-account $ACCOUNT_3_ADDRESS \
	--app-account $ACCOUNT_4_ADDRESS
    expect {
	timeout { puts timeout; ::AlgorandGoal::Abort  "\n Failed to see expected output" }
	"*committed in round*" {puts "app call successful"; close}
	eof {::AlgorandGoal::Abort "app call failed" }
    }
    ::AlgorandGoal::CheckProcessReturnedCode 1

    puts "Checking the results"
    set EXPECTED_OUTPUT "Account0*$PRIMARY_ACCOUNT_ADDRESS"
    set EXPECTED_OUTPUT "$EXPECTED_OUTPUT*Account1*$ACCOUNT_1_ADDRESS"
    set EXPECTED_OUTPUT "$EXPECTED_OUTPUT*Account2*$ACCOUNT_2_ADDRESS"
    set EXPECTED_OUTPUT "$EXPECTED_OUTPUT*Account3*$ACCOUNT_3_ADDRESS"
    set EXPECTED_OUTPUT "$EXPECTED_OUTPUT*Account4*$ACCOUNT_4_ADDRESS"
    set EXPECTED_OUTPUT "$EXPECTED_OUTPUT*Num Accounts*ui*4"

    # check the local state of the caller
    spawn goal app read --app-id $APP_ID --local --guess-format \
	--from $PRIMARY_ACCOUNT_ADDRESS -w $PRIMARY_WALLET_NAME -d $TEST_PRIMARY_NODE_DIR
    expect {
	timeout { puts timeout; ::AlgorandGoal::Abort  "\n Failed to see expected output" }
	"*$EXPECTED_OUTPUT*" {puts "Local state read correctly"; close}
	eof {::AlgorandGoal::Abort "App read failed. Expected output includes: $EXPECTED_OUTPUT" }
    }
    ::AlgorandGoal::CheckProcessReturnedCode 1

    # check the local state of account 2
    spawn goal app read --app-id $APP_ID --local --guess-format \
	--from $ACCOUNT_2_ADDRESS -w $WALLET_1_NAME -d $TEST_PRIMARY_NODE_DIR
    expect {
	timeout { puts timeout; ::AlgorandGoal::Abort  "\n Failed to see expected output" }
	"Please enter the password for wallet '$WALLET_1_NAME':" {send "$WALLET_1_PASSWORD\r" ; exp_continue}
	"*$EXPECTED_OUTPUT*" {puts "Local state read correctly"; close}
	eof {::AlgorandGoal::Abort "App read failed. Expected output includes: $EXPECTED_OUTPUT" }
    }
    ::AlgorandGoal::CheckProcessReturnedCode 1

    # call the app with a missing app-account. It should fail
    puts "Calling goal app call to get the local state params"
    spawn goal app call --app-id $APP_ID --from $PRIMARY_ACCOUNT_ADDRESS -w $PRIMARY_WALLET_NAME -d $TEST_PRIMARY_NODE_DIR \
	--app-account $ACCOUNT_1_ADDRESS \
	--app-account $ACCOUNT_2_ADDRESS \
	--app-account $ACCOUNT_4_ADDRESS
    expect {
        timeout { puts timeout; ::AlgorandGoal::Abort  "\n Failed to see expected output" }
        "*Couldn't broadcast tx with algod: HTTP 400 Bad Request: TransactionPool.Remember: transaction*invalid Accounts index 4*" {
            puts "\nError received successfully "
            # wait until the eof signal is received
            expect {
                timeout { close; ::AlgorandGoal::Abort "failed to see goal terminating after outputing error message" }
                eof { puts "eof received as expected after error message output" }
            }
        }
        eof {::AlgorandGoal::Abort "failed to get the expected error" }
    }
    lassign [::AlgorandGoal::CheckProcessReturnedCode 0] response OS_CODE ERR_CODE KILLED KILL_SIGNAL EXP
    if {$response != 1 || $OS_CODE != 0 || $ERR_CODE != 1} {
	    ::AlgorandGoal::Abort "failed to get the expected error. Expected ERR_CODE = 1 got ERR_CODE = $ERR_CODE"
    }

    # Shutdown the network
    ::AlgorandGoal::StopNetwork $NETWORK_NAME $TEST_ROOT_DIR

    puts "Goal Stateful Teal test Successful"
}



if { [catch {
    source  goalExpectCommon.exp

    puts "starting test"

    puts "TEST_ALGO_DIR: $TEST_ALGO_DIR"
    puts "TEST_DATA_DIR: $TEST_DATA_DIR"

    puts "calling goalAppAccountAddressTest"

    goalAppAccountAddress  $TEST_ALGO_DIR  $TEST_DATA_DIR

} EXCEPTION ] } {
   ::AlgorandGoal::Abort "ERROR in goalAppAccountAddressTest: $EXCEPTION"
}