* Added test application for the AttributeIterator implementation. Note that
this test fails under BeOS, while it works just fine under Haiku. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27449 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -1,5 +1,9 @@
|
|||||||
SubDir HAIKU_TOP src tests add-ons kernel file_systems bfs ;
|
SubDir HAIKU_TOP src tests add-ons kernel file_systems bfs ;
|
||||||
|
|
||||||
|
SimpleTest bfs_attribute_iterator_test :
|
||||||
|
bfs_attribute_iterator_test.cpp
|
||||||
|
: be ;
|
||||||
|
|
||||||
SubInclude HAIKU_TOP src tests add-ons kernel file_systems bfs array ;
|
SubInclude HAIKU_TOP src tests add-ons kernel file_systems bfs array ;
|
||||||
SubInclude HAIKU_TOP src tests add-ons kernel file_systems bfs bufferPool ;
|
SubInclude HAIKU_TOP src tests add-ons kernel file_systems bfs bufferPool ;
|
||||||
SubInclude HAIKU_TOP src tests add-ons kernel file_systems bfs bfs_shell ;
|
SubInclude HAIKU_TOP src tests add-ons kernel file_systems bfs bfs_shell ;
|
||||||
|
|||||||
@@ -0,0 +1,316 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2008, Axel Dörfler, [email protected].
|
||||||
|
* This file may be used under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <Entry.h>
|
||||||
|
#include <File.h>
|
||||||
|
#include <fs_attr.h>
|
||||||
|
#include <TypeConstants.h>
|
||||||
|
|
||||||
|
|
||||||
|
const char* kTempFile = "/tmp/bfs_attribute_iterator_test";
|
||||||
|
|
||||||
|
bool gVerbose;
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
is_marker(const char* name)
|
||||||
|
{
|
||||||
|
return strstr(name, ":marker") != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32
|
||||||
|
attribute_index(const char* name)
|
||||||
|
{
|
||||||
|
int32 number;
|
||||||
|
if (sscanf(name, "test:%ld", &number) == 1)
|
||||||
|
return number;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
add_attributes(BFile& file, int32 start, int32 count)
|
||||||
|
{
|
||||||
|
for (int32 index = start; index < start + count; index++) {
|
||||||
|
char name[B_ATTR_NAME_LENGTH];
|
||||||
|
snprintf(name, sizeof(name), "test:%ld", index);
|
||||||
|
file.WriteAttr(name, B_INT32_TYPE, 0, &index, sizeof(int32));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
remove_attributes(BFile& file, int32 start, int32 count)
|
||||||
|
{
|
||||||
|
for (int32 index = start; index < start + count; index++) {
|
||||||
|
char name[B_ATTR_NAME_LENGTH];
|
||||||
|
snprintf(name, sizeof(name), "test:%ld", index);
|
||||||
|
file.RemoveAttr(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
add_marker_attribute(BFile& file, int32 index)
|
||||||
|
{
|
||||||
|
char name[B_ATTR_NAME_LENGTH];
|
||||||
|
snprintf(name, sizeof(name), "test:%ld:marker", index);
|
||||||
|
file.WriteAttr(name, B_INT32_TYPE, 0, &index, sizeof(int32));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
remove_marker_attribute(BFile& file, int32 index)
|
||||||
|
{
|
||||||
|
char name[B_ATTR_NAME_LENGTH];
|
||||||
|
snprintf(name, sizeof(name), "test:%ld:marker", index);
|
||||||
|
file.RemoveAttr(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
test_remove_attributes(BFile& file, int32 start, int32 count, int32 removeAt,
|
||||||
|
int32 removeIndex1, int32 removeIndex2)
|
||||||
|
{
|
||||||
|
int fd = file.Dup();
|
||||||
|
if (fd < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int32 index = 0;
|
||||||
|
bool seen[4096] = {0};
|
||||||
|
|
||||||
|
if (gVerbose)
|
||||||
|
printf("test removeAt %ld\n", removeAt);
|
||||||
|
|
||||||
|
DIR* dir = fs_fopen_attr_dir(fd);
|
||||||
|
while (struct dirent* entry = fs_read_attr_dir(dir)) {
|
||||||
|
if (gVerbose)
|
||||||
|
printf(" %ld. %s\n", index, entry->d_name);
|
||||||
|
if (index == removeAt) {
|
||||||
|
if (removeIndex1 > 0)
|
||||||
|
remove_marker_attribute(file, removeIndex1);
|
||||||
|
if (removeIndex2 > 0)
|
||||||
|
remove_marker_attribute(file, removeIndex2);
|
||||||
|
}
|
||||||
|
index++;
|
||||||
|
|
||||||
|
if (is_marker(entry->d_name))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int32 attributeIndex = attribute_index(entry->d_name);
|
||||||
|
if (attributeIndex > 0) {
|
||||||
|
if (seen[attributeIndex]) {
|
||||||
|
printf("attribute index %ld already listed!\n", attributeIndex);
|
||||||
|
exit(1);
|
||||||
|
} else
|
||||||
|
seen[attributeIndex] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fs_close_attr_dir(dir);
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
for (int32 i = start; i < start + count; i++) {
|
||||||
|
if (!seen[i]) {
|
||||||
|
printf("attribute index %ld not listed, saw only %ld/%ld!\n", i,
|
||||||
|
index, count);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
test_add_attributes(BFile& file, int32 start, int32 count, int32 addAt,
|
||||||
|
int32 addIndex1, int32 addIndex2)
|
||||||
|
{
|
||||||
|
int fd = file.Dup();
|
||||||
|
if (fd < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int32 index = 0;
|
||||||
|
bool seen[4096] = {0};
|
||||||
|
|
||||||
|
if (gVerbose)
|
||||||
|
printf("test addAt %ld\n", addAt);
|
||||||
|
|
||||||
|
DIR* dir = fs_fopen_attr_dir(fd);
|
||||||
|
while (struct dirent* entry = fs_read_attr_dir(dir)) {
|
||||||
|
if (gVerbose)
|
||||||
|
printf(" %ld. %s\n", index, entry->d_name);
|
||||||
|
if (index == addAt) {
|
||||||
|
if (addIndex1 > 0)
|
||||||
|
add_marker_attribute(file, addIndex1);
|
||||||
|
if (addIndex2 > 0)
|
||||||
|
add_marker_attribute(file, addIndex2);
|
||||||
|
}
|
||||||
|
index++;
|
||||||
|
|
||||||
|
if (is_marker(entry->d_name))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int32 attributeIndex = attribute_index(entry->d_name);
|
||||||
|
if (attributeIndex > 0) {
|
||||||
|
if (seen[attributeIndex]) {
|
||||||
|
printf("attribute index %ld already listed!\n", attributeIndex);
|
||||||
|
exit(1);
|
||||||
|
} else
|
||||||
|
seen[attributeIndex] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fs_close_attr_dir(dir);
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
for (int32 i = start; i < start + count; i++) {
|
||||||
|
if (!seen[i]) {
|
||||||
|
printf("attribute index %ld not listed, saw only %ld/%ld!\n", i,
|
||||||
|
index, count);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
if (argc > 1 && !strcmp(argv[1], "-v"))
|
||||||
|
gVerbose = true;
|
||||||
|
|
||||||
|
BFile file;
|
||||||
|
status_t status = file.SetTo(kTempFile, B_CREATE_FILE | B_READ_WRITE);
|
||||||
|
if (status != B_OK) {
|
||||||
|
fprintf(stderr, "Could not create temporary file: %s\n",
|
||||||
|
strerror(status));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
puts("--------- Remove Tests ----------");
|
||||||
|
|
||||||
|
// remove test, many attributes
|
||||||
|
|
||||||
|
puts("Test 1...");
|
||||||
|
|
||||||
|
for (int32 count = 5; count <= 100; count += 5) {
|
||||||
|
add_attributes(file, 1, count);
|
||||||
|
add_marker_attribute(file, count);
|
||||||
|
add_attributes(file, count + 1, count);
|
||||||
|
|
||||||
|
test_remove_attributes(file, 1, count,
|
||||||
|
count & 1 ? count - 1 : count + 1, count, -1);
|
||||||
|
|
||||||
|
remove_attributes(file, 1, count * 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove test, all positions
|
||||||
|
|
||||||
|
puts("Test 2...");
|
||||||
|
|
||||||
|
for (int32 i = 1; i < 100; i++) {
|
||||||
|
add_attributes(file, 1, 50);
|
||||||
|
add_marker_attribute(file, 51);
|
||||||
|
add_attributes(file, 51, 50);
|
||||||
|
|
||||||
|
test_remove_attributes(file, 1, 100, i, 51, -1);
|
||||||
|
|
||||||
|
remove_attributes(file, 1, 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove test, all positions, remove many
|
||||||
|
|
||||||
|
puts("Test 3...");
|
||||||
|
|
||||||
|
for (int32 i = 1; i < 100; i++) {
|
||||||
|
add_attributes(file, 1, 33);
|
||||||
|
add_marker_attribute(file, 33);
|
||||||
|
add_attributes(file, 34, 34);
|
||||||
|
add_marker_attribute(file, 67);
|
||||||
|
add_attributes(file, 68, 33);
|
||||||
|
|
||||||
|
test_remove_attributes(file, 1, 100, i, 33, 67);
|
||||||
|
|
||||||
|
remove_attributes(file, 1, 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
puts("--------- Add Tests ----------");
|
||||||
|
|
||||||
|
// add test, many attributes
|
||||||
|
|
||||||
|
puts("Test 4...");
|
||||||
|
|
||||||
|
for (int32 count = 10; count <= 200; count += 10) {
|
||||||
|
add_attributes(file, 1, count);
|
||||||
|
|
||||||
|
int32 half = count / 2;
|
||||||
|
|
||||||
|
test_add_attributes(file, 1, count,
|
||||||
|
half & 1 ? half - 1 : half + 1, half - 2, half + 2);
|
||||||
|
|
||||||
|
remove_attributes(file, 1, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
// add test, all iterator positions
|
||||||
|
|
||||||
|
puts("Test 5...");
|
||||||
|
|
||||||
|
for (int32 i = 1; i < 100; i++) {
|
||||||
|
add_attributes(file, 1, 100);
|
||||||
|
|
||||||
|
test_add_attributes(file, 1, 100, i, 50, -1);
|
||||||
|
|
||||||
|
remove_attributes(file, 1, 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
// add test, all attribute positions
|
||||||
|
|
||||||
|
puts("Test 6...");
|
||||||
|
|
||||||
|
for (int32 i = 1; i < 100; i++) {
|
||||||
|
add_attributes(file, 1, 100);
|
||||||
|
|
||||||
|
test_add_attributes(file, 1, 100, 50, i, -1);
|
||||||
|
|
||||||
|
remove_attributes(file, 1, 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
// add test, many attributes
|
||||||
|
|
||||||
|
puts("Test 7...");
|
||||||
|
|
||||||
|
for (int32 i = 1; i < 100; i++) {
|
||||||
|
add_attributes(file, 1, 100);
|
||||||
|
|
||||||
|
test_add_attributes(file, 1, 100, i, 33, 67);
|
||||||
|
|
||||||
|
remove_attributes(file, 1, 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
// add test, many attributes
|
||||||
|
|
||||||
|
puts("Test 8...");
|
||||||
|
|
||||||
|
for (int32 i = 1; i < 100; i++) {
|
||||||
|
add_attributes(file, 1, 100);
|
||||||
|
|
||||||
|
test_add_attributes(file, 1, 100, 50, i - 1, i + 1);
|
||||||
|
|
||||||
|
remove_attributes(file, 1, 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
BEntry entry;
|
||||||
|
if (entry.SetTo(kTempFile) == B_OK)
|
||||||
|
entry.Remove();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user