// matchZoneKey checks if stdname and dstname match the corresponding key // values "MUI_Std" and MUI_Dlt" or "Std" and "Dlt" (the latter down-level // from Vista) in the kname key stored under the open registry key zones. func matchZoneKey(zones registry.Key, kname string, stdname, dstname string) (matched bool, err2 error) { k, err := registry.OpenKey(zones, kname, registry.READ) if err != nil { return false, err } defer k.Close() var std, dlt string if err = registry.LoadRegLoadMUIString(); err == nil { // Try MUI_Std and MUI_Dlt first, fallback to Std and Dlt if *any* error occurs std, err = k.GetMUIStringValue("MUI_Std") if err == nil { dlt, err = k.GetMUIStringValue("MUI_Dlt") } } if err != nil { // Fallback to Std and Dlt if std, _, err = k.GetStringValue("Std"); err != nil { return false, err } if dlt, _, err = k.GetStringValue("Dlt"); err != nil { return false, err } } if std != stdname { return false, nil } if dlt != dstname && dstname != stdname { return false, nil } return true, nil }
func TestToEnglishName(t *testing.T) { const want = "Central Europe Standard Time" k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\`+want, registry.READ) if err != nil { t.Fatalf("cannot open CEST time zone information from registry: %s", err) } defer k.Close() var std, dlt string if err = registry.LoadRegLoadMUIString(); err == nil { // Try MUI_Std and MUI_Dlt first, fallback to Std and Dlt if *any* error occurs std, err = k.GetMUIStringValue("MUI_Std") if err == nil { dlt, err = k.GetMUIStringValue("MUI_Dlt") } } if err != nil { // Fallback to Std and Dlt if std, _, err = k.GetStringValue("Std"); err != nil { t.Fatalf("cannot read CEST Std registry key: %s", err) } if dlt, _, err = k.GetStringValue("Dlt"); err != nil { t.Fatalf("cannot read CEST Dlt registry key: %s", err) } } name, err := ToEnglishName(std, dlt) if err != nil { t.Fatalf("toEnglishName failed: %s", err) } if name != want { t.Fatalf("english name: %q, want: %q", name, want) } }
func TestGetMUIStringValue(t *testing.T) { if err := registry.LoadRegLoadMUIString(); err != nil { t.Skip("regLoadMUIString not supported; skipping") } if err := procGetDynamicTimeZoneInformation.Find(); err != nil { t.Skipf("%s not supported; skipping", procGetDynamicTimeZoneInformation.Name) } var dtzi DynamicTimezoneinformation if _, err := GetDynamicTimeZoneInformation(&dtzi); err != nil { t.Fatal(err) } tzKeyName := syscall.UTF16ToString(dtzi.TimeZoneKeyName[:]) timezoneK, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\`+tzKeyName, registry.READ) if err != nil { t.Fatal(err) } defer timezoneK.Close() type testType struct { name string want string } var tests = []testType{ {"MUI_Std", syscall.UTF16ToString(dtzi.StandardName[:])}, } if dtzi.DynamicDaylightTimeDisabled == 0 { tests = append(tests, testType{"MUI_Dlt", syscall.UTF16ToString(dtzi.DaylightName[:])}) } for _, test := range tests { got, err := timezoneK.GetMUIStringValue(test.name) if err != nil { t.Error("GetMUIStringValue:", err) } if got != test.want { t.Errorf("GetMUIStringValue: %s: Got %q, want %q", test.name, got, test.want) } } }