Skip to content

Commit

Permalink
Remove external_test_executor_engine option
Browse files Browse the repository at this point in the history
Specify engine option in `external_test_executor`
  • Loading branch information
SevInf committed Nov 21, 2023
1 parent f8fab6e commit 731f128
Show file tree
Hide file tree
Showing 12 changed files with 44 additions and 79 deletions.
2 changes: 1 addition & 1 deletion .envrc
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export QE_LOG_LEVEL=debug # Set it to "trace" to enable query-graph debugging lo
# export FMT_SQL=1 # Uncomment it to enable logging formatted SQL queries

### Uncomment to run driver adapters tests. See query-engine-driver-adapters.yml workflow for how tests run in CI.
# export EXTERNAL_TEST_EXECUTOR="$(pwd)/query-engine/driver-adapters/js/connector-test-kit-executor/script/start_node.sh"
# export EXTERNAL_TEST_EXECUTOR="napi"
# export DRIVER_ADAPTER=pg # Set to pg, neon or planetscale
# export PRISMA_DISABLE_QUAINT_EXECUTORS=1 # Disable quaint executors for driver adapters
# export DRIVER_ADAPTER_URL_OVERRIDE ="postgres://USER:PASSWORD@DATABASExxxx" # Override the database url for the driver adapter tests
Expand Down
89 changes: 31 additions & 58 deletions query-engine/connector-test-kit-rs/query-tests-setup/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,17 @@ use std::{convert::TryFrom, env, fmt::Display, fs::File, io::Read, path::PathBuf

static TEST_CONFIG_FILE_NAME: &str = ".test_config";

#[derive(Debug, Default, Deserialize, Clone)]
pub enum TestExecutorEngine {
#[default]
#[derive(Debug, Deserialize, Clone)]
pub enum TestExecutor {
Napi,
Wasm,
}

impl Display for TestExecutorEngine {
impl Display for TestExecutor {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
TestExecutorEngine::Napi => f.write_str("Napi"),
TestExecutorEngine::Wasm => f.write_str("Wasm"),
TestExecutor::Napi => f.write_str("Napi"),
TestExecutor::Wasm => f.write_str("Wasm"),
}
}
}
Expand All @@ -40,13 +39,9 @@ pub struct TestConfig {
/// Used when testing driver adapters, this process is expected to be a javascript process
/// loading the library engine (as a library, or WASM modules) and providing it with a
/// driver adapter.
/// Possible values: Napi, Wasm
/// Env key: `EXTERNAL_TEST_EXECUTOR`
external_test_executor: Option<String>,

/// Specifies which engine to use within external test executor.
/// If omitted, NAPI engine will be used.
/// Env key: `EXTERNAL_TEST_EXECUTOR_ENGINE`
external_test_executor_engine: Option<TestExecutorEngine>,
external_test_executor: Option<TestExecutor>,

/// The driver adapter to use when running tests, will be forwarded to the external test
/// executor by setting the `DRIVER_ADAPTER` env var when spawning the executor process
Expand Down Expand Up @@ -106,12 +101,11 @@ fn exit_with_message(msg: &str) -> ! {
impl TestConfig {
/// Loads a configuration. File-based config has precedence over env config.
pub(crate) fn load() -> Self {
let mut config = match Self::from_file().or_else(Self::from_env) {
let config = match Self::from_file().or_else(Self::from_env) {
Some(config) => config,
None => exit_with_message(CONFIG_LOAD_FAILED),
};

config.fill_defaults();
config.validate();
config.log_info();

Expand All @@ -128,9 +122,8 @@ impl TestConfig {
self.connector_version().unwrap_or_default()
);
println!("* CI? {}", self.is_ci);
if self.external_test_executor.as_ref().is_some() {
println!("* External test executor: {}", self.external_test_executor().unwrap_or_default());
println!("* External test executor engine: {:?}", self.external_test_executor_engine().unwrap_or_default());
if let Some(external_test_executor) = self.external_test_executor.as_ref() {
println!("* External test executor: {}", external_test_executor);
println!("* Driver adapter: {}", self.driver_adapter().unwrap_or_default());
println!("* Driver adapter url override: {}", self.json_stringify_driver_adapter_config());
}
Expand All @@ -140,9 +133,8 @@ impl TestConfig {
fn from_env() -> Option<Self> {
let connector = std::env::var("TEST_CONNECTOR").ok();
let connector_version = std::env::var("TEST_CONNECTOR_VERSION").ok();
let external_test_executor = std::env::var("EXTERNAL_TEST_EXECUTOR").ok();
let external_test_executor_engine = std::env::var("EXTERNAL_TEST_EXECUTOR_ENGINE")
.map(|value| serde_json::from_str::<TestExecutorEngine>(&value).ok())
let external_test_executor = std::env::var("EXTERNAL_TEST_EXECUTOR")
.map(|value| serde_json::from_str::<TestExecutor>(&value).ok())
.unwrap_or_default();

let driver_adapter = std::env::var("DRIVER_ADAPTER").ok();
Expand All @@ -160,7 +152,6 @@ impl TestConfig {
external_test_executor,
driver_adapter,
driver_adapter_config,
external_test_executor_engine,
})
}

Expand All @@ -182,31 +173,23 @@ impl TestConfig {
})
}

/// if the loaded value for external_test_executor is "default" (case insensitive),
/// and the workspace_root is set, then use the default external test executor.
fn fill_defaults(&mut self) {
fn workspace_root() -> Option<PathBuf> {
env::var("WORKSPACE_ROOT").ok().map(PathBuf::from)
}

pub fn external_test_executor_path(&self) -> Option<String> {
const DEFAULT_TEST_EXECUTOR: &str =
"query-engine/driver-adapters/connector-test-kit-executor/script/start_node.sh";

if self
.external_test_executor
self.external_test_executor
.as_ref()
.filter(|s| s.eq_ignore_ascii_case("default"))
.is_some()
{
self.external_test_executor = Self::workspace_root()
.map(|path| path.join(DEFAULT_TEST_EXECUTOR))
.or_else(|| {
exit_with_message(
"WORKSPACE_ROOT needs to be correctly set to the root of the prisma-engines repository",
)
})
.and_then(|path| path.to_str().map(|s| s.to_owned()));
}
}

fn workspace_root() -> Option<PathBuf> {
env::var("WORKSPACE_ROOT").ok().map(PathBuf::from)
.and_then(|_| Self::workspace_root())
.map(|path| path.join(DEFAULT_TEST_EXECUTOR))
.or_else(|| {
exit_with_message(
"WORKSPACE_ROOT needs to be correctly set to the root of the prisma-engines repository",
)
})
.and_then(|path| path.to_str().map(|s| s.to_owned()))
}

fn validate(&self) {
Expand All @@ -233,7 +216,7 @@ impl TestConfig {
Err(err) => exit_with_message(&err.to_string()),
}

if let Some(file) = self.external_test_executor.as_ref() {
if let Some(file) = self.external_test_executor_path().as_ref() {
let path = PathBuf::from(file);
let md = path.metadata();
if !path.exists() || md.is_err() || !md.unwrap().is_file() {
Expand Down Expand Up @@ -261,12 +244,6 @@ impl TestConfig {
);
}

if self.external_test_executor_engine.is_some() && self.external_test_executor.is_none() {
exit_with_message(
"External test executor engine can be used only if EXTERNAL_TEST_EXECUTOR env var is set.",
);
}

if self.driver_adapter.is_some() && self.external_test_executor.is_none() {
exit_with_message(
"When using a driver adapter, the external test executor (EXTERNAL_TEST_EXECUTOR env var) must be set.",
Expand All @@ -292,12 +269,8 @@ impl TestConfig {
self.is_ci
}

pub fn external_test_executor(&self) -> Option<&str> {
self.external_test_executor.as_deref()
}

pub fn external_test_executor_engine(&self) -> Option<TestExecutorEngine> {
self.external_test_executor_engine.clone()
pub fn external_test_executor(&self) -> Option<TestExecutor> {
self.external_test_executor.clone()
}

pub fn driver_adapter(&self) -> Option<&str> {
Expand Down Expand Up @@ -338,8 +311,8 @@ impl TestConfig {
self.json_stringify_driver_adapter_config()
),
(
"EXTERNAL_TEST_EXECUTOR_ENGINE".to_string(),
self.external_test_executor_engine.clone().unwrap_or_default().to_string(),
"EXTERNAL_TEST_EXECUTOR".to_string(),
self.external_test_executor.clone().unwrap_or(TestExecutor::Napi).to_string(),
),
(
"PRISMA_DISABLE_QUAINT_EXECUTORS".to_string(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,15 +101,15 @@ fn start_rpc_thread(mut receiver: mpsc::Receiver<ReqImpl>) -> Result<()> {
use tokio::process::Command;

let path = crate::CONFIG
.external_test_executor()
.external_test_executor_path()
.unwrap_or_else(|| exit_with_message(1, "start_rpc_thread() error: external test executor is not set"));

tokio::runtime::Builder::new_current_thread()
.enable_io()
.build()
.unwrap()
.block_on(async move {
let process = match Command::new(path)
let process = match Command::new(&path)
.envs(CONFIG.for_external_executor())
.stdin(Stdio::piped())
.stdout(Stdio::piped())
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
{
"connector": "sqlite",
"driver_adapter": "libsql",
"external_test_executor": "default",
"external_test_executor_engine": "Napi"
"external_test_executor": "Napi"
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
{
"connector": "sqlite",
"driver_adapter": "libsql",
"external_test_executor": "default",
"external_test_executor_engine": "Wasm"
"external_test_executor": "Wasm"
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,5 @@
"version": "13",
"driver_adapter": "neon:ws",
"driver_adapter_config": { "proxyUrl": "127.0.0.1:5488/v1" },
"external_test_executor": "default",
"external_test_executor_engine": "Napi"
"external_test_executor": "Napi"
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,5 @@
"version": "13",
"driver_adapter": "neon:ws",
"driver_adapter_config": { "proxyUrl": "127.0.0.1:5488/v1" },
"external_test_executor": "default",
"external_test_executor_engine": "Wasm"
"external_test_executor": "Wasm"
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,5 @@
"connector": "postgres",
"version": "13",
"driver_adapter": "pg",
"external_test_executor": "default",
"external_test_executor_engine": "Napi"
"external_test_executor": "Napi"
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,5 @@
"connector": "postgres",
"version": "13",
"driver_adapter": "pg",
"external_test_executor": "default",
"external_test_executor_engine": "Wasm"
"external_test_executor": "Wasm"
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,5 @@
"version": "8.0",
"driver_adapter": "planetscale",
"driver_adapter_config": { "proxyUrl": "http://root:root@127.0.0.1:8085" },
"external_test_executor": "default",
"external_test_executor_engine": "Napi"
"external_test_executor": "Napi"
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,5 @@
"version": "8.0",
"driver_adapter": "planetscale",
"driver_adapter_config": { "proxyUrl": "http://root:root@127.0.0.1:8085" },
"external_test_executor": "default",
"external_test_executor_engine": "Wasm"
"external_test_executor": "Wasm"
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,15 @@ export async function initQueryEngine(adapter: ErrorCapturingDriverAdapter, data
debug(parsed)
}

const engineFromEnv = process.env.EXTERNAL_TEST_EXECUTOR_ENGINE ?? 'Napi'
const engineFromEnv = process.env.EXTERNAL_TEST_EXECUTOR ?? 'Napi'
if (engineFromEnv === 'Wasm') {
const { WasmQueryEngine } = await import('./wasm')
return new WasmQueryEngine(queryEngineOptions, logCallback, adapter)
} else if (engineFromEnv === 'Napi') {
const { QueryEngine } = loadNapiEngine()
return new QueryEngine(queryEngineOptions, logCallback, adapter)
} else {
throw new TypeError(`Invalid EXTERNAL_TEST_EXECUTOR_ENGINE value: ${engineFromEnv}. Expected Napi or Wasm`)
throw new TypeError(`Invalid EXTERNAL_TEST_EXECUTOR value: ${engineFromEnv}. Expected Napi or Wasm`)
}


Expand Down

0 comments on commit 731f128

Please sign in to comment.