rust-postgres/tokio-postgres/tests/test/main.rs

719 lines
20 KiB
Rust
Raw Normal View History

2018-12-09 01:40:37 +00:00
#![warn(rust_2018_idioms)]
#![feature(async_await)]
2018-06-19 02:34:25 +00:00
2019-07-31 04:29:18 +00:00
use futures::stream;
2019-07-30 04:36:07 +00:00
use futures::{join, try_join, FutureExt, TryStreamExt};
2019-07-31 04:25:30 +00:00
use std::fmt::Write;
use std::time::{Duration, Instant};
use tokio::net::TcpStream;
2019-07-31 04:25:30 +00:00
use tokio::timer::Delay;
2018-06-22 02:38:42 +00:00
use tokio_postgres::error::SqlState;
use tokio_postgres::tls::{NoTls, NoTlsStream};
2019-07-27 03:11:34 +00:00
use tokio_postgres::types::{Kind, Type};
2019-07-28 23:34:07 +00:00
use tokio_postgres::{Client, Config, Connection, Error, SimpleQueryMessage};
mod parse;
2018-12-18 05:25:21 +00:00
#[cfg(feature = "runtime")]
mod runtime;
2018-12-10 00:18:21 +00:00
mod types;
2019-07-23 04:27:21 +00:00
async fn connect_raw(s: &str) -> Result<(Client, Connection<TcpStream, NoTlsStream>), Error> {
let socket = TcpStream::connect(&"127.0.0.1:5433".parse().unwrap())
.await
.unwrap();
let config = s.parse::<Config>().unwrap();
config.connect_raw(socket, NoTls).await
2018-06-22 02:38:42 +00:00
}
2019-07-23 04:27:21 +00:00
async fn connect(s: &str) -> Client {
let (client, connection) = connect_raw(s).await.unwrap();
let connection = connection.map(|r| r.unwrap());
tokio::spawn(connection);
client
}
#[tokio::test]
async fn plain_password_missing() {
2019-07-23 04:27:21 +00:00
connect_raw("user=pass_user dbname=postgres")
.await
.err()
.unwrap();
2018-06-22 02:38:42 +00:00
}
#[tokio::test]
async fn plain_password_wrong() {
2019-07-23 04:27:21 +00:00
match connect_raw("user=pass_user password=foo dbname=postgres").await {
2018-06-22 02:38:42 +00:00
Ok(_) => panic!("unexpected success"),
Err(ref e) if e.code() == Some(&SqlState::INVALID_PASSWORD) => {}
Err(e) => panic!("{}", e),
}
}
#[tokio::test]
async fn plain_password_ok() {
2019-07-23 04:27:21 +00:00
connect("user=pass_user password=password dbname=postgres").await;
2018-06-22 02:38:42 +00:00
}
#[tokio::test]
async fn md5_password_missing() {
2019-07-23 04:27:21 +00:00
connect_raw("user=md5_user dbname=postgres")
.await
.err()
.unwrap();
2018-06-22 02:38:42 +00:00
}
#[tokio::test]
async fn md5_password_wrong() {
2019-07-23 04:27:21 +00:00
match connect_raw("user=md5_user password=foo dbname=postgres").await {
2018-06-22 02:38:42 +00:00
Ok(_) => panic!("unexpected success"),
Err(ref e) if e.code() == Some(&SqlState::INVALID_PASSWORD) => {}
Err(e) => panic!("{}", e),
}
}
#[tokio::test]
async fn md5_password_ok() {
2019-07-23 04:27:21 +00:00
connect("user=md5_user password=password dbname=postgres").await;
2018-06-22 02:38:42 +00:00
}
#[tokio::test]
async fn scram_password_missing() {
2019-07-23 04:27:21 +00:00
connect_raw("user=scram_user dbname=postgres")
.await
.err()
.unwrap();
2018-06-22 02:38:42 +00:00
}
#[tokio::test]
async fn scram_password_wrong() {
2019-07-23 04:27:21 +00:00
match connect_raw("user=scram_user password=foo dbname=postgres").await {
2018-06-22 02:38:42 +00:00
Ok(_) => panic!("unexpected success"),
Err(ref e) if e.code() == Some(&SqlState::INVALID_PASSWORD) => {}
Err(e) => panic!("{}", e),
}
}
#[tokio::test]
async fn scram_password_ok() {
2019-07-23 04:27:21 +00:00
connect("user=scram_user password=password dbname=postgres").await;
2018-06-22 02:38:42 +00:00
}
2019-07-24 02:54:22 +00:00
#[tokio::test]
async fn pipelined_prepare() {
let mut client = connect("user=postgres").await;
2019-07-27 03:11:34 +00:00
let prepare1 = client.prepare("SELECT $1::HSTORE[]");
2019-07-24 02:54:22 +00:00
let prepare2 = client.prepare("SELECT $1::BIGINT");
let (statement1, statement2) = try_join!(prepare1, prepare2).unwrap();
2019-07-27 03:11:34 +00:00
assert_eq!(statement1.params()[0].name(), "_hstore");
assert_eq!(statement1.columns()[0].type_().name(), "_hstore");
2019-07-24 02:54:22 +00:00
assert_eq!(statement2.params()[0], Type::INT8);
assert_eq!(statement2.columns()[0].type_(), &Type::INT8);
}
2019-07-25 02:18:15 +00:00
#[tokio::test]
async fn insert_select() {
let mut client = connect("user=postgres").await;
2019-07-28 23:34:07 +00:00
client
.batch_execute("CREATE TEMPORARY TABLE foo (id SERIAL, name TEXT)")
2019-07-25 02:18:15 +00:00
.await
.unwrap();
let insert = client.prepare("INSERT INTO foo (name) VALUES ($1), ($2)");
let select = client.prepare("SELECT id, name FROM foo ORDER BY id");
let (insert, select) = try_join!(insert, select).unwrap();
let insert = client.execute(&insert, &[&"alice", &"bob"]);
2019-07-29 00:48:32 +00:00
let select = client.query(&select, &[]).try_collect::<Vec<_>>();
2019-07-25 02:18:15 +00:00
let (_, rows) = try_join!(insert, select).unwrap();
assert_eq!(rows.len(), 2);
assert_eq!(rows[0].get::<_, i32>(0), 1);
assert_eq!(rows[0].get::<_, &str>(1), "alice");
assert_eq!(rows[1].get::<_, i32>(0), 2);
assert_eq!(rows[1].get::<_, &str>(1), "bob");
}
2019-07-27 03:11:34 +00:00
#[tokio::test]
async fn custom_enum() {
let mut client = connect("user=postgres").await;
2018-07-05 04:02:08 +00:00
2019-07-28 23:34:07 +00:00
client
.batch_execute(
2019-07-27 03:11:34 +00:00
"CREATE TYPE pg_temp.mood AS ENUM (
'sad',
'ok',
'happy'
)",
)
2019-07-27 03:11:34 +00:00
.await
2018-12-09 01:40:37 +00:00
.unwrap();
2018-07-05 04:02:08 +00:00
2019-07-27 03:11:34 +00:00
let select = client.prepare("SELECT $1::mood").await.unwrap();
2018-07-05 04:02:08 +00:00
let ty = &select.params()[0];
assert_eq!("mood", ty.name());
assert_eq!(
&Kind::Enum(vec![
"sad".to_string(),
"ok".to_string(),
"happy".to_string(),
]),
2019-07-27 03:11:34 +00:00
ty.kind(),
2018-07-05 04:02:08 +00:00
);
}
2019-07-27 03:11:34 +00:00
#[tokio::test]
async fn custom_domain() {
let mut client = connect("user=postgres").await;
2018-07-05 04:02:08 +00:00
2019-07-28 23:34:07 +00:00
client
.batch_execute("CREATE DOMAIN pg_temp.session_id AS bytea CHECK(octet_length(VALUE) = 16)")
2019-07-27 03:11:34 +00:00
.await
2018-12-09 01:40:37 +00:00
.unwrap();
2018-07-05 04:02:08 +00:00
2019-07-27 03:11:34 +00:00
let select = client.prepare("SELECT $1::session_id").await.unwrap();
2018-07-05 04:02:08 +00:00
let ty = &select.params()[0];
assert_eq!("session_id", ty.name());
assert_eq!(&Kind::Domain(Type::BYTEA), ty.kind());
}
2019-07-27 03:11:34 +00:00
#[tokio::test]
async fn custom_array() {
let mut client = connect("user=postgres").await;
2018-07-05 04:02:08 +00:00
2019-07-27 03:11:34 +00:00
let select = client.prepare("SELECT $1::HSTORE[]").await.unwrap();
2018-07-05 04:02:08 +00:00
let ty = &select.params()[0];
assert_eq!("_hstore", ty.name());
2019-07-27 03:11:34 +00:00
match ty.kind() {
Kind::Array(ty) => {
2018-07-05 04:02:08 +00:00
assert_eq!("hstore", ty.name());
assert_eq!(&Kind::Simple, ty.kind());
}
_ => panic!("unexpected kind"),
}
}
2019-07-27 03:11:34 +00:00
#[tokio::test]
async fn custom_composite() {
let mut client = connect("user=postgres").await;
2018-07-05 04:02:08 +00:00
2019-07-28 23:34:07 +00:00
client
.batch_execute(
2019-07-27 03:11:34 +00:00
"CREATE TYPE pg_temp.inventory_item AS (
2019-07-28 23:34:07 +00:00
name TEXT,
supplier INTEGER,
price NUMERIC
)",
)
2019-07-27 03:11:34 +00:00
.await
2018-12-09 01:40:37 +00:00
.unwrap();
2018-07-05 04:02:08 +00:00
2019-07-27 03:11:34 +00:00
let select = client.prepare("SELECT $1::inventory_item").await.unwrap();
2018-07-05 04:02:08 +00:00
let ty = &select.params()[0];
assert_eq!(ty.name(), "inventory_item");
2019-07-27 03:11:34 +00:00
match ty.kind() {
Kind::Composite(fields) => {
2018-07-05 04:02:08 +00:00
assert_eq!(fields[0].name(), "name");
assert_eq!(fields[0].type_(), &Type::TEXT);
assert_eq!(fields[1].name(), "supplier");
assert_eq!(fields[1].type_(), &Type::INT4);
assert_eq!(fields[2].name(), "price");
assert_eq!(fields[2].type_(), &Type::NUMERIC);
}
2019-07-27 03:11:34 +00:00
_ => panic!("unexpected kind"),
2018-07-05 04:02:08 +00:00
}
}
2019-07-27 03:11:34 +00:00
#[tokio::test]
async fn custom_range() {
let mut client = connect("user=postgres").await;
2019-07-28 23:34:07 +00:00
client
.batch_execute(
2019-07-27 03:11:34 +00:00
"CREATE TYPE pg_temp.floatrange AS RANGE (
2019-07-28 23:34:07 +00:00
subtype = float8,
subtype_diff = float8mi
)",
2019-07-27 03:11:34 +00:00
)
.await
.unwrap();
let select = client.prepare("SELECT $1::floatrange").await.unwrap();
let ty = &select.params()[0];
assert_eq!("floatrange", ty.name());
assert_eq!(&Kind::Range(Type::FLOAT8), ty.kind());
}
2019-07-28 23:34:07 +00:00
#[tokio::test]
async fn simple_query() {
let mut client = connect("user=postgres").await;
let messages = client
.simple_query(
"CREATE TEMPORARY TABLE foo (
id SERIAL,
name TEXT
);
INSERT INTO foo (name) VALUES ('steven'), ('joe');
SELECT * FROM foo ORDER BY id;",
)
.try_collect::<Vec<_>>()
.await
.unwrap();
match messages[0] {
SimpleQueryMessage::CommandComplete(0) => {}
_ => panic!("unexpected message"),
}
match messages[1] {
SimpleQueryMessage::CommandComplete(2) => {}
_ => panic!("unexpected message"),
}
match &messages[2] {
SimpleQueryMessage::Row(row) => {
assert_eq!(row.get(0), Some("1"));
assert_eq!(row.get(1), Some("steven"));
}
_ => panic!("unexpected message"),
}
match &messages[3] {
SimpleQueryMessage::Row(row) => {
assert_eq!(row.get(0), Some("2"));
assert_eq!(row.get(1), Some("joe"));
}
_ => panic!("unexpected message"),
}
match messages[4] {
SimpleQueryMessage::CommandComplete(2) => {}
_ => panic!("unexpected message"),
}
assert_eq!(messages.len(), 5);
}
2019-07-30 04:36:07 +00:00
#[tokio::test]
async fn cancel_query_raw() {
let mut client = connect("user=postgres").await;
2019-07-31 04:25:30 +00:00
let socket = TcpStream::connect(&"127.0.0.1:5433".parse().unwrap())
.await
.unwrap();
2019-07-30 04:36:07 +00:00
let cancel = client.cancel_query_raw(socket, NoTls);
let cancel = Delay::new(Instant::now() + Duration::from_millis(100)).then(|()| cancel);
let sleep = client.batch_execute("SELECT pg_sleep(100)");
match join!(sleep, cancel) {
(Err(ref e), Ok(())) if e.code() == Some(&SqlState::QUERY_CANCELED) => {}
t => panic!("unexpected return: {:?}", t),
}
}
2019-07-31 02:54:30 +00:00
#[tokio::test]
async fn transaction_commit() {
let mut client = connect("user=postgres").await;
2019-07-31 04:25:30 +00:00
client
.batch_execute(
"CREATE TEMPORARY TABLE foo(
2019-07-31 04:29:18 +00:00
id SERIAL,
name TEXT
)",
2019-07-31 04:25:30 +00:00
)
.await
.unwrap();
2019-07-31 02:54:30 +00:00
let mut transaction = client.transaction().await.unwrap();
2019-07-31 04:25:30 +00:00
transaction
.batch_execute("INSERT INTO foo (name) VALUES ('steven')")
.await
.unwrap();
2019-07-31 02:54:30 +00:00
transaction.commit().await.unwrap();
let stmt = client.prepare("SELECT name FROM foo").await.unwrap();
2019-07-31 04:25:30 +00:00
let rows = client
.query(&stmt, &[])
.try_collect::<Vec<_>>()
.await
.unwrap();
2019-07-31 02:54:30 +00:00
assert_eq!(rows.len(), 1);
assert_eq!(rows[0].get::<_, &str>(0), "steven");
}
#[tokio::test]
async fn transaction_rollback() {
let mut client = connect("user=postgres").await;
2019-07-31 04:25:30 +00:00
client
.batch_execute(
"CREATE TEMPORARY TABLE foo(
2019-07-31 04:29:18 +00:00
id SERIAL,
name TEXT
)",
2019-07-31 04:25:30 +00:00
)
.await
.unwrap();
2019-07-31 02:54:30 +00:00
let mut transaction = client.transaction().await.unwrap();
2019-07-31 04:25:30 +00:00
transaction
.batch_execute("INSERT INTO foo (name) VALUES ('steven')")
.await
.unwrap();
2019-07-31 02:54:30 +00:00
transaction.rollback().await.unwrap();
let stmt = client.prepare("SELECT name FROM foo").await.unwrap();
2019-07-31 04:25:30 +00:00
let rows = client
.query(&stmt, &[])
.try_collect::<Vec<_>>()
.await
.unwrap();
2019-07-31 02:54:30 +00:00
assert_eq!(rows.len(), 0);
}
#[tokio::test]
async fn transaction_rollback_drop() {
let mut client = connect("user=postgres").await;
2019-07-31 04:25:30 +00:00
client
.batch_execute(
"CREATE TEMPORARY TABLE foo(
2019-07-31 04:29:18 +00:00
id SERIAL,
name TEXT
)",
2019-07-31 04:25:30 +00:00
)
.await
.unwrap();
2019-07-31 02:54:30 +00:00
let mut transaction = client.transaction().await.unwrap();
2019-07-31 04:25:30 +00:00
transaction
.batch_execute("INSERT INTO foo (name) VALUES ('steven')")
.await
.unwrap();
2019-07-31 02:54:30 +00:00
drop(transaction);
let stmt = client.prepare("SELECT name FROM foo").await.unwrap();
2019-07-31 04:25:30 +00:00
let rows = client
.query(&stmt, &[])
.try_collect::<Vec<_>>()
.await
.unwrap();
assert_eq!(rows.len(), 0);
}
#[tokio::test]
async fn copy_in() {
let mut client = connect("user=postgres").await;
2019-07-31 04:29:18 +00:00
client
.batch_execute(
"CREATE TEMPORARY TABLE foo (
id INTEGER,
name TEXT
)",
)
.await
.unwrap();
2019-07-31 04:25:30 +00:00
let stmt = client.prepare("COPY foo FROM STDIN").await.unwrap();
2019-07-31 04:29:18 +00:00
let stream = stream::iter(
vec![b"1\tjim\n".to_vec(), b"2\tjoe\n".to_vec()]
.into_iter()
.map(Ok::<_, String>),
);
2019-07-31 04:25:30 +00:00
let rows = client.copy_in(&stmt, &[], stream).await.unwrap();
assert_eq!(rows, 2);
2019-07-31 04:29:18 +00:00
let stmt = client
.prepare("SELECT id, name FROM foo ORDER BY id")
.await
.unwrap();
let rows = client
.query(&stmt, &[])
.try_collect::<Vec<_>>()
.await
.unwrap();
2019-07-31 02:54:30 +00:00
2019-07-31 04:25:30 +00:00
assert_eq!(rows.len(), 2);
assert_eq!(rows[0].get::<_, i32>(0), 1);
assert_eq!(rows[0].get::<_, &str>(1), "jim");
assert_eq!(rows[1].get::<_, i32>(0), 2);
assert_eq!(rows[1].get::<_, &str>(1), "joe");
}
#[tokio::test]
async fn copy_in_large() {
let mut client = connect("user=postgres").await;
2019-07-31 04:29:18 +00:00
client
.batch_execute(
"CREATE TEMPORARY TABLE foo (
id INTEGER,
name TEXT
)",
)
.await
.unwrap();
2019-07-31 04:25:30 +00:00
let stmt = client.prepare("COPY foo FROM STDIN").await.unwrap();
let a = "0\tname0\n".to_string();
let mut b = String::new();
for i in 1..5_000 {
writeln!(b, "{0}\tname{0}", i).unwrap();
}
let mut c = String::new();
for i in 5_000..10_000 {
writeln!(c, "{0}\tname{0}", i).unwrap();
}
let stream = stream::iter(vec![a, b, c].into_iter().map(Ok::<_, String>));
let rows = client.copy_in(&stmt, &[], stream).await.unwrap();
assert_eq!(rows, 10_000);
}
#[tokio::test]
async fn copy_in_error() {
let mut client = connect("user=postgres").await;
2019-07-31 04:29:18 +00:00
client
.batch_execute(
"CREATE TEMPORARY TABLE foo (
id INTEGER,
name TEXT
)",
)
.await
.unwrap();
2019-07-31 04:25:30 +00:00
let stmt = client.prepare("COPY foo FROM STDIN").await.unwrap();
let stream = stream::iter(vec![Ok(b"1\tjim\n".to_vec()), Err("asdf")]);
let error = client.copy_in(&stmt, &[], stream).await.unwrap_err();
assert!(error.to_string().contains("asdf"));
2019-07-31 04:29:18 +00:00
let stmt = client
.prepare("SELECT id, name FROM foo ORDER BY id")
.await
.unwrap();
let rows = client
.query(&stmt, &[])
.try_collect::<Vec<_>>()
.await
.unwrap();
2019-07-31 02:54:30 +00:00
assert_eq!(rows.len(), 0);
}
2019-08-01 03:15:17 +00:00
#[tokio::test]
async fn copy_out() {
let mut client = connect("user=postgres").await;
client.batch_execute(
"CREATE TEMPORARY TABLE foo (
id SERIAL,
name TEXT
);
INSERT INTO foo (name) VALUES ('jim'), ('joe');"
).await.unwrap();
let stmt = client.prepare("COPY foo TO STDOUT").await.unwrap();
let data = client.copy_out(&stmt, &[]).try_concat().await.unwrap();
assert_eq!(&data[..], b"1\tjim\n2\tjoe\n");
}
2019-07-27 03:11:34 +00:00
/*
2018-07-05 04:02:08 +00:00
#[test]
2019-07-27 03:11:34 +00:00
fn query_portal() {
2018-07-05 04:02:08 +00:00
let _ = env_logger::try_init();
let mut runtime = Runtime::new().unwrap();
let (mut client, connection) = runtime.block_on(connect("user=postgres")).unwrap();
2018-07-05 04:02:08 +00:00
let connection = connection.map_err(|e| panic!("{}", e));
runtime.handle().spawn(connection).unwrap();
2018-07-08 05:42:04 +00:00
runtime
.block_on(
client
.simple_query(
2019-07-27 03:11:34 +00:00
"CREATE TEMPORARY TABLE foo (id SERIAL, name TEXT);
INSERT INTO foo (name) VALUES ('alice'), ('bob'), ('charlie');
BEGIN;",
)
.for_each(|_| Ok(())),
)
2018-12-09 01:40:37 +00:00
.unwrap();
2018-07-05 04:02:08 +00:00
2019-07-27 03:11:34 +00:00
let statement = runtime
.block_on(client.prepare("SELECT id, name FROM foo ORDER BY id"))
.unwrap();
let portal = runtime.block_on(client.bind(&statement, &[])).unwrap();
2018-07-05 04:02:08 +00:00
2019-07-27 03:11:34 +00:00
let f1 = client.query_portal(&portal, 2).collect();
let f2 = client.query_portal(&portal, 2).collect();
let f3 = client.query_portal(&portal, 2).collect();
let (r1, r2, r3) = runtime.block_on(f1.join3(f2, f3)).unwrap();
assert_eq!(r1.len(), 2);
assert_eq!(r1[0].get::<_, i32>(0), 1);
assert_eq!(r1[0].get::<_, &str>(1), "alice");
assert_eq!(r1[1].get::<_, i32>(0), 2);
assert_eq!(r1[1].get::<_, &str>(1), "bob");
assert_eq!(r2.len(), 1);
assert_eq!(r2[0].get::<_, i32>(0), 3);
assert_eq!(r2[0].get::<_, &str>(1), "charlie");
assert_eq!(r3.len(), 0);
2018-07-05 04:02:08 +00:00
}
2018-07-07 17:11:16 +00:00
#[test]
fn notifications() {
let _ = env_logger::try_init();
let mut runtime = Runtime::new().unwrap();
let (mut client, mut connection) = runtime.block_on(connect("user=postgres")).unwrap();
2018-07-07 17:11:16 +00:00
let (tx, rx) = mpsc::unbounded();
let connection = future::poll_fn(move || {
while let Some(message) = try_ready!(connection.poll_message().map_err(|e| panic!("{}", e)))
{
if let AsyncMessage::Notification(notification) = message {
2019-01-08 05:10:15 +00:00
debug!("received {}", notification.payload());
2018-07-07 17:11:16 +00:00
tx.unbounded_send(notification).unwrap();
}
}
Ok(Async::Ready(()))
});
runtime.handle().spawn(connection).unwrap();
2018-07-08 05:42:04 +00:00
runtime
.block_on(
client
.simple_query(
"LISTEN test_notifications;
NOTIFY test_notifications, 'hello';
NOTIFY test_notifications, 'world';",
)
.for_each(|_| Ok(())),
)
2018-07-08 05:42:04 +00:00
.unwrap();
2018-07-07 17:11:16 +00:00
drop(client);
runtime.run().unwrap();
let notifications = rx.collect().wait().unwrap();
assert_eq!(notifications.len(), 2);
2019-01-08 05:10:15 +00:00
assert_eq!(notifications[0].channel(), "test_notifications");
assert_eq!(notifications[0].payload(), "hello");
assert_eq!(notifications[1].channel(), "test_notifications");
assert_eq!(notifications[1].payload(), "world");
2018-07-07 17:11:16 +00:00
}
2018-07-14 21:59:37 +00:00
2018-12-23 01:02:48 +00:00
#[test]
2018-12-24 18:02:48 +00:00
fn poll_idle_running() {
struct DelayStream(Delay);
impl Stream for DelayStream {
type Item = Vec<u8>;
type Error = tokio_postgres::Error;
fn poll(&mut self) -> Poll<Option<Vec<u8>>, tokio_postgres::Error> {
try_ready!(self.0.poll().map_err(|e| panic!("{}", e)));
QUERY_DONE.store(true, Ordering::SeqCst);
Ok(Async::Ready(None))
}
2018-12-23 01:02:48 +00:00
}
2018-12-24 18:02:48 +00:00
struct IdleFuture(tokio_postgres::Client);
2018-12-23 01:02:48 +00:00
impl Future for IdleFuture {
type Item = ();
type Error = tokio_postgres::Error;
fn poll(&mut self) -> Poll<(), tokio_postgres::Error> {
2018-12-24 18:02:48 +00:00
try_ready!(self.0.poll_idle());
2018-12-23 01:02:48 +00:00
assert!(QUERY_DONE.load(Ordering::SeqCst));
Ok(Async::Ready(()))
}
}
static QUERY_DONE: AtomicBool = AtomicBool::new(false);
let _ = env_logger::try_init();
let mut runtime = Runtime::new().unwrap();
let (mut client, connection) = runtime.block_on(connect("user=postgres")).unwrap();
let connection = connection.map_err(|e| panic!("{}", e));
runtime.handle().spawn(connection).unwrap();
let execute = client
.simple_query("CREATE TEMPORARY TABLE foo (id INT)")
.for_each(|_| Ok(()));
2018-12-24 18:02:48 +00:00
runtime.block_on(execute).unwrap();
let prepare = client.prepare("COPY foo FROM STDIN");
let stmt = runtime.block_on(prepare).unwrap();
let copy_in = client.copy_in(
&stmt,
&[],
DelayStream(Delay::new(Instant::now() + Duration::from_millis(10))),
);
let copy_in = copy_in.map(|_| ()).map_err(|e| panic!("{}", e));
runtime.spawn(copy_in);
2018-12-23 01:02:48 +00:00
2018-12-24 18:02:48 +00:00
let future = IdleFuture(client);
runtime.block_on(future).unwrap();
}
#[test]
fn poll_idle_new() {
struct IdleFuture {
client: tokio_postgres::Client,
2019-01-18 05:11:24 +00:00
prepare: Option<impls::Prepare>,
2018-12-24 18:02:48 +00:00
}
impl Future for IdleFuture {
type Item = ();
type Error = tokio_postgres::Error;
fn poll(&mut self) -> Poll<(), tokio_postgres::Error> {
match self.prepare.take() {
Some(_future) => {
assert!(!self.client.poll_idle().unwrap().is_ready());
Ok(Async::NotReady)
}
None => {
assert!(self.client.poll_idle().unwrap().is_ready());
Ok(Async::Ready(()))
}
}
}
}
let _ = env_logger::try_init();
let mut runtime = Runtime::new().unwrap();
let (mut client, connection) = runtime.block_on(connect("user=postgres")).unwrap();
let connection = connection.map_err(|e| panic!("{}", e));
runtime.handle().spawn(connection).unwrap();
2018-12-23 01:02:48 +00:00
2018-12-24 18:02:48 +00:00
let prepare = client.prepare("");
2018-12-23 01:02:48 +00:00
let future = IdleFuture {
client,
2018-12-24 18:02:48 +00:00
prepare: Some(prepare),
2018-12-23 01:02:48 +00:00
};
runtime.block_on(future).unwrap();
}
*/