#cloud-config
#
# Copyright 2020 Google LLC
#
# Licensed 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.

write_files:
  - path: /tmp/preloader-test/test.sh
    permissions: 0644
    owner: root
    content: |
      set -o errexit
      set -o pipefail

      # Templated by cloudbuild config that runs this test.
      OEM_SIZE_TH=%s

      trap 'fail exiting due to errors' EXIT

      fail() {
        echo "TestFail: $@"
      }

      testHello() {
        if [[ ! -f /mnt/stateful_partition/hello ]]; then
          echo "/mnt/stateful_partition/hello is not a valid file (does it exist?)"
          echo "testHello fail"
          RESULT="fail"
          return
        fi
        expected="hello"
        actual=$(cat /mnt/stateful_partition/hello)
        if [[ "${expected}" != "${actual}" ]]; then
          echo "/mnt/stateful_partition/hello contains ${actual} instead of ${expected}"
          echo "testHello fail"
          RESULT="fail"
          return
        fi
        echo "testHello pass"
      }

      testOEMHello(){
        if [[ ! -f /usr/share/oem/hello ]]; then
          echo "/usr/share/oem/hello is not a valid file (does it exist?)"
          echo "testOEMHello fail"
          RESULT="fail"
          return
        fi
        expected="hello"
        actual=$(cat /usr/share/oem/hello)
        if [[ "${expected}" != "${actual}" ]]; then
          echo "/usr/share/oem/hello contains ${actual} instead of ${expected}"
          echo "testOEMHello fail"
          RESULT="fail"
          return
        fi
        echo "testOEMHello pass"        
      }

      testUbuntuImage() {
        expected="ubuntu"
        actual=$(docker images --format {{.Repository}})
        if [[ "${expected}" != "${actual}" ]]; then
          echo "expected docker images: ${expected}"
          echo "actual docker images: ${actual}"
          echo "testUbuntuImage fail"
          RESULT="fail"
          return
        fi
        echo "testUbuntuImage pass"
      }

      testHomeDir() {
        expected="chronos"
        actual=$(ls /home)
        if [[ "${expected}" != "${actual}" ]]; then
          echo "expected home contents: ${expected}"
          echo "actual home contents: ${actual}"
          echo "testHomeDir fail"
          RESULT="fail"
          return
        fi
        echo "testHomeDir pass"
      }

      testWorkdirClean() {
        if [[ -d "/var/lib/.cos-customizer" ]]; then
          echo "/var/lib/.cos-customizer exists"
          echo "testWorkdirClean fail"
          RESULT="fail"
          return
        fi
        echo "testWorkdirClean pass"
      }

      testOEMSize(){
        actual=$(df --output=size /usr/share/oem --block-size=$((1<<20)) | tail -n 1)
        if [[ "${actual}" -le "${OEM_SIZE_TH}" ]]; then
          echo "OEM size 80% threshold: ${OEM_SIZE_TH} MB"
          echo "actual OEM size: ${actual} MB"
          echo "testOEMSize fail"
          RESULT="fail"
          return
        fi
        echo "testOEMSize pass"
      }

      testStatefulSize(){
        local -r stateful_size_th=7168
        actual=$(df --output=size /mnt/stateful_partition --block-size=$((1<<20)) | tail -n 1)
        if [[ "${actual}" -le "${stateful_size_th}" ]]; then
          echo "STATEFUL size 80% threshold: ${stateful_size_th} MB"
          echo "actual STATEFUL size: ${actual} MB"
          echo "testStatefulSize fail"
          RESULT="fail"
          return
        fi
        echo "testStatefulSize pass"
      }

      mountOEM(){
        if [[ ! -e /dev/dm-1 ]]; then
          echo "/dev/dm-1 doesn't exist"
          echo "mountOEM fail"
          RESULT="fail"
          return
        fi
        sudo mount -o ro /dev/dm-1 /usr/share/oem/
        echo "mountOEM pass"
      }

      testOEMMountService(){
        if (! sudo systemctl show -p LoadState usr-share-oem.mount | grep "masked" > /dev/null ); then
          echo "usr-share-oem.mount not masked"
          echo "testOEMMountService fail"
          RESULT="fail"
          return
        fi
        echo "testOEMMountService pass"
      }

      main() {
        RESULT="pass"
        mountOEM
        testHello
        testUbuntuImage
        testHomeDir
        testWorkdirClean
        testOEMSize
        testOEMHello
        testOEMMountService
        testStatefulSize
        if [[ "${RESULT}" == "fail" ]]; then
          exit 1
        fi
      }

      main 2>&1 | sed "s/^/TestStatus: /"
      trap - EXIT
      echo "TestPass: all tests passed"

  - path: /etc/systemd/system/preloader-test.service
    permissions: 0644
    owner: root
    content: |
      [Unit]
      Description=Preloader test
      Wants=network-online.target gcr-online.target docker.service
      After=network-online.target gcr-online.target docker.service

      [Service]
      Type=oneshot
      RemainAfterExit=yes
      User=root
      ExecStart=/bin/bash /tmp/preloader-test/test.sh
      StandardOutput=tty
      StandardError=tty
      TTYPath=/dev/ttyS1

runcmd:
  - systemctl daemon-reload
  - systemctl --no-block start preloader-test.service
