diff options
Diffstat (limited to 'source4/torture')
-rw-r--r-- | source4/torture/smb2/read.c | 55 |
1 files changed, 51 insertions, 4 deletions
diff --git a/source4/torture/smb2/read.c b/source4/torture/smb2/read.c index 3e1d077b7d..62240f35ba 100644 --- a/source4/torture/smb2/read.c +++ b/source4/torture/smb2/read.c @@ -38,13 +38,13 @@ #define CHECK_VALUE(v, correct) do { \ if ((v) != (correct)) { \ - printf("(%s) Incorrect value %s=%d - should be %d\n", \ - __location__, #v, v, correct); \ + printf("(%s) Incorrect value %s=%u - should be %u\n", \ + __location__, #v, (unsigned)v, (unsigned)correct); \ ret = false; \ goto done; \ }} while (0) -static bool test_read(struct torture_context *torture, struct smb2_tree *tree) +static bool test_read_eof(struct torture_context *torture, struct smb2_tree *tree) { bool ret = true; NTSTATUS status; @@ -126,13 +126,60 @@ done: return ret; } + +static bool test_read_position(struct torture_context *torture, struct smb2_tree *tree) +{ + bool ret = true; + NTSTATUS status; + struct smb2_handle h; + uint8_t buf[70000]; + struct smb2_read rd; + TALLOC_CTX *tmp_ctx = talloc_new(tree); + union smb_fileinfo info; + + ZERO_STRUCT(buf); + + status = torture_smb2_testfile(tree, "lock1.txt", &h); + CHECK_STATUS(status, NT_STATUS_OK); + + status = smb2_util_write(tree, h, buf, 0, ARRAY_SIZE(buf)); + CHECK_STATUS(status, NT_STATUS_OK); + + ZERO_STRUCT(rd); + rd.in.file.handle = h; + rd.in.length = 10; + rd.in.offset = 0; + rd.in.min_count = 1; + + status = smb2_read(tree, tmp_ctx, &rd); + CHECK_STATUS(status, NT_STATUS_OK); + CHECK_VALUE(rd.out.data.length, 10); + + info.generic.level = RAW_FILEINFO_SMB2_ALL_INFORMATION; + info.generic.in.file.handle = h; + + status = smb2_getinfo_file(tree, tmp_ctx, &info); + CHECK_STATUS(status, NT_STATUS_OK); + if (torture_setting_bool(torture, "windows", false)) { + CHECK_VALUE(info.all_info2.out.position, 0); + } else { + CHECK_VALUE(info.all_info2.out.position, 10); + } + + +done: + talloc_free(tmp_ctx); + return ret; +} + /* basic testing of SMB2 read */ struct torture_suite *torture_smb2_read_init(void) { struct torture_suite *suite = torture_suite_create(talloc_autofree_context(), "READ"); - torture_suite_add_1smb2_test(suite, "READ", test_read); + torture_suite_add_1smb2_test(suite, "EOF", test_read_eof); + torture_suite_add_1smb2_test(suite, "POSITION", test_read_position); suite->description = talloc_strdup(suite, "SMB2-READ tests"); |