From 0872d524caa91005c696a6904bd6987df8b0e509 Mon Sep 17 00:00:00 2001 From: Matan Kushner Date: Sun, 28 Apr 2019 13:34:46 -0400 Subject: [PATCH] Add docker for integration tests (#37) --- .dockerignore | 1 + azure-pipelines.yml | 15 ++++-------- integration_test | 13 +++++++++++ tests/Dockerfile | 36 +++++++++++++++++++++++++++++ tests/directory.rs | 20 ++++++++++------ tests/nodejs.rs | 56 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 123 insertions(+), 18 deletions(-) create mode 100644 .dockerignore create mode 100755 integration_test create mode 100644 tests/Dockerfile create mode 100644 tests/nodejs.rs diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..2f7896d1 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +target/ diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 52ebd028..1f1dd639 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -20,15 +20,6 @@ jobs: - script: cargo fmt --all -- --check displayName: Run Rustfmt - - job: "Bench" - pool: - vmImage: "ubuntu-16.04" - container: "rust:latest" - condition: eq(variables['Build.Reason'], 'PullRequest') - steps: - - script: cargo bench - displayName: Run benchmark - - job: "Test" strategy: matrix: @@ -50,6 +41,9 @@ jobs: pool: vmImage: "ubuntu-16.04" steps: + - task: NodeTool@0 + inputs: + versionSpec: '12.0.0' - script: | curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain $RUSTUP_TOOLCHAIN echo "##vso[task.setvariable variable=PATH;]$PATH:$HOME/.cargo/bin" @@ -63,6 +57,5 @@ jobs: condition: eq( variables['Agent.OS'], 'Windows_NT' ) - script: cargo build --all displayName: Cargo build - # Until env stubbing is solved, make tests run on a single thread - - script: cargo test --all -- --test-threads=1 + - script: cargo test -- --ignored displayName: Cargo test diff --git a/integration_test b/integration_test new file mode 100755 index 00000000..8d716d56 --- /dev/null +++ b/integration_test @@ -0,0 +1,13 @@ +#!/bin/bash + +if ! (docker --version); then + printf 'Docker is required to run the starship integration tests.\n' + printf 'Please download and install Docker in order to run these tests locally.\n' + exit 1 +fi + +printf 'Building test docker image:\n' +docker build -f tests/Dockerfile --tag starship-test . + +printf 'Running test suite:\n' +docker run --rm -t -v $(pwd):/starship starship-test diff --git a/tests/Dockerfile b/tests/Dockerfile new file mode 100644 index 00000000..992e31ea --- /dev/null +++ b/tests/Dockerfile @@ -0,0 +1,36 @@ +FROM rust:latest + +# Install Node.js +ENV NODE_VERSION 12.0.0 +RUN curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash \ + && . $HOME/.nvm/nvm.sh \ + && nvm install $NODE_VERSION \ + && nvm alias default $NODE_VERSION \ + && nvm use default +ENV PATH /root/.nvm/versions/node/v$NODE_VERSION/bin:$PATH +# Check that Node.js was correctly installed +RUN node --version + +# Create blank project +RUN USER=root cargo new --bin starship +WORKDIR /starship + +# We want dependencies cached, so copy those first +COPY ./Cargo.lock ./Cargo.lock +COPY ./Cargo.toml ./Cargo.toml + +# Cargo.toml will fail to parse without my_benchmark +RUN mkdir benches +RUN touch benches/my_benchmark.rs + +# This is a dummy build to get dependencies cached +RUN cargo build --release + +# Delete the dummy build +RUN rm -rf /starship + +# Create the directory for the real source files +RUN mkdir starship +WORKDIR /starship + +CMD [ "cargo", "test", "--", "--ignored"] diff --git a/tests/directory.rs b/tests/directory.rs index e7c0d1cd..2eb20f48 100644 --- a/tests/directory.rs +++ b/tests/directory.rs @@ -1,4 +1,5 @@ use ansi_term::Color; +use dirs::home_dir; use git2::Repository; use starship::segment::Segment; use std::fs; @@ -25,7 +26,8 @@ fn home_directory() -> io::Result<()> { #[test] #[ignore] fn directory_in_home() -> io::Result<()> { - let dir = Path::new("~/starship/engine"); + let dir = home_dir().unwrap().join("starship/engine"); + fs::create_dir_all(&dir)?; let expected = Segment::new("dir") .set_value("~/starship/engine") @@ -40,7 +42,8 @@ fn directory_in_home() -> io::Result<()> { #[test] #[ignore] fn truncated_directory_in_home() -> io::Result<()> { - let dir = Path::new("~/starship/engine/schematics"); + let dir = home_dir().unwrap().join("starship/engine/schematics"); + fs::create_dir_all(&dir)?; let expected = Segment::new("dir") .set_value("starship/engine/schematics") @@ -67,12 +70,11 @@ fn root_directory() -> io::Result<()> { } #[test] -#[ignore] fn directory_in_root() -> io::Result<()> { - let dir = Path::new("/private"); + let dir = Path::new("/opt"); let expected = Segment::new("dir") - .set_value("/private") + .set_value("/opt") .set_style(Color::Cyan.bold()) .output(); let actual = common::render_segment("dir", &dir); @@ -84,10 +86,11 @@ fn directory_in_root() -> io::Result<()> { #[test] #[ignore] fn truncated_directory_in_root() -> io::Result<()> { - let dir = Path::new("/private/var/folders/3s"); + let dir = Path::new("/opt/starship/thrusters/rocket"); + fs::create_dir_all(&dir)?; let expected = Segment::new("dir") - .set_value("var/folders/3s") + .set_value("starship/thrusters/rocket") .set_style(Color::Cyan.bold()) .output(); let actual = common::render_segment("dir", &dir); @@ -97,6 +100,7 @@ fn truncated_directory_in_root() -> io::Result<()> { } #[test] +#[ignore] fn git_repo_root() -> io::Result<()> { let tmp_dir = TempDir::new()?; let repo_dir = tmp_dir.path().join("rocket-controls"); @@ -115,6 +119,7 @@ fn git_repo_root() -> io::Result<()> { } #[test] +#[ignore] fn directory_in_git_repo() -> io::Result<()> { let tmp_dir = TempDir::new()?; let repo_dir = tmp_dir.path().join("rocket-controls"); @@ -134,6 +139,7 @@ fn directory_in_git_repo() -> io::Result<()> { } #[test] +#[ignore] fn truncated_directory_in_git_repo() -> io::Result<()> { let tmp_dir = TempDir::new()?; let repo_dir = tmp_dir.path().join("rocket-controls"); diff --git a/tests/nodejs.rs b/tests/nodejs.rs new file mode 100644 index 00000000..fe07a0cd --- /dev/null +++ b/tests/nodejs.rs @@ -0,0 +1,56 @@ +use ansi_term::Color; +use starship::segment::Segment; +use std::fs::{self, File}; +use std::io; +use tempfile::TempDir; + +mod common; + +#[test] +#[ignore] +fn folder_with_package_json() -> io::Result<()> { + let dir = TempDir::new()?; + File::create(dir.path().join("package.json"))?; + + let expected = Segment::new("node") + .set_value("⬢ v12.0.0") + .set_style(Color::Green.bold()) + .output(); + let actual = common::render_segment("nodejs", &dir.path()); + assert_eq!(expected, actual); + + Ok(()) +} + +#[test] +#[ignore] +fn folder_with_js_file() -> io::Result<()> { + let dir = TempDir::new()?; + File::create(dir.path().join("index.js"))?; + + let expected = Segment::new("node") + .set_value("⬢ v12.0.0") + .set_style(Color::Green.bold()) + .output(); + let actual = common::render_segment("nodejs", &dir.path()); + assert_eq!(expected, actual); + + Ok(()) +} + +#[test] +#[ignore] +fn folder_with_node_modules() -> io::Result<()> { + let dir = TempDir::new()?; + let node_modules = dir.path().join("node_modules"); + fs::create_dir_all(&node_modules)?; + + let expected = Segment::new("node") + .set_value("⬢ v12.0.0") + .set_style(Color::Green.bold()) + .output(); + let actual = common::render_segment("nodejs", &dir.path()); + assert_eq!(expected, actual); + + Ok(()) +}