Skip to content

Commit

Permalink
OPENNLP-1688 - Add GH action to test binaries (*nix + win) in GH actions
Browse files Browse the repository at this point in the history
  • Loading branch information
rzo1 committed Jan 17, 2025
1 parent 2690b88 commit 0e4150a
Show file tree
Hide file tree
Showing 3 changed files with 279 additions and 0 deletions.
189 changes: 189 additions & 0 deletions .github/workflows/shell-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

name: Shell Bats CI

on:
push:
# branches:
# - main
pull_request:

jobs:
test-unix-shell-ubuntu:
name: Test on Ubuntu
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

# Note: bats-core/[email protected] is not allowed to be used (needs an INFRA issue)
- name: Install Bats (Testing Framework)
run: |
sudo apt-get update
sudo apt-get install -y bats
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17

- name: Build with Maven
run: mvn -V clean install --no-transfer-progress -Pci -DskipTests=true

- name: Find and Extract OpenNLP Distribution
run: |
# Find the first non-src .tar.gz file in the target directory
TAR_FILE=$(find opennlp-distr/target -maxdepth 1 -type f -name "*.tar.gz" ! -name "*-src*.tar.gz" | head -n 1)
# Ensure we found a file
if [ -z "$TAR_FILE" ]; then
echo "Error: No matching tar.gz file found in opennlp-distr/target"
exit 1
fi
# Extract the tar.gz file
tar -xzf "$TAR_FILE" -C $HOME
# Get the directory name of the extracted content
EXTRACTED_DIR=$(tar -tf "$TAR_FILE" | head -n 1 | cut -f1 -d"/")
# Set OPENNLP_HOME dynamically
echo "OPENNLP_HOME=$HOME/$EXTRACTED_DIR" >> $GITHUB_ENV
echo "$HOME/$EXTRACTED_DIR/bin" >> $GITHUB_PATH
- name: Verify Extraction
run: |
echo "OPENNLP_HOME: $OPENNLP_HOME"
ls -l $OPENNLP_HOME/bin
- name: Run Bats Tests
run: |
bats ./opennlp-distr/src/test/sh
env:
JAVA_HOME: ${{ env.JAVA_HOME }}
OPENNLP_HOME: ${{ env.OPENNLP_HOME }}

test-unix-shell-macos:
name: Test on macOS
runs-on: macos-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install Bats (Testing Framework)
run: |
brew update
brew install bats-core
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17

- name: Build with Maven
run: mvn -V clean install --no-transfer-progress -Pci -DskipTests=true

- name: Find and Extract OpenNLP Distribution
run: |
TAR_FILE=$(find opennlp-distr/target -maxdepth 1 -type f -name "*.tar.gz" ! -name "*-src*.tar.gz" | head -n 1)
if [ -z "$TAR_FILE" ]; then
echo "Error: No matching tar.gz file found in opennlp-distr/target"
exit 1
fi
tar -xzf "$TAR_FILE" -C $HOME
EXTRACTED_DIR=$(tar -tf "$TAR_FILE" | head -n 1 | cut -f1 -d"/")
echo "OPENNLP_HOME=$HOME/$EXTRACTED_DIR" >> $GITHUB_ENV
echo "$HOME/$EXTRACTED_DIR/bin" >> $GITHUB_PATH
- name: Verify Extraction
run: |
echo "OPENNLP_HOME: $OPENNLP_HOME"
ls -l $OPENNLP_HOME/bin
- name: Run Bats Tests
run: |
bats ./opennlp-distr/src/test/sh
env:
JAVA_HOME: ${{ env.JAVA_HOME }}
OPENNLP_HOME: ${{ env.OPENNLP_HOME }}

test-windows-shell:
name: Test on Windows
runs-on: windows-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

# Install Pester for PowerShell testing
- name: Install Pester
run: |
Install-Module -Name Pester -Force -Scope CurrentUser
Import-Module Pester
shell: pwsh

# Set up JDK 17 for Windows (using Temurin distribution)
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17

# Build with Maven (same as the Linux setup)
- name: Build with Maven
run: mvn -V clean install --no-transfer-progress -Pci -DskipTests=true

