diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0a6ca52a4..b9a0a276e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,7 +13,7 @@ jobs: runs-on: ${{ matrix.operating-system }} strategy: matrix: - operating-system: [ ubuntu-latest, windows-latest, macos-13 ] + operating-system: [ ubuntu-latest, windows-latest, macos-latest ] rust: [ stable ] env: pact_do_not_track: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3a5473d0c..313d43a73 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,11 +19,11 @@ jobs: strategy: matrix: include: - - operating-system: ubuntu-20.04 + - operating-system: ubuntu-22.04 targets: x86_64-unknown-linux-gnu,x86_64-unknown-linux-musl,aarch64-unknown-linux-gnu,aarch64-unknown-linux-musl - - operating-system: windows-2019 + - operating-system: windows-latest targets: aarch64-pc-windows-msvc,x86_64-pc-windows-msvc - - operating-system: macos-13 + - operating-system: macos-latest targets: aarch64-apple-darwin,x86_64-apple-darwin fail-fast: false diff --git a/pact_mock_server_cli/Dockerfile b/pact_mock_server_cli/Dockerfile index ab2737fd0..3fafe5478 100644 --- a/pact_mock_server_cli/Dockerfile +++ b/pact_mock_server_cli/Dockerfile @@ -4,19 +4,19 @@ ARG BIN_ARCH=x86_64 ARG VERSION=1.0.5 RUN apk --no-cache add wget -RUN wget -O pact_mock_server_cli.gz https://github.com/pact-foundation/pact-reference/releases/download/pact_mock_server_cli-v${VERSION}/pact_mock_server_cli-linux-${BIN_ARCH}.gz -RUN gunzip pact_mock_server_cli.gz -RUN chmod +x pact_mock_server_cli +RUN wget -O pact-mock-server.gz https://github.com/pact-foundation/pact-reference/releases/download/pact_mock_server_cli-v${VERSION}/pact-mock-server-linux-${BIN_ARCH}.gz +RUN gunzip pact-mock-server.gz +RUN chmod +x pact-mock-server # Now, we need to build our _real_ Docker container, copying in the executable. FROM ${ARCH}alpine:3.16 RUN apk --no-cache add ca-certificates COPY --from=builder \ - /pact_mock_server_cli \ + /pact-mock-server \ /usr/local/bin/ EXPOSE 8080 9000-9020 -ENTRYPOINT ["/usr/local/bin/pact_mock_server_cli"] +ENTRYPOINT ["/usr/local/bin/pact-mock-server"] CMD ["start", "--base-port", "9000"] diff --git a/pact_mock_server_cli/README.md b/pact_mock_server_cli/README.md index 11a6041c6..d05ae3274 100644 --- a/pact_mock_server_cli/README.md +++ b/pact_mock_server_cli/README.md @@ -8,16 +8,16 @@ restful web api or through the command line interface. It implements the [V4 Pac ## Command line interface -The mock server is bundles as a single binary executable `pact_mock_server_cli`. Running this with out any options displays +The mock server is bundles as a single binary executable `pact-mock-server`. Running this with out any options displays the standard help. ```console,ignore -$ ./pact_mock_server_cli --help -./pact_mock_server_cli v1.0.0 +$ ./pact-mock-server --help +./pact-mock-server v1.0.0 Standalone Pact mock server USAGE: - pact_mock_server_cli [FLAGS] [OPTIONS] + pact-mock-server [FLAGS] [OPTIONS] FLAGS: --help Prints help information @@ -72,10 +72,10 @@ This prints either the main help or the help for a sub-command. This starts the master mock server. This server needs to be running for the other sub-commands to work. ```console -$ ./pact_mock_server_cli help start +$ ./pact-mock-server help start Starts the master mock server -Usage: pact_mock_server_cli start [OPTIONS] +Usage: pact-mock-server start [OPTIONS] Options: --help Print help and exit @@ -101,7 +101,7 @@ This sets the output directory that log files and pact files are written to. It ##### Example ```console,ignore -$ ./pact_mock_server_cli start -l debug -o logs/ +$ ./pact-mock-server start -l debug -o logs/ 15:40:08 [DEBUG] hyper::server: threads = 10 15:40:08 [INFO] pact_mock_server_cli::server: Server started on port 8080 ``` @@ -114,22 +114,23 @@ will be displayed. Note, the tls option will only be available if the tls create feature is enabled. ```console -$ ./pact_mock_server_cli help create +$ ./pact-mock-server help create Creates a new mock server from a pact file -Usage: pact_mock_server_cli create [OPTIONS] --file +Usage: pact-mock-server create [OPTIONS] --file Options: - -f, --file the pact file to define the mock server - --help Print help and exit - -c, --cors-preflight Handle CORS pre-flight requests - -v, --version Print version information and exit - -p, --port port the master mock server runs on (defaults to 8080) - --tls Enable TLS with the mock server (will use a self-signed certificate) - -h, --host hostname the master mock server runs on (defaults to localhost) - -l, --loglevel Log level for mock servers to write to the log file (defaults to info) [possible values: error, warn, info, debug, trace, none] - --no-term-log Turns off using terminal ANSI escape codes - --no-file-log Do not log to an output file + -f, --file the pact file to define the mock server + --help Print help and exit + -c, --cors-preflight Handle CORS pre-flight requests + -v, --version Print version information and exit + -p, --port port the master mock server runs on (defaults to 8080) + --specification The Pact specification version to use (defaults to V4) + -h, --host hostname the master mock server runs on (defaults to localhost) + --tls Enable TLS with the mock server (will use a self-signed certificate) + -l, --loglevel Log level for mock servers to write to the log file (defaults to info) [possible values: error, warn, info, debug, trace, none] + --no-term-log Turns off using terminal ANSI escape codes + --no-file-log Do not log to an output file ``` @@ -143,7 +144,7 @@ This option specifies the pact file to base the mock server on. It is a mandator ##### Example ```console,ignore -$ ./pact_mock_server_cli create -f ../../../libpact_matching/tests/pact.json +$ ./pact-mock-server create -f ../../../libpact_matching/tests/pact.json 15:43:47 [INFO] pact_mock_server_cli::create_mock: Creating mock server from file ../../../libpact_matching/tests/pact.json Mock server "7d1bf906d0ff42528f2d7d794dd19c5b" started on port 52943 ``` @@ -153,10 +154,10 @@ Mock server "7d1bf906d0ff42528f2d7d794dd19c5b" started on port 52943 Lists out all running mock servers with their ID, port, provider name and status. ```console -$ ./pact_mock_server_cli list --help +$ ./pact-mock-server list --help Lists all the running mock servers -Usage: pact_mock_server_cli list [OPTIONS] +Usage: pact-mock-server list [OPTIONS] Options: --help Print help and exit @@ -173,7 +174,7 @@ Options: ##### Example ```console,ignore -$ ./pact_mock_server_cli list +$ ./pact-mock-server list Mock Server Id Port Provider Status 7d1bf906d0ff42528f2d7d794dd19c5b 52943 Alice Service error ``` @@ -185,10 +186,10 @@ expectations have been met, the pact file will be written out to the output dire sub-command. If there is any errors, no pact file will be written and the errors displayed to the console. ```console -$ ./pact_mock_server_cli verify --help +$ ./pact-mock-server verify --help Verify the mock server by id or port number, and generate a pact file if all ok -Usage: pact_mock_server_cli verify [OPTIONS] +Usage: pact-mock-server verify [OPTIONS] Options: --help @@ -228,7 +229,7 @@ The port number of the mock server to verify. Either this option or the mock ser In the case of a mock server that has issues: ```console,ignore -$ ./pact_mock_server_cli verify -m 52943 +$ ./pact-mock-server verify -m 52943 Mock server 7d1bf906d0ff42528f2d7d794dd19c5b/52943 failed verification with 1 errors 0 - Expected request was not received - {"method":"GET","path":"/mallory","query":"name=ron&status=good"} @@ -237,7 +238,7 @@ Mock server 7d1bf906d0ff42528f2d7d794dd19c5b/52943 failed verification with 1 er and for a mock server that has matched all requests: ```console,ignore -$ ./pact_mock_server_cli verify -m 52943 +$ ./pact-mock-server verify -m 52943 Mock server 7d1bf906d0ff42528f2d7d794dd19c5b/52943 verified ok ``` @@ -246,10 +247,10 @@ Mock server 7d1bf906d0ff42528f2d7d794dd19c5b/52943 verified ok Shutdown the mock server by id or port number, releasing all its resources. ```console -$ ./pact_mock_server_cli help shutdown +$ ./pact-mock-server help shutdown Shutdown the mock server by id or port number, releasing all its resources -Usage: pact_mock_server_cli shutdown [OPTIONS] +Usage: pact-mock-server shutdown [OPTIONS] Options: --help @@ -287,7 +288,7 @@ The port number of the mock server to shutdown. Either this option or the mock s ##### Example ```console,ignore -$ ./pact_mock_server_cli shutdown -i 3a94a472d04849048b78109e288702d0 +$ ./pact-mock-server shutdown -i 3a94a472d04849048b78109e288702d0 Mock server with id '3a94a472d04849048b78109e288702d0' shutdown ok ``` diff --git a/pact_mock_server_cli/release-docker.sh b/pact_mock_server_cli/release-docker.sh index 50564cf66..f565ab96a 100755 --- a/pact_mock_server_cli/release-docker.sh +++ b/pact_mock_server_cli/release-docker.sh @@ -9,21 +9,21 @@ if [ "" = "$1" ]; then fi # AMD64 -docker build . -t pactfoundation/pact-ref-mock-server:$1-amd64 --platform linux/amd64 \ +docker build . -t pactfoundation/pact-mock-server:$1-amd64 --platform linux/amd64 \ --build-arg ARCH=amd64/ --build-arg BIN_ARCH=x86_64 --build-arg VERSION=$1 -docker push pactfoundation/pact-ref-mock-server:$1-amd64 +docker push pactfoundation/pact-mock-server:$1-amd64 # ARM64V8 -docker build . -t pactfoundation/pact-ref-mock-server:$1-arm64v8 --platform linux/arm64 \ +docker build . -t pactfoundation/pact-mock-server:$1-arm64v8 --platform linux/arm64 \ --build-arg ARCH=arm64v8/ --build-arg BIN_ARCH=aarch64 --build-arg VERSION=$1 -docker push pactfoundation/pact-ref-mock-server:$1-arm64v8 +docker push pactfoundation/pact-mock-server:$1-arm64v8 # Create Manifest -docker manifest create pactfoundation/pact-ref-mock-server:$1 \ - --amend pactfoundation/pact-ref-mock-server:$1-amd64 \ - --amend pactfoundation/pact-ref-mock-server:$1-arm64v8 -docker manifest push pactfoundation/pact-ref-mock-server:$1 -docker manifest create pactfoundation/pact-ref-mock-server:latest \ - --amend pactfoundation/pact-ref-mock-server:$1-amd64 \ - --amend pactfoundation/pact-ref-mock-server:$1-arm64v8 -docker manifest push pactfoundation/pact-ref-mock-server:latest +docker manifest create pactfoundation/pact-mock-server:$1 \ + --amend pactfoundation/pact-mock-server:$1-amd64 \ + --amend pactfoundation/pact-mock-server:$1-arm64v8 +docker manifest push pactfoundation/pact-mock-server:$1 +docker manifest create pactfoundation/pact-mock-server:latest \ + --amend pactfoundation/pact-mock-server:$1-amd64 \ + --amend pactfoundation/pact-mock-server:$1-arm64v8 +docker manifest push pactfoundation/pact-mock-server:latest diff --git a/pact_mock_server_cli/release-linux.sh b/pact_mock_server_cli/release-linux.sh index 4b27b7344..a66d2fc28 100755 --- a/pact_mock_server_cli/release-linux.sh +++ b/pact_mock_server_cli/release-linux.sh @@ -19,8 +19,8 @@ build_x86_64() { if [[ "${cargo_flags[*]}" =~ "--release" ]]; then gzip_and_sum \ - "$CARGO_TARGET_DIR/x86_64-unknown-linux-musl/release/pact_mock_server_cli" \ - "$ARTIFACTS_DIR/pact_mock_server_cli-linux-x86_64.gz" + "$CARGO_TARGET_DIR/x86_64-unknown-linux-musl/release/pact-mock-server" \ + "$ARTIFACTS_DIR/pact-mock-server-linux-x86_64.gz" fi } @@ -34,8 +34,8 @@ build_aarch64() { if [[ "${cargo_flags[*]}" =~ "--release" ]]; then gzip_and_sum \ - "$CARGO_TARGET_DIR/aarch64-unknown-linux-musl/release/pact_mock_server_cli" \ - "$ARTIFACTS_DIR/pact_mock_server_cli-linux-aarch64.gz" + "$CARGO_TARGET_DIR/aarch64-unknown-linux-musl/release/pact-mock-server" \ + "$ARTIFACTS_DIR/pact-mock-server-linux-aarch64.gz" fi } diff --git a/pact_mock_server_cli/release-macos.sh b/pact_mock_server_cli/release-macos.sh index d9e77ff3f..a4afdad1a 100755 --- a/pact_mock_server_cli/release-macos.sh +++ b/pact_mock_server_cli/release-macos.sh @@ -22,11 +22,8 @@ build_x86_64() { if [[ "${cargo_flags[*]}" =~ "--release" ]]; then gzip_and_sum \ - "$CARGO_TARGET_DIR/x86_64-apple-darwin/release/pact_mock_server_cli" \ - "$ARTIFACTS_DIR/pact_mock_server_cli-osx-x86_64.gz" - gzip_and_sum \ - "$CARGO_TARGET_DIR/x86_64-apple-darwin/release/pact_mock_server_cli" \ - "$ARTIFACTS_DIR/pact_mock_server_cli-macos-x86_64.gz" + "$CARGO_TARGET_DIR/x86_64-apple-darwin/release/pact-mock-server" \ + "$ARTIFACTS_DIR/pact-mock-server-macos-x86_64.gz" fi } @@ -36,11 +33,8 @@ build_aarch64() { if [[ "${cargo_flags[*]}" =~ "--release" ]]; then gzip_and_sum \ - "$CARGO_TARGET_DIR/aarch64-apple-darwin/release/pact_mock_server_cli" \ - "$ARTIFACTS_DIR/pact_mock_server_cli-osx-aarch64.gz" - gzip_and_sum \ - "$CARGO_TARGET_DIR/aarch64-apple-darwin/release/pact_mock_server_cli" \ - "$ARTIFACTS_DIR/pact_mock_server_cli-macos-aarch64.gz" + "$CARGO_TARGET_DIR/aarch64-apple-darwin/release/pact-mock-server" \ + "$ARTIFACTS_DIR/pact-mock-server-macos-aarch64.gz" fi } diff --git a/pact_mock_server_cli/release-win.sh b/pact_mock_server_cli/release-win.sh index e6ebe3a2c..5fe1dab25 100644 --- a/pact_mock_server_cli/release-win.sh +++ b/pact_mock_server_cli/release-win.sh @@ -20,8 +20,8 @@ build_x86_64() { # If --release in cargo flags, then gzip and sum the release artifacts if [[ "${cargo_flags[*]}" =~ "--release" ]]; then gzip_and_sum \ - "$CARGO_TARGET_DIR/x86_64-pc-windows-msvc/release/pact_mock_server_cli.exe" \ - "$ARTIFACTS_DIR/pact_mock_server_cli-windows-x86_64.exe.gz" + "$CARGO_TARGET_DIR/x86_64-pc-windows-msvc/release/pact-mock-server.exe" \ + "$ARTIFACTS_DIR/pact-mock-server-windows-x86_64.exe.gz" fi } @@ -31,8 +31,8 @@ build_aarch64() { if [[ "${cargo_flags[*]}" =~ "--release" ]]; then gzip_and_sum \ - "$CARGO_TARGET_DIR/aarch64-pc-windows-msvc/release/pact_mock_server_cli.exe" \ - "$ARTIFACTS_DIR/pact_mock_server_cli-windows-aarch64.exe.gz" + "$CARGO_TARGET_DIR/aarch64-pc-windows-msvc/release/pact-mock-server.exe" \ + "$ARTIFACTS_DIR/pact-mock-server-windows-aarch64.exe.gz" fi } diff --git a/pact_mock_server_cli/src/bin/pact-mock-server.rs b/pact_mock_server_cli/src/bin/pact-mock-server.rs new file mode 100644 index 000000000..9078b12ec --- /dev/null +++ b/pact_mock_server_cli/src/bin/pact-mock-server.rs @@ -0,0 +1,7 @@ +#[tokio::main] +async fn main() { + match pact_mock_server_cli::handle_command_args().await { + Ok(_) => (), + Err(err) => std::process::exit(err) + } +} diff --git a/pact_mock_server_cli/src/create_mock.rs b/pact_mock_server_cli/src/create_mock.rs index d420bcbd4..49bdc2e00 100644 --- a/pact_mock_server_cli/src/create_mock.rs +++ b/pact_mock_server_cli/src/create_mock.rs @@ -15,14 +15,19 @@ pub async fn create_mock_server(host: &str, port: u16, matches: &ArgMatches, usa match RequestResponsePact::read_pact(Path::new(file)) { Ok(ref pact) => { - let mut args = vec![]; + let mut args = Vec::::new(); if matches.get_flag("cors") { info!("Setting mock server to handle CORS pre-flight requests"); - args.push("cors=true"); + args.push("cors=true".to_string()); + } + if let Some(specification) = matches.get_one::("specification") { + info!("Setting mock server to use pact specification {}", specification); + let spec_arg = format!("specification={}", specification); + args.push(spec_arg); } if matches.get_flag("tls") { info!("Setting mock server to use TLS"); - args.push("tls=true"); + args.push("tls=true".to_string()); } let url = if args.is_empty() { format!("http://{}:{}/", host, port) diff --git a/pact_mock_server_cli/src/main.rs b/pact_mock_server_cli/src/lib.rs similarity index 88% rename from pact_mock_server_cli/src/main.rs rename to pact_mock_server_cli/src/lib.rs index 92b5b93af..8f8474c3c 100644 --- a/pact_mock_server_cli/src/main.rs +++ b/pact_mock_server_cli/src/lib.rs @@ -7,10 +7,12 @@ use std::env; use std::io; +use std::process::ExitCode; use std::str::FromStr; use std::sync::Mutex; use anyhow::anyhow; +use clap::ArgMatches; use clap::{Arg, ArgAction, command, Command}; use clap::error::ErrorKind; use lazy_static::*; @@ -19,10 +21,10 @@ use rand::distributions::Alphanumeric; use rand::Rng; use regex::Regex; use tracing_core::LevelFilter; -use tracing_subscriber::fmt::writer::MakeWriterExt; use tracing_subscriber::FmtSubscriber; use pact_mock_server::server_manager::ServerManager; +use tracing_subscriber::layer::SubscriberExt; pub(crate) fn display_error(error: String, _usage: &str, code: i32) -> ! { eprintln!("ERROR: {}\nExiting with status {}", error, code); @@ -41,7 +43,7 @@ mod list; mod verify; mod shutdown; -fn print_version() { +pub fn print_version() { println!("pact mock server version : v{}", clap::crate_version!()); println!("pact specification version: v{}", PactSpecification::V4.version_str()); } @@ -60,13 +62,20 @@ fn setup_loggers( if command == "start" && !no_file_log { let file_appender = tracing_appender::rolling::daily(output.unwrap_or("."), "pact_mock_server.log"); - let (non_blocking, _guard) = tracing_appender::non_blocking(file_appender); - let subscriber = FmtSubscriber::builder() - .with_max_level(log_level) - .with_writer(non_blocking.and(io::stdout)) - .with_thread_names(true) - .with_ansi(!no_term_log) - .finish(); + let (non_blocking, guard) = tracing_appender::non_blocking(file_appender); + static mut LOG_GUARD: Option = None; + unsafe { + LOG_GUARD = Some(guard); + } + let file_layer = tracing_subscriber::fmt::layer() + .with_writer(non_blocking) + .with_ansi(false) + .with_thread_names(true); + + let subscriber = + FmtSubscriber::builder().with_max_level(log_level).with_ansi(!no_term_log).finish() + .with(file_layer); + tracing::subscriber::set_global_default(subscriber) } else { let subscriber = FmtSubscriber::builder() @@ -95,14 +104,6 @@ fn mock_server_id(v: &str) -> Result { } } -#[tokio::main] -async fn main() { - match handle_command_args().await { - Ok(_) => (), - Err(err) => std::process::exit(err) - } -} - #[derive(Debug, Clone)] pub(crate) struct ServerOpts { pub output_path: Option, @@ -114,13 +115,45 @@ lazy_static!{ pub(crate) static ref SERVER_MANAGER: Mutex = Mutex::new(ServerManager::new()); } -async fn handle_command_args() -> Result<(), i32> { +pub async fn handle_command_args() -> Result<(), i32> { let mut app = setup_args(); - let usage = app.render_usage().to_string(); let matches = app.try_get_matches(); match matches { - Ok(ref matches) => { + Ok(results) => handle_matches(&results).await, + + Err(ref err) => { + match err.kind() { + ErrorKind::DisplayHelp => { + println!("{}", err); + Ok(()) + }, + ErrorKind::DisplayVersion => { + print_version(); + println!(); + Ok(()) + }, + _ => { + err.exit() + } + } + } + } +} + +pub fn process_mock_command(args: &ArgMatches) -> Result<(), ExitCode> { + tokio::runtime::Runtime::new().unwrap().block_on(async { + let res = handle_matches(args).await; + match res { + Ok(()) => Ok(()), + Err(code) => Err(ExitCode::from(code as u8)), + } + }) +} + + + +async fn handle_matches(matches: &ArgMatches) -> Result<(), i32> { let log_level = matches.get_one::("loglevel").map(|lvl| lvl.as_str()); let no_file_log = matches.get_flag("no-file-log"); let no_term_log = matches.get_flag("no-term-log"); @@ -144,6 +177,8 @@ async fn handle_command_args() -> Result<(), i32> { let localhost = "localhost".to_string(); let host = matches.get_one::("host").unwrap_or(&localhost); + let usage = setup_args().render_usage().to_string(); + match matches.subcommand() { Some(("start", sub_matches)) => { let output_path = sub_matches.get_one::("output").map(|s| s.to_owned()); @@ -164,27 +199,8 @@ async fn handle_command_args() -> Result<(), i32> { Some(("shutdown-master", sub_matches)) => shutdown::shutdown_master_server(host, port, sub_matches, usage.as_str()).await, _ => Err(3) } - }, - Err(ref err) => { - match err.kind() { - ErrorKind::DisplayHelp => { - println!("{}", err); - Ok(()) - }, - ErrorKind::DisplayVersion => { - print_version(); - println!(); - Ok(()) - }, - _ => { - err.exit() - } - } - } - } } - -fn setup_args() -> Command { +pub fn setup_args() -> Command { #[allow(unused_mut)] let mut create_command = Command::new("create") .about("Creates a new mock server from a pact file") @@ -199,7 +215,12 @@ fn setup_args() -> Command { .short('c') .long("cors-preflight") .action(ArgAction::SetTrue) - .help("Handle CORS pre-flight requests")); + .help("Handle CORS pre-flight requests")) + .arg(Arg::new("specification") + .long("specification") + .action(ArgAction::Set) + .num_args(1) + .help("The Pact specification version to use (defaults to V4)")); #[cfg(feature = "tls")] { diff --git a/pact_mock_server_cli/src/server.rs b/pact_mock_server_cli/src/server.rs index 7a4dfcf4c..143d5f8e9 100644 --- a/pact_mock_server_cli/src/server.rs +++ b/pact_mock_server_cli/src/server.rs @@ -93,10 +93,23 @@ fn start_provider(context: &mut WebmachineContext) -> Result { })?; debug!("Loaded pact = {:?}", pact); let mock_server_id = generate_hexadecimal(8); - let config = MockServerConfig { + let pact_specification = match context.request.query.get("specification") { + Some(specs) => { + match specs.first() { + Some(spec) if !spec.is_empty() => Some(spec.clone()), + _ => None, + } + }, + None => None + }; + + let mut config = MockServerConfig { cors_preflight: query_param_set(context, "cors"), .. MockServerConfig::default() - }; + }; + if let Some(spec) = pact_specification { + config.pact_specification = spec.into(); + } debug!("Mock server config = {:?}", config); #[allow(unused_assignments)] diff --git a/pact_mock_server_cli/tests/cmd/create.stdout b/pact_mock_server_cli/tests/cmd/create.stdout index 849dad630..e2167f1bf 100644 --- a/pact_mock_server_cli/tests/cmd/create.stdout +++ b/pact_mock_server_cli/tests/cmd/create.stdout @@ -1,16 +1,17 @@ Creates a new mock server from a pact file -Usage: pact_mock_server_cli create [OPTIONS] --file +Usage: pact-mock-server create [OPTIONS] --file Options: - -f, --file the pact file to define the mock server - --help Print help and exit - -c, --cors-preflight Handle CORS pre-flight requests - -v, --version Print version information and exit - -p, --port port the master mock server runs on (defaults to 8080) - --tls Enable TLS with the mock server (will use a self-signed certificate) - -h, --host hostname the master mock server runs on (defaults to localhost) - -l, --loglevel Log level for mock servers to write to the log file (defaults to info) [possible values: error, warn, info, debug, trace, none] - --no-term-log Turns off using terminal ANSI escape codes - --no-file-log Do not log to an output file + -f, --file the pact file to define the mock server + --help Print help and exit + -c, --cors-preflight Handle CORS pre-flight requests + -v, --version Print version information and exit + -p, --port port the master mock server runs on (defaults to 8080) + --specification The Pact specification version to use (defaults to V4) + -h, --host hostname the master mock server runs on (defaults to localhost) + --tls Enable TLS with the mock server (will use a self-signed certificate) + -l, --loglevel Log level for mock servers to write to the log file (defaults to info) [possible values: error, warn, info, debug, trace, none] + --no-term-log Turns off using terminal ANSI escape codes + --no-file-log Do not log to an output file diff --git a/pact_mock_server_cli/tests/cmd/create.toml b/pact_mock_server_cli/tests/cmd/create.toml index fe1883b3a..86129dae4 100644 --- a/pact_mock_server_cli/tests/cmd/create.toml +++ b/pact_mock_server_cli/tests/cmd/create.toml @@ -1,2 +1,2 @@ -bin.name = "pact_mock_server_cli" +bin.name = "pact-mock-server" args = "create --help" diff --git a/pact_mock_server_cli/tests/cmd/list.stdout b/pact_mock_server_cli/tests/cmd/list.stdout index e7329b58e..42a653957 100644 --- a/pact_mock_server_cli/tests/cmd/list.stdout +++ b/pact_mock_server_cli/tests/cmd/list.stdout @@ -1,6 +1,6 @@ Lists all the running mock servers -Usage: pact_mock_server_cli list [OPTIONS] +Usage: pact-mock-server list [OPTIONS] Options: --help Print help and exit diff --git a/pact_mock_server_cli/tests/cmd/list.toml b/pact_mock_server_cli/tests/cmd/list.toml index d921b5149..8f4ff6ddc 100644 --- a/pact_mock_server_cli/tests/cmd/list.toml +++ b/pact_mock_server_cli/tests/cmd/list.toml @@ -1,2 +1,2 @@ -bin.name = "pact_mock_server_cli" +bin.name = "pact-mock-server" args = "list --help" diff --git a/pact_mock_server_cli/tests/cmd/main.stdout b/pact_mock_server_cli/tests/cmd/main.stdout index 173bb772e..da32110bf 100644 --- a/pact_mock_server_cli/tests/cmd/main.stdout +++ b/pact_mock_server_cli/tests/cmd/main.stdout @@ -1,6 +1,6 @@ Standalone Pact mock server -Usage: pact_mock_server_cli [OPTIONS] [COMMAND] +Usage: pact-mock-server [OPTIONS] [COMMAND] Commands: start Starts the master mock server diff --git a/pact_mock_server_cli/tests/cmd/main.toml b/pact_mock_server_cli/tests/cmd/main.toml index b47a251ee..0943ea2ac 100644 --- a/pact_mock_server_cli/tests/cmd/main.toml +++ b/pact_mock_server_cli/tests/cmd/main.toml @@ -1,3 +1,3 @@ -bin.name = "pact_mock_server_cli" +bin.name = "pact-mock-server" args = "--help" #status.code = 2 diff --git a/pact_mock_server_cli/tests/cmd/shutdown.stdout b/pact_mock_server_cli/tests/cmd/shutdown.stdout index ecfb1ab63..f4a3bdad1 100644 --- a/pact_mock_server_cli/tests/cmd/shutdown.stdout +++ b/pact_mock_server_cli/tests/cmd/shutdown.stdout @@ -1,6 +1,6 @@ Shutdown the mock server by id or port number, releasing all its resources -Usage: pact_mock_server_cli shutdown [OPTIONS] +Usage: pact-mock-server shutdown [OPTIONS] Options: --help diff --git a/pact_mock_server_cli/tests/cmd/shutdown.toml b/pact_mock_server_cli/tests/cmd/shutdown.toml index 892ce160a..6267f9b38 100644 --- a/pact_mock_server_cli/tests/cmd/shutdown.toml +++ b/pact_mock_server_cli/tests/cmd/shutdown.toml @@ -1,2 +1,2 @@ -bin.name = "pact_mock_server_cli" +bin.name = "pact-mock-server" args = "shutdown --help" diff --git a/pact_mock_server_cli/tests/cmd/start.stdout b/pact_mock_server_cli/tests/cmd/start.stdout index 8d9eb0086..57fbe509d 100644 --- a/pact_mock_server_cli/tests/cmd/start.stdout +++ b/pact_mock_server_cli/tests/cmd/start.stdout @@ -1,6 +1,6 @@ Starts the master mock server -Usage: pact_mock_server_cli start [OPTIONS] +Usage: pact-mock-server start [OPTIONS] Options: --help Print help and exit diff --git a/pact_mock_server_cli/tests/cmd/start.toml b/pact_mock_server_cli/tests/cmd/start.toml index 997c2c45b..256eb6507 100644 --- a/pact_mock_server_cli/tests/cmd/start.toml +++ b/pact_mock_server_cli/tests/cmd/start.toml @@ -1,2 +1,2 @@ -bin.name = "pact_mock_server_cli" +bin.name = "pact-mock-server" args = "start --help" diff --git a/pact_mock_server_cli/tests/cmd/verify.stdout b/pact_mock_server_cli/tests/cmd/verify.stdout index 9c680ef0d..1e070c8f7 100644 --- a/pact_mock_server_cli/tests/cmd/verify.stdout +++ b/pact_mock_server_cli/tests/cmd/verify.stdout @@ -1,6 +1,6 @@ Verify the mock server by id or port number, and generate a pact file if all ok -Usage: pact_mock_server_cli verify [OPTIONS] +Usage: pact-mock-server verify [OPTIONS] Options: --help diff --git a/pact_mock_server_cli/tests/cmd/verify.toml b/pact_mock_server_cli/tests/cmd/verify.toml index b73e00b15..99f93491f 100644 --- a/pact_mock_server_cli/tests/cmd/verify.toml +++ b/pact_mock_server_cli/tests/cmd/verify.toml @@ -1,2 +1,2 @@ -bin.name = "pact_mock_server_cli" +bin.name = "pact-mock-server" args = "verify --help" diff --git a/scripts/gzip-and-sum.sh b/scripts/gzip-and-sum.sh index 42f1f1d8a..c7847b52f 100644 --- a/scripts/gzip-and-sum.sh +++ b/scripts/gzip-and-sum.sh @@ -15,4 +15,11 @@ gzip_and_sum() { gzip --stdout --best "$orig_file" > "$target_file" openssl dgst -sha256 -r "$target_file" > "$digest_file" -} + basenamedir=$(basename $target_file) + if [[ "$(uname -s)" == "Darwin" ]]; then + # OSX requires an empty arg passed to -i, but this doesn't work on Lin/Win + sed -Ei '' "s|\*(.*)$|\*$basenamedir|" "$digest_file" + else + sed -Ei "s|\*(.*)$|\*$basenamedir|" "$digest_file" + fi +} \ No newline at end of file diff --git a/scripts/install-pact_mock_server_cli.sh b/scripts/install-pact_mock_server_cli.sh new file mode 100755 index 000000000..17ac5ac40 --- /dev/null +++ b/scripts/install-pact_mock_server_cli.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env sh + +set -e +set -x + +MOCK_SERVER_CLI_VERSION="2.0.0" # https://github.com/pact-foundation/pact-core-mock-server/releases + +mkdir -p ~/.pact/bin +case "$(uname -s)" in + + Darwin) + echo '== Installing mock server CLI for Mac OSX ==' + if [ "$(uname -m)" = "arm64" ]; then + curl -L -o ~/.pact/bin/pact-mock-server.gz https://github.com/pact-foundation/pact-core-mock-server/releases/download/pact_mock_server_cli-v${MOCK_SERVER_CLI_VERSION}/pact-mock-server-macos-aarch64.gz + else + curl -L -o ~/.pact/bin/pact-mock-server.gz https://github.com/pact-foundation/pact-core-mock-server/releases/download/pact_mock_server_cli-v${MOCK_SERVER_CLI_VERSION}/pact-mock-server-macos-x86_64.gz + fi + gunzip -N -f ~/.pact/bin/pact-mock-server.gz + chmod +x ~/.pact/bin/pact-mock-server + ;; + + Linux) + echo '== Installing mock server CLI for Linux ==' + if [ "$(uname -m)" = "aarch64" ]; then + curl -L -o ~/.pact/bin/pact-mock-server.gz https://github.com/pact-foundation/pact-core-mock-server/releases/download/pact_mock_server_cli-v${MOCK_SERVER_CLI_VERSION}/pact-mock-server-linux-aarch64.gz + else + curl -L -o ~/.pact/bin/pact-mock-server.gz https://github.com/pact-foundation/pact-core-mock-server/releases/download/pact_mock_server_cli-v${MOCK_SERVER_CLI_VERSION}/pact-mock-server-linux-x86_64.gz + fi + gunzip -N -f ~/.pact/bin/pact-mock-server.gz + chmod +x ~/.pact/bin/pact-mock-server + ;; + + CYGWIN*|MINGW32*|MSYS*|MINGW*) + echo '== Installing mock server CLI for MS Windows ==' + if [ "$(uname -m)" = "aarch64" ]; then + curl -L -o ~/.pact/bin/pact-mock-server.exe.gz https://github.com/pact-foundation/pact-core-mock-server/releases/download/pact_mock_server_cli-v${MOCK_SERVER_CLI_VERSION}/pact-mock-server-windows-aarch64.exe.gz + else + curl -L -o ~/.pact/bin/pact-mock-server.exe.gz https://github.com/pact-foundation/pact-core-mock-server/releases/download/pact_mock_server_cli-v${MOCK_SERVER_CLI_VERSION}/pact-mock-server-windows-x86_64.exe.gz + fi + gunzip -N -f ~/.pact/bin/pact-mock-server.exe.gz + chmod +x ~/.pact/bin/pact-mock-server.exe + ;; + + *) + echo "ERROR: $(uname -s) is not a supported operating system" + exit 1 + ;; +esac \ No newline at end of file