All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
1.5.0 - 2023-01-17
- C++ definitions of
ARDUINO_CI_COMPILATION_MOCKS
andARDUINO_CI_GODMODE
to aid in compilation macros CIConfig.available_override_config_path()
to search for available override files in standard locationsCIConfig.override_file_from_project_library
andCIConfig.override_file_from_example
to expose config locations- CI runner script now expliclty informs about config overrides
- A project
examples/
directory can now provide its own configuration override file, which provides no new flexibility but simply mirrors the behavior fortests/
.
CIConfig
now usesPathname
instead of strings
CIConfig.with_config
, which was only used internally
-
arduino_ci.rb --help
no longer crashes -
Fix missing
LED_BUILTIN
definition for Arduino Due, Zero and Circuit Playground. -
No longer ignore failures if the first step of compiling files for the unit test fails.
1.4.0 - 2022-12-28
- Allow use of watchdog timer in application code (though it doesn't do anything)
- Show output from successful compile
--min-free-space=N
command-line argument to fail if free space is below required value- Add
_BV()
macro. - Support for
dtostrf()
- Added a CI workflow to lint the code base
- Added a CI workflow to check for spelling errors
- Extraction of bytes usage in a compiled sketch is now calculated in a method:
ArduinoBackend.last_bytes_usage
- Added
nano_every
platform to representarduino:megaavr
architecture - Working directory is now printed in test runner output
- Explicitly include
irb
via rubygems
- We now compile a shared library to be used for each test.
- Put build artifacts in a separate directory to reduce clutter.
- Replace
#define yield() _NOP()
withinline void yield() { _NOP(); }
so that other code can define ayield()
function. - Update .gitattributes so we have consistent line endings
- Change 266 files from CRLF to LF.
- Run tests on push as well as on a pull request so developers can see impact
ArduinoBackend
now exposesconfig_file_path
instead ofconfig_dir
so that we can be explicit about strange behavior inarduino-cli
that isn't going to change anytime soon- Use
arduino-cli
version0.29.0
as the backend - Test runner detects console width if possible, allowing variable width from 80-132 chars
- Properly report compile errors in GitHub Actions.
- Fix copy/paste error to allow additional warnings for a platform
- Apply "rule of three" to Client copy constructor and copy assignment operator
- Run Windows tests on Windows not Ubuntu
- Properly report error in building shared library
- A missing
examples
directory no longer causes a crash incpp_library.rb
- Referring to an undefined platform no longer causes a crash; it's now a helpful error message
- A copy/paste error that prevented compiler warning flags from being supplied has been fixed, via jgfoster
- RSpec was not communicating compile errors from unit test executables that failed to build. Now it does, via jgfoster
- Windows paths now avoid picking up backslashes, for proper equality comparisons
- Libraries are now considered installed if their entry is a symlink (for which
exist?
would returnfalse
)
1.3.0 - 2021-01-13
- Better indications of the build phases in the test runner
arduino_ci.rb
- Better indications of which example sketch is being compiled as part of testing
- Topmost installation instructions now suggest
gem install arduino_ci
instead of using aGemfile
. Reasons for using aGemfile
are listed and discussed separately further down the README. - Stream::readStreamUntil() no longer returns delimiter
- scanning of
library.properties
; this can and should now be performed by the standalonearduino-lint
tool.
- Example sketches with no configured platforms were printing the wrong configuration values to the debug message
- Libraries directory was not being automatically created prior to attempting to change directory into it
- A style error whose "fix" caused an actual error.
- Proper installation order for NetworkLib in CI workflow configuration
1.2.0 - 2021-01-06
- Environment variable to run a custom initialization script during CI testing:
CUSTOM_INIT_SCRIPT
- Environment variable to run from a subdirectory during CI testing:
USE_SUBDIR
assertComparativeEquivalent()
andassertComparativeNotEquivalent()
to evaluate equality on ana - b == 0
basis (and/or!(a > b) && !(a < b)
)assertEqualFloat()
andassertNotEqualFloat()
for comparing floats with epsilonassertInfinity()
andassertNotInfinity()
for comparing floats to infinityassertNAN()
andassertNotNAN()
for comparing floats toNaN
assertion()
,ReporterTAP.onAssert()
, andtestBehaviorExp
macro to handle simple expression evaluation (is true, is false, etc)Wire.resetMocks()
and documentationshiftIn()
andshiftOut()
CIConfig.is_default
to detect when the default configuration is usedArduinoBackend.boards_installed?
to detect whether a board family (or package, likearduino:avr
) is installedArduinoBackend.library_available?
to detect whether the library manager knows of a library- Sanity checks for
library.properties
includes=
anddepends=
entries
- Rubocop expected syntax downgraded from ruby 2.6 to 2.5
assertEqual()
andassertNotEqual()
use actual==
and!=
-- they no longer require a type to be totally ordered just to do equality tests- Evaluative assertions (is true/false/null/etc) now produce simpler error messages instead of masquerading as an operation (e.g. "== true")
LibraryProperties.to_h
now properly uses formatters and symbolic keys, in order to support a.to_s
- Architectures from
library.properties
are considered when iterating over unit test or examples compilation, as well as the configured platforms
- Warnings about directory name mismatches are now based on proper comparison of strings
- Now using the recommended "stable" URL for the
esp32
board family esp8266:huzzah
options updated as per upstream- Errors about
'_NOP' was not declared in this scope
(test added) pinMode()
andanalogReference()
are now functions (no longer macros), because that conflicted with actual function names in the wildanalogReadResolution()
andanalogWriteResolution()
are also no longer macros
1.1.0 - 2020-12-02
ensure_arduino_installation.rb
now ensures the existence of the library directory as well- Environment variables to escalate unit tests or examples not being found during CI testing -
EXPECT_EXAMPLES
andEXPECT_UNITTESTS
- Conserve CI testing minutes by grouping CI into fewer runs
- Improper reference to
Host
inarduino_ci.rb
test runner is now properly qualified - Failure to set board manager URLs (for 3rd party board providers) has been fixed
1.0.0 - 2020-11-29
- Special handling of attempts to run the
arduino_ci.rb
CI script against the ruby library instead of an actual Arduino project - Explicit checks for attempting to test
arduino_ci
itself as if it were a library, resolving a minor annoyance to this developer. - Code coverage tooling
- Explicit check and warning for library directory names that do not match our guess of what the library should/would be called
- Symlink tests for
Host
- Add documentation on how to use Arduino CI with GitHub Actions
- Allow tests to run on GitHub without external set up, via GitHub Actions (Windows, Linux, MacOS)
- Exposed desired CLI backend version as
ArduinoInstallation::DESIRED_ARDUINO_CLI_VERSION
- Arduino backend is now
arduino-cli
version0.13.0
ArduinoCmd
is nowArduinoBackend
CppLibrary
now relies largely onArduinoBackend
instead of making its own judgements about libraries (metadata, includes, and examples)ArduinoBackend
functionality related toCppLibrary
now lives inCppLibrary
CppLibrary
now works in an installation-first manner for exposure toarduino-cli
's logic -- without installation, there is no ability to reason about librariesCppLibrary
forces just-in-time recursive dependency installation in order to work sensiblyArduinoBackend
maintains the central "best guess" logic on what a library (on disk) might be named
arduino_ci_remote.rb
CLI switch--skip-compilation
- Deprecated
arduino_ci_remote.rb
in favor ofarduino_ci.rb
ARDUINO_CI_SKIP_SPLASH_SCREEN_RSPEC_TESTS
no longer affects any tests because there are no longer splash screens since switching toarduino-cli
CIConfig.package_builtin?
as this is no longer relevant to thearduino-cli
backend (which has no built-in packages)- Travis and Appveyor CI
- Missing include of
IPAddress.h
inClient.h
- Mismatches between library names in
library.properties
and the directory names, which can cause cryptic failures LibraryProperties
skips over parse errors instead of crashing: only lines with non-empty keys and non-nil values are recorded
0.4.0 - 2020-11-21
arduino_ci_remote.rb
CLI switch--skip-examples-compilation
- Add support for
digitalPinToPort()
,digitalPinToBitMask()
,portOutputRegister()
, andportInputRegister()
CppLibrary.header_files
to find header filesLibraryProperties
to read metadata from Arduino librariesCppLibrary.library_properties_path
,CppLibrary.library_properties?
,CppLibrary.library_properties
to expose library properties of a Cpp libraryCppLibrary.arduino_library_dependencies
to list the dependent libraries specified by the library.properties fileCppLibrary.print_stack_dump
prints stack trace dumps (on Windows specifically) to the console if encountered- Definitions for Arduino zero
- Support for mock EEPROM (but only if board supports it)
- Add stubs for
Client.h
,IPAddress.h
,Printable.h
,Server.h
, andUdp.h
Wire
now has a mock support for the master role- Sample project for
BusIO
to show problem finding header file
- Move repository from https://github.com/ianfixes/arduino_ci to https://github.com/Arduino-CI/arduino_ci
- Revise math macros to avoid name clashes
CppLibrary
functions returning C++ header or code files now respect the 1.0/1.5 library specification- Mocks of built-in macros made more accurate
- NUM_SERIAL_PORTS can now be set explicitly
- Improve SPI header strategy
arduino_ci_remote.rb
CLI switch--skip-compilation
- Deprecated
arduino_ci_remote.rb
in favor ofarduino_ci.rb
- Don't define
ostream& operator<<(nullptr_t)
if already defined by Apple CppLibrary.in_tests_dir?
no longer produces an error if there is no tests directory- The definition of the
_SFR_IO8
macro no longer produces errors about rvalues - Typo in
cpp_library.rb
, misspelling ofaux_libraries
0.3.0 - 2019-09-03
- Unit testing configuration now allows
exclude_dirs
to be set, which prevents stray source files from as part of unit testing allows
0.2.1 - 2019-08-12
- Minimal Wire mocks. Will not provide support for unit testing I2C communication yet, but will allow compilation of libraries that use I2C.
StreamTape
class now bridgesStream
andHardwareSerial
to allow general-purpose stream mocking & history
- Arduino command failures (to read preferences) now causes a fatal error, with help for troubleshooting the underlying command
- Arduino library dependencies are now installed prior to unit testing, instead of prior to compilation testing. Whoops.
- Arduino library dependencies with spaces in their names are now handled properly during compilation -- spaces are automatically coerced to underscores
0.2.0 - 2019-02-20
release-new-version.sh
script- outputs for
PinHistory
can now report timestamps - Fibonacci Clock for clock testing purposes (internal to this library)
- Shortened
ArduinoQueue
push and pop operations ci/Queue.h
is nowMockEventQueue.h
, with timing dataMockEventQueue::Node
now contains structMockEventQueue::Event
, which contains both the templated typeT
and a field for a timestamp.- Construction of
MockEventQueue
now includes a constructor argument for the time-fetching function - Construction of
PinHistory
now includes a constructor argument for the time-fetching function PinHistory
can now return an array of timestamps for its eventsGodmodeState
is now a singleton pattern, which is necessary to support the globality of Arduino functionsGodmodeState
now uses timestamped PinHistory for Analog and Digital
ArduinoQueue
no longer leaks memory
0.1.21 - 2019-02-07
- Proper
ostream operator <<
fornullptr
- Proper comparison operations for
nullptr
Compare.h
heavily refactored to use a smallish macro
- Homegrown implementation of
nullptr
nullptr
support (again)
0.1.20 - 2019-01-31
unittest_setup()
andunittest_teardown()
were not being executed for each unit test, only for the set of all tests. My bad.
0.1.19 - 2019-01-30
- Added rspec sensitivity to the environment variable
$ARDUINO_CI_SELECT_CPP_TESTS=<glob>
(forarduino_ci
gem hackers) assertNotNull()
andassureNotNull()
C++ comparisons
CiConfig::allowable_unittest_files
now usesPathname
to full effectnullptr
now defined in its own class
- Assertions on
nullptr
- The definition of
nullptr
0.1.18 - 2019-01-29
ArduinoInstallation
andArduinoDownloader
now allow console output to optionally be set to anIO
object of choice duringforce_install
ArduinoInstallation::force_install
now optionally accepts a version stringarduino_library_location.rb
script to print Arduino library location to stdoutarduino_ci_remote.rb
now supports--skip-unittests
and--skip-compilation
. If you skip both, only theautolocate!
of the Arduino binary will be performed.keepachangelog_manager
gem to begin streamlining the release processunittest_setup()
andunittest_teardown()
macros, my thanks to @hlovdal for contributing this code- Added rspec sensitivity to the environment variable
$ARDUINO_CI_SKIP_SPLASH_SCREEN_RSPEC_TESTS
(forarduino_ci
gem hackers) - Added rspec sensitivity to the environment variable
$ARDUINO_CI_SKIP_RUBY_RSPEC_TESTS
(forarduino_ci
gem hackers) - Added rspec sensitivity to the environment variable
$ARDUINO_CI_SKIP_CPP_RSPEC_TESTS
(forarduino_ci
gem hackers) nullptr
definition in C++assertNull()
for unit tests
- Unit tests and examples are now executed alphabetically by filename
- The
pgm_read_...
preprocessor macros in cpp/arduino/avr/pgmspace.h now expands to an expression with applicable type. - Unit tests for interrupts (
attachInterrupt
anddetachInterrupt
) get their own file
- Library installation no longer "fails" if the library is already installed
- Platform definition for
mega2560
now includes proper AVR compiler flag CppLibrary::vendor_bundle?
now asks where gems are, instead of assumingvendor/bundle/
install_local_library
step inarduino_ci_remote.rb
now properly surfaces any error message
0.1.17 - 2019-01-14
- Provide an
itoa
function. It is present in Arduino's runtime environment but not on most (all?) host systems because itoa is not a portable standard function. to_h
andto_s
functions forci_config.rb
CIConfig::clone
- Ability to override
CIConfig
from a hash instead of just a file arduino_ci_remote.rb
now supports command line switches--testfile-select=GLOB
and--testfile-reject=GLOB
(which can both be repeated)
- Simplified the use of
Array.each
with a return statement; it's now simplyArray.find
autolocate!
for Arduino installations now raisesArduinoInstallationError
ifforce_install
fails- Errors due to missing YAML are now named
ConfigurationError
- Determining a working OSX launch command no longer breaks on non-English installations
arduino_ci_remote.rb
now honors selected and rejected test files
0.1.16 - 2019-01-06
- Finally put some factorization into the
arduino_ci_remote.rb
script: testing unit and testing compilation are now standalone functions
- Unnecessary board changes during unit tests no longer happen
- Proper casting for
pgm_read_byte
0.1.15 - 2019-01-04
- Checking for (empty) set of platforms to build now precedes the check for examples to build; this avoids assuming that all libraries will have an example and dumping the file set when none are found
- Spaces in the names of project directories no longer cause unit test binaries to fail execution
- Configuration file overrides with
nil
s (or empty arrays) now properly override their base configuration
0.1.14 - 2018-09-21
- Arduino command wrapper now natively supports board manager URLs
arduino_ci_remote.rb
checks for proper board manager URLs for requested platformsarduino_ci_remote.rb
reports on Arduino executable location- exposed
index_libraries
inArduinoCmd
so it can be used as an explicit build step
- Centralized file listing code in
arduino_ci_remote.rb
arduino_ci_remote.rb
is verbose about platforms, packages, and URLs
- Linux wrapper no longer bails out on long-running commands. That behavior was possible in Arduino 1.6.x that might pop up a graphical error message, but with the display manager removed this is no longer a concern
0.1.13 - 2018-09-19
arduino_ci_remote.rb
now iterates over example platforms before examples (saves time)
arduino_ci_remote.rb
no longer crashes iftest/
directory doesn't exist
0.1.12 - 2018-09-13
- Explicit
libasan
checking (reporting) in build script
- Test file
int main(){}
needed a CPP extension in order to properly compile - Fixed build script reporting for
inform()
when it returns a non-string value from its block - Don't count false returns from
inform()
blocks as failures
0.1.11 - 2018-09-13
- Explicit checks that the requested test platforms are defined in YML
- Arduino command wrapper can now guess whether a library is installed
- CPP library class now reaches into included Arduino libraries for source files
- SPI mocks
ensure_arduino_installation.rb
to allow custom libraries to be installed- Copy constructor for
ArduinoCITable
- Some error information on failures to download the Arduino binary
- Refactored documentation
- External libraries aren't forcibly installed via the Arduino binary (in
arduino_cmd_remote.rb
) if they appear to exist on disk already attachInterrupt
anddetachInterrupt
are now mocked instead of_NOP
- Unit test binaries now run with debugging symbols and address sanitization (if available), to help isolate the causes of segfaults
ArduinoCommand::libdir
logic is now centralized, usingsketchbook.path
from prefs instead of hard-coding
- Display Manager became no longer necessary with Arduino 1.8.X
- OSX splash screen re-disabled
- ArduinoCITable didn't initialize its size on
clear()
- CPP file aggregation now ignores dotfiles
- Unit test
compilers
section of YAML configuration is now properly inherited from parent configuration files - Retrieving preferences is now properly cached
- Paths on Windows should now work due to the use of
Pathname
- symlinking directories in Windows environments now properly uses
/D
switch tomklink
0.1.10 - 2018-05-06
- Arduino
force_install
on Linux now attempts downloading 3 times and provides more information on failure - Explicit check for
wget
- Windows / Appveyor support, enabled largely by contributions from @tomduff
long long
support inString
- Representative
.gitignore
files in sample projects - Cross-platform symlinking in
Host
- OSX CI via Travis, with separate badges
- Author
- Splash-screen-skip hack on OSX now falls back on "official" launch method if the hack doesn't work
- Refactored download/install code in prepration for windows CI
- Explicitly use 32-bit math for mocked Random()
- Ruby-centric download and unzipping of Arduino IDE packages, now with progress dots
ArduinoDownloaderPosix
became empty, so it was removed
Gemfile.lock
files are properly ignored- Windows hosts won't try to open a display manager
isnan
portability- OSX force_install
0.1.9 - 2018-04-12
- Explicit tests of
.arduino-ci.yml
inTestSomething
example
- Malformed YAML (duplicate unittests section) now has no duplicate section
- arduino_ci_remote.rb script now has correct arguments in build_for_test
0.1.8 - 2018-04-03
- Definition of
LED_BUILTIN
, first reported bydfrencham
on GitHub - Stubs for
tone
andnoTone
, first suggested bydfrencham
on GitHub - Ability to specify multiple compilers for unit testing
- Compile errors / portability issues in
WString.h
andPrint.h
, first reported bydfrencham
on GitHub - Compile errors / inheritance issues in
Print.h
andStream.h
, first reported bydfrencham
on GitHub - Print functions for int, double, long, etc
0.1.7 - 2018-03-07
- Queue and Table are now ArduinoCIQueue and ArduinoCITable to avoid name collisions
0.1.6 - 2018-03-07
CppLibrary
can now reportgcc_version
arduino_ci_remote.rb
now formats tasks with multiple output lines more nicely- Templates for CI classes are now pass-by-value (no const reference)
- Replaced pipes with
Open3.capture3
to avoid deadlocks when commands have too much output ci_config.rb
now returns empty arrays (instead of nil) for undefined config keyspgmspace.h
explicitly includes<string.h>
__FlashStringHelper
should now be properly mocked for compilationWString.h
bool operator now works and is simpler
0.1.5 - 2018-03-05
- Yaml files can have either
.yml
or.yaml
extensions - Yaml files support select/reject criteria for paths of unit tests for targeted testing
- Pins now track history and can report it in Ascii (big- or little-endian) for digital sequences
- Pins now accept an array (or string) of input bits for providing pin values across multiple reads
- FlashStringHelper (and related macros) compilation mocks
- SoftwareSerial. That took a while.
- Queue template implementation
- Table template implementation
- ObservableDataStream and DataStreamObserver pattern implementation
- DeviceUsingBytes and implementation of mocked serial device
- Unit test executables print to STDERR just in case there are segfaults. Uh, just in case I ever write any.
- OSX no longer experiences
javax.net.ssl.SSLKeyException: RSA premaster secret error
messages when downloading board package files arduino_ci_remote.rb
no longer makes unnecessary changes to the board being tested- Scripts no longer crash if there is no
test/
directory - Scripts no longer crash if there is no
examples/
directory assureTrue
andassureFalse
nowassure
instead of justassert
ing.
0.1.4 - 2018-02-01
- Support for all builtin Math functions https://www.arduino.cc/reference/en/
- Support for all builtin Bits and Bytes functions https://www.arduino.cc/reference/en/
- Support for GODMODE and time functions
- Support for Character functions https://www.arduino.cc/reference/en/
- Mocks for
random
functions with seed control - Many original Arduino
#define
s - Mocks for pinMode, analog/digital read/write
- Support for WString
- Support for Print
- Support for Stream (backed by a String implementation)
- All the IO stuff (pins, serial port support flags, etc) from the Arduino library
- Support for Serial (backed by GODMODE)
- Made
wget
have quieter output
0.1.3 - 2018-01-25
- C++ functions for
assure
;assert
s will run tests and continue,assure
s will abort on failures - Missing dotfiles in the
DoSomething
project have been committed
arduino_ci_remote.rb
doesn't attempt to set URLs if nothing needs to be downloadedarduino_ci_remote.rb
does unit tests firstunittest_main()
is now the macro for theint main()
of test files
- All test files were reporting "not ok" in TAP output. Now they are OK iff all asserts pass.
- Directories with a C++ extension in their name could cause problems. Now they are ignored.
CppLibrary
had trouble with symlinks. It shouldn't anymore.CppLibrary
had trouble with vendor bundles. It might in the future, but I have a better fix ready to go if it's an issue.
0.1.2 - 2018-01-25
- Actually package CPP and YAML files into the gem. Whoops.
0.1.1 - 2018-01-24
- README documentation for the actual unit tests
0.1.0 - 2018-01-24
- Unit testing support
- Documentation for all Ruby methods
ArduinoInstallation
class for managing lib / executable pathsDisplayManager
class for managing Xvfb instance if neededArduinoCmd
captures and caches preferencesArduinoCmd
reports on whether a board is installedArduinoCmd
sets preferencesArduinoCmd
installs boardsArduinoCmd
installs librariesArduinoCmd
selects boards (compiler preference)ArduinoCmd
verifies sketchesCppLibrary
manages GCC for unittestsCIConfig
manages overridable config for all testing
DisplayManger.with_display
doesn'tdisable
if the display was enabled prior to starting the block
- Built gems are
.gitignore
d - Updated gems based on Github's security advisories
0.0.1 - 2018-01-10
- Skeleton for gem with working unit tests