# Find and Extract OpenNLP Distribution
- name: Find and Extract OpenNLP Distribution
run: |
# Find the first non-src .tar.gz file in the target directory
$TAR_FILE = Get-ChildItem -Path opennlp-distr/target -Filter "*.tar.gz" | Where-Object { $_.Name -notlike "*-src*" } | Select-Object -First 1
# Ensure we found a file
if (-not $TAR_FILE) {
Write-Error "Error: No matching tar.gz file found in opennlp-distr/target"
exit 1
}
# Extract the tar.gz file
$Destination = "$env:USERPROFILE"
tar -xzf $TAR_FILE.FullName -C $Destination
# Get the directory name of the extracted content
$EXTRACTED_DIR = (tar -tf $TAR_FILE.FullName | Select-Object -First 1).Split('/')[0]
# Set OPENNLP_HOME dynamically
echo "OPENNLP_HOME=$env:USERPROFILE\$EXTRACTED_DIR" >> $GITHUB_ENV
echo "$env:USERPROFILE\$EXTRACTED_DIR\bin" >> $GITHUB_PATH
# Verify Extraction
- name: Verify Extraction
run: |
echo "OPENNLP_HOME: $env:OPENNLP_HOME"
dir $env:OPENNLP_HOME\bin
# Run Pester Tests for opennlp.bat
- name: Run Pester Tests
run: |
Invoke-Pester -Script "./opennlp-distr/test/ps/test_opennlp.Tests.ps1" -Output Detailed
shell: pwsh
env:
JAVA_HOME: ${{ env.JAVA_HOME }}
OPENNLP_HOME: ${{ env.OPENNLP_HOME }}
38 changes: 38 additions & 0 deletions opennlp-distr/src/test/ps/test_opennlp.Tests.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
Describe "opennlp.bat Tests" {

# Setup before all tests
BeforeAll {
$env:PATH = "$env:OPENNLP_HOME\bin;$env:PATH"
}

# Test if opennlp.bat is accessible and executable
It "opennlp.bat exists and is executable" {
$batFile = Join-Path $env:OPENNLP_HOME "bin\opennlp.bat"
$batFile | Should -Exist

# Check if the bat file is executable (on Windows, this means it's a valid executable script)
$result = & $batFile -h
$result | Should -Not -BeNullOrEmpty
}

# Test the output of SimpleTokenizer
It "SimpleTokenizer produces correct output" {
$input = "Hello, friends"
$expected_output = "Hello , friends"

# Run the opennlp.bat with SimpleTokenizer
$output = & "$env:OPENNLP_HOME\bin\opennlp.bat" SimpleTokenizer <<< $input

# Debugging: Log the output
Write-Host "Output: $output"

# Validate the command executed successfully
$output | Should -Not -BeNullOrEmpty
$output | Should -Contain $expected_output
}

# Cleanup after tests
AfterAll {
Remove-Item Env:\PATH -ErrorAction SilentlyContinue
}
}
52 changes: 52 additions & 0 deletions opennlp-distr/src/test/sh/test_opennlp.bats
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#!/usr/bin/env bats

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Setup the environment before running the tests
setup() {
PATH="$OPENNLP_HOME/bin:$PATH"
}

# Test to check if the binary is accessible
@test "Binary 'opennlp' exists and is executable" {
run command -v opennlp
[ "$status" -eq 0 ]
[ -x "$output" ]
}

# Test to validate the output of the SimpleTokenizer
@test "SimpleTokenizer produces correct output" {
input="Hello, friends"
expected_output="Hello , friends"

# Run the command and capture output
run echo "$input" | opennlp SimpleTokenizer

# Debugging: Log the status and output
echo "Status: $status"
echo "Output: $output"

# Validate the command executed successfully
[ "$status" -eq 0 ] || echo "Error: opennlp SimpleTokenizer failed"

# Validate the output matches the expected result
[ "${output}" = "$expected_output" ] || echo "Unexpected output: ${output}"
}

# Teardown the environment after running the tests
teardown() {
unset OPENNLP_HOME
}

0 comments on commit 0e4150a

Please sign in to comment.