Skip to content

Commit

Permalink
ioc/tests: add test for testing selection of epics-base
Browse files Browse the repository at this point in the history
  • Loading branch information
minijackson committed Jul 24, 2023
1 parent b9c8272 commit ec1a3b6
Show file tree
Hide file tree
Showing 21 changed files with 372 additions and 0 deletions.
45 changes: 45 additions & 0 deletions ioc/tests/default-ioc/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
releaseBranch:
{pkgs, ...}: let
inherit (pkgs) epnixLib;
inherit (pkgs.stdenv.hostPlatform) system;

result = epnixLib.evalEpnixModules {
nixpkgsConfig.system = system;
epnixConfig.imports = [
(import ./top/epnix.nix releaseBranch)
];
};

service = result.config.epnix.nixos.services.ioc.config;

ioc = result.outputs.build;
in
pkgs.nixosTest {
name = "default-ioc-epics-base-${releaseBranch}";
meta.maintainers = with epnixLib.maintainers; [minijackson];

nodes.machine = {
environment.systemPackages = [pkgs.epnix.epics-base];
systemd.services.ioc = service;
};

testScript = ''
machine.wait_for_unit("default.target")
machine.wait_for_unit("ioc.service")
with subtest("wait until started"):
assert machine.wait_until_succeeds("caget -t SIMPLE:AI").strip() == "0"
with subtest("EPICS revision is correct"):
machine.succeed("journalctl --no-pager -u ioc.service | grep -F '## EPICS R${releaseBranch}'")
with subtest("ai records"):
assert machine.wait_until_succeeds("caget -t SIMPLE:AI").strip() == "0"
machine.succeed("caput SIMPLE:AI 123.456")
assert machine.wait_until_succeeds("caget -t SIMPLE:AI").strip() == "123.456"
'';

passthru = {
inherit ioc;
};
}
29 changes: 29 additions & 0 deletions ioc/tests/default-ioc/top/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Install directories
/bin/
/cfg/
/db/
/dbd/
/html/
/include/
/lib/
/templates/

# Local configuration files
/configure/*.local

# iocBoot generated files
/iocBoot/*ioc*/cdCommands
/iocBoot/*ioc*/dllPath.bat
/iocBoot/*ioc*/envPaths
/iocBoot/*ioc*/relPaths.sh

# Build directories
O.*/

# Common files created by other tools
/QtC-*
/.vscode/
*.orig
*.log
.*.swp
.DS_Store
31 changes: 31 additions & 0 deletions ioc/tests/default-ioc/top/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Makefile at top of application tree
TOP = .
include $(TOP)/configure/CONFIG

# Directories to build, any order
DIRS += configure
DIRS += $(wildcard *Sup)
DIRS += $(wildcard *App)
DIRS += $(wildcard *Top)
DIRS += $(wildcard iocBoot)

# The build order is controlled by these dependency rules:

# All dirs except configure depend on configure
$(foreach dir, $(filter-out configure, $(DIRS)), \
$(eval $(dir)_DEPEND_DIRS += configure))

# Any *App dirs depend on all *Sup dirs
$(foreach dir, $(filter %App, $(DIRS)), \
$(eval $(dir)_DEPEND_DIRS += $(filter %Sup, $(DIRS))))

# Any *Top dirs depend on all *Sup and *App dirs
$(foreach dir, $(filter %Top, $(DIRS)), \
$(eval $(dir)_DEPEND_DIRS += $(filter %Sup %App, $(DIRS))))

# iocBoot depends on all *App dirs
iocBoot_DEPEND_DIRS += $(filter %App,$(DIRS))

# Add any additional dependency rules here:

include $(TOP)/configure/RULES_TOP
45 changes: 45 additions & 0 deletions ioc/tests/default-ioc/top/configure/CONFIG
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# CONFIG - Load build configuration data
#
# Do not make changes to this file!

# Allow user to override where the build rules come from
RULES = $(EPICS_BASE)

# RELEASE files point to other application tops
include $(TOP)/configure/RELEASE
-include $(TOP)/configure/RELEASE.$(EPICS_HOST_ARCH).Common

ifdef T_A
-include $(TOP)/configure/RELEASE.Common.$(T_A)
-include $(TOP)/configure/RELEASE.$(EPICS_HOST_ARCH).$(T_A)
endif

# Check EPICS_BASE is set properly
ifneq (file,$(origin EPICS_BASE))
$(error EPICS_BASE must be set in a configure/RELEASE file)
else
ifeq ($(wildcard $(EPICS_BASE)/configure/CONFIG_BASE),)
$(error EPICS_BASE does not point to an EPICS installation)
endif
endif

CONFIG = $(RULES)/configure
include $(CONFIG)/CONFIG

# Override the Base definition:
INSTALL_LOCATION = $(TOP)

# CONFIG_SITE files contain local build configuration settings
include $(TOP)/configure/CONFIG_SITE

# Host-arch specific settings
-include $(TOP)/configure/CONFIG_SITE.$(EPICS_HOST_ARCH).Common

ifdef T_A
# Target-arch specific settings
-include $(TOP)/configure/CONFIG_SITE.Common.$(T_A)

# Host & target specific settings
-include $(TOP)/configure/CONFIG_SITE.$(EPICS_HOST_ARCH).$(T_A)
endif

43 changes: 43 additions & 0 deletions ioc/tests/default-ioc/top/configure/CONFIG_SITE
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# CONFIG_SITE

# Make any application-specific changes to the EPICS build
# configuration variables in this file.
#
# Host/target specific settings can be specified in files named
# CONFIG_SITE.$(EPICS_HOST_ARCH).Common
# CONFIG_SITE.Common.$(T_A)
# CONFIG_SITE.$(EPICS_HOST_ARCH).$(T_A)

# CHECK_RELEASE controls the consistency checking of the support
# applications pointed to by the RELEASE* files.
# Normally CHECK_RELEASE should be set to YES.
# Set CHECK_RELEASE to NO to disable checking completely.
# Set CHECK_RELEASE to WARN to perform consistency checking but
# continue building even if conflicts are found.
CHECK_RELEASE = YES

# Set this when you only want to compile this application
# for a subset of the cross-compiled target architectures
# that Base is built for.
#CROSS_COMPILER_TARGET_ARCHS = vxWorks-ppc32

# To install files into a location other than $(TOP) define
# INSTALL_LOCATION here.
#INSTALL_LOCATION=</absolute/path/to/install/top>

# Set this when the IOC and build host use different paths
# to the install location. This may be needed to boot from
# a Microsoft FTP server say, or on some NFS configurations.
#IOCS_APPL_TOP = </IOC's/absolute/path/to/install/top>

# For application debugging purposes, override the HOST_OPT and/
# or CROSS_OPT settings from base/configure/CONFIG_SITE
#HOST_OPT = NO
#CROSS_OPT = NO

# These allow developers to override the CONFIG_SITE variable
# settings without having to modify the configure/CONFIG_SITE
# file itself.
-include $(TOP)/../CONFIG_SITE.local
-include $(TOP)/configure/CONFIG_SITE.local

8 changes: 8 additions & 0 deletions ioc/tests/default-ioc/top/configure/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
TOP=..

include $(TOP)/configure/CONFIG

TARGETS = $(CONFIG_TARGETS)
CONFIGS += $(subst ../,,$(wildcard $(CONFIG_INSTALLS)))

include $(TOP)/configure/RULES
42 changes: 42 additions & 0 deletions ioc/tests/default-ioc/top/configure/RELEASE
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# RELEASE - Location of external support modules
#
# IF YOU CHANGE ANY PATHS in this file or make API changes to
# any modules it refers to, you should do a "make rebuild" in
# this application's top level directory.
#
# The EPICS build process does not check dependencies against
# any files from outside the application, so it is safest to
# rebuild it completely if any modules it depends on change.
#
# Host- or target-specific settings can be given in files named
# RELEASE.$(EPICS_HOST_ARCH).Common
# RELEASE.Common.$(T_A)
# RELEASE.$(EPICS_HOST_ARCH).$(T_A)
#
# This file is parsed by both GNUmake and an EPICS Perl script,
# so it may ONLY contain definititions of paths to other support
# modules, variable definitions that are used in module paths,
# and include statements that pull in other RELEASE files.
# Variables may be used before their values have been set.
# Build variables that are NOT used in paths should be set in
# the CONFIG_SITE file.

# Variables and paths to dependent modules:
#MODULES = /path/to/modules
#MYMODULE = $(MODULES)/my-module

# If using the sequencer, point SNCSEQ at its top directory:
#SNCSEQ = $(MODULES)/seq-ver

# EPICS_BASE should appear last so earlier modules can override stuff:
EPICS_BASE = /nix/store/gq8ysfw2yqwij1wd64vcc0nwy8p67vzx-epics-base-7.0.7

# Set RULES here if you want to use build rules from somewhere
# other than EPICS_BASE:
#RULES = $(MODULES)/build-rules

# These lines allow developers to override these RELEASE settings
# without having to modify this file directly.
-include $(TOP)/../RELEASE.local
-include $(TOP)/../RELEASE.$(EPICS_HOST_ARCH).local
-include $(TOP)/configure/RELEASE.local
6 changes: 6 additions & 0 deletions ioc/tests/default-ioc/top/configure/RULES
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# RULES

include $(CONFIG)/RULES

# Library should be rebuilt because LIBOBJS may have changed.
$(LIBNAME): ../Makefile
2 changes: 2 additions & 0 deletions ioc/tests/default-ioc/top/configure/RULES.ioc
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#RULES.ioc
include $(CONFIG)/RULES.ioc
2 changes: 2 additions & 0 deletions ioc/tests/default-ioc/top/configure/RULES_DIRS
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#RULES_DIRS
include $(CONFIG)/RULES_DIRS
3 changes: 3 additions & 0 deletions ioc/tests/default-ioc/top/configure/RULES_TOP
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#RULES_TOP
include $(CONFIG)/RULES_TOP

13 changes: 13 additions & 0 deletions ioc/tests/default-ioc/top/epnix.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
releaseBranch: _: {
epnix = {
meta.name = "checks-default-ioc";
buildConfig.src = ./.;

epics-base.releaseBranch = releaseBranch;

nixos.services.ioc = {
app = "simple";
ioc = "iocsimple";
};
};
}
6 changes: 6 additions & 0 deletions ioc/tests/default-ioc/top/iocBoot/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
TOP = ..
include $(TOP)/configure/CONFIG
DIRS += $(wildcard *ioc*)
DIRS += $(wildcard as*)
include $(CONFIG)/RULES_DIRS

5 changes: 5 additions & 0 deletions ioc/tests/default-ioc/top/iocBoot/iocsimple/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
TOP = ../..
include $(TOP)/configure/CONFIG
ARCH = $(EPICS_HOST_ARCH)
TARGETS = envPaths
include $(TOP)/configure/RULES.ioc
10 changes: 10 additions & 0 deletions ioc/tests/default-ioc/top/iocBoot/iocsimple/st.cmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#!../../bin/linux-x86_64/simple

< envPaths

dbLoadDatabase "../../dbd/simple.dbd"
simple_registerRecordDeviceDriver(pdbbase)

dbLoadRecords("../../db/simple.db")

iocInit()
11 changes: 11 additions & 0 deletions ioc/tests/default-ioc/top/simpleApp/Db/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
TOP=../..
include $(TOP)/configure/CONFIG
#----------------------------------------
# ADD MACRO DEFINITIONS AFTER THIS LINE

DB += simple.db

include $(TOP)/configure/RULES
#----------------------------------------
# ADD RULES AFTER THIS LINE

2 changes: 2 additions & 0 deletions ioc/tests/default-ioc/top/simpleApp/Db/simple.db
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
record(ai, "SIMPLE:AI") {
}
14 changes: 14 additions & 0 deletions ioc/tests/default-ioc/top/simpleApp/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Makefile at top of application tree
TOP = ..
include $(TOP)/configure/CONFIG

# Directories to be built, in any order.
# You can replace these wildcards with an explicit list
DIRS += $(wildcard src* *Src*)
DIRS += $(wildcard db* *Db*)

# If the build order matters, add dependency rules like this,
# which specifies that xxxSrc must be built after src:
#xxxSrc_DEPEND_DIRS += src

include $(TOP)/configure/RULES_DIRS
29 changes: 29 additions & 0 deletions ioc/tests/default-ioc/top/simpleApp/src/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
TOP=../..

include $(TOP)/configure/CONFIG
#----------------------------------------
# ADD MACRO DEFINITIONS AFTER THIS LINE
#=============================

PROD_IOC = simple
# simple.dbd will be created and installed
DBD += simple.dbd

# simple.dbd will be made up from these files:
simple_DBD += base.dbd

# simple_registerRecordDeviceDriver.cpp derives from simple.dbd
simple_SRCS += simple_registerRecordDeviceDriver.cpp

# Build the main IOC entry point on workstation OSs.
simple_SRCS_DEFAULT += simpleMain.cpp

# Finally link to the EPICS Base libraries
simple_LIBS += $(EPICS_BASE_IOC_LIBS)

#===========================

include $(TOP)/configure/RULES
#----------------------------------------
# ADD RULES AFTER THIS LINE

23 changes: 23 additions & 0 deletions ioc/tests/default-ioc/top/simpleApp/src/simpleMain.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/* simpleMain.cpp */
/* Author: Marty Kraimer Date: 17MAR2000 */

#include <stddef.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <stdio.h>

#include "epicsExit.h"
#include "epicsThread.h"
#include "iocsh.h"

int main(int argc,char *argv[])
{
if(argc>=2) {
iocsh(argv[1]);
epicsThreadSleep(.2);
}
iocsh(NULL);
epicsExit(0);
return(0);
}
3 changes: 3 additions & 0 deletions ioc/tests/default.nix
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
{pkgs, ...} @ args:
with pkgs.lib;
{
default-ioc-epics-base-3 = import ./default-ioc "3" args;
default-ioc-epics-base-7 = import ./default-ioc "7" args;

support-seq-simple = import ./support/seq/simple args;
support-StreamDevice-simple = import ./support/StreamDevice/simple args;
support-autosave-simple = import ./support/autosave/simple args;
Expand Down

0 comments on commit ec1a3b6

Please sign in to comment.