aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/test
diff options
context:
space:
mode:
authorEgor Tensin <egor@tensin.name>2026-03-30 11:49:10 +0200
committerEgor Tensin <egor@tensin.name>2026-03-30 11:54:40 +0200
commit4cd3a9cdf65a8f0b96de21420b98b8e02181e4f4 (patch)
tree08b54a4313cdb41a883b244ffcbb423dbf7ced46 /test
parentremove examples "dynamic" & "static" (diff)
downloadcmake-common-4cd3a9cdf65a8f0b96de21420b98b8e02181e4f4.tar.gz
cmake-common-4cd3a9cdf65a8f0b96de21420b98b8e02181e4f4.zip
move testing-only things into test/
Diffstat (limited to 'test')
-rw-r--r--test/examples/boost/CMakeLists.txt12
-rw-r--r--test/examples/boost/foo.cpp13
-rw-r--r--test/examples/boost/run.ps124
-rw-r--r--test/examples/simple/CMakeLists.txt11
-rw-r--r--test/examples/simple/baz.cpp7
-rw-r--r--test/examples/simple/baz.hpp9
-rw-r--r--test/examples/simple/foo.cpp9
-rw-r--r--test/scripts/verify_arch.ps182
-rwxr-xr-xtest/scripts/verify_arch.sh56
-rw-r--r--test/scripts/verify_symbols.ps11
-rwxr-xr-xtest/scripts/verify_symbols.sh43
11 files changed, 267 insertions, 0 deletions
diff --git a/test/examples/boost/CMakeLists.txt b/test/examples/boost/CMakeLists.txt
new file mode 100644
index 0000000..0e92e38
--- /dev/null
+++ b/test/examples/boost/CMakeLists.txt
@@ -0,0 +1,12 @@
+cmake_minimum_required(VERSION 3.15)
+
+project(example_boost)
+
+set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
+find_package(Boost REQUIRED COMPONENTS filesystem)
+add_executable(foo foo.cpp)
+target_link_libraries(foo PRIVATE Boost::disable_autolinking Boost::filesystem)
+
+install(TARGETS foo RUNTIME DESTINATION bin)
diff --git a/test/examples/boost/foo.cpp b/test/examples/boost/foo.cpp
new file mode 100644
index 0000000..6219e68
--- /dev/null
+++ b/test/examples/boost/foo.cpp
@@ -0,0 +1,13 @@
+#include <boost/filesystem.hpp>
+
+#include <iostream>
+
+int main(int argc, char* argv[]) {
+ namespace fs = boost::filesystem;
+ std::cout << argv[0] << '\n';
+ for (int i = 1; i < argc; ++i) {
+ std::cout << fs::absolute(boost::filesystem::path{argv[i]}).string()
+ << '\n';
+ }
+ return 0;
+}
diff --git a/test/examples/boost/run.ps1 b/test/examples/boost/run.ps1
new file mode 100644
index 0000000..578911f
--- /dev/null
+++ b/test/examples/boost/run.ps1
@@ -0,0 +1,24 @@
+param(
+ [Parameter(Mandatory=$true)]
+ [string] $FooPath
+)
+
+$foo_path = [System.IO.Path]::GetFullPath($FooPath)
+if ($IsWindows) {
+ $foo_path += '.exe'
+}
+
+$relative = 'test.txt'
+$absolute = Join-Path (Get-Location).Path $relative
+
+$actual = & $foo_path $relative
+echo 'Actual output:'
+echo $actual
+
+$expected = $foo_path,$absolute
+echo 'Expected output:'
+echo $expected
+
+if (Compare-Object $actual $expected -CaseSensitive) {
+ throw 'Unexpected output'
+}
diff --git a/test/examples/simple/CMakeLists.txt b/test/examples/simple/CMakeLists.txt
new file mode 100644
index 0000000..50a588b
--- /dev/null
+++ b/test/examples/simple/CMakeLists.txt
@@ -0,0 +1,11 @@
+cmake_minimum_required(VERSION 3.15)
+
+project(example_simple)
+
+add_library(baz SHARED baz.cpp)
+target_include_directories(baz PUBLIC .)
+
+add_executable(foo foo.cpp)
+target_link_libraries(foo PRIVATE baz)
+
+install(TARGETS foo baz RUNTIME DESTINATION bin LIBRARY DESTINATION lib)
diff --git a/test/examples/simple/baz.cpp b/test/examples/simple/baz.cpp
new file mode 100644
index 0000000..d108ae3
--- /dev/null
+++ b/test/examples/simple/baz.cpp
@@ -0,0 +1,7 @@
+#include "baz.hpp"
+
+#include <iostream>
+
+void baz() {
+ std::cout << "baz\n";
+}
diff --git a/test/examples/simple/baz.hpp b/test/examples/simple/baz.hpp
new file mode 100644
index 0000000..2fc9b2a
--- /dev/null
+++ b/test/examples/simple/baz.hpp
@@ -0,0 +1,9 @@
+#pragma once
+
+#ifdef _MSC_VER
+#define DLLEXPORT __declspec(dllexport)
+#else
+#define DLLEXPORT
+#endif
+
+DLLEXPORT void baz();
diff --git a/test/examples/simple/foo.cpp b/test/examples/simple/foo.cpp
new file mode 100644
index 0000000..7e928e1
--- /dev/null
+++ b/test/examples/simple/foo.cpp
@@ -0,0 +1,9 @@
+#include <baz.hpp>
+
+#include <iostream>
+
+int main() {
+ std::cout << "foo\n";
+ baz();
+ return 0;
+}
diff --git a/test/scripts/verify_arch.ps1 b/test/scripts/verify_arch.ps1
new file mode 100644
index 0000000..183a8c5
--- /dev/null
+++ b/test/scripts/verify_arch.ps1
@@ -0,0 +1,82 @@
+param(
+ [Parameter(Mandatory=$true)]
+ [string] $Path,
+ [Parameter(Mandatory=$true)]
+ [ValidateSet('x64', 'x86')]
+ [string] $Arch
+)
+
+$ErrorActionPreference = "Stop";
+Set-PSDebug -Strict
+
+function Get-MachineType {
+ param(
+ [Parameter(Mandatory=$true)]
+ [string] $Arch
+ )
+
+ $machine_type = switch ($Arch) {
+ 'x64' { 0x8664 }
+ 'x86' { 0x14c }
+ default { throw "Unsupported architecture: $Arch" }
+ }
+ return $machine_type
+}
+
+function Parse-MachineType {
+ param(
+ [Parameter(Mandatory=$true)]
+ [string] $Path
+ )
+
+ $header_offset_offset = 0x3c
+ $machine_type_offset = 4 # Two words
+
+ $bytes = [System.IO.File]::ReadAllBytes($Path)
+ $header_offset = [System.BitConverter]::ToUInt32($bytes, $header_offset_offset)
+ $machine_type = [System.BitConverter]::ToUInt16($bytes, $header_offset + $machine_type_offset)
+
+ return $machine_type
+}
+
+function Verify-Architecture {
+ param(
+ [Parameter(Mandatory=$true)]
+ [string] $Path,
+ [Parameter(Mandatory=$true)]
+ [string] $Arch
+ )
+
+ $actual = Parse-MachineType -Path $Path
+ $actual_hex = "0x{0:x}" -f $actual
+ $expected = Get-MachineType -Arch $Arch
+ $expected_hex = "0x{0:x}" -f $expected
+
+ if ($actual -eq $expected) {
+ Write-Host "File '$Path' matches architecture '$Arch'."
+ } else {
+ Write-Host "File '$Path' DOES NOT match architecture '$Arch'."
+ Write-Error "Expected machine type '$expected_hex', actual machine type is '$actual_hex'."
+ }
+}
+
+function Test-AppVeyor {
+ return Test-Path env:APPVEYOR
+}
+
+function Verify-ArchitectureAppVeyor {
+ if (Test-AppVeyor) {
+ $appveyor_cwd = pwd
+ }
+
+ try {
+ Verify-Architecture -Path $script:Path -Arch $script:Arch
+ } finally {
+ if (Test-AppVeyor) {
+ cd $appveyor_cwd
+ Set-PSDebug -Off
+ }
+ }
+}
+
+Verify-ArchitectureAppVeyor
diff --git a/test/scripts/verify_arch.sh b/test/scripts/verify_arch.sh
new file mode 100755
index 0000000..aafc5e8
--- /dev/null
+++ b/test/scripts/verify_arch.sh
@@ -0,0 +1,56 @@
+#!/usr/bin/env bash
+
+set -o errexit -o nounset -o pipefail
+
+script_name="$( basename -- "${BASH_SOURCE[0]}" )"
+readonly script_name
+
+elf_file_class() {
+ local path
+ for path; do
+ od --address-radix=n --skip-bytes=4 --read-bytes=1 --format=x1 -- "$path"
+ done
+}
+
+arch_to_file_class() {
+ local arch
+ for arch; do
+ case "$arch" in
+ x86)
+ echo '01'
+ ;;
+ x64)
+ echo '02'
+ ;;
+ *)
+ echo "$script_name: unsupported architecture: $arch" >&2
+ return 1
+ ;;
+ esac
+ done
+}
+
+main() {
+ if [ "$#" -ne 2 ]; then
+ echo "usage: $script_name BIN_PATH ARCH" >&2
+ return 1
+ fi
+
+ local path="$1"
+ local arch="$2"
+
+ local expected
+ expected=" $( arch_to_file_class "$arch" )"
+ local actual
+ actual="$( elf_file_class "$path" )"
+
+ if [ "$expected" = "$actual" ]; then
+ echo "$script_name: file '$path' matches architecture '$arch'"
+ else
+ echo "$script_name: file '$path' DOES NOT match architecture '$arch'"
+ echo "$script_name: expected ELF file class '$expected', actual file class is '$actual'" >&2
+ return 1
+ fi
+}
+
+main "$@"
diff --git a/test/scripts/verify_symbols.ps1 b/test/scripts/verify_symbols.ps1
new file mode 100644
index 0000000..ebe6d99
--- /dev/null
+++ b/test/scripts/verify_symbols.ps1
@@ -0,0 +1 @@
+Write-Host "Not going to check symbols for a Windows executable."
diff --git a/test/scripts/verify_symbols.sh b/test/scripts/verify_symbols.sh
new file mode 100755
index 0000000..73cc6ba
--- /dev/null
+++ b/test/scripts/verify_symbols.sh
@@ -0,0 +1,43 @@
+#!/usr/bin/env bash
+
+set -o errexit -o nounset -o pipefail
+
+script_name="$( basename -- "${BASH_SOURCE[0]}" )"
+readonly script_name
+
+main() {
+ if [ "$#" -lt 1 ]; then
+ echo "usage: $script_name BIN_PATH [SYMBOL...]" >&2
+ return 1
+ fi
+
+ local path="$1"
+ shift
+
+ local nm
+ nm="$( nm --demangle -- "$path" 2>&1 )"
+
+ if [ "$#" -eq 0 ]; then
+ if [ "$nm" == "nm: $path: no symbols" ]; then
+ echo "$script_name: file '$path' has no symbols, as expected"
+ return 0
+ else
+ echo "$script_name: file '$path' should not have symbols, but it does" >&2
+ return 1
+ fi
+ fi
+
+ local symbol
+ for symbol; do
+ if echo "$nm" | grep -F -e " $symbol"; then
+ echo "$script_name: file '$path' has symbol '$symbol'"
+ else
+ echo "$script_name: symbol '$symbol' wasn't found in file '$path'"
+ echo "$script_name: here's the complete symbol list:"
+ echo "$nm"
+ return 1
+ fi
+ done
+}
+
+main "$@"