blob: 0856b7dcfbfbb701a9e54fa777267917aabc3ec9 [file] [log] [blame]
// Copyright 2024 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package orchestrate
import (
"fmt"
"io"
"net"
"os"
"path/filepath"
)
var (
serialLog = filepath.Join(os.Getenv("TEST_UNDECLARED_OUTPUTS_DIR"), "serial.log")
serialSymLog = filepath.Join(os.Getenv("TEST_UNDECLARED_OUTPUTS_DIR"), "serial.symbolized.log")
)
// SerialLogging holds information about logging the serial from the device.
type SerialLogging struct {
socket net.Conn
}
// StartSerialLogging captures serial logging into a file in the background.
func StartSerialLogging(deviceConfig *DeviceConfig) (*SerialLogging, error) {
socket, err := net.Dial("unix", deviceConfig.SerialMux)
if err != nil {
return nil, fmt.Errorf("net.Dial: %w", err)
}
dst, err := os.Create(serialLog)
if err != nil {
return nil, fmt.Errorf("os.Create: %w", err)
}
go func() {
if _, err := io.Copy(dst, socket); err != nil {
fmt.Printf("serial io.Copy failed: %v\n", err)
}
if err := dst.Close(); err != nil {
fmt.Printf("serial conn.Close failed: %v\n", err)
}
}()
return &SerialLogging{socket: socket}, nil
}
// Symbolize the log file.
func (s *SerialLogging) Symbolize(runner *TestOrchestrator) {
if err := runner.Symbolize(serialLog, serialSymLog); err != nil {
fmt.Printf("serial runner.Symbolize: %v\n", err)
}
}
// Stop stops the goroutine listening for logs.
func (s *SerialLogging) Stop() {
if err := s.socket.Close(); err != nil {
fmt.Printf("serial conn.Close: %v\n", err)
}
}