version: '2.3'

services:
  # Override the supervisor service configuration. The tests will
  # be run through the `sut` service
  balena-supervisor:
    build:
      context: ./
      dockerfile: Dockerfile.template
      args:
        ARCH: ${ARCH:-amd64}
    command: [ '/wait-for-it.sh', '--', '/usr/src/app/entry.sh' ]
    # Use bridge networking for the tests
    network_mode: 'bridge'
    networks:
      - default
    environment:
      DOCKER_HOST: tcp://docker:2375
      DBUS_SYSTEM_BUS_ADDRESS: unix:path=/run/dbus/system_bus_socket
      # Required by migrations
      CONFIG_MOUNT_POINT: /mnt/root/mnt/boot/config.json
      # Read by constants to setup `bootMountpoint`
      BOOT_MOUNTPOINT: /mnt/boot
    depends_on:
      - docker
      - dbus
      - dbus-services
    volumes:
      - dbus:/run/dbus
      - ./test/data/root:/mnt/root
      - ./test/lib/wait-for-it.sh:/wait-for-it.sh
    tmpfs:
      - /data # sqlite3 database

  dbus:
    image: balenablocks/dbus
    environment:
      DBUS_CONFIG: session.conf
      DBUS_ADDRESS: unix:path=/run/dbus/system_bus_socket
    volumes:
      - dbus:/run/dbus

  # Fake system service to listen for supervisor
  # requests
  dbus-services:
    build: ./test/lib/dbus
    depends_on:
      - dbus
    volumes:
      - dbus:/run/dbus
    environment:
      DBUS_SYSTEM_BUS_ADDRESS: unix:path=/run/dbus/system_bus_socket

  docker:
    image: docker:dind
    privileged: true
    environment:
      DOCKER_TLS_CERTDIR: ''
    command: --tls=false # --debug

  sut:
    # Build the supervisor code for development and testing
    build:
      context: ./
      dockerfile: Dockerfile.template
      target: test
      args:
        # Change this if testing in another architecture
        ARCH: ${ARCH:-amd64}
    command:
      [
        './test/lib/wait-for-it.sh',
        '--supervisor',
        '--',
        'npm',
        'run',
        'test:integration'
      ]
    depends_on:
      - balena-supervisor
      - docker
      - dbus
      - dbus-services
    volumes:
      - dbus:/run/dbus
    # Set required supervisor configuration variables here
    environment:
      DOCKER_HOST: tcp://docker:2375
      DBUS_SYSTEM_BUS_ADDRESS: unix:path=/run/dbus/system_bus_socket
      BALENA_SUPERVISOR_ADDRESS: http://balena-supervisor:48484
      # Required by migrations
      CONFIG_MOUNT_POINT: /mnt/root/mnt/boot/config.json
      # Read by constants to setup `bootMountpoint`
      BOOT_MOUNTPOINT: /mnt/boot
    # Set required mounts as tmpfs or volumes here
    # if specific files need to be backed up between tests,
    # make sure to add them to the `testfs` configuration under
    # .mochapodrc.yml
    tmpfs:
      - /data
      - /mnt/root

volumes:
  dbus:
    driver_opts:
      # Use tmpfs to avoid files remaining between runs
      type: tmpfs
      device: tmpfs

networks:
  default:
