blob: 70993367f17aa051ee542bfff45941a87587b9a0 [file] [log] [blame]
// Copyright 2020 The Chromium OS 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 crosdisks provides a series of tests to verify CrosDisks'
// D-Bus API behavior.
package crosdisks
import (
"context"
"reflect"
"strings"
"github.com/godbus/dbus"
"chromiumos/tast/errors"
"chromiumos/tast/local/crosdisks"
"chromiumos/tast/testing"
)
func testVolumeFormat(ctx context.Context, cd *crosdisks.CrosDisks, ld *crosdisks.LoopbackDevice, fsType string) error {
label := "LB" + strings.ToUpper(fsType)
st, err := cd.FormatAndWaitForCompletion(ctx, ld.DevicePath(), fsType, []string{"Label", label})
if err != nil {
return errors.Wrapf(err, "failed to invoke Format on %q as %q", ld.DevicePath(), fsType)
}
if st.Device != ld.DevicePath() {
return errors.Errorf("unexpected device in response: got %q; want %q", st.Device, ld.DevicePath())
}
if st.Status != 0 {
return errors.Errorf("unexpected status of format: got %d; want 0", st.Status)
}
// Double-check if the device has correct label now.
props, err := cd.GetDeviceProperties(ctx, ld.DevicePath())
if err != nil {
return errors.Wrapf(err, "failed to query properties of %q", ld.DevicePath())
}
actualLabel, ok := props["IdLabel"]
if !ok {
return errors.Errorf("failed to obtain IdLabel property on %q", ld.DevicePath())
}
if actualLabel.Signature() != dbus.SignatureOfType(reflect.TypeOf("")) {
return errors.Errorf("incorrect filesystem label format %q", actualLabel.String())
}
if actualLabel.Value() != label {
return errors.Errorf("incorrect filesystem label: got %q; want %q", actualLabel.Value(), label)
}
return nil
}
// RunFormatTests executes a set of tests which format a partition with different filesystems CrosDisks.
func RunFormatTests(ctx context.Context, s *testing.State) {
cd, err := crosdisks.New(ctx)
if err != nil {
s.Fatal("Failed to connect CrosDisks D-Bus service: ", err)
}
defer cd.Close()
for _, fsType := range []string{"vfat", "exfat", "ntfs"} {
s.Run(ctx, fsType, func(ctx context.Context, s *testing.State) {
err = withLoopbackDeviceDo(ctx, cd, loopbackSizeBytes, "", func(ctx context.Context, ld *crosdisks.LoopbackDevice) error {
if err := testVolumeFormat(ctx, cd, ld, fsType); err != nil {
s.Error("Test case failed: ", err)
}
return nil
})
if err != nil {
s.Error("Failed to initialize loopback device: ", err)
}
})
}
}