ClickHouse/tests/queries/0_stateless/01176_mysql_client_interactive.expect
Azat Khuzhin a424b4ad56 Do not ignore eof in expect tests
expect_after that adjusts default timeout handler, reseted eof handler,
and this tell expect that it can ignore eof from read, consider the
following example:

<details>

    ```expect
    #!/usr/bin/expect -f

    exp_internal 1
    log_user 1
    set timeout 4
    match_max 100000

    expect_after {
        # eof { exp_continue }
        timeout {
            exit 1
        }
    }

    spawn bash -c "sleep 1; echo ':) '"
    expect ":) "
    ```

    ```
    $ ./expect.expect < /dev/null
    spawn bash -c sleep 1; echo ':) '
    parent: waiting for sync byte
    parent: telling child to go ahead
    parent: now unsynchronized from child
    spawn: returns {6614}

    expect: does "" (spawn_id exp4) match glob pattern ":) "? no
    expect: read eof
                 ^^^
    expect: set expect_out(spawn_id) "exp0"
    expect: set expect_out(buffer) ""
    ```

And with uncommented eof handler:

    ```
    $ ./expect.expect < /dev/null
    spawn bash -c sleep 1; echo ':) '
    parent: waiting for sync byte
    parent: telling child to go ahead
    parent: now unsynchronized from child
    spawn: returns {17959}

    expect: does "" (spawn_id exp4) match glob pattern ":) "? no
    expect: read eof
    expect: set expect_out(spawn_id) "exp0"
    expect: set expect_out(buffer) ""
    expect: continuing expect after update

    expect: does "" (spawn_id exp4) match glob pattern ":) "? no

    expect: does ":) \r\n" (spawn_id exp4) match glob pattern ":) "? yes
    expect: set expect_out(0,string) ":) "
    expect: set expect_out(spawn_id) "exp4"
    expect: set expect_out(buffer) ":) "
    ```

</details>
2021-12-29 10:02:38 +03:00

59 lines
1.5 KiB
Plaintext
Executable File

#!/usr/bin/expect -f
# Tags: no-fasttest
# Tag no-fasttest: requires mysql client
log_user 0
set timeout 60
match_max 100000
expect_after {
# Do not ignore eof from expect
eof { exp_continue }
# A default timeout action is to do nothing, change it to fail
timeout { exit 1 }
}
set basedir [file dirname $argv0]
spawn bash -c "source $basedir/../shell_config.sh ; \$MYSQL_CLIENT_BINARY \$MYSQL_CLIENT_OPT"
expect -nocase -re "mysql.*> "
send -- "USE system;\r"
expect "Database changed"
send -- "SELECT * FROM one;\r"
expect "| dummy |"
expect "| 0 |"
expect "1 row in set"
# exception before start
send -- "select * from table_that_does_not_exist;\r"
expect "ERROR 60 (00000): Code: 60"
# exception after start
send -- "select throwIf(number) from numbers(2) settings max_block_size=1;\r"
expect "ERROR 395 (00000): Code: 395"
# other formats
send -- "select * from system.one format TSV;\r"
expect "ERROR 1 (00000): Code: 1"
send -- "select * from system.one format JSON;\r"
expect "ERROR 1 (00000): Code: 1"
send -- "select * from system.one format MySQLWire;\r"
expect "| dummy |"
expect "| 0 |"
expect "1 row in set"
send -- "select count(number), sum(number) from numbers(10);\r"
expect "+---------------+-------------+"
expect "| count(number) | sum(number) |"
expect "+---------------+-------------+"
expect "| 10 | 45 |"
expect "+---------------+-------------+"
expect "1 row in set"
expect -nocase -re "mysql.*> "
send -- "quit;\r"
expect eof