github.com/google/fleetspeak@v0.1.15-0.20240426164851-4f31f62c1aea/fleetspeak/src/windows/regutil/regutil_windows_test.go (about) 1 // Copyright 2018 Google Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // https://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 //go:build windows 16 17 package regutil 18 19 import ( 20 "bytes" 21 "reflect" 22 "strings" 23 "testing" 24 25 "golang.org/x/sys/windows/registry" 26 ) 27 28 func TestVerifyPath(t *testing.T) { 29 if err := VerifyPath(""); err == nil { 30 t.Fatal("Error expected, but err == nil, verification failed - path shouldn't be empty.") 31 } 32 33 if err := VerifyPath(`path\to\a\registry\key\without\hkey\prefix`); err == nil { 34 t.Fatalf("Error expected, but err == nil, verification failed - path should start with %s.", hkeyPrefix) 35 } 36 37 if err := VerifyPath(`HKEY_LOCAL_MACHINE\path\to\a\registry\key\with\hkey\prefix`); err != nil { 38 t.Fatalf("Verification of a valid path failed: %v", err) 39 } 40 } 41 42 const tempRegPrefix = `HKEY_LOCAL_MACHINE\SOFTWARE\FleetspeakTest` 43 44 func tearDown() { 45 // Delete test key and all its subkeys. 46 registry.DeleteKey(registry.LOCAL_MACHINE, `SOFTWARE\FleetspeakTest`) 47 } 48 49 func TestWriteBinaryValue(t *testing.T) { 50 defer tearDown() 51 52 valuename := "TestWriteBinaryValue" 53 value := []byte("TestReadBinaryValue value") 54 55 if err := WriteBinaryValue(tempRegPrefix, valuename, value); err != ErrKeyNotExist { 56 t.Fatalf("Expected ErrKeyNotExist, instead got: %v", err) 57 } 58 59 if err := CreateKeyIfNotExist(tempRegPrefix); err != nil { 60 t.Fatal(err) 61 } 62 63 if err := WriteBinaryValue(tempRegPrefix, valuename, value); err != nil { 64 t.Fatalf("WriteBinaryValue: %v", err) 65 } 66 } 67 68 func TestReadBinaryValue(t *testing.T) { 69 defer tearDown() 70 71 valuename := "TestReadBinaryValue" 72 value := []byte("TestReadBinaryValue value") 73 74 if _, err := ReadBinaryValue(tempRegPrefix, valuename); err != ErrKeyNotExist { 75 t.Errorf("Expected ErrKeyNotExist, instead got: %v", err) 76 } 77 78 if err := CreateKeyIfNotExist(tempRegPrefix); err != nil { 79 t.Fatal(err) 80 } 81 82 if _, err := ReadBinaryValue(tempRegPrefix, valuename); err != ErrValueNotExist { 83 t.Errorf("Expected ErrValueNotExist, instead got: %v", err) 84 } 85 86 if err := WriteBinaryValue(tempRegPrefix, valuename, value); err != nil { 87 t.Fatalf("WriteBinaryValue: %v", err) 88 } 89 90 b, err := ReadBinaryValue(tempRegPrefix, valuename) 91 if err != nil { 92 t.Fatalf("ReadBinaryValue: %v", err) 93 } 94 95 if g, w := b, value; !bytes.Equal(g, w) { 96 t.Fatalf("got %q, want %q", g, w) 97 } 98 } 99 100 func TestWriteStringValue(t *testing.T) { 101 defer tearDown() 102 103 valuename := "TestWriteStringValue" 104 value := "TestWriteStringValue value" 105 106 if err := WriteStringValue(tempRegPrefix, valuename, value); err != ErrKeyNotExist { 107 t.Fatalf("Expected ErrKeyNotExist, instead got: %v", err) 108 } 109 110 if err := CreateKeyIfNotExist(tempRegPrefix); err != nil { 111 t.Fatal(err) 112 } 113 114 if err := WriteStringValue(tempRegPrefix, valuename, value); err != nil { 115 t.Fatalf("WriteStringValue: %v", err) 116 } 117 } 118 119 func TestReadStringValue(t *testing.T) { 120 defer tearDown() 121 122 valuename := "TestReadStringValue" 123 value := "TestReadStringValue value" 124 125 if _, err := ReadStringValue(tempRegPrefix, valuename); err != ErrKeyNotExist { 126 t.Errorf("Expected ErrKeyNotExist, instead got: %v", err) 127 } 128 129 if err := CreateKeyIfNotExist(tempRegPrefix); err != nil { 130 t.Fatal(err) 131 } 132 133 if _, err := ReadStringValue(tempRegPrefix, valuename); err != ErrValueNotExist { 134 t.Errorf("Expected ErrValueNotExist, instead got: %v", err) 135 } 136 137 if err := WriteStringValue(tempRegPrefix, valuename, value); err != nil { 138 t.Fatalf("WriteStringValue: %v", err) 139 } 140 141 s, err := ReadStringValue(tempRegPrefix, valuename) 142 if err != nil { 143 t.Fatalf("ReadStringValue: %v", err) 144 } 145 146 if g, w := s, value; g != w { 147 t.Fatalf("got %q, want %q", g, w) 148 } 149 } 150 151 func TestReadMultiStringValue(t *testing.T) { 152 defer tearDown() 153 154 valueName := "TestReadMultiStringValue" 155 156 if _, err := ReadMultiStringValue(tempRegPrefix, valueName); err != ErrKeyNotExist { 157 t.Errorf("Expected ErrKeyNotExist, instead got: %v", err) 158 } 159 160 if err := CreateKeyIfNotExist(tempRegPrefix); err != nil { 161 t.Fatal(err) 162 } 163 164 if _, err := ReadMultiStringValue(tempRegPrefix, valueName); err != ErrValueNotExist { 165 t.Errorf("Expected ErrValueNotExist, instead got: %v", err) 166 } 167 168 k, err := registry.OpenKey( 169 registry.LOCAL_MACHINE, strings.TrimPrefix(tempRegPrefix, hkeyPrefix), 170 registry.SET_VALUE) 171 if err != nil { 172 t.Fatal(err) 173 } 174 defer k.Close() 175 176 want := []string{"foo", "bar", "baz"} 177 k.SetStringsValue(valueName, want) 178 179 got, err := ReadMultiStringValue(tempRegPrefix, valueName) 180 if err != nil { 181 t.Fatalf("ReadMultiStringValue: %v", err) 182 } 183 184 if !reflect.DeepEqual(got, want) { 185 t.Errorf("ReadMultiStringValue failed; got: %v, want: %v", got, want) 186 } 187 } 188 189 func TestLs(t *testing.T) { 190 defer tearDown() 191 192 if _, err := Ls(tempRegPrefix); err != ErrKeyNotExist { 193 t.Fatalf("Expected ErrKeyNotExist, instead got: %v", err) 194 } 195 196 if err := CreateKeyIfNotExist(tempRegPrefix); err != nil { 197 t.Fatal(err) 198 } 199 200 valueName := "TestLs" 201 202 if err := WriteStringValue(tempRegPrefix, valueName, "TestLs value"); err != nil { 203 t.Fatalf("WriteStringValue: %v", err) 204 } 205 206 vs, err := Ls(tempRegPrefix) 207 if err != nil { 208 t.Fatalf("Ls: %v", err) 209 } 210 211 if len(vs) != 1 { 212 t.Fatalf("wrong number of elements: got %q, want []string{%q}", vs, valueName) 213 } 214 215 if vs[0] != valueName { 216 t.Fatalf("got %q, want []string{%q}", vs, valueName) 217 } 218 }