blob: 896ace5f8748259be1a562d1da1388b26b4ccb29 [file]
// 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 firmware
import (
"reflect"
"testing"
pb "chromiumos/tast/services/cros/firmware"
)
// flags converts a list of ints to a slice of pb.GBBFlags.
func flags(f ...int) []pb.GBBFlag {
var fs []pb.GBBFlag
for _, i := range f {
fs = append(fs, pb.GBBFlag(i))
}
return fs
}
// state constructs a GBBFlagsState.
func state(clear, set []pb.GBBFlag) *pb.GBBFlagsState {
return &pb.GBBFlagsState{Clear: clear, Set: set}
}
func TestCanonicalGBBFlagState(t *testing.T) {
states := []struct {
a *pb.GBBFlagsState
c *pb.GBBFlagsState
}{
{state(flags(), flags()), state(flags(), flags())},
{state(flags(0), flags()), state(flags(0), flags())},
{state(flags(), flags(0)), state(flags(), flags(0))},
{state(flags(1, 2, 3), flags(4, 5, 6)), state(flags(1, 2, 3), flags(4, 5, 6))},
{state(flags(3, 2, 1), flags(6, 5, 4)), state(flags(1, 2, 3), flags(4, 5, 6))},
}
for _, s := range states {
cA := canonicalGBBFlagsState(s.a)
if !reflect.DeepEqual(cA.Clear, s.c.Clear) {
t.Errorf("Clear incorrect for canonical %v: \ngot\n%v\nwant\n%v\n\n", s.a.Clear, cA.Clear, s.c.Clear)
}
if !reflect.DeepEqual(cA.Set, s.c.Set) {
t.Errorf("Set incorrect for canonical %v: \ngot\n%v\nwant\n%v\n\n", s.a.Set, cA.Set, s.c.Set)
}
}
}
func TestGBBFlagsStatesEqual(t *testing.T) {
states := []struct {
a *pb.GBBFlagsState
b *pb.GBBFlagsState
want bool
}{
{state(flags(), flags()), state(flags(), flags()), true},
{state(flags(0), flags()), state(flags(0), flags()), true},
{state(flags(), flags(0)), state(flags(), flags(0)), true},
{state(flags(1, 2, 3), flags(4, 5, 6)), state(flags(1, 2, 3), flags(4, 5, 6)), true},
{state(flags(3, 2, 1), flags(6, 5, 4)), state(flags(1, 2, 3), flags(4, 5, 6)), true},
{state(flags(3, 2, 1), flags(6, 5, 4)), state(flags(3, 2, 1), flags(6, 5, 4)), true},
{state(flags(), flags()), state(flags(0), flags()), false},
{state(flags(0), flags()), state(flags(), flags(0)), false},
{state(flags(0), flags(0)), state(flags(0), flags(1)), false},
{state(flags(0), flags(0)), state(flags(1), flags(0)), false},
{state(flags(0, 1), flags(0, 1)), state(flags(0, 1), flags(0, 2)), false},
}
for _, s := range states {
got := GBBFlagsStatesEqual(s.a, s.b)
if got != s.want {
t.Errorf("Comparing\n%+v\nand\n%+v\ngot %v, want %v", s.a, s.b, got, s.want)
}
}
}
func TestGBBFlagsChanged(t *testing.T) {
states := []struct {
a *pb.GBBFlagsState
b *pb.GBBFlagsState
f []pb.GBBFlag
want bool
}{
{state(flags(), flags()), state(flags(), flags()), flags(0), false},
{state(flags(0), flags(1)), state(flags(1), flags(0)), flags(2), false},
{state(flags(0), flags()), state(flags(0), flags()), flags(0), false},
{state(flags(), flags(0)), state(flags(), flags(0)), flags(0), false},
{state(flags(), flags(0)), state(flags(), flags(0)), flags(0), false},
{state(flags(0), flags()), state(flags(1), flags()), flags(0), false},
{state(flags(0), flags()), state(flags(), flags(0)), flags(0), true},
{state(flags(), flags(0)), state(flags(0), flags()), flags(0), true},
{state(flags(), flags(0)), state(flags(0), flags()), flags(0), true},
{state(flags(0, 1), flags(0, 1, 2)), state(flags(0, 2), flags()), flags(0), true},
}
for _, s := range states {
got := GBBFlagsChanged(s.a, s.b, s.f)
if got != s.want {
t.Errorf("Flags %v changed from\n%v\nto%v\ngot %v, want %v", s.f, s.a, s.b, got, s.want)
}
}
}
func TestAllGBBFlags(t *testing.T) {
var all []int
for i := 0; i < len(pb.GBBFlag_value); i++ {
all = append(all, i)
}
want := flags(all...)
got := AllGBBFlags()
if !reflect.DeepEqual(got, want) {
t.Errorf("All flags\ngot\n%v\nwant\n%v", got, want)
}
}