1 /*
2  * PROJECT:         ReactOS api tests
3  * LICENSE:         LGPLv2.1+ - See COPYING.LIB in the top level directory
4  * PURPOSE:         Test for CRegKey
5  * PROGRAMMERS:     Mark Jansen
6  *                  Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
7  */
8 
9 #include <atlbase.h>
10 
11 #ifdef HAVE_APITEST
12     #include <apitest.h>
13 #else
14     #include "atltest.h"
15 #endif
16 
17 START_TEST(CRegKey)
18 {
19     CRegKey key;
20     CRegKey key2(HKEY_CURRENT_USER);
21 
22     ok(key.m_hKey == NULL, "Expected m_hKey to be initialized to 0, was: %p\n", key.m_hKey);
23     ok(key2.m_hKey == HKEY_CURRENT_USER, "Expected m_hKey to be initialized to HKEY_CURRENT_USER, was: %p\n", key2.m_hKey);
24     ok(key2 == HKEY_CURRENT_USER, "Expected operator HKEY() to be implemented\n");
25 
26     // Take ownership
27     CRegKey key3(key2);
28     ok(key3.m_hKey == HKEY_CURRENT_USER, "Expected m_hKey to be initialized to HKEY_CURRENT_USER, was: %p\n", key3.m_hKey);
29     ok(key2.m_hKey == NULL, "Expected m_hKey to be initialized to 0, was: %p\n", key2.m_hKey);
30 
31     LSTATUS lret;
32 
33     lret = key.Close();
34     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
35     lret = key2.Close();
36     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
37     lret = key3.Close();
38     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
39 
40     // read/write
41     lret = key.Open(HKEY_CURRENT_USER, _T("Environment"));
42     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
43     ok(key.m_hKey != NULL, "Expected m_hKey to not be NULL, was: %p\n", key.m_hKey);
44 
45 
46     HKEY tmp = key.m_hKey;
47     HKEY detached = key.Detach();
48     ok(key.m_hKey == NULL, "Expected m_hKey to be 0, was: %p\n", key.m_hKey);
49     ok(detached == tmp, "Expected detached to be %p, was: %p\n", tmp, detached);
50     key.Attach(detached);
51     ok(key.m_hKey == tmp, "Expected m_hKey to be %p, was: %p\n", tmp, key.m_hKey);
52 
53     lret = key2.Open(HKEY_CURRENT_USER, _T("Environment"), KEY_READ);
54     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
55 
56     lret = key3.Open(HKEY_CURRENT_USER, _T("Environment"), KEY_WRITE);
57     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
58 
59     TCHAR testdata[] = _T("XX-XX");
60     lret = key.SetValue(_T("APITEST_VALUE_NAME"), REG_SZ, testdata, sizeof(testdata));
61     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
62 
63     TCHAR buffer[100];
64     ULONG buffer_size = sizeof(buffer);
65     DWORD type = 0x12345;
66     memset(buffer, 0, sizeof(buffer));
67 
68     lret = key.QueryValue(_T("APITEST_VALUE_NAME"), &type, buffer, &buffer_size);
69     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
70     ok(type == REG_SZ, "Expected type to be REG_SZ, was: %lu\n", type);
71     ok(buffer_size == sizeof(testdata), "Expected buffer_size to be %u, was: %lu\n", sizeof(testdata), buffer_size);
72     ok(!memcmp(buffer, testdata, sizeof(testdata)), "Expected to get the same input as what was written!\n");
73 
74 
75     buffer_size = sizeof(buffer);
76     type = 0x12345;
77     memset(buffer, 0, sizeof(buffer));
78     lret = key2.QueryValue(_T("APITEST_VALUE_NAME"), &type, buffer, &buffer_size);
79     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
80     ok(type == REG_SZ, "Expected type to be REG_SZ, was: %lu\n", type);
81     ok(buffer_size == sizeof(testdata), "Expected buffer_size to be %u, was: %lu\n", sizeof(testdata), buffer_size);
82     ok(!memcmp(buffer, testdata, sizeof(testdata)), "Expected to get the same input as what was written!\n");
83 
84     buffer_size = sizeof(buffer);
85     type = 0x12345;
86     memset(buffer, 0, sizeof(buffer));
87     lret = key3.QueryValue(_T("APITEST_VALUE_NAME"), &type, buffer, &buffer_size);
88     ok(lret == ERROR_ACCESS_DENIED, "Expected lret to be ERROR_ACCESS_DENIED, was: %lu\n", lret);
89     ok(type == 0 || ((sizeof(void*) == 8) && broken(type == 1)) || broken(type > 200), "Expected type to be 0, was: %lu\n", type);
90     ok(buffer_size == sizeof(buffer), "Expected buffer_size to be %u, was: %lu\n", sizeof(buffer), buffer_size);
91 
92 
93     lret = key2.SetValue(_T("APITEST_VALUE_NAME"), REG_SZ, testdata, sizeof(testdata));
94     ok(lret == ERROR_ACCESS_DENIED, "Expected lret to be ERROR_ACCESS_DENIED, was: %lu\n", lret);
95 
96     lret = key2.DeleteValue(_T("APITEST_VALUE_NAME"));
97     ok(lret == ERROR_ACCESS_DENIED, "Expected lret to be ERROR_ACCESS_DENIED, was: %lu\n", lret);
98 
99     DWORD dword = 0x54321;
100     lret = key2.QueryDWORDValue(_T("APITEST_VALUE_NAME"), dword);
101     ok(lret == ERROR_MORE_DATA, "Expected lret to be ERROR_MORE_DATA, was: %lu\n", lret);
102     ok(dword == 0x54321, "Expected dword to be 0x54321, was: %lu\n", dword);
103 
104     lret = key.SetValue(_T("APITEST_VALUE_NAME"), REG_SZ, testdata, sizeof(TCHAR));
105     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_ACCESS_DENIED, was: %lu\n", lret);
106 
107     dword = 0x54321;
108     lret = key2.QueryDWORDValue(_T("APITEST_VALUE_NAME"), dword);
109     ok(lret == ERROR_INVALID_DATA, "Expected lret to be ERROR_MORE_DATA, was: %lu\n", lret);
110     ok(dword != 0x54321, "Expected dword to NOT be 0x54321, was: %lu\n", dword);
111 
112     lret = key3.SetDWORDValue(_T("APITEST_VALUE_NAME"), 0x12345);
113     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
114 
115     dword = 0x54321;
116     lret = key2.QueryDWORDValue(_T("APITEST_VALUE_NAME"), dword);
117     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
118     ok(dword == 0x12345, "Expected dword to be 0x12345, was: %lu\n", dword);
119 
120 
121     lret = key3.DeleteValue(_T("APITEST_VALUE_NAME"));
122     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
123 
124 
125     lret = key.SetKeyValue(_T("APITEST_KEY_NAME"), _T("APITEST_VALUE"));
126     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
127 
128     CRegKey qv;
129 
130     // COUNTOF, not SIZEOF!!!!
131     lret = qv.Open(HKEY_CURRENT_USER, _T("Environment\\APITEST_KEY_NAME"));
132     buffer_size = _countof(buffer);
133     memset(buffer, 0, sizeof(buffer));
134     lret = qv.QueryStringValue(NULL, buffer, &buffer_size);
135     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
136     ok(buffer_size == _countof("APITEST_VALUE"), "Expected buffer_size to be %u, was: %lu\n", _countof("APITEST_VALUE"), buffer_size);
137     ok(!_tcscmp(buffer, _T("APITEST_VALUE")), "Expected to get the same input as what was written!\n");
138 
139     lret = key.SetKeyValue(_T("APITEST_KEY_NAME"), _T("APITEST_VALUE2"), _T("APITEST_VALUE_NAME"));
140     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
141 
142     buffer_size = _countof(buffer);
143     memset(buffer, 0, sizeof(buffer));
144     lret = qv.QueryStringValue(_T("APITEST_VALUE_NAME"), buffer, &buffer_size);
145     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
146     ok(buffer_size == _countof("APITEST_VALUE2"), "Expected buffer_size to be %u, was: %lu\n", _countof("APITEST_VALUE2"), buffer_size);
147     ok(!_tcscmp(buffer, _T("APITEST_VALUE2")), "Expected to get the same input as what was written!\n");
148 
149     lret = key.DeleteSubKey(_T("APITEST_KEY_NAME"));
150     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
151 
152     GUID guid, guid2;
153     memset(&guid, 56, sizeof(guid));
154 
155     lret = key.SetGUIDValue(_T("GUID_NAME"), guid);
156     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
157 
158     lret = key.QueryGUIDValue(_T("GUID_NAME"), guid2);
159     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
160     ok(!memcmp(&guid, &guid2, sizeof(guid)), "Expected guid to equal guid2\n");
161 
162     buffer_size = _countof(buffer);
163     memset(buffer, 0, sizeof(buffer));
164     lret = key2.QueryStringValue(_T("GUID_NAME"), buffer, &buffer_size);
165     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
166     ok(buffer_size == _countof("{38383838-3838-3838-3838-383838383838}"),
167         "Expected buffer_size to be %u, was: %lu\n", _countof("{38383838-3838-3838-3838-383838383838}"), buffer_size);
168     ok(!_tcscmp(buffer, _T("{38383838-3838-3838-3838-383838383838}")), "Expected to get the same input as what was written!\n");
169 
170     memset(&guid, 33, 5);
171     lret = key.SetBinaryValue(_T("BIN_NAME"), &guid, 5);
172     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
173 
174     buffer_size = sizeof(buffer);
175     memset(buffer, 0, sizeof(buffer));
176     lret = key.QueryBinaryValue(_T("GUID_NAME"), buffer, &buffer_size);
177     ok(lret == ERROR_INVALID_DATA, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
178     ok(buffer_size == sizeof(_T("{38383838-3838-3838-3838-383838383838}")),
179         "Expected buffer_size to be %u, was: %lu\n", sizeof(_T("{38383838-3838-3838-3838-383838383838}")), buffer_size);
180     ok(buffer[0] == '{', "Expected buffer[0] to be 123, was: %i\n", (int)buffer[0]);
181 
182     buffer_size = sizeof(buffer);
183     memset(buffer, 0, sizeof(buffer));
184     lret = key.QueryBinaryValue(_T("BIN_NAME"), buffer, &buffer_size);
185     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
186     ok(buffer_size == 5, "Expected buffer_size to be %i, was: %lu\n", 5, buffer_size);
187     ok(!memcmp(buffer, &guid, 5), "Expected the first 5 bytes of buffer to equal the data in null_guid\n");
188 
189     lret = key.DeleteValue(_T("GUID_NAME"));
190     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
191 
192     lret = key.DeleteValue(_T("BIN_NAME"));
193     ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
194 
195     {
196         CRegKey test1;
197         lret = test1.Create(HKEY_CURRENT_USER, _T("TEST1"));
198         ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
199 
200         CRegKey test2;
201         lret = test2.Create(test1, _T("TEST2"));
202         ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
203 
204         CRegKey test3;
205         lret = test3.Create(test2, _T("TEST3"));
206         ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
207     }
208     {
209         CRegKey key(HKEY_CURRENT_USER);
210         lret = key.RecurseDeleteKey(_T("TEST1"));
211         ok(lret == ERROR_SUCCESS, "Expected lret to be ERROR_SUCCESS, was: %lu\n", lret);
212     }
213 }
214