PageRenderTime 47ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 1ms

/third_party/gofrontend/libgo/go/internal/syscall/windows/registry/registry_test.go

http://github.com/axw/llgo
Go | 678 lines | 608 code | 56 blank | 14 comment | 208 complexity | 0712966c612cf4103c6342fc6ea31f7e MD5 | raw file
Possible License(s): BSD-3-Clause, MIT
  1. // Copyright 2015 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. // +build windows
  5. package registry_test
  6. import (
  7. "bytes"
  8. "crypto/rand"
  9. "os"
  10. "syscall"
  11. "testing"
  12. "internal/syscall/windows/registry"
  13. )
  14. func randKeyName(prefix string) string {
  15. const numbers = "0123456789"
  16. buf := make([]byte, 10)
  17. rand.Read(buf)
  18. for i, b := range buf {
  19. buf[i] = numbers[b%byte(len(numbers))]
  20. }
  21. return prefix + string(buf)
  22. }
  23. func TestReadSubKeyNames(t *testing.T) {
  24. k, err := registry.OpenKey(registry.CLASSES_ROOT, "TypeLib", registry.ENUMERATE_SUB_KEYS|registry.QUERY_VALUE)
  25. if err != nil {
  26. t.Fatal(err)
  27. }
  28. defer k.Close()
  29. names, err := k.ReadSubKeyNames(-1)
  30. if err != nil {
  31. t.Fatal(err)
  32. }
  33. var foundStdOle bool
  34. for _, name := range names {
  35. // Every PC has "stdole 2.0 OLE Automation" library installed.
  36. if name == "{00020430-0000-0000-C000-000000000046}" {
  37. foundStdOle = true
  38. }
  39. }
  40. if !foundStdOle {
  41. t.Fatal("could not find stdole 2.0 OLE Automation")
  42. }
  43. }
  44. func TestCreateOpenDeleteKey(t *testing.T) {
  45. k, err := registry.OpenKey(registry.CURRENT_USER, "Software", registry.QUERY_VALUE)
  46. if err != nil {
  47. t.Fatal(err)
  48. }
  49. defer k.Close()
  50. testKName := randKeyName("TestCreateOpenDeleteKey_")
  51. testK, exist, err := registry.CreateKey(k, testKName, registry.CREATE_SUB_KEY)
  52. if err != nil {
  53. t.Fatal(err)
  54. }
  55. defer testK.Close()
  56. if exist {
  57. t.Fatalf("key %q already exists", testKName)
  58. }
  59. testKAgain, exist, err := registry.CreateKey(k, testKName, registry.CREATE_SUB_KEY)
  60. if err != nil {
  61. t.Fatal(err)
  62. }
  63. defer testKAgain.Close()
  64. if !exist {
  65. t.Fatalf("key %q should already exist", testKName)
  66. }
  67. testKOpened, err := registry.OpenKey(k, testKName, registry.ENUMERATE_SUB_KEYS)
  68. if err != nil {
  69. t.Fatal(err)
  70. }
  71. defer testKOpened.Close()
  72. err = registry.DeleteKey(k, testKName)
  73. if err != nil {
  74. t.Fatal(err)
  75. }
  76. testKOpenedAgain, err := registry.OpenKey(k, testKName, registry.ENUMERATE_SUB_KEYS)
  77. if err == nil {
  78. defer testKOpenedAgain.Close()
  79. t.Fatalf("key %q should already been deleted", testKName)
  80. }
  81. if err != registry.ErrNotExist {
  82. t.Fatalf(`unexpected error ("not exist" expected): %v`, err)
  83. }
  84. }
  85. func equalStringSlice(a, b []string) bool {
  86. if len(a) != len(b) {
  87. return false
  88. }
  89. if a == nil {
  90. return true
  91. }
  92. for i := range a {
  93. if a[i] != b[i] {
  94. return false
  95. }
  96. }
  97. return true
  98. }
  99. type ValueTest struct {
  100. Type uint32
  101. Name string
  102. Value interface{}
  103. WillFail bool
  104. }
  105. var ValueTests = []ValueTest{
  106. {Type: registry.SZ, Name: "String1", Value: ""},
  107. {Type: registry.SZ, Name: "String2", Value: "\000", WillFail: true},
  108. {Type: registry.SZ, Name: "String3", Value: "Hello World"},
  109. {Type: registry.SZ, Name: "String4", Value: "Hello World\000", WillFail: true},
  110. {Type: registry.EXPAND_SZ, Name: "ExpString1", Value: ""},
  111. {Type: registry.EXPAND_SZ, Name: "ExpString2", Value: "\000", WillFail: true},
  112. {Type: registry.EXPAND_SZ, Name: "ExpString3", Value: "Hello World"},
  113. {Type: registry.EXPAND_SZ, Name: "ExpString4", Value: "Hello\000World", WillFail: true},
  114. {Type: registry.EXPAND_SZ, Name: "ExpString5", Value: "%PATH%"},
  115. {Type: registry.EXPAND_SZ, Name: "ExpString6", Value: "%NO_SUCH_VARIABLE%"},
  116. {Type: registry.EXPAND_SZ, Name: "ExpString7", Value: "%PATH%;."},
  117. {Type: registry.BINARY, Name: "Binary1", Value: []byte{}},
  118. {Type: registry.BINARY, Name: "Binary2", Value: []byte{1, 2, 3}},
  119. {Type: registry.BINARY, Name: "Binary3", Value: []byte{3, 2, 1, 0, 1, 2, 3}},
  120. {Type: registry.DWORD, Name: "Dword1", Value: uint64(0)},
  121. {Type: registry.DWORD, Name: "Dword2", Value: uint64(1)},
  122. {Type: registry.DWORD, Name: "Dword3", Value: uint64(0xff)},
  123. {Type: registry.DWORD, Name: "Dword4", Value: uint64(0xffff)},
  124. {Type: registry.QWORD, Name: "Qword1", Value: uint64(0)},
  125. {Type: registry.QWORD, Name: "Qword2", Value: uint64(1)},
  126. {Type: registry.QWORD, Name: "Qword3", Value: uint64(0xff)},
  127. {Type: registry.QWORD, Name: "Qword4", Value: uint64(0xffff)},
  128. {Type: registry.QWORD, Name: "Qword5", Value: uint64(0xffffff)},
  129. {Type: registry.QWORD, Name: "Qword6", Value: uint64(0xffffffff)},
  130. {Type: registry.MULTI_SZ, Name: "MultiString1", Value: []string{"a", "b", "c"}},
  131. {Type: registry.MULTI_SZ, Name: "MultiString2", Value: []string{"abc", "", "cba"}},
  132. {Type: registry.MULTI_SZ, Name: "MultiString3", Value: []string{""}},
  133. {Type: registry.MULTI_SZ, Name: "MultiString4", Value: []string{"abcdef"}},
  134. {Type: registry.MULTI_SZ, Name: "MultiString5", Value: []string{"\000"}, WillFail: true},
  135. {Type: registry.MULTI_SZ, Name: "MultiString6", Value: []string{"a\000b"}, WillFail: true},
  136. {Type: registry.MULTI_SZ, Name: "MultiString7", Value: []string{"ab", "\000", "cd"}, WillFail: true},
  137. {Type: registry.MULTI_SZ, Name: "MultiString8", Value: []string{"\000", "cd"}, WillFail: true},
  138. {Type: registry.MULTI_SZ, Name: "MultiString9", Value: []string{"ab", "\000"}, WillFail: true},
  139. }
  140. func setValues(t *testing.T, k registry.Key) {
  141. for _, test := range ValueTests {
  142. var err error
  143. switch test.Type {
  144. case registry.SZ:
  145. err = k.SetStringValue(test.Name, test.Value.(string))
  146. case registry.EXPAND_SZ:
  147. err = k.SetExpandStringValue(test.Name, test.Value.(string))
  148. case registry.MULTI_SZ:
  149. err = k.SetStringsValue(test.Name, test.Value.([]string))
  150. case registry.BINARY:
  151. err = k.SetBinaryValue(test.Name, test.Value.([]byte))
  152. case registry.DWORD:
  153. err = k.SetDWordValue(test.Name, uint32(test.Value.(uint64)))
  154. case registry.QWORD:
  155. err = k.SetQWordValue(test.Name, test.Value.(uint64))
  156. default:
  157. t.Fatalf("unsupported type %d for %s value", test.Type, test.Name)
  158. }
  159. if test.WillFail {
  160. if err == nil {
  161. t.Fatalf("setting %s value %q should fail, but succeeded", test.Name, test.Value)
  162. }
  163. } else {
  164. if err != nil {
  165. t.Fatal(err)
  166. }
  167. }
  168. }
  169. }
  170. func enumerateValues(t *testing.T, k registry.Key) {
  171. names, err := k.ReadValueNames(-1)
  172. if err != nil {
  173. t.Error(err)
  174. return
  175. }
  176. haveNames := make(map[string]bool)
  177. for _, n := range names {
  178. haveNames[n] = false
  179. }
  180. for _, test := range ValueTests {
  181. wantFound := !test.WillFail
  182. _, haveFound := haveNames[test.Name]
  183. if wantFound && !haveFound {
  184. t.Errorf("value %s is not found while enumerating", test.Name)
  185. }
  186. if haveFound && !wantFound {
  187. t.Errorf("value %s is found while enumerating, but expected to fail", test.Name)
  188. }
  189. if haveFound {
  190. delete(haveNames, test.Name)
  191. }
  192. }
  193. for n, v := range haveNames {
  194. t.Errorf("value %s (%v) is found while enumerating, but has not been cretaed", n, v)
  195. }
  196. }
  197. func testErrNotExist(t *testing.T, name string, err error) {
  198. if err == nil {
  199. t.Errorf("%s value should not exist", name)
  200. return
  201. }
  202. if err != registry.ErrNotExist {
  203. t.Errorf("reading %s value should return 'not exist' error, but got: %s", name, err)
  204. return
  205. }
  206. }
  207. func testErrUnexpectedType(t *testing.T, test ValueTest, gottype uint32, err error) {
  208. if err == nil {
  209. t.Errorf("GetXValue(%q) should not succeed", test.Name)
  210. return
  211. }
  212. if err != registry.ErrUnexpectedType {
  213. t.Errorf("reading %s value should return 'unexpected key value type' error, but got: %s", test.Name, err)
  214. return
  215. }
  216. if gottype != test.Type {
  217. t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype)
  218. return
  219. }
  220. }
  221. func testGetStringValue(t *testing.T, k registry.Key, test ValueTest) {
  222. got, gottype, err := k.GetStringValue(test.Name)
  223. if err != nil {
  224. t.Errorf("GetStringValue(%s) failed: %v", test.Name, err)
  225. return
  226. }
  227. if got != test.Value {
  228. t.Errorf("want %s value %q, got %q", test.Name, test.Value, got)
  229. return
  230. }
  231. if gottype != test.Type {
  232. t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype)
  233. return
  234. }
  235. if gottype == registry.EXPAND_SZ {
  236. _, err = registry.ExpandString(got)
  237. if err != nil {
  238. t.Errorf("ExpandString(%s) failed: %v", got, err)
  239. return
  240. }
  241. }
  242. }
  243. func testGetIntegerValue(t *testing.T, k registry.Key, test ValueTest) {
  244. got, gottype, err := k.GetIntegerValue(test.Name)
  245. if err != nil {
  246. t.Errorf("GetIntegerValue(%s) failed: %v", test.Name, err)
  247. return
  248. }
  249. if got != test.Value.(uint64) {
  250. t.Errorf("want %s value %v, got %v", test.Name, test.Value, got)
  251. return
  252. }
  253. if gottype != test.Type {
  254. t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype)
  255. return
  256. }
  257. }
  258. func testGetBinaryValue(t *testing.T, k registry.Key, test ValueTest) {
  259. got, gottype, err := k.GetBinaryValue(test.Name)
  260. if err != nil {
  261. t.Errorf("GetBinaryValue(%s) failed: %v", test.Name, err)
  262. return
  263. }
  264. if !bytes.Equal(got, test.Value.([]byte)) {
  265. t.Errorf("want %s value %v, got %v", test.Name, test.Value, got)
  266. return
  267. }
  268. if gottype != test.Type {
  269. t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype)
  270. return
  271. }
  272. }
  273. func testGetStringsValue(t *testing.T, k registry.Key, test ValueTest) {
  274. got, gottype, err := k.GetStringsValue(test.Name)
  275. if err != nil {
  276. t.Errorf("GetStringsValue(%s) failed: %v", test.Name, err)
  277. return
  278. }
  279. if !equalStringSlice(got, test.Value.([]string)) {
  280. t.Errorf("want %s value %#v, got %#v", test.Name, test.Value, got)
  281. return
  282. }
  283. if gottype != test.Type {
  284. t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype)
  285. return
  286. }
  287. }
  288. func testGetValue(t *testing.T, k registry.Key, test ValueTest, size int) {
  289. if size <= 0 {
  290. return
  291. }
  292. // read data with no buffer
  293. gotsize, gottype, err := k.GetValue(test.Name, nil)
  294. if err != nil {
  295. t.Errorf("GetValue(%s, [%d]byte) failed: %v", test.Name, size, err)
  296. return
  297. }
  298. if gotsize != size {
  299. t.Errorf("want %s value size of %d, got %v", test.Name, size, gotsize)
  300. return
  301. }
  302. if gottype != test.Type {
  303. t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype)
  304. return
  305. }
  306. // read data with short buffer
  307. gotsize, gottype, err = k.GetValue(test.Name, make([]byte, size-1))
  308. if err == nil {
  309. t.Errorf("GetValue(%s, [%d]byte) should fail, but suceeded", test.Name, size-1)
  310. return
  311. }
  312. if err != registry.ErrShortBuffer {
  313. t.Errorf("reading %s value should return 'short buffer' error, but got: %s", test.Name, err)
  314. return
  315. }
  316. if gotsize != size {
  317. t.Errorf("want %s value size of %d, got %v", test.Name, size, gotsize)
  318. return
  319. }
  320. if gottype != test.Type {
  321. t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype)
  322. return
  323. }
  324. // read full data
  325. gotsize, gottype, err = k.GetValue(test.Name, make([]byte, size))
  326. if err != nil {
  327. t.Errorf("GetValue(%s, [%d]byte) failed: %v", test.Name, size, err)
  328. return
  329. }
  330. if gotsize != size {
  331. t.Errorf("want %s value size of %d, got %v", test.Name, size, gotsize)
  332. return
  333. }
  334. if gottype != test.Type {
  335. t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype)
  336. return
  337. }
  338. // check GetValue returns ErrNotExist as required
  339. _, _, err = k.GetValue(test.Name+"_not_there", make([]byte, size))
  340. if err == nil {
  341. t.Errorf("GetValue(%q) should not succeed", test.Name)
  342. return
  343. }
  344. if err != registry.ErrNotExist {
  345. t.Errorf("GetValue(%q) should return 'not exist' error, but got: %s", test.Name, err)
  346. return
  347. }
  348. }
  349. func testValues(t *testing.T, k registry.Key) {
  350. for _, test := range ValueTests {
  351. switch test.Type {
  352. case registry.SZ, registry.EXPAND_SZ:
  353. if test.WillFail {
  354. _, _, err := k.GetStringValue(test.Name)
  355. testErrNotExist(t, test.Name, err)
  356. } else {
  357. testGetStringValue(t, k, test)
  358. _, gottype, err := k.GetIntegerValue(test.Name)
  359. testErrUnexpectedType(t, test, gottype, err)
  360. // Size of utf16 string in bytes is not perfect,
  361. // but correct for current test values.
  362. // Size also includes terminating 0.
  363. testGetValue(t, k, test, (len(test.Value.(string))+1)*2)
  364. }
  365. _, _, err := k.GetStringValue(test.Name + "_string_not_created")
  366. testErrNotExist(t, test.Name+"_string_not_created", err)
  367. case registry.DWORD, registry.QWORD:
  368. testGetIntegerValue(t, k, test)
  369. _, gottype, err := k.GetBinaryValue(test.Name)
  370. testErrUnexpectedType(t, test, gottype, err)
  371. _, _, err = k.GetIntegerValue(test.Name + "_int_not_created")
  372. testErrNotExist(t, test.Name+"_int_not_created", err)
  373. size := 8
  374. if test.Type == registry.DWORD {
  375. size = 4
  376. }
  377. testGetValue(t, k, test, size)
  378. case registry.BINARY:
  379. testGetBinaryValue(t, k, test)
  380. _, gottype, err := k.GetStringsValue(test.Name)
  381. testErrUnexpectedType(t, test, gottype, err)
  382. _, _, err = k.GetBinaryValue(test.Name + "_byte_not_created")
  383. testErrNotExist(t, test.Name+"_byte_not_created", err)
  384. testGetValue(t, k, test, len(test.Value.([]byte)))
  385. case registry.MULTI_SZ:
  386. if test.WillFail {
  387. _, _, err := k.GetStringsValue(test.Name)
  388. testErrNotExist(t, test.Name, err)
  389. } else {
  390. testGetStringsValue(t, k, test)
  391. _, gottype, err := k.GetStringValue(test.Name)
  392. testErrUnexpectedType(t, test, gottype, err)
  393. size := 0
  394. for _, s := range test.Value.([]string) {
  395. size += len(s) + 1 // nil terminated
  396. }
  397. size += 1 // extra nil at the end
  398. size *= 2 // count bytes, not uint16
  399. testGetValue(t, k, test, size)
  400. }
  401. _, _, err := k.GetStringsValue(test.Name + "_strings_not_created")
  402. testErrNotExist(t, test.Name+"_strings_not_created", err)
  403. default:
  404. t.Errorf("unsupported type %d for %s value", test.Type, test.Name)
  405. continue
  406. }
  407. }
  408. }
  409. func testStat(t *testing.T, k registry.Key) {
  410. subk, _, err := registry.CreateKey(k, "subkey", registry.CREATE_SUB_KEY)
  411. if err != nil {
  412. t.Error(err)
  413. return
  414. }
  415. defer subk.Close()
  416. defer registry.DeleteKey(k, "subkey")
  417. ki, err := k.Stat()
  418. if err != nil {
  419. t.Error(err)
  420. return
  421. }
  422. if ki.SubKeyCount != 1 {
  423. t.Error("key must have 1 subkey")
  424. }
  425. if ki.MaxSubKeyLen != 6 {
  426. t.Error("key max subkey name length must be 6")
  427. }
  428. if ki.ValueCount != 24 {
  429. t.Errorf("key must have 24 values, but is %d", ki.ValueCount)
  430. }
  431. if ki.MaxValueNameLen != 12 {
  432. t.Errorf("key max value name length must be 10, but is %d", ki.MaxValueNameLen)
  433. }
  434. if ki.MaxValueLen != 38 {
  435. t.Errorf("key max value length must be 38, but is %d", ki.MaxValueLen)
  436. }
  437. }
  438. func deleteValues(t *testing.T, k registry.Key) {
  439. for _, test := range ValueTests {
  440. if test.WillFail {
  441. continue
  442. }
  443. err := k.DeleteValue(test.Name)
  444. if err != nil {
  445. t.Error(err)
  446. continue
  447. }
  448. }
  449. names, err := k.ReadValueNames(-1)
  450. if err != nil {
  451. t.Error(err)
  452. return
  453. }
  454. if len(names) != 0 {
  455. t.Errorf("some values remain after deletion: %v", names)
  456. }
  457. }
  458. func TestValues(t *testing.T) {
  459. softwareK, err := registry.OpenKey(registry.CURRENT_USER, "Software", registry.QUERY_VALUE)
  460. if err != nil {
  461. t.Fatal(err)
  462. }
  463. defer softwareK.Close()
  464. testKName := randKeyName("TestValues_")
  465. k, exist, err := registry.CreateKey(softwareK, testKName, registry.CREATE_SUB_KEY|registry.QUERY_VALUE|registry.SET_VALUE)
  466. if err != nil {
  467. t.Fatal(err)
  468. }
  469. defer k.Close()
  470. if exist {
  471. t.Fatalf("key %q already exists", testKName)
  472. }
  473. defer registry.DeleteKey(softwareK, testKName)
  474. setValues(t, k)
  475. enumerateValues(t, k)
  476. testValues(t, k)
  477. testStat(t, k)
  478. deleteValues(t, k)
  479. }
  480. func walkKey(t *testing.T, k registry.Key, kname string) {
  481. names, err := k.ReadValueNames(-1)
  482. if err != nil {
  483. t.Fatalf("reading value names of %s failed: %v", kname, err)
  484. }
  485. for _, name := range names {
  486. _, valtype, err := k.GetValue(name, nil)
  487. if err != nil {
  488. t.Fatalf("reading value type of %s of %s failed: %v", name, kname, err)
  489. }
  490. switch valtype {
  491. case registry.NONE:
  492. case registry.SZ:
  493. _, _, err := k.GetStringValue(name)
  494. if err != nil {
  495. t.Error(err)
  496. }
  497. case registry.EXPAND_SZ:
  498. s, _, err := k.GetStringValue(name)
  499. if err != nil {
  500. t.Error(err)
  501. }
  502. _, err = registry.ExpandString(s)
  503. if err != nil {
  504. t.Error(err)
  505. }
  506. case registry.DWORD, registry.QWORD:
  507. _, _, err := k.GetIntegerValue(name)
  508. if err != nil {
  509. t.Error(err)
  510. }
  511. case registry.BINARY:
  512. _, _, err := k.GetBinaryValue(name)
  513. if err != nil {
  514. t.Error(err)
  515. }
  516. case registry.MULTI_SZ:
  517. _, _, err := k.GetStringsValue(name)
  518. if err != nil {
  519. t.Error(err)
  520. }
  521. case registry.FULL_RESOURCE_DESCRIPTOR, registry.RESOURCE_LIST, registry.RESOURCE_REQUIREMENTS_LIST:
  522. // TODO: not implemented
  523. default:
  524. t.Fatalf("value type %d of %s of %s failed: %v", valtype, name, kname, err)
  525. }
  526. }
  527. names, err = k.ReadSubKeyNames(-1)
  528. if err != nil {
  529. t.Fatalf("reading sub-keys of %s failed: %v", kname, err)
  530. }
  531. for _, name := range names {
  532. func() {
  533. subk, err := registry.OpenKey(k, name, registry.ENUMERATE_SUB_KEYS|registry.QUERY_VALUE)
  534. if err != nil {
  535. if err == syscall.ERROR_ACCESS_DENIED {
  536. // ignore error, if we are not allowed to access this key
  537. return
  538. }
  539. t.Fatalf("opening sub-keys %s of %s failed: %v", name, kname, err)
  540. }
  541. defer subk.Close()
  542. walkKey(t, subk, kname+`\`+name)
  543. }()
  544. }
  545. }
  546. func TestWalkFullRegistry(t *testing.T) {
  547. if testing.Short() {
  548. t.Skip("skipping long running test in short mode")
  549. }
  550. walkKey(t, registry.CLASSES_ROOT, "CLASSES_ROOT")
  551. walkKey(t, registry.CURRENT_USER, "CURRENT_USER")
  552. walkKey(t, registry.LOCAL_MACHINE, "LOCAL_MACHINE")
  553. walkKey(t, registry.USERS, "USERS")
  554. walkKey(t, registry.CURRENT_CONFIG, "CURRENT_CONFIG")
  555. }
  556. func TestExpandString(t *testing.T) {
  557. got, err := registry.ExpandString("%PATH%")
  558. if err != nil {
  559. t.Fatal(err)
  560. }
  561. want := os.Getenv("PATH")
  562. if got != want {
  563. t.Errorf("want %q string expanded, got %q", want, got)
  564. }
  565. }
  566. func TestInvalidValues(t *testing.T) {
  567. softwareK, err := registry.OpenKey(registry.CURRENT_USER, "Software", registry.QUERY_VALUE)
  568. if err != nil {
  569. t.Fatal(err)
  570. }
  571. defer softwareK.Close()
  572. testKName := randKeyName("TestInvalidValues_")
  573. k, exist, err := registry.CreateKey(softwareK, testKName, registry.CREATE_SUB_KEY|registry.QUERY_VALUE|registry.SET_VALUE)
  574. if err != nil {
  575. t.Fatal(err)
  576. }
  577. defer k.Close()
  578. if exist {
  579. t.Fatalf("key %q already exists", testKName)
  580. }
  581. defer registry.DeleteKey(softwareK, testKName)
  582. var tests = []struct {
  583. Type uint32
  584. Name string
  585. Data []byte
  586. }{
  587. {registry.DWORD, "Dword1", nil},
  588. {registry.DWORD, "Dword2", []byte{1, 2, 3}},
  589. {registry.QWORD, "Qword1", nil},
  590. {registry.QWORD, "Qword2", []byte{1, 2, 3}},
  591. {registry.QWORD, "Qword3", []byte{1, 2, 3, 4, 5, 6, 7}},
  592. {registry.MULTI_SZ, "MultiString1", nil},
  593. {registry.MULTI_SZ, "MultiString2", []byte{0}},
  594. {registry.MULTI_SZ, "MultiString3", []byte{'a', 'b', 0}},
  595. {registry.MULTI_SZ, "MultiString4", []byte{'a', 0, 0, 'b', 0}},
  596. {registry.MULTI_SZ, "MultiString5", []byte{'a', 0, 0}},
  597. }
  598. for _, test := range tests {
  599. err := k.SetValue(test.Name, test.Type, test.Data)
  600. if err != nil {
  601. t.Fatalf("SetValue for %q failed: %v", test.Name, err)
  602. }
  603. }
  604. for _, test := range tests {
  605. switch test.Type {
  606. case registry.DWORD, registry.QWORD:
  607. value, valType, err := k.GetIntegerValue(test.Name)
  608. if err == nil {
  609. t.Errorf("GetIntegerValue(%q) succeeded. Returns type=%d value=%v", test.Name, valType, value)
  610. }
  611. case registry.MULTI_SZ:
  612. value, valType, err := k.GetStringsValue(test.Name)
  613. if err == nil {
  614. if len(value) != 0 {
  615. t.Errorf("GetStringsValue(%q) succeeded. Returns type=%d value=%v", test.Name, valType, value)
  616. }
  617. }
  618. default:
  619. t.Errorf("unsupported type %d for %s value", test.Type, test.Name)
  620. }
  621. }
  622. }