Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 181ab0b

Browse files
committed
mark failures
1 parent ed88a51 commit 181ab0b

File tree

2 files changed

+83
-38
lines changed

2 files changed

+83
-38
lines changed

Lib/test/test_winreg.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,10 +212,14 @@ def _test_named_args(self, key, sub_key):
212212

213213
class LocalWinregTests(BaseWinregTests):
214214

215+
# TODO: RUSTPYTHON
216+
@unittest.expectedFailure
215217
def test_registry_works(self):
216218
self._test_all(HKEY_CURRENT_USER)
217219
self._test_all(HKEY_CURRENT_USER, "日本-subkey")
218220

221+
# TODO: RUSTPYTHON
222+
@unittest.expectedFailure
219223
def test_registry_works_extended_functions(self):
220224
# Substitute the regular CreateKey and OpenKey calls with their
221225
# extended counterparts.
@@ -228,6 +232,8 @@ def test_registry_works_extended_functions(self):
228232

229233
self._delete_test_data(HKEY_CURRENT_USER)
230234

235+
# TODO: RUSTPYTHON
236+
@unittest.expectedFailure
231237
def test_named_arguments(self):
232238
self._test_named_args(HKEY_CURRENT_USER, test_key_name)
233239
# Use the regular DeleteKey to clean up
@@ -245,6 +251,8 @@ def test_nonexistent_remote_registry(self):
245251
connect = lambda: ConnectRegistry("abcdefghijkl", HKEY_CURRENT_USER)
246252
self.assertRaises(OSError, connect)
247253

254+
# TODO: RUSTPYTHON
255+
@unittest.skip("flaky")
248256
def testExpandEnvironmentStrings(self):
249257
r = ExpandEnvironmentStrings("%windir%\\test")
250258
self.assertEqual(type(r), str)
@@ -291,6 +299,8 @@ def run(self):
291299
DeleteKey(HKEY_CURRENT_USER, test_key_name+'\\changing_value')
292300
DeleteKey(HKEY_CURRENT_USER, test_key_name)
293301

302+
# TODO: RUSTPYTHON
303+
@unittest.expectedFailure
294304
def test_long_key(self):
295305
# Issue2810, in 2.6 and 3.1 when the key name was exactly 256
296306
# characters, EnumKey raised "WindowsError: More data is
@@ -305,6 +315,8 @@ def test_long_key(self):
305315
DeleteKey(HKEY_CURRENT_USER, '\\'.join((test_key_name, name)))
306316
DeleteKey(HKEY_CURRENT_USER, test_key_name)
307317

318+
# TODO: RUSTPYTHON
319+
@unittest.expectedFailure
308320
def test_dynamic_key(self):
309321
# Issue2810, when the value is dynamically generated, these
310322
# raise "WindowsError: More data is available" in 2.6 and 3.1
@@ -339,6 +351,8 @@ def test_reflection_unsupported(self):
339351
finally:
340352
DeleteKey(HKEY_CURRENT_USER, test_key_name)
341353

354+
# TODO: RUSTPYTHON
355+
@unittest.expectedFailure
342356
def test_setvalueex_value_range(self):
343357
# Test for Issue #14420, accept proper ranges for SetValueEx.
344358
# Py2Reg, which gets called by SetValueEx, was using PyLong_AsLong,
@@ -351,6 +365,8 @@ def test_setvalueex_value_range(self):
351365
finally:
352366
DeleteKey(HKEY_CURRENT_USER, test_key_name)
353367

368+
# TODO: RUSTPYTHON
369+
@unittest.expectedFailure
354370
def test_setvalueex_negative_one_check(self):
355371
# Test for Issue #43984, check -1 was not set by SetValueEx.
356372
# Py2Reg, which gets called by SetValueEx, wasn't checking return
@@ -368,6 +384,8 @@ def test_setvalueex_negative_one_check(self):
368384
finally:
369385
DeleteKey(HKEY_CURRENT_USER, test_key_name)
370386

387+
# TODO: RUSTPYTHON
388+
@unittest.expectedFailure
371389
def test_queryvalueex_return_value(self):
372390
# Test for Issue #16759, return unsigned int from QueryValueEx.
373391
# Reg2Py, which gets called by QueryValueEx, was returning a value
@@ -384,6 +402,8 @@ def test_queryvalueex_return_value(self):
384402
finally:
385403
DeleteKey(HKEY_CURRENT_USER, test_key_name)
386404

405+
# TODO: RUSTPYTHON
406+
@unittest.expectedFailure
387407
def test_setvalueex_crash_with_none_arg(self):
388408
# Test for Issue #21151, segfault when None is passed to SetValueEx
389409
try:
@@ -397,6 +417,8 @@ def test_setvalueex_crash_with_none_arg(self):
397417
finally:
398418
DeleteKey(HKEY_CURRENT_USER, test_key_name)
399419

420+
# TODO: RUSTPYTHON
421+
@unittest.expectedFailure
400422
def test_read_string_containing_null(self):
401423
# Test for issue 25778: REG_SZ should not contain null characters
402424
try:
@@ -421,13 +443,16 @@ def test_remote_registry_works(self):
421443

422444
@unittest.skipUnless(WIN64_MACHINE, "x64 specific registry tests")
423445
class Win64WinregTests(BaseWinregTests):
424-
446+
# TODO: RUSTPYTHON
447+
@unittest.expectedFailure
425448
def test_named_arguments(self):
426449
self._test_named_args(HKEY_CURRENT_USER, test_key_name)
427450
# Clean up and also exercise the named arguments
428451
DeleteKeyEx(key=HKEY_CURRENT_USER, sub_key=test_key_name,
429452
access=KEY_ALL_ACCESS, reserved=0)
430453

454+
# TODO: RUSTPYTHON
455+
@unittest.expectedFailure
431456
@unittest.skipIf(win32_edition() in ('WindowsCoreHeadless', 'IoTEdgeOS'), "APIs not available on WindowsCoreHeadless")
432457
def test_reflection_functions(self):
433458
# Test that we can call the query, enable, and disable functions
@@ -513,6 +538,8 @@ def test_disable_reflection(self):
513538
DeleteKeyEx(HKEY_CURRENT_USER, test_reflect_key_name,
514539
KEY_WOW64_32KEY, 0)
515540

541+
# TODO: RUSTPYTHON
542+
@unittest.expectedFailure
516543
def test_exception_numbers(self):
517544
with self.assertRaises(FileNotFoundError) as ctx:
518545
QueryValue(HKEY_CLASSES_ROOT, 'some_value_that_does_not_exist')

vm/src/stdlib/winreg.rs

Lines changed: 55 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
use crate::{PyRef, VirtualMachine, builtins::PyModule};
55

66
pub(crate) fn make_module(vm: &VirtualMachine) -> PyRef<PyModule> {
7-
let module = winreg::make_module(vm);
8-
module
7+
winreg::make_module(vm)
98
}
109

1110
#[pymodule]
@@ -53,48 +52,55 @@ mod winreg {
5352
#[pyattr(once)]
5453
fn HKEY_CLASSES_ROOT(_vm: &VirtualMachine) -> PyHKEYObject {
5554
PyHKEYObject {
55+
#[allow(clippy::arc_with_non_send_sync)]
5656
hkey: Arc::new(PyRwLock::new(Registry::HKEY_CLASSES_ROOT)),
5757
}
5858
}
5959

6060
#[pyattr(once)]
6161
fn HKEY_CURRENT_USER(_vm: &VirtualMachine) -> PyHKEYObject {
6262
PyHKEYObject {
63+
#[allow(clippy::arc_with_non_send_sync)]
6364
hkey: Arc::new(PyRwLock::new(Registry::HKEY_CURRENT_USER)),
6465
}
6566
}
6667

6768
#[pyattr(once)]
6869
fn HKEY_LOCAL_MACHINE(_vm: &VirtualMachine) -> PyHKEYObject {
6970
PyHKEYObject {
71+
#[allow(clippy::arc_with_non_send_sync)]
7072
hkey: Arc::new(PyRwLock::new(Registry::HKEY_LOCAL_MACHINE)),
7173
}
7274
}
7375

7476
#[pyattr(once)]
7577
fn HKEY_USERS(_vm: &VirtualMachine) -> PyHKEYObject {
7678
PyHKEYObject {
79+
#[allow(clippy::arc_with_non_send_sync)]
7780
hkey: Arc::new(PyRwLock::new(Registry::HKEY_USERS)),
7881
}
7982
}
8083

8184
#[pyattr(once)]
8285
fn HKEY_PERFORMANCE_DATA(_vm: &VirtualMachine) -> PyHKEYObject {
8386
PyHKEYObject {
87+
#[allow(clippy::arc_with_non_send_sync)]
8488
hkey: Arc::new(PyRwLock::new(Registry::HKEY_PERFORMANCE_DATA)),
8589
}
8690
}
8791

8892
#[pyattr(once)]
8993
fn HKEY_CURRENT_CONFIG(_vm: &VirtualMachine) -> PyHKEYObject {
9094
PyHKEYObject {
95+
#[allow(clippy::arc_with_non_send_sync)]
9196
hkey: Arc::new(PyRwLock::new(Registry::HKEY_CURRENT_CONFIG)),
9297
}
9398
}
9499

95100
#[pyattr(once)]
96101
fn HKEY_DYN_DATA(_vm: &VirtualMachine) -> PyHKEYObject {
97102
PyHKEYObject {
103+
#[allow(clippy::arc_with_non_send_sync)]
98104
hkey: Arc::new(PyRwLock::new(Registry::HKEY_DYN_DATA)),
99105
}
100106
}
@@ -266,7 +272,7 @@ mod winreg {
266272
Registry::RegConnectRegistryW(
267273
wide_computer_name.as_ptr(),
268274
*key.hkey.read(),
269-
&mut ret_key
275+
&mut ret_key,
270276
)
271277
};
272278
if res == 0 {
@@ -277,11 +283,7 @@ mod winreg {
277283
} else {
278284
let mut ret_key = std::ptr::null_mut();
279285
let res = unsafe {
280-
Registry::RegConnectRegistryW(
281-
std::ptr::null_mut(),
282-
*key.hkey.read(),
283-
&mut ret_key
284-
)
286+
Registry::RegConnectRegistryW(std::ptr::null_mut(), *key.hkey.read(), &mut ret_key)
285287
};
286288
if res == 0 {
287289
Ok(PyHKEYObject::new(ret_key))
@@ -436,18 +438,15 @@ mod winreg {
436438
)
437439
};
438440
if rc != 0 {
439-
return Err(vm.new_os_error(format!(
440-
"RegQueryInfoKeyW failed with error code {}",
441-
rc
442-
)));
441+
return Err(vm.new_os_error(format!("RegQueryInfoKeyW failed with error code {}", rc)));
443442
}
444-
443+
445444
// Include room for null terminators.
446445
ret_value_size += 1;
447446
ret_data_size += 1;
448447
let mut buf_value_size = ret_value_size;
449448
let mut buf_data_size = ret_data_size;
450-
449+
451450
// Allocate buffers.
452451
let mut ret_value_buf: Vec<u16> = vec![0; ret_value_size as usize];
453452
let mut ret_data_buf: Vec<u8> = vec![0; ret_data_size as usize];
@@ -484,12 +483,9 @@ mod winreg {
484483
continue;
485484
}
486485
if rc != 0 {
487-
return Err(vm.new_os_error(format!(
488-
"RegEnumValueW failed with error code {}",
489-
rc
490-
)));
486+
return Err(vm.new_os_error(format!("RegEnumValueW failed with error code {}", rc)));
491487
}
492-
488+
493489
// At this point, current_value_size and current_data_size have been updated.
494490
// Retrieve the registry type.
495491
let mut reg_type: u32 = 0;
@@ -505,25 +501,28 @@ mod winreg {
505501
&mut current_data_size as *mut u32,
506502
)
507503
};
508-
504+
509505
// Convert the registry value name from UTF‑16.
510506
let name_len = ret_value_buf
511507
.iter()
512508
.position(|&c| c == 0)
513509
.unwrap_or(ret_value_buf.len());
514510
let name = String::from_utf16(&ret_value_buf[..name_len])
515511
.map_err(|e| vm.new_value_error(format!("UTF16 conversion error: {}", e)))?;
516-
512+
517513
// Slice the data buffer to the actual size returned.
518514
let data_slice = &ret_data_buf[..current_data_size as usize];
519515
let py_data = reg_to_py(vm, data_slice, reg_type)?;
520-
516+
521517
// Return tuple (value_name, data, type)
522-
return Ok(vm.ctx.new_tuple(vec![
523-
vm.ctx.new_str(name).into(),
524-
py_data,
525-
vm.ctx.new_int(reg_type).into(),
526-
]).into());
518+
return Ok(vm
519+
.ctx
520+
.new_tuple(vec![
521+
vm.ctx.new_str(name).into(),
522+
py_data,
523+
vm.ctx.new_int(reg_type).into(),
524+
])
525+
.into());
527526
}
528527
}
529528

@@ -614,8 +613,13 @@ mod winreg {
614613
if err != 0 {
615614
return Err(vm.new_os_error(format!("error code: {}", err)));
616615
}
617-
let l: u64 = (lpftlastwritetime.dwHighDateTime as u64) << 32 | lpftlastwritetime.dwLowDateTime as u64;
618-
let tup: Vec<PyObjectRef> = vec![vm.ctx.new_int(lpcsubkeys).into(), vm.ctx.new_int(lpcvalues).into(), vm.ctx.new_int(l).into()];
616+
let l: u64 = (lpftlastwritetime.dwHighDateTime as u64) << 32
617+
| lpftlastwritetime.dwLowDateTime as u64;
618+
let tup: Vec<PyObjectRef> = vec![
619+
vm.ctx.new_int(lpcsubkeys).into(),
620+
vm.ctx.new_int(lpcvalues).into(),
621+
vm.ctx.new_int(l).into(),
622+
];
619623
Ok(vm.ctx.new_tuple(tup))
620624
}
621625

@@ -642,7 +646,11 @@ mod winreg {
642646
}
643647

644648
#[pyfunction]
645-
fn QueryValueEx(key: PyRef<PyHKEYObject>, name: String, vm: &VirtualMachine) -> PyResult<PyObjectRef> {
649+
fn QueryValueEx(
650+
key: PyRef<PyHKEYObject>,
651+
name: String,
652+
vm: &VirtualMachine,
653+
) -> PyResult<PyObjectRef> {
646654
let wide_name = to_utf16(name);
647655
let mut buf_size = 0;
648656
let res = unsafe {
@@ -693,11 +701,17 @@ mod winreg {
693701
}
694702

695703
#[pyfunction]
696-
fn SetValue(key: PyRef<PyHKEYObject>, sub_key: String, typ: u32, value: String, vm: &VirtualMachine) -> PyResult<()> {
704+
fn SetValue(
705+
key: PyRef<PyHKEYObject>,
706+
sub_key: String,
707+
typ: u32,
708+
value: String,
709+
vm: &VirtualMachine,
710+
) -> PyResult<()> {
697711
if typ != Registry::REG_SZ {
698712
return Err(vm.new_type_error("type must be winreg.REG_SZ".to_string()));
699713
}
700-
714+
701715
let wide_sub_key = to_utf16(sub_key);
702716

703717
// TODO: Value check
@@ -753,7 +767,10 @@ mod winreg {
753767
std::slice::from_raw_parts(ret_data.as_ptr() as *const u16, u16_count)
754768
};
755769
// Only use characters up to the first NUL.
756-
let len = u16_slice.iter().position(|&c| c == 0).unwrap_or(u16_slice.len());
770+
let len = u16_slice
771+
.iter()
772+
.position(|&c| c == 0)
773+
.unwrap_or(u16_slice.len());
757774
let s = String::from_utf16(&u16_slice[..len])
758775
.map_err(|e| vm.new_value_error(format!("UTF16 error: {}", e)))?;
759776
Ok(vm.ctx.new_str(s).into())
@@ -814,10 +831,11 @@ mod winreg {
814831
}
815832
// REG_SZ is fallthrough
816833
REG_EXPAND_SZ => {
817-
return Err(vm.new_type_error("TODO: RUSTPYTHON REG_EXPAND_SZ is not supported".to_string()));
834+
Err(vm
835+
.new_type_error("TODO: RUSTPYTHON REG_EXPAND_SZ is not supported".to_string()))
818836
}
819837
REG_MULTI_SZ => {
820-
return Err(vm.new_type_error("TODO: RUSTPYTHON REG_MULTI_SZ is not supported".to_string()));
838+
Err(vm.new_type_error("TODO: RUSTPYTHON REG_MULTI_SZ is not supported".to_string()))
821839
}
822840
// REG_BINARY is fallthrough
823841
_ => {
@@ -856,7 +874,7 @@ mod winreg {
856874
if res != 0 {
857875
return Err(vm.new_os_error(format!("error code: {}", res)));
858876
}
859-
},
877+
}
860878
Ok(None) => {
861879
let len = 0;
862880
let ptr = std::ptr::null();
@@ -874,7 +892,7 @@ mod winreg {
874892
if res != 0 {
875893
return Err(vm.new_os_error(format!("error code: {}", res)));
876894
}
877-
},
895+
}
878896
Err(_) => return Err(vm.new_type_error("value must be an integer".to_string())),
879897
}
880898
Ok(())

0 commit comments

Comments
 (0)