github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/pvl/registers_test.go (about)

     1  // Copyright 2016 Keybase, Inc. All rights reserved. Use of
     2  // this source code is governed by the included BSD license.
     3  
     4  package pvl
     5  
     6  import (
     7  	"fmt"
     8  	"testing"
     9  )
    10  
    11  func TestNamedRegsStore(t *testing.T) {
    12  	tests := []struct {
    13  		shouldwork               bool
    14  		op, arg1, arg2, expected string
    15  	}{
    16  		// banning a register works
    17  		{true, "Ban", "banned", "", ""},
    18  		{false, "Ban", "banned", "", ""},
    19  		{false, "Set", "banned", "foo", ""},
    20  		{false, "Get", "banned", "", ""},
    21  
    22  		// set and get works
    23  		// cannot ban a set register
    24  		{true, "Set", "x", "foo", ""},
    25  		{true, "Get", "x", "", "foo"},
    26  		{false, "Ban", "x", "", ""},
    27  		{true, "Get", "x", "", "foo"},
    28  
    29  		// cannot set twice
    30  		{true, "Set", "y", "bar", ""},
    31  		{true, "Get", "y", "", "bar"},
    32  		{false, "Set", "y", "baz", ""},
    33  		{true, "Get", "y", "", "bar"},
    34  
    35  		// cannot use invalid keys
    36  		{false, "Set", "Z", "", ""},
    37  		{false, "Get", "Z", "", ""},
    38  		{false, "Set", "specialchar@", "oosh", ""},
    39  		{false, "Set", "", "oosh", ""},
    40  		{false, "Ban", "#!", "", ""},
    41  
    42  		// can use valid keys
    43  		{true, "Set", "tmp1_2", "fuzzle", ""},
    44  		{true, "Get", "tmp1_2", "", "fuzzle"},
    45  
    46  		// empty string is an ok value
    47  		{true, "Set", "empty", "", ""},
    48  		{true, "Get", "empty", "", ""},
    49  	}
    50  
    51  	regs := *newNamedRegsStore()
    52  
    53  	for i, unit := range tests {
    54  		var err error
    55  		var res string
    56  		useRes := false
    57  
    58  		fail := func(f string, args ...interface{}) {
    59  			prefix := fmt.Sprintf("[%v] ", i)
    60  			t.Fatalf(prefix+f, args...)
    61  		}
    62  
    63  		switch unit.op {
    64  		case "Get":
    65  			res, err = regs.Get(unit.arg1)
    66  			useRes = true
    67  		case "Set":
    68  			err = regs.Set(unit.arg1, unit.arg2)
    69  		case "Ban":
    70  			err = regs.Ban(unit.arg1)
    71  		}
    72  
    73  		if err == nil {
    74  			if !unit.shouldwork {
    75  				fail("should have failed")
    76  			}
    77  			if useRes && (res != unit.expected) {
    78  				fail("got '%v'; expected '%v'", res, unit.expected)
    79  			}
    80  		} else if unit.shouldwork {
    81  			fail("should have worked; got %v", err)
    82  		}
    83  	}
    84  }
    85  
    86  func TestNamedRegsStoreCopy(t *testing.T) {
    87  	// Copying a store aliases its state.
    88  	// This should not be depended on but it's good to know.
    89  	regs1 := *newNamedRegsStore()
    90  	regs2 := regs1
    91  
    92  	err := regs1.Set("foo", "1")
    93  	if err != nil {
    94  		t.Fatal()
    95  	}
    96  
    97  	err = regs2.Set("foo", "1")
    98  	if err == nil {
    99  		t.Fatal()
   100  	}
   101  }