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  }