util/syspolicy/*: move syspolicy keys to new const leaf "pkey" package
This is step 1 of ~3, breaking up #14720 into reviewable chunks, with the aim to make syspolicy be a build-time configurable feature. In this first (very noisy) step, all the syspolicy string key constants move to a new constant-only (code-free) package. This will make future steps more reviewable, without this movement noise. There are no code or behavior changes here. The future steps of this series can be seen in #14720: removing global funcs from syspolicy resolution and using an interface that's plumbed around instead. Then adding build tags. Updates #12614 Change-Id: If73bf2c28b9c9b1a408fe868b0b6a25b03eeabd1 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
committed by
Brad Fitzpatrick
parent
6d45fcfc93
commit
cc532efc20
@@ -1,13 +0,0 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
package setting
|
||||
|
||||
// Key is a string that uniquely identifies a policy and must remain unchanged
|
||||
// once established and documented for a given policy setting. It may contain
|
||||
// alphanumeric characters and zero or more [KeyPathSeparator]s to group
|
||||
// individual policy settings into categories.
|
||||
type Key string
|
||||
|
||||
// KeyPathSeparator allows logical grouping of policy settings into categories.
|
||||
const KeyPathSeparator = '/'
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
"github.com/go-json-experiment/json/jsontext"
|
||||
"tailscale.com/types/opt"
|
||||
"tailscale.com/types/structs"
|
||||
"tailscale.com/util/syspolicy/pkey"
|
||||
)
|
||||
|
||||
// RawItem contains a raw policy setting value as read from a policy store, or an
|
||||
@@ -169,4 +170,4 @@ func (v *RawValue) UnmarshalJSON(b []byte) error {
|
||||
}
|
||||
|
||||
// RawValues is a map of keyed setting values that can be read from a JSON.
|
||||
type RawValues map[Key]RawValue
|
||||
type RawValues map[pkey.Key]RawValue
|
||||
|
||||
@@ -16,6 +16,7 @@ import (
|
||||
|
||||
"tailscale.com/types/lazy"
|
||||
"tailscale.com/util/syspolicy/internal"
|
||||
"tailscale.com/util/syspolicy/pkey"
|
||||
"tailscale.com/util/testenv"
|
||||
)
|
||||
|
||||
@@ -134,7 +135,7 @@ type ValueType interface {
|
||||
|
||||
// Definition defines policy key, scope and value type.
|
||||
type Definition struct {
|
||||
key Key
|
||||
key pkey.Key
|
||||
scope Scope
|
||||
typ Type
|
||||
platforms PlatformList
|
||||
@@ -142,12 +143,12 @@ type Definition struct {
|
||||
|
||||
// NewDefinition returns a new [Definition] with the specified
|
||||
// key, scope, type and supported platforms (see [PlatformList]).
|
||||
func NewDefinition(k Key, s Scope, t Type, platforms ...string) *Definition {
|
||||
func NewDefinition(k pkey.Key, s Scope, t Type, platforms ...string) *Definition {
|
||||
return &Definition{key: k, scope: s, typ: t, platforms: platforms}
|
||||
}
|
||||
|
||||
// Key returns a policy setting's identifier.
|
||||
func (d *Definition) Key() Key {
|
||||
func (d *Definition) Key() pkey.Key {
|
||||
if d == nil {
|
||||
return ""
|
||||
}
|
||||
@@ -208,7 +209,7 @@ func (d *Definition) Equal(d2 *Definition) bool {
|
||||
}
|
||||
|
||||
// DefinitionMap is a map of setting [Definition] by [Key].
|
||||
type DefinitionMap map[Key]*Definition
|
||||
type DefinitionMap map[pkey.Key]*Definition
|
||||
|
||||
var (
|
||||
definitions lazy.SyncValue[DefinitionMap]
|
||||
@@ -224,7 +225,7 @@ var (
|
||||
// invoking any functions that use the registered policy definitions. This
|
||||
// includes calling [Definitions] or [DefinitionOf] directly, or reading any
|
||||
// policy settings via syspolicy.
|
||||
func Register(k Key, s Scope, t Type, platforms ...string) {
|
||||
func Register(k pkey.Key, s Scope, t Type, platforms ...string) {
|
||||
RegisterDefinition(NewDefinition(k, s, t, platforms...))
|
||||
}
|
||||
|
||||
@@ -290,7 +291,7 @@ func SetDefinitionsForTest(tb testenv.TB, ds ...*Definition) error {
|
||||
// DefinitionOf returns a setting definition by key,
|
||||
// or [ErrNoSuchKey] if the specified key does not exist,
|
||||
// or an error if there are conflicting policy definitions.
|
||||
func DefinitionOf(k Key) (*Definition, error) {
|
||||
func DefinitionOf(k pkey.Key) (*Definition, error) {
|
||||
ds, err := settingDefinitions()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
"tailscale.com/types/lazy"
|
||||
"tailscale.com/types/ptr"
|
||||
"tailscale.com/util/syspolicy/internal"
|
||||
"tailscale.com/util/syspolicy/pkey"
|
||||
)
|
||||
|
||||
func TestSettingDefinition(t *testing.T) {
|
||||
@@ -18,7 +19,7 @@ func TestSettingDefinition(t *testing.T) {
|
||||
name string
|
||||
setting *Definition
|
||||
osOverride string
|
||||
wantKey Key
|
||||
wantKey pkey.Key
|
||||
wantScope Scope
|
||||
wantType Type
|
||||
wantIsSupported bool
|
||||
@@ -163,10 +164,10 @@ func TestSettingDefinition(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestRegisterSettingDefinition(t *testing.T) {
|
||||
const testPolicySettingKey Key = "TestPolicySetting"
|
||||
const testPolicySettingKey pkey.Key = "TestPolicySetting"
|
||||
tests := []struct {
|
||||
name string
|
||||
key Key
|
||||
key pkey.Key
|
||||
wantEq *Definition
|
||||
wantErr error
|
||||
}{
|
||||
|
||||
@@ -15,34 +15,35 @@ import (
|
||||
"github.com/go-json-experiment/json/jsontext"
|
||||
xmaps "golang.org/x/exp/maps"
|
||||
"tailscale.com/util/deephash"
|
||||
"tailscale.com/util/syspolicy/pkey"
|
||||
)
|
||||
|
||||
// Snapshot is an immutable collection of ([Key], [RawItem]) pairs, representing
|
||||
// a set of policy settings applied at a specific moment in time.
|
||||
// A nil pointer to [Snapshot] is valid.
|
||||
type Snapshot struct {
|
||||
m map[Key]RawItem
|
||||
m map[pkey.Key]RawItem
|
||||
sig deephash.Sum // of m
|
||||
summary Summary
|
||||
}
|
||||
|
||||
// NewSnapshot returns a new [Snapshot] with the specified items and options.
|
||||
func NewSnapshot(items map[Key]RawItem, opts ...SummaryOption) *Snapshot {
|
||||
func NewSnapshot(items map[pkey.Key]RawItem, opts ...SummaryOption) *Snapshot {
|
||||
return &Snapshot{m: xmaps.Clone(items), sig: deephash.Hash(&items), summary: SummaryWith(opts...)}
|
||||
}
|
||||
|
||||
// All returns an iterator over policy settings in s. The iteration order is not
|
||||
// specified and is not guaranteed to be the same from one call to the next.
|
||||
func (s *Snapshot) All() iter.Seq2[Key, RawItem] {
|
||||
func (s *Snapshot) All() iter.Seq2[pkey.Key, RawItem] {
|
||||
if s == nil {
|
||||
return func(yield func(Key, RawItem) bool) {}
|
||||
return func(yield func(pkey.Key, RawItem) bool) {}
|
||||
}
|
||||
return maps.All(s.m)
|
||||
}
|
||||
|
||||
// Get returns the value of the policy setting with the specified key
|
||||
// or nil if it is not configured or has an error.
|
||||
func (s *Snapshot) Get(k Key) any {
|
||||
func (s *Snapshot) Get(k pkey.Key) any {
|
||||
v, _ := s.GetErr(k)
|
||||
return v
|
||||
}
|
||||
@@ -50,7 +51,7 @@ func (s *Snapshot) Get(k Key) any {
|
||||
// GetErr returns the value of the policy setting with the specified key,
|
||||
// [ErrNotConfigured] if it is not configured, or an error returned by
|
||||
// the policy Store if the policy setting could not be read.
|
||||
func (s *Snapshot) GetErr(k Key) (any, error) {
|
||||
func (s *Snapshot) GetErr(k pkey.Key) (any, error) {
|
||||
if s != nil {
|
||||
if s, ok := s.m[k]; ok {
|
||||
return s.Value(), s.Error()
|
||||
@@ -62,7 +63,7 @@ func (s *Snapshot) GetErr(k Key) (any, error) {
|
||||
// GetSetting returns the untyped policy setting with the specified key and true
|
||||
// if a policy setting with such key has been configured;
|
||||
// otherwise, it returns zero, false.
|
||||
func (s *Snapshot) GetSetting(k Key) (setting RawItem, ok bool) {
|
||||
func (s *Snapshot) GetSetting(k pkey.Key) (setting RawItem, ok bool) {
|
||||
setting, ok = s.m[k]
|
||||
return setting, ok
|
||||
}
|
||||
@@ -94,9 +95,9 @@ func (s *Snapshot) EqualItems(s2 *Snapshot) bool {
|
||||
|
||||
// Keys return an iterator over keys in s. The iteration order is not specified
|
||||
// and is not guaranteed to be the same from one call to the next.
|
||||
func (s *Snapshot) Keys() iter.Seq[Key] {
|
||||
func (s *Snapshot) Keys() iter.Seq[pkey.Key] {
|
||||
if s.m == nil {
|
||||
return func(yield func(Key) bool) {}
|
||||
return func(yield func(pkey.Key) bool) {}
|
||||
}
|
||||
return maps.Keys(s.m)
|
||||
}
|
||||
@@ -144,8 +145,8 @@ func (s *Snapshot) String() string {
|
||||
|
||||
// snapshotJSON holds JSON-marshallable data for [Snapshot].
|
||||
type snapshotJSON struct {
|
||||
Summary Summary `json:",omitzero"`
|
||||
Settings map[Key]RawItem `json:",omitempty"`
|
||||
Summary Summary `json:",omitzero"`
|
||||
Settings map[pkey.Key]RawItem `json:",omitempty"`
|
||||
}
|
||||
|
||||
var (
|
||||
@@ -232,7 +233,7 @@ func MergeSnapshots(snapshot1, snapshot2 *Snapshot) *Snapshot {
|
||||
}
|
||||
return &Snapshot{snapshot2.m, snapshot2.sig, SummaryWith(summaryOpts...)}
|
||||
}
|
||||
m := make(map[Key]RawItem, snapshot1.Len()+snapshot2.Len())
|
||||
m := make(map[pkey.Key]RawItem, snapshot1.Len()+snapshot2.Len())
|
||||
xmaps.Copy(m, snapshot1.m)
|
||||
xmaps.Copy(m, snapshot2.m) // snapshot2 has higher precedence
|
||||
return &Snapshot{m, deephash.Hash(&m), SummaryWith(summaryOpts...)}
|
||||
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
|
||||
jsonv2 "github.com/go-json-experiment/json"
|
||||
"tailscale.com/util/syspolicy/internal"
|
||||
"tailscale.com/util/syspolicy/pkey"
|
||||
)
|
||||
|
||||
func TestMergeSnapshots(t *testing.T) {
|
||||
@@ -23,23 +24,23 @@ func TestMergeSnapshots(t *testing.T) {
|
||||
name: "both-nil",
|
||||
s1: nil,
|
||||
s2: nil,
|
||||
want: NewSnapshot(map[Key]RawItem{}),
|
||||
want: NewSnapshot(map[pkey.Key]RawItem{}),
|
||||
},
|
||||
{
|
||||
name: "both-empty",
|
||||
s1: NewSnapshot(map[Key]RawItem{}),
|
||||
s2: NewSnapshot(map[Key]RawItem{}),
|
||||
want: NewSnapshot(map[Key]RawItem{}),
|
||||
s1: NewSnapshot(map[pkey.Key]RawItem{}),
|
||||
s2: NewSnapshot(map[pkey.Key]RawItem{}),
|
||||
want: NewSnapshot(map[pkey.Key]RawItem{}),
|
||||
},
|
||||
{
|
||||
name: "first-nil",
|
||||
s1: nil,
|
||||
s2: NewSnapshot(map[Key]RawItem{
|
||||
s2: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(true),
|
||||
}),
|
||||
want: NewSnapshot(map[Key]RawItem{
|
||||
want: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(true),
|
||||
@@ -47,13 +48,13 @@ func TestMergeSnapshots(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "first-empty",
|
||||
s1: NewSnapshot(map[Key]RawItem{}),
|
||||
s2: NewSnapshot(map[Key]RawItem{
|
||||
s1: NewSnapshot(map[pkey.Key]RawItem{}),
|
||||
s2: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(false),
|
||||
}),
|
||||
want: NewSnapshot(map[Key]RawItem{
|
||||
want: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(false),
|
||||
@@ -61,13 +62,13 @@ func TestMergeSnapshots(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "second-nil",
|
||||
s1: NewSnapshot(map[Key]RawItem{
|
||||
s1: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(true),
|
||||
}),
|
||||
s2: nil,
|
||||
want: NewSnapshot(map[Key]RawItem{
|
||||
want: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(true),
|
||||
@@ -75,13 +76,13 @@ func TestMergeSnapshots(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "second-empty",
|
||||
s1: NewSnapshot(map[Key]RawItem{
|
||||
s1: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(false),
|
||||
}),
|
||||
s2: NewSnapshot(map[Key]RawItem{}),
|
||||
want: NewSnapshot(map[Key]RawItem{
|
||||
s2: NewSnapshot(map[pkey.Key]RawItem{}),
|
||||
want: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(false),
|
||||
@@ -89,17 +90,17 @@ func TestMergeSnapshots(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "no-conflicts",
|
||||
s1: NewSnapshot(map[Key]RawItem{
|
||||
s1: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(false),
|
||||
}),
|
||||
s2: NewSnapshot(map[Key]RawItem{
|
||||
s2: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting4": RawItemOf(2 * time.Hour),
|
||||
"Setting5": RawItemOf(VisibleByPolicy),
|
||||
"Setting6": RawItemOf(ShowChoiceByPolicy),
|
||||
}),
|
||||
want: NewSnapshot(map[Key]RawItem{
|
||||
want: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(false),
|
||||
@@ -110,17 +111,17 @@ func TestMergeSnapshots(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "with-conflicts",
|
||||
s1: NewSnapshot(map[Key]RawItem{
|
||||
s1: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(true),
|
||||
}),
|
||||
s2: NewSnapshot(map[Key]RawItem{
|
||||
s2: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(456),
|
||||
"Setting3": RawItemOf(false),
|
||||
"Setting4": RawItemOf(2 * time.Hour),
|
||||
}),
|
||||
want: NewSnapshot(map[Key]RawItem{
|
||||
want: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(456),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(false),
|
||||
@@ -129,17 +130,17 @@ func TestMergeSnapshots(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "with-scope-first-wins",
|
||||
s1: NewSnapshot(map[Key]RawItem{
|
||||
s1: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(true),
|
||||
}, DeviceScope),
|
||||
s2: NewSnapshot(map[Key]RawItem{
|
||||
s2: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(456),
|
||||
"Setting3": RawItemOf(false),
|
||||
"Setting4": RawItemOf(2 * time.Hour),
|
||||
}, CurrentUserScope),
|
||||
want: NewSnapshot(map[Key]RawItem{
|
||||
want: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(true),
|
||||
@@ -148,17 +149,17 @@ func TestMergeSnapshots(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "with-scope-second-wins",
|
||||
s1: NewSnapshot(map[Key]RawItem{
|
||||
s1: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(true),
|
||||
}, CurrentUserScope),
|
||||
s2: NewSnapshot(map[Key]RawItem{
|
||||
s2: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(456),
|
||||
"Setting3": RawItemOf(false),
|
||||
"Setting4": RawItemOf(2 * time.Hour),
|
||||
}, DeviceScope),
|
||||
want: NewSnapshot(map[Key]RawItem{
|
||||
want: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(456),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(false),
|
||||
@@ -167,18 +168,18 @@ func TestMergeSnapshots(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "with-scope-both-empty",
|
||||
s1: NewSnapshot(map[Key]RawItem{}, CurrentUserScope),
|
||||
s2: NewSnapshot(map[Key]RawItem{}, DeviceScope),
|
||||
want: NewSnapshot(map[Key]RawItem{}, CurrentUserScope),
|
||||
s1: NewSnapshot(map[pkey.Key]RawItem{}, CurrentUserScope),
|
||||
s2: NewSnapshot(map[pkey.Key]RawItem{}, DeviceScope),
|
||||
want: NewSnapshot(map[pkey.Key]RawItem{}, CurrentUserScope),
|
||||
},
|
||||
{
|
||||
name: "with-scope-first-empty",
|
||||
s1: NewSnapshot(map[Key]RawItem{}, CurrentUserScope),
|
||||
s2: NewSnapshot(map[Key]RawItem{
|
||||
s1: NewSnapshot(map[pkey.Key]RawItem{}, CurrentUserScope),
|
||||
s2: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(true)}, DeviceScope, NewNamedOrigin("TestPolicy", DeviceScope)),
|
||||
want: NewSnapshot(map[Key]RawItem{
|
||||
want: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(true),
|
||||
@@ -186,13 +187,13 @@ func TestMergeSnapshots(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "with-scope-second-empty",
|
||||
s1: NewSnapshot(map[Key]RawItem{
|
||||
s1: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(true),
|
||||
}, CurrentUserScope),
|
||||
s2: NewSnapshot(map[Key]RawItem{}),
|
||||
want: NewSnapshot(map[Key]RawItem{
|
||||
s2: NewSnapshot(map[pkey.Key]RawItem{}),
|
||||
want: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(true),
|
||||
@@ -226,28 +227,28 @@ func TestSnapshotEqual(t *testing.T) {
|
||||
{
|
||||
name: "nil-empty",
|
||||
s1: nil,
|
||||
s2: NewSnapshot(map[Key]RawItem{}),
|
||||
s2: NewSnapshot(map[pkey.Key]RawItem{}),
|
||||
wantEqual: true,
|
||||
wantEqualItems: true,
|
||||
},
|
||||
{
|
||||
name: "empty-nil",
|
||||
s1: NewSnapshot(map[Key]RawItem{}),
|
||||
s1: NewSnapshot(map[pkey.Key]RawItem{}),
|
||||
s2: nil,
|
||||
wantEqual: true,
|
||||
wantEqualItems: true,
|
||||
},
|
||||
{
|
||||
name: "empty-empty",
|
||||
s1: NewSnapshot(map[Key]RawItem{}),
|
||||
s2: NewSnapshot(map[Key]RawItem{}),
|
||||
s1: NewSnapshot(map[pkey.Key]RawItem{}),
|
||||
s2: NewSnapshot(map[pkey.Key]RawItem{}),
|
||||
wantEqual: true,
|
||||
wantEqualItems: true,
|
||||
},
|
||||
{
|
||||
name: "first-nil",
|
||||
s1: nil,
|
||||
s2: NewSnapshot(map[Key]RawItem{
|
||||
s2: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(false),
|
||||
@@ -257,8 +258,8 @@ func TestSnapshotEqual(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "first-empty",
|
||||
s1: NewSnapshot(map[Key]RawItem{}),
|
||||
s2: NewSnapshot(map[Key]RawItem{
|
||||
s1: NewSnapshot(map[pkey.Key]RawItem{}),
|
||||
s2: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(false),
|
||||
@@ -268,7 +269,7 @@ func TestSnapshotEqual(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "second-nil",
|
||||
s1: NewSnapshot(map[Key]RawItem{
|
||||
s1: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(true),
|
||||
@@ -279,23 +280,23 @@ func TestSnapshotEqual(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "second-empty",
|
||||
s1: NewSnapshot(map[Key]RawItem{
|
||||
s1: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(false),
|
||||
}),
|
||||
s2: NewSnapshot(map[Key]RawItem{}),
|
||||
s2: NewSnapshot(map[pkey.Key]RawItem{}),
|
||||
wantEqual: false,
|
||||
wantEqualItems: false,
|
||||
},
|
||||
{
|
||||
name: "same-items-same-order-no-scope",
|
||||
s1: NewSnapshot(map[Key]RawItem{
|
||||
s1: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(false),
|
||||
}),
|
||||
s2: NewSnapshot(map[Key]RawItem{
|
||||
s2: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(false),
|
||||
@@ -305,12 +306,12 @@ func TestSnapshotEqual(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "same-items-same-order-same-scope",
|
||||
s1: NewSnapshot(map[Key]RawItem{
|
||||
s1: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(false),
|
||||
}, DeviceScope),
|
||||
s2: NewSnapshot(map[Key]RawItem{
|
||||
s2: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(false),
|
||||
@@ -320,12 +321,12 @@ func TestSnapshotEqual(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "same-items-different-order-same-scope",
|
||||
s1: NewSnapshot(map[Key]RawItem{
|
||||
s1: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(false),
|
||||
}, DeviceScope),
|
||||
s2: NewSnapshot(map[Key]RawItem{
|
||||
s2: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting3": RawItemOf(false),
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
@@ -335,12 +336,12 @@ func TestSnapshotEqual(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "same-items-same-order-different-scope",
|
||||
s1: NewSnapshot(map[Key]RawItem{
|
||||
s1: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(false),
|
||||
}, DeviceScope),
|
||||
s2: NewSnapshot(map[Key]RawItem{
|
||||
s2: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(false),
|
||||
@@ -350,12 +351,12 @@ func TestSnapshotEqual(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "different-items-same-scope",
|
||||
s1: NewSnapshot(map[Key]RawItem{
|
||||
s1: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(123),
|
||||
"Setting2": RawItemOf("String"),
|
||||
"Setting3": RawItemOf(false),
|
||||
}, DeviceScope),
|
||||
s2: NewSnapshot(map[Key]RawItem{
|
||||
s2: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting4": RawItemOf(2 * time.Hour),
|
||||
"Setting5": RawItemOf(VisibleByPolicy),
|
||||
"Setting6": RawItemOf(ShowChoiceByPolicy),
|
||||
@@ -404,7 +405,7 @@ func TestSnapshotString(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "non-empty",
|
||||
snapshot: NewSnapshot(map[Key]RawItem{
|
||||
snapshot: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemOf(2 * time.Hour),
|
||||
"Setting2": RawItemOf(VisibleByPolicy),
|
||||
"Setting3": RawItemOf(ShowChoiceByPolicy),
|
||||
@@ -416,14 +417,14 @@ Setting3 = user-decides`,
|
||||
},
|
||||
{
|
||||
name: "non-empty-with-item-origin",
|
||||
snapshot: NewSnapshot(map[Key]RawItem{
|
||||
snapshot: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemWith(42, nil, NewNamedOrigin("Test Policy", DeviceScope)),
|
||||
}),
|
||||
wantString: `Setting1 = 42 - {Test Policy (Device)}`,
|
||||
},
|
||||
{
|
||||
name: "non-empty-with-item-error",
|
||||
snapshot: NewSnapshot(map[Key]RawItem{
|
||||
snapshot: NewSnapshot(map[pkey.Key]RawItem{
|
||||
"Setting1": RawItemWith(nil, NewErrorText("bang!"), nil),
|
||||
}),
|
||||
wantString: `Setting1 = Error{"bang!"}`,
|
||||
@@ -458,55 +459,55 @@ func TestMarshalUnmarshalSnapshot(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "Bool/True",
|
||||
snapshot: NewSnapshot(map[Key]RawItem{"BoolPolicy": RawItemOf(true)}),
|
||||
snapshot: NewSnapshot(map[pkey.Key]RawItem{"BoolPolicy": RawItemOf(true)}),
|
||||
wantJSON: `{"Settings": {"BoolPolicy": {"Value": true}}}`,
|
||||
},
|
||||
{
|
||||
name: "Bool/False",
|
||||
snapshot: NewSnapshot(map[Key]RawItem{"BoolPolicy": RawItemOf(false)}),
|
||||
snapshot: NewSnapshot(map[pkey.Key]RawItem{"BoolPolicy": RawItemOf(false)}),
|
||||
wantJSON: `{"Settings": {"BoolPolicy": {"Value": false}}}`,
|
||||
},
|
||||
{
|
||||
name: "String/Non-Empty",
|
||||
snapshot: NewSnapshot(map[Key]RawItem{"StringPolicy": RawItemOf("StringValue")}),
|
||||
snapshot: NewSnapshot(map[pkey.Key]RawItem{"StringPolicy": RawItemOf("StringValue")}),
|
||||
wantJSON: `{"Settings": {"StringPolicy": {"Value": "StringValue"}}}`,
|
||||
},
|
||||
{
|
||||
name: "String/Empty",
|
||||
snapshot: NewSnapshot(map[Key]RawItem{"StringPolicy": RawItemOf("")}),
|
||||
snapshot: NewSnapshot(map[pkey.Key]RawItem{"StringPolicy": RawItemOf("")}),
|
||||
wantJSON: `{"Settings": {"StringPolicy": {"Value": ""}}}`,
|
||||
},
|
||||
{
|
||||
name: "Integer/NonZero",
|
||||
snapshot: NewSnapshot(map[Key]RawItem{"IntPolicy": RawItemOf(uint64(42))}),
|
||||
snapshot: NewSnapshot(map[pkey.Key]RawItem{"IntPolicy": RawItemOf(uint64(42))}),
|
||||
wantJSON: `{"Settings": {"IntPolicy": {"Value": 42}}}`,
|
||||
},
|
||||
{
|
||||
name: "Integer/Zero",
|
||||
snapshot: NewSnapshot(map[Key]RawItem{"IntPolicy": RawItemOf(uint64(0))}),
|
||||
snapshot: NewSnapshot(map[pkey.Key]RawItem{"IntPolicy": RawItemOf(uint64(0))}),
|
||||
wantJSON: `{"Settings": {"IntPolicy": {"Value": 0}}}`,
|
||||
},
|
||||
{
|
||||
name: "String-List",
|
||||
snapshot: NewSnapshot(map[Key]RawItem{"ListPolicy": RawItemOf([]string{"Value1", "Value2"})}),
|
||||
snapshot: NewSnapshot(map[pkey.Key]RawItem{"ListPolicy": RawItemOf([]string{"Value1", "Value2"})}),
|
||||
wantJSON: `{"Settings": {"ListPolicy": {"Value": ["Value1", "Value2"]}}}`,
|
||||
},
|
||||
{
|
||||
name: "Duration/Zero",
|
||||
snapshot: NewSnapshot(map[Key]RawItem{"DurationPolicy": RawItemOf(time.Duration(0))}),
|
||||
snapshot: NewSnapshot(map[pkey.Key]RawItem{"DurationPolicy": RawItemOf(time.Duration(0))}),
|
||||
wantJSON: `{"Settings": {"DurationPolicy": {"Value": "0s"}}}`,
|
||||
wantBack: NewSnapshot(map[Key]RawItem{"DurationPolicy": RawItemOf("0s")}),
|
||||
wantBack: NewSnapshot(map[pkey.Key]RawItem{"DurationPolicy": RawItemOf("0s")}),
|
||||
},
|
||||
{
|
||||
name: "Duration/NonZero",
|
||||
snapshot: NewSnapshot(map[Key]RawItem{"DurationPolicy": RawItemOf(2 * time.Hour)}),
|
||||
snapshot: NewSnapshot(map[pkey.Key]RawItem{"DurationPolicy": RawItemOf(2 * time.Hour)}),
|
||||
wantJSON: `{"Settings": {"DurationPolicy": {"Value": "2h0m0s"}}}`,
|
||||
wantBack: NewSnapshot(map[Key]RawItem{"DurationPolicy": RawItemOf("2h0m0s")}),
|
||||
wantBack: NewSnapshot(map[pkey.Key]RawItem{"DurationPolicy": RawItemOf("2h0m0s")}),
|
||||
},
|
||||
{
|
||||
name: "Empty/With-Summary",
|
||||
snapshot: NewSnapshot(
|
||||
map[Key]RawItem{},
|
||||
map[pkey.Key]RawItem{},
|
||||
SummaryWith(CurrentUserScope, NewNamedOrigin("TestSource", DeviceScope)),
|
||||
),
|
||||
wantJSON: `{"Summary": {"Origin": {"Name": "TestSource", "Scope": "Device"}, "Scope": "User"}}`,
|
||||
@@ -514,7 +515,7 @@ func TestMarshalUnmarshalSnapshot(t *testing.T) {
|
||||
{
|
||||
name: "Setting/With-Summary",
|
||||
snapshot: NewSnapshot(
|
||||
map[Key]RawItem{"PolicySetting": RawItemOf(uint64(42))},
|
||||
map[pkey.Key]RawItem{"PolicySetting": RawItemOf(uint64(42))},
|
||||
SummaryWith(CurrentUserScope, NewNamedOrigin("TestSource", DeviceScope)),
|
||||
),
|
||||
wantJSON: `{
|
||||
@@ -525,7 +526,7 @@ func TestMarshalUnmarshalSnapshot(t *testing.T) {
|
||||
{
|
||||
name: "Settings/With-Origins",
|
||||
snapshot: NewSnapshot(
|
||||
map[Key]RawItem{
|
||||
map[pkey.Key]RawItem{
|
||||
"SettingA": RawItemWith(uint64(42), nil, NewNamedOrigin("SourceA", DeviceScope)),
|
||||
"SettingB": RawItemWith("B", nil, NewNamedOrigin("SourceB", CurrentProfileScope)),
|
||||
"SettingC": RawItemWith(true, nil, NewNamedOrigin("SourceC", CurrentUserScope)),
|
||||
|
||||
Reference in New Issue
Block a user