blob: 4b29fad5967850b8c4c645f9ffa3bb3733f80ab9 [file] [log] [blame]
Rob Pike20acc5c2014-08-11 14:48:46 -07001// Copyright 2013 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
Brad Fitzpatrickfcb26fe2021-10-20 08:28:07 -07005//go:build windows
Rob Pike279b3782014-08-12 22:59:00 -07006
Rob Pike8442dd22014-08-11 15:58:26 -07007package windows_test
Rob Pike20acc5c2014-08-11 14:48:46 -07008
9import (
Jason A. Donenfeld10058d72019-03-06 18:49:41 +010010 "strings"
Hilko Bengen8dbc5d02017-10-13 15:31:29 +020011 "syscall"
Rob Pike20acc5c2014-08-11 14:48:46 -070012 "testing"
Rob Pike279b3782014-08-12 22:59:00 -070013
Andrew Gerranddea3d762014-11-10 08:56:17 +110014 "golang.org/x/sys/windows"
Rob Pike20acc5c2014-08-11 14:48:46 -070015)
16
17func testSetGetenv(t *testing.T, key, value string) {
Rob Pike8442dd22014-08-11 15:58:26 -070018 err := windows.Setenv(key, value)
Rob Pike20acc5c2014-08-11 14:48:46 -070019 if err != nil {
20 t.Fatalf("Setenv failed to set %q: %v", value, err)
21 }
Rob Pike8442dd22014-08-11 15:58:26 -070022 newvalue, found := windows.Getenv(key)
Rob Pike20acc5c2014-08-11 14:48:46 -070023 if !found {
24 t.Fatalf("Getenv failed to find %v variable (want value %q)", key, value)
25 }
26 if newvalue != value {
27 t.Fatalf("Getenv(%v) = %q; want %q", key, newvalue, value)
28 }
29}
30
31func TestEnv(t *testing.T) {
32 testSetGetenv(t, "TESTENV", "AVALUE")
33 // make sure TESTENV gets set to "", not deleted
34 testSetGetenv(t, "TESTENV", "")
35}
Hilko Bengen8dbc5d02017-10-13 15:31:29 +020036
37func TestGetProcAddressByOrdinal(t *testing.T) {
38 // Attempt calling shlwapi.dll:IsOS, resolving it by ordinal, as
39 // suggested in
40 // https://msdn.microsoft.com/en-us/library/windows/desktop/bb773795.aspx
41 h, err := windows.LoadLibrary("shlwapi.dll")
42 if err != nil {
43 t.Fatalf("Failed to load shlwapi.dll: %s", err)
44 }
45 procIsOS, err := windows.GetProcAddressByOrdinal(h, 437)
46 if err != nil {
47 t.Fatalf("Could not find shlwapi.dll:IsOS by ordinal: %s", err)
48 }
49 const OS_NT = 1
50 r, _, _ := syscall.Syscall(procIsOS, 1, OS_NT, 0, 0)
51 if r == 0 {
52 t.Error("shlwapi.dll:IsOS(OS_NT) returned 0, expected non-zero value")
53 }
54}
Jason A. Donenfeld10058d72019-03-06 18:49:41 +010055
56func TestGetSystemDirectory(t *testing.T) {
57 d, err := windows.GetSystemDirectory()
58 if err != nil {
59 t.Fatalf("Failed to get system directory: %s", err)
60 }
61 if !strings.HasSuffix(strings.ToLower(d), "\\system32") {
62 t.Fatalf("System directory does not end in system32: %s", d)
63 }
64}
Jason A. Donenfeldc7b8b682019-08-25 20:57:52 -060065
66func TestGetWindowsDirectory(t *testing.T) {
67 d1, err := windows.GetWindowsDirectory()
68 if err != nil {
69 t.Fatalf("Failed to get Windows directory: %s", err)
70 }
71 d2, err := windows.GetSystemWindowsDirectory()
72 if err != nil {
73 t.Fatalf("Failed to get system Windows directory: %s", err)
74 }
75 if !strings.HasSuffix(strings.ToLower(d1), `\windows`) {
76 t.Fatalf("Windows directory does not end in windows: %s", d1)
77 }
78 if !strings.HasSuffix(strings.ToLower(d2), `\windows`) {
79 t.Fatalf("System Windows directory does not end in windows: %s", d2)
80 }
81}
ly3035506886aff5f32020-05-06 13:54:32 +000082func TestFindProcByOrdinal(t *testing.T) {
83 // Attempt calling shlwapi.dll:IsOS, resolving it by ordinal, as
84 // suggested in
85 // https://msdn.microsoft.com/en-us/library/windows/desktop/bb773795.aspx
86 dll, err := windows.LoadDLL("shlwapi.dll")
87 if err != nil {
88 t.Fatalf("Failed to load shlwapi.dll: %s", err)
89 }
90 procIsOS, err := dll.FindProcByOrdinal(437)
91 if err != nil {
92 t.Fatalf("Could not find shlwapi.dll:IsOS by ordinal: %s", err)
93 }
94 if procIsOS.Name != "#437" {
95 t.Fatalf("Proc's name is incorrect: %s,expected #437", procIsOS.Name)
96 }
97 const OS_NT = 1
98 r, _, _ := syscall.Syscall(procIsOS.Addr(), 1, OS_NT, 0, 0)
99 if r == 0 {
100 t.Error("shlwapi.dll:IsOS(OS_NT) returned 0, expected non-zero value")
101 }
102}