Skip to content
This repository has been archived by the owner on Mar 21, 2024. It is now read-only.

Commit

Permalink
Merge pull request #61 from golemcloud/tests_with_no_docker
Browse files Browse the repository at this point in the history
tests with no docker
  • Loading branch information
senia-psm committed Feb 5, 2024
2 parents 96cd4d7 + 29fce7b commit 645befd
Show file tree
Hide file tree
Showing 4 changed files with 141 additions and 61 deletions.
38 changes: 31 additions & 7 deletions tests/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ pub mod redis;
pub mod shard_manager;
pub mod worker;

use crate::context::db::{DbInfo, Postgres};
use crate::context::db::{Db, DbInfo};
use crate::context::golem_service::{GolemService, GolemServiceInfo};
use crate::context::redis::{Redis, RedisInfo};
use crate::context::shard_manager::{ShardManager, ShardManagerInfo};
Expand All @@ -24,6 +24,26 @@ pub struct EnvConfig {
pub redis_key_prefix: String,
pub wasi_root: PathBuf,
pub local_golem: bool,
pub db_type: DbType,
}

#[derive(Debug, Clone)]
pub enum DbType {
Postgres,
Sqlite,
}

impl DbType {
pub fn from_env() -> DbType {
let db_type_str = std::env::var("GOLEM_TEST_DB")
.unwrap_or("".to_string())
.to_lowercase();
if db_type_str == "sqlite" {
DbType::Sqlite
} else {
DbType::Postgres
}
}
}

impl EnvConfig {
Expand All @@ -37,13 +57,14 @@ impl EnvConfig {
std::env::var("GOLEM_TEST_TEMPLATES").unwrap_or("../test-templates".to_string()),
),
local_golem: std::env::var("GOLEM_DOCKER_SERVICES").is_err(),
db_type: DbType::from_env(),
}
}
}

pub struct Context<'docker_client> {
env: EnvConfig,
postgres: Postgres<'docker_client>,
db: Db<'docker_client>,
redis: Redis<'docker_client>,
shard_manager: ShardManager<'docker_client>,
golem_service: GolemService<'docker_client>,
Expand All @@ -53,11 +74,14 @@ pub struct Context<'docker_client> {
impl Context<'_> {
pub fn start(docker: &clients::Cli) -> Result<Context, Failed> {
let env_config = EnvConfig::from_env();
let postgres = Postgres::start(docker, &env_config)?;

println!("Starting context with env config: {env_config:?}");

let db = Db::start(docker, &env_config)?;
let redis = Redis::make(docker, &env_config)?;
let shard_manager = ShardManager::start(docker, &env_config, &redis.info())?;
let golem_service =
GolemService::start(docker, &env_config, &shard_manager.info(), &postgres.info())?;
GolemService::start(docker, &env_config, &shard_manager.info(), &db.info())?;
let worker_executors = WorkerExecutors::start(
docker,
&env_config,
Expand All @@ -68,7 +92,7 @@ impl Context<'_> {

Ok(Context {
env: env_config,
postgres,
db,
redis,
shard_manager,
golem_service,
Expand All @@ -79,7 +103,7 @@ impl Context<'_> {
pub fn info(&self) -> ContextInfo {
ContextInfo {
env: self.env.clone(),
db: Box::new(self.postgres.info()),
db: self.db.info(),
redis: self.redis.info(),
shard_manager: self.shard_manager.info(),
golem_service: self.golem_service.info(),
Expand All @@ -96,7 +120,7 @@ impl Drop for Context<'_> {

pub struct ContextInfo {
pub env: EnvConfig,
pub db: Box<dyn DbInfo + Sync + Send>,
pub db: DbInfo,
pub redis: RedisInfo,
pub shard_manager: ShardManagerInfo,
pub golem_service: GolemServiceInfo,
Expand Down
143 changes: 104 additions & 39 deletions tests/context/db.rs
Original file line number Diff line number Diff line change
@@ -1,19 +1,28 @@
use crate::context::{EnvConfig, NETWORK};
use crate::context::{DbType, EnvConfig, NETWORK};
use libtest_mimic::Failed;
use std::collections::HashMap;
use std::path::PathBuf;
use testcontainers::{clients, Container, RunnableImage};

pub struct Postgres<'docker_client> {
host: String,
port: u16,
local_port: u16,
_node: Container<'docker_client, testcontainers_modules::postgres::Postgres>,
pub struct Db<'docker_client> {
inner: DbInner<'docker_client>,
}

impl<'docker_client> Postgres<'docker_client> {
fn test_started(&self) -> Result<(), Failed> {
pub enum DbInner<'docker_client> {
Sqlite(PathBuf),
Postgres {
host: String,
port: u16,
local_port: u16,
_node: Container<'docker_client, testcontainers_modules::postgres::Postgres>,
},
}

impl<'docker_client> Db<'docker_client> {
fn test_started(local_port: u16) -> Result<(), Failed> {
let mut conn =
::postgres::Client::connect(&self.connection_string(), ::postgres::NoTls).unwrap();
::postgres::Client::connect(&Db::connection_string(local_port), ::postgres::NoTls)
.unwrap();

let _ = conn.query("SELECT version()", &[])?;
Ok(())
Expand All @@ -22,12 +31,41 @@ impl<'docker_client> Postgres<'docker_client> {
pub fn start(
docker: &'docker_client clients::Cli,
env_config: &EnvConfig,
) -> Result<Postgres<'docker_client>, Failed> {
) -> Result<Db<'docker_client>, Failed> {
match &env_config.db_type {
DbType::Sqlite => Db::prepare_sqlite(),
DbType::Postgres => Db::start_postgres(docker, env_config),
}
}

fn prepare_sqlite() -> Result<Db<'docker_client>, Failed> {
let path = PathBuf::from("../target/golem_test_db");

if path.exists() {
std::fs::remove_file(&path)?
}

Ok(Db {
inner: DbInner::Sqlite(path),
})
}

fn start_postgres(
docker: &'docker_client clients::Cli,
env_config: &EnvConfig,
) -> Result<Db<'docker_client>, Failed> {
println!("Starting Postgres in docker");

let name = "golem_postgres";
let image = RunnableImage::from(testcontainers_modules::postgres::Postgres::default())
.with_tag("12")
.with_container_name(name)
.with_network(NETWORK);
.with_tag("12");

let image = if env_config.local_golem {
image
} else {
image.with_container_name(name).with_network(NETWORK)
};

let node = docker.run(image);

let host = if env_config.local_golem {
Expand All @@ -42,33 +80,70 @@ impl<'docker_client> Postgres<'docker_client> {
5432
};

let res = Postgres {
host: host.to_string(),
port,
local_port: node.get_host_port_ipv4(5432),
_node: node,
let local_port = node.get_host_port_ipv4(5432);

let res = Db {
inner: DbInner::Postgres {
host: host.to_string(),
port,
local_port,
_node: node,
},
};

res.test_started()?;
Db::test_started(local_port)?;

Ok(res)
}

pub fn connection_string(&self) -> String {
fn connection_string(local_port: u16) -> String {
format!(
"postgres://postgres:postgres@127.0.0.1:{}/postgres",
self.local_port,
local_port,
)
}

pub fn info(&self) -> PostgresInfo {
PostgresInfo {
host: self.host.clone(),
port: self.port,
local_port: self.local_port,
database_name: "postgres".to_owned(),
username: "postgres".to_owned(),
password: "postgres".to_owned(),
pub fn info(&self) -> DbInfo {
match &self.inner {
DbInner::Sqlite(path) => DbInfo::Sqlite(path.clone()),
DbInner::Postgres {
host,
port,
local_port,
_node: _,
} => DbInfo::Postgres(PostgresInfo {
host: host.clone(),
port: port.clone(),
local_port: local_port.clone(),
database_name: "postgres".to_owned(),
username: "postgres".to_owned(),
password: "postgres".to_owned(),
}),
}
}
}

#[derive(Debug)]
pub enum DbInfo {
Sqlite(PathBuf),
Postgres(PostgresInfo),
}

impl DbInfo {
pub fn env(&self) -> HashMap<String, String> {
match self {
DbInfo::Postgres(pg) => pg.env(),
DbInfo::Sqlite(db_path) => [
("GOLEM__DB__TYPE".to_string(), "Sqlite".to_string()),
(
"GOLEM__DB__CONFIG__DATABASE".to_string(),
db_path
.to_str()
.expect("Invalid Sqlite database path")
.to_string(),
),
]
.into(),
}
}
}
Expand Down Expand Up @@ -121,13 +196,3 @@ impl PostgresInfo {
])
}
}

pub trait DbInfo {
fn env(&self) -> HashMap<String, String>;
}

impl DbInfo for PostgresInfo {
fn env(&self) -> HashMap<String, String> {
self.env()
}
}
8 changes: 4 additions & 4 deletions tests/context/golem_service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ impl<'docker_client> GolemService<'docker_client> {
docker: &'docker_client clients::Cli,
env_config: &EnvConfig,
shard_manager: &ShardManagerInfo,
db: &impl DbInfo,
db: &DbInfo,
) -> Result<GolemService<'docker_client>, Failed> {
if env_config.local_golem {
GolemService::start_process(env_config, shard_manager, db)
Expand All @@ -117,7 +117,7 @@ impl<'docker_client> GolemService<'docker_client> {
docker: &'docker_client clients::Cli,
env_config: &EnvConfig,
shard_manager: &ShardManagerInfo,
db: &impl DbInfo,
db: &DbInfo,
) -> Result<GolemService<'docker_client>, Failed> {
println!("Starting Golem Service docker with shard manager: {shard_manager:?}");

Expand Down Expand Up @@ -146,7 +146,7 @@ impl<'docker_client> GolemService<'docker_client> {
http_port: u16,
env_config: &EnvConfig,
shard_manager: &ShardManagerInfo,
db: &impl DbInfo,
db: &DbInfo,
) -> HashMap<String, String> {
let log_level = if env_config.verbose { "debug" } else { "info" };

Expand Down Expand Up @@ -188,7 +188,7 @@ impl<'docker_client> GolemService<'docker_client> {
fn start_process(
env_config: &EnvConfig,
shard_manager: &ShardManagerInfo,
db: &impl DbInfo,
db: &DbInfo,
) -> Result<GolemService<'docker_client>, Failed> {
println!("Starting Golem Service");

Expand Down
13 changes: 2 additions & 11 deletions tests/worker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,23 +98,14 @@ fn worker_new_instance(
make_template(&context, &format!("{name} worker new instance"), &cli)?.template_id;
let worker_name = format!("{name}_worker_new_instance");
let cfg = &cli.config;
let worker_id: Result<VersionedWorkerId, Failed> = cli.run(&[
let worker_id: VersionedWorkerId = cli.run(&[
"worker",
"add",
&cfg.arg('w', "worker-name"),
&worker_name,
&cfg.arg('T', "template-id"),
&template_id,
]);

let worker_id = match worker_id {
Ok(id) => id,
Err(e) => {
println!("Worker add failed: {e:?}");
std::thread::sleep(Duration::from_secs(6000));
panic!("PNIC")
}
};
])?;

assert_eq!(worker_id.worker_id.template_id.to_string(), template_id);
assert_eq!(worker_id.worker_id.worker_name, worker_name);
Expand Down

0 comments on commit 645befd

Please sign in to comment.