summaryrefslogtreecommitdiff
path: root/test/e2e-go/cli/goal/expect/goalDryrunRestTest.exp
blob: 0d580723a9761852fb18e226f584b4ef0e3c2896 (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
#!/usr/bin/expect -f
set err 0
log_user 1

proc TestGoalDryrun { DRREQ_FILE TEST_PRIMARY_NODE_DIR } {
    set PASSED 0
    set PROGRAM_TYPE ""
    spawn goal clerk dryrun-remote -d $TEST_PRIMARY_NODE_DIR -D $DRREQ_FILE -v
    expect {
        timeout { ::AlgorandGoal::Abort "goal clerk dryrun-remote timeout" }
        -re {(ApprovalProgram)} {set PROGRAM_TYPE $expect_out(1,string); exp_continue}
        "PASS" {set PASSED 1; close}
    }
    if { $PASSED == 0 } {
        ::AlgorandGoal::Abort "Program did not pass"
    }
    if { $PROGRAM_TYPE != "ApprovalProgram" } {
        puts "Program type: $PROGRAM_TYPE"
        ::AlgorandGoal::Abort "Invalid program type"
    }
}

proc TestGoalDryrunExitCode { DRREQ_FILE TEST_PRIMARY_NODE_DIR EXPECTED_STATUS_CODE EXPECTED_MESSAGE} {
    set MESSAGE_MATCHED 0
    spawn goal clerk dryrun-remote -d $TEST_PRIMARY_NODE_DIR -D $DRREQ_FILE -v
    expect {
        timeout { ::AlgorandGoal::Abort "goal clerk dryrun-remote timeout" }
        $EXPECTED_MESSAGE {puts "message matched"; set MESSAGE_MATCHED 1; exp_continue}
        eof { catch wait result; set STATUS_CODE [lindex $result 3]; }
    }
    if { $STATUS_CODE != $EXPECTED_STATUS_CODE } {
        puts "Exit code: $STATUS_CODE, expected: $EXPECTED_STATUS_CODE"
        ::AlgorandGoal::Abort "Progran exited with incorrect code"
    }
    if { $MESSAGE_MATCHED == 0 } {
        ::AlgorandGoal::Abort "Progam message did not match expected"
    }
}

if { [catch {

    source  goalExpectCommon.exp
    set TEST_ALGO_DIR [lindex $argv 0]
    set TEST_DATA_DIR [lindex $argv 1]

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

    set TIME_STAMP [clock seconds]

    set TEST_ROOT_DIR $TEST_ALGO_DIR/root
    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_PROGS_DIR "$TEST_DATA_DIR/../scripts/e2e_subs/tealprogs"

    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

    # Update the Primary Node configuration
    exec -- cat "$TEST_ROOT_DIR/Primary/config.json" | jq {. |= . + {"EnableDeveloperAPI":true}} > $TEST_ROOT_DIR/Primary/config.json.new
    exec rm $TEST_ROOT_DIR/Primary/config.json
    exec mv $TEST_ROOT_DIR/Primary/config.json.new $TEST_ROOT_DIR/Primary/config.json

    ::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"

    set TEAL_PROG_FILE "$TEST_ROOT_DIR/trivial.teal"
    exec printf "#pragma version 2\nint 1" > $TEAL_PROG_FILE

    # no format parameter
    set DRREQ_FILE_1 "$TEST_ROOT_DIR/app-create-drreq-1.json"
    spawn goal app create --creator $PRIMARY_ACCOUNT_ADDRESS --approval-prog $TEAL_PROG_FILE --clear-prog $TEAL_PROG_FILE --global-byteslices 0 --global-ints 0 --local-byteslices 0 --local-ints 0 -d $TEST_PRIMARY_NODE_DIR -o $DRREQ_FILE_1 --dryrun-dump
    expect {
        timeout { ::AlgorandGoal::Abort "goal app create timeout" }
    }

    # explicit json
    set DRREQ_FILE_2 "$TEST_ROOT_DIR/app-create-drreq-2.json"
    spawn goal app create --creator $PRIMARY_ACCOUNT_ADDRESS --approval-prog $TEAL_PROG_FILE --clear-prog $TEAL_PROG_FILE --global-byteslices 0 --global-ints 0 --local-byteslices 0 --local-ints 0 -d $TEST_PRIMARY_NODE_DIR -o $DRREQ_FILE_2 --dryrun-dump --dryrun-dump-format=json
    expect {
        timeout { ::AlgorandGoal::Abort "goal app create timeout" }
    }

    # explicit msgp
    set DRREQ_FILE_3 "$TEST_ROOT_DIR/app-create-drreq.msgp"
    spawn goal app create --creator $PRIMARY_ACCOUNT_ADDRESS --approval-prog $TEAL_PROG_FILE --clear-prog $TEAL_PROG_FILE --global-byteslices 0 --global-ints 0 --local-byteslices 0 --local-ints 0 -d $TEST_PRIMARY_NODE_DIR -o $DRREQ_FILE_3 --dryrun-dump --dryrun-dump-format=msgp
    expect {
        timeout { ::AlgorandGoal::Abort "goal app create timeout" }
    }

    # atomic transfer
    set DRREQ_FILE_4 "$TEST_ROOT_DIR/atomic-tran-drreq.msgp"
    set AT_TX1_FILE "$TEST_ROOT_DIR/atomic-tran-tx1.mspg"
    set AT_TX2_FILE "$TEST_ROOT_DIR/atomic-tran-tx2.mspg"
    set AT_COMBINED_FILE "$TEST_ROOT_DIR/atomic-tran-comb.mspg"
    set AT_GROUPPED_FILE "$TEST_ROOT_DIR/atomic-tran-group.mspg"
    spawn goal clerk send --from $PRIMARY_ACCOUNT_ADDRESS --to $PRIMARY_ACCOUNT_ADDRESS -a 1 --fee 1000 -d $TEST_PRIMARY_NODE_DIR -o $AT_TX1_FILE
    expect {
        timeout { ::AlgorandGoal::Abort "goal clerk send timeout" }
    }
    spawn goal app create --creator $PRIMARY_ACCOUNT_ADDRESS --approval-prog $TEAL_PROG_FILE --clear-prog $TEAL_PROG_FILE --global-byteslices 0 --global-ints 0 --local-byteslices 0 --local-ints 0 -d $TEST_PRIMARY_NODE_DIR -o $AT_TX2_FILE
    expect {
        timeout { ::AlgorandGoal::Abort "goal app create timeout" }
    }
    exec cat $AT_TX1_FILE $AT_TX2_FILE > $AT_COMBINED_FILE
    exec goal clerk group -i $AT_COMBINED_FILE -o $AT_GROUPPED_FILE
    spawn goal clerk dryrun -t $AT_GROUPPED_FILE -d $TEST_PRIMARY_NODE_DIR -o $DRREQ_FILE_4 --dryrun-dump --dryrun-dump-format=msgp
    expect {
        timeout { ::AlgorandGoal::Abort "goal clerk dryrun timeout" }
    }

    # invalid app
    set INVALID_FILE_1 "$TEST_ROOT_DIR/invalid-app.json"
    set INVALID_FILE_1_ID [open $INVALID_FILE_1 "w"]
    set INVALID_FILE_1_DATA "{ \"round\": -1 }"
    puts -nonewline $INVALID_FILE_1_ID $INVALID_FILE_1_DATA
    close $INVALID_FILE_1_ID

    TestGoalDryrun $DRREQ_FILE_1 $TEST_PRIMARY_NODE_DIR
    TestGoalDryrun $DRREQ_FILE_2 $TEST_PRIMARY_NODE_DIR
    TestGoalDryrun $DRREQ_FILE_3 $TEST_PRIMARY_NODE_DIR
    TestGoalDryrun $DRREQ_FILE_4 $TEST_PRIMARY_NODE_DIR

    TestGoalDryrunExitCode $DRREQ_FILE_3 $TEST_PRIMARY_NODE_DIR 0 "PASS"
    TestGoalDryrunExitCode "" $TEST_PRIMARY_NODE_DIR 1 "Cannot read file : open : no such file or directory"
    TestGoalDryrunExitCode $INVALID_FILE_1 $TEST_PRIMARY_NODE_DIR 1 "dryrun-remote: HTTP 400 Bad Request:"

    # check local state access during opt-in transaction
    set GLOBAL_BYTE_SLICES 0
    set LOCAL_BYTE_SLICES 1
    set APP_ID [::AlgorandGoal::AppCreate0 $PRIMARY_WALLET_NAME "" $PRIMARY_ACCOUNT_ADDRESS $TEAL_PROGS_DIR/app_optin_put.teal $GLOBAL_BYTE_SLICES $LOCAL_BYTE_SLICES $TEAL_PROGS_DIR/clear_program_state.teal $TEST_PRIMARY_NODE_DIR]
    set DRREQ_FILE_OPTIN "$TEST_ROOT_DIR/app-optin-drreq.msgp"
    spawn goal app optin --app-id $APP_ID --from $PRIMARY_ACCOUNT_ADDRESS -o $DRREQ_FILE_OPTIN --dryrun-dump --dryrun-dump-format=msgp -d $TEST_PRIMARY_NODE_DIR
    expect {
        timeout { ::AlgorandGoal::Abort "goal app optin timeout" }
    }

    TestGoalDryrun $DRREQ_FILE_OPTIN $TEST_PRIMARY_NODE_DIR

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

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