blob: 5ed387c40f95c77dd6d06ac8c5815f5b6318220b [file] [log] [blame]
Tim Windelschmidt6d33a432025-02-04 14:34:25 +01001// Copyright The Monogon Project Authors.
Lorenz Brun547b33f2020-04-23 15:27:06 +02002// SPDX-License-Identifier: Apache-2.0
Lorenz Brun547b33f2020-04-23 15:27:06 +02003
Serge Bazanski216fe7b2021-05-21 18:36:16 +02004// ktest is a test launcher for running tests inside a custom kernel and passes
5// the results back out.
Lorenz Brun547b33f2020-04-23 15:27:06 +02006package main
7
8import (
Lorenz Brun3ff5af32020-06-24 16:34:11 +02009 "context"
Lorenz Brun547b33f2020-04-23 15:27:06 +020010 "flag"
Lorenz Brun547b33f2020-04-23 15:27:06 +020011 "io"
12 "log"
Lorenz Brun547b33f2020-04-23 15:27:06 +020013 "os"
Lorenz Brun3ff5af32020-06-24 16:34:11 +020014 "time"
15
Tim Windelschmidtd0cdb572025-03-27 17:18:39 +010016 "source.monogon.dev/osbase/test/qemu"
Lorenz Brun547b33f2020-04-23 15:27:06 +020017)
18
19var (
20 kernelPath = flag.String("kernel-path", "", "Path of the Kernel ELF file")
21 initrdPath = flag.String("initrd-path", "", "Path of the initrd image")
22 cmdline = flag.String("cmdline", "", "Additional kernel command line options")
23)
24
25func main() {
26 flag.Parse()
27
Tim Windelschmidtd0cdb572025-03-27 17:18:39 +010028 hostFeedbackConn, vmFeedbackConn, err := qemu.NewSocketPair()
Lorenz Brun547b33f2020-04-23 15:27:06 +020029 if err != nil {
Lorenz Brun3ff5af32020-06-24 16:34:11 +020030 log.Fatalf("Failed to create socket pair: %v", err)
Lorenz Brun547b33f2020-04-23 15:27:06 +020031 }
Lorenz Brun547b33f2020-04-23 15:27:06 +020032
33 exitCodeChan := make(chan uint8, 1)
34
35 go func() {
Lorenz Brun3ff5af32020-06-24 16:34:11 +020036 defer hostFeedbackConn.Close()
Lorenz Brun547b33f2020-04-23 15:27:06 +020037
38 returnCode := make([]byte, 1)
Lorenz Brun3ff5af32020-06-24 16:34:11 +020039 if _, err := io.ReadFull(hostFeedbackConn, returnCode); err != nil {
Lorenz Brun547b33f2020-04-23 15:27:06 +020040 log.Fatalf("Failed to read socket: %v", err)
41 }
42 exitCodeChan <- returnCode[0]
43 }()
44
Tim Windelschmidtd0cdb572025-03-27 17:18:39 +010045 if err := qemu.RunMicroVM(context.Background(), &qemu.MicroVMOptions{
Leopoldaf5086b2023-01-15 14:12:42 +010046 Name: "ktest",
Lorenz Brun3ff5af32020-06-24 16:34:11 +020047 KernelPath: *kernelPath,
48 InitramfsPath: *initrdPath,
49 Cmdline: *cmdline,
50 SerialPort: os.Stdout,
51 ExtraChardevs: []*os.File{vmFeedbackConn},
52 DisableHostNetworkInterface: true,
53 }); err != nil {
54 log.Fatalf("Failed to run ktest VM: %v", err)
Lorenz Brun547b33f2020-04-23 15:27:06 +020055 }
Lorenz Brun3ff5af32020-06-24 16:34:11 +020056
Lorenz Brun547b33f2020-04-23 15:27:06 +020057 select {
58 case exitCode := <-exitCodeChan:
59 os.Exit(int(exitCode))
Lorenz Brun3ff5af32020-06-24 16:34:11 +020060 case <-time.After(1 * time.Second):
61 log.Fatal("Failed to get an error code back (test runtime probably crashed)")
Lorenz Brun547b33f2020-04-23 15:27:06 +020062 }
63}