diff --git a/.github/workflows/ci-mysql-client-tests.yaml b/.github/workflows/ci-mysql-client-tests.yaml index 8e21981d0e..234976118a 100644 --- a/.github/workflows/ci-mysql-client-tests.yaml +++ b/.github/workflows/ci-mysql-client-tests.yaml @@ -13,7 +13,7 @@ concurrency: jobs: mysql_client_integrations_job: runs-on: ubuntu-22.04 - timeout-minutes: 30 + timeout-minutes: 45 name: Run tests steps: - name: Checkout diff --git a/integration-tests/MySQLDockerfile b/integration-tests/MySQLDockerfile index dd86df9541..0cd7e32d0a 100644 --- a/integration-tests/MySQLDockerfile +++ b/integration-tests/MySQLDockerfile @@ -117,6 +117,10 @@ RUN gem install bundler -v 2.1.4 && bundle install RUN Rscript -e 'install.packages(c("DBI", "RMySQL", "RMariaDB"), \ repos = c(RSPM="https://packagemanager.rstudio.com/cran/__linux__/focal/latest"))' +# install rust +RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain stable -y +ENV PATH="/root/.cargo/bin:${PATH}" + # install postgres and psql RUN service postgresql start @@ -136,5 +140,9 @@ RUN go build -o /usr/local/bin/dolt ./cmd/dolt COPY mysql-client-tests /mysql-client-tests COPY mysql-client-tests/mysql-client-tests-entrypoint.sh /mysql-client-tests/entrypoint.sh +# install rust dependencies +WORKDIR /mysql-client-tests/rust +RUN cargo build --config net.git-fetch-with-cli=true + WORKDIR /mysql-client-tests ENTRYPOINT ["/mysql-client-tests/entrypoint.sh"] diff --git a/integration-tests/mysql-client-tests/mysql-client-tests.bats b/integration-tests/mysql-client-tests/mysql-client-tests.bats index 88b12e9a37..a04ac973c1 100644 --- a/integration-tests/mysql-client-tests/mysql-client-tests.bats +++ b/integration-tests/mysql-client-tests/mysql-client-tests.bats @@ -162,4 +162,8 @@ EOF" -m "postgres" Rscript $BATS_TEST_DIRNAME/r/rmariadb-test.r $USER $PORT $REPO_NAME } +@test "rust mysql.connector client" { + cd $BATS_TEST_DIRNAME/rust + cargo run --bin mysql_connector_test $USER $PORT $REPO_NAME +} diff --git a/integration-tests/mysql-client-tests/rust/Cargo.toml b/integration-tests/mysql-client-tests/rust/Cargo.toml new file mode 100644 index 0000000000..0a26070a76 --- /dev/null +++ b/integration-tests/mysql-client-tests/rust/Cargo.toml @@ -0,0 +1,12 @@ +[package] + +name = "mysql_connector_test" +version = "0.0.1" +edition = "2018" + +[dependencies] +mysql = "*" + +[[bin]] +name = "mysql_connector_test" +path = "src/mysql_connector_test.rs" diff --git a/integration-tests/mysql-client-tests/rust/rust-toolchain.toml b/integration-tests/mysql-client-tests/rust/rust-toolchain.toml new file mode 100644 index 0000000000..292fe499e3 --- /dev/null +++ b/integration-tests/mysql-client-tests/rust/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "stable" diff --git a/integration-tests/mysql-client-tests/rust/src/mysql_connector_test.rs b/integration-tests/mysql-client-tests/rust/src/mysql_connector_test.rs new file mode 100644 index 0000000000..91de8a5ed9 --- /dev/null +++ b/integration-tests/mysql-client-tests/rust/src/mysql_connector_test.rs @@ -0,0 +1,46 @@ +use mysql::Row; +use mysql::prelude::*; +use std::env; +use std::process::exit; + +fn main() { + let args: Vec = env::args().collect(); + let user = &args[1]; + let port = &args[2]; + let db = &args[3]; + + let url = format!("mysql://{}@127.0.0.1:{}/{}", user, port, db); + let connection_opts = mysql::Opts::from_url(&url).unwrap(); + let pool = mysql::Pool::new(connection_opts).unwrap(); + let mut conn = pool.get_conn().unwrap(); + + let queries: Vec<(&str, usize)> = [ + ("create table test (pk int, `value` int, primary key(pk))", 0), + ("describe test", 2), + ("insert into test (pk, `value`) values (0,0)", 0), + ("select * from test", 1), + ("call dolt_add('-A');", 1), + ("call dolt_commit('-m', 'my commit')", 1), + ("call dolt_checkout('-b', 'mybranch')", 1), + ("insert into test (pk, `value`) values (1,1)", 0), + ("call dolt_commit('-a', '-m', 'my commit2')", 1), + ("call dolt_checkout('main')", 1), + ("call dolt_merge('mybranch')", 1), + ("select COUNT(*) FROM dolt_log", 1) + ].to_vec(); + + for (query, expected) in queries.into_iter() { + let result = conn.query(query); + let response : Vec = result.expect("Error: bad response"); + println!("{:?}", response); + if response.len() != expected { + println!("LENGTH: {}", response.len()); + println!("QUERY: {}", query); + println!("EXPECTED: {}", expected); + println!("RESULT: {:?}", response); + exit(1) + } + } + + exit(0) +}