summaryrefslogtreecommitdiff
path: root/firmware/test
diff options
context:
space:
mode:
authorBjörn Stenberg <bjorn@haxx.se>2002-11-11 15:47:19 +0000
committerBjörn Stenberg <bjorn@haxx.se>2002-11-11 15:47:19 +0000
commit4cde66765999976b43d46366e495bf353d35736e (patch)
treefb6758e68181e37870b455baa5371f77c3af5eff /firmware/test
parent9f9c495662cbba43fdb3bf577a48d40e30e1245e (diff)
downloadrockbox-4cde66765999976b43d46366e495bf353d35736e.zip
rockbox-4cde66765999976b43d46366e495bf353d35736e.tar.gz
rockbox-4cde66765999976b43d46366e495bf353d35736e.tar.bz2
rockbox-4cde66765999976b43d46366e495bf353d35736e.tar.xz
Added a truckload of test code.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2829 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/test')
-rw-r--r--firmware/test/fat/main.c266
1 files changed, 238 insertions, 28 deletions
diff --git a/firmware/test/fat/main.c b/firmware/test/fat/main.c
index 58f83f4..ca28832 100644
--- a/firmware/test/fat/main.c
+++ b/firmware/test/fat/main.c
@@ -2,6 +2,8 @@
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
+#include <time.h>
+#include <sys/time.h>
#include "fat.h"
#include "debug.h"
#include "disk.h"
@@ -84,13 +86,15 @@ void dbg_dir(char* currdir)
}
#define CHUNKSIZE 8
+#define BUFSIZE 8192
int dbg_mkfile(char* name, int num)
{
- char text[8192];
+ char text[BUFSIZE+1];
int i;
int fd;
int x=0;
+ bool stop = false;
fd = open(name,O_WRONLY);
if (fd<0) {
@@ -100,7 +104,7 @@ int dbg_mkfile(char* name, int num)
num *= 1024;
while ( num ) {
int rc;
- int len = num > sizeof text ? sizeof text : num;
+ int len = num > BUFSIZE ? BUFSIZE : num;
for (i=0; i<len/CHUNKSIZE; i++ )
sprintf(text+i*CHUNKSIZE,"%c%06x,",name[1],x++);
@@ -113,23 +117,35 @@ int dbg_mkfile(char* name, int num)
else
if ( rc == 0 ) {
DEBUGF("No space left\n");
- break;
+ return -2;
}
else
DEBUGF("wrote %d bytes\n",rc);
num -= len;
+
+ if ( !num ) {
+ if ( stop )
+ break;
+
+ /* add a random number of chunks to test byte-copy code */
+ num = ((int) rand() % SECTOR_SIZE) & ~7;
+ LDEBUGF("Adding random size %d\n",num);
+ stop = true;
+ }
}
-
+
close(fd);
return 0;
}
+
int dbg_chkfile(char* name, int size)
{
char text[81920];
int i;
int x=0;
+ int pos = 0;
int block=0;
int fd = open(name,O_RDONLY);
if (fd<0) {
@@ -137,18 +153,21 @@ int dbg_chkfile(char* name, int size)
return -1;
}
- if (size) {
- lseek(fd, size*512, SEEK_SET);
- x = size * 1024 / 16;
- LDEBUGF("Check base is %x\n",x);
- }
+ size = lseek(fd, 0, SEEK_END);
+ DEBUGF("File is %d bytes\n", size);
+ /* random start position */
+ if ( size )
+ pos = ((int)rand() % size) & ~7;
+ lseek(fd, pos, SEEK_SET);
+ x = pos / CHUNKSIZE;
+
+ LDEBUGF("Check base is %x (%d)\n",x,pos);
while (1) {
int rc = read(fd, text, sizeof text);
DEBUGF("read %d bytes\n",rc);
if (rc < 0) {
- DEBUGF("Failed writing data\n");
- return -1;
+ panicf("Failed reading data\n");
}
else {
char tmp[CHUNKSIZE+1];
@@ -157,13 +176,86 @@ int dbg_chkfile(char* name, int size)
for (i=0; i<rc/CHUNKSIZE; i++ ) {
sprintf(tmp,"%c%06x,",name[1],x++);
if (strncmp(text+i*CHUNKSIZE,tmp,CHUNKSIZE)) {
- DEBUGF("Mismatch in byte %x (sector %d). Expected %.8s found %.8s\n",
- block*sizeof(text)+i*CHUNKSIZE,
- (block*sizeof(text)+i*CHUNKSIZE) / SECTOR_SIZE,
+ int idx = pos + block*sizeof(text) + i*CHUNKSIZE;
+ DEBUGF("Mismatch in byte 0x%x (byte 0x%x of sector 0x%x)."
+ "\nExpected %.8s found %.8s\n",
+ idx, idx % SECTOR_SIZE, idx / SECTOR_SIZE,
tmp,
text+i*CHUNKSIZE);
- dbg_dump_buffer(text+i*CHUNKSIZE - 0x20, 0x40,
- block*sizeof(text)+i*CHUNKSIZE - 0x20);
+ DEBUGF("i=%x, idx=%x\n",i,idx);
+ dbg_dump_buffer(text+i*CHUNKSIZE - 0x20, 0x40, idx - 0x20);
+ return -1;
+ }
+ }
+ }
+ block++;
+ }
+
+ close(fd);
+
+ return 0;
+}
+
+int dbg_wrtest(char* name)
+{
+ char text[81920];
+ int i;
+ int x=0;
+ int pos = 0;
+ int block=0;
+ int size, fd, rc;
+ char tmp[CHUNKSIZE+1];
+
+ fd = open(name,O_RDWR);
+ if (fd<0) {
+ DEBUGF("Failed opening file\n");
+ return -1;
+ }
+
+ size = lseek(fd, 0, SEEK_END);
+ DEBUGF("File is %d bytes\n", size);
+ /* random start position */
+ if ( size )
+ pos = ((int)rand() % size) & ~7;
+ rc = lseek(fd, pos, SEEK_SET);
+ if ( rc < 0 )
+ panicf("Failed seeking\n");
+ x = pos / CHUNKSIZE;
+ LDEBUGF("Check base is %x (%d)\n",x,pos);
+
+ sprintf(tmp,"%c%06x,",name[1],x++);
+ rc = write(fd, tmp, 8);
+ if ( rc < 0 )
+ panicf("Failed writing data\n");
+
+ if ( size )
+ pos = ((int)rand() % size) & ~7;
+ rc = lseek(fd, pos, SEEK_SET);
+ if ( rc < 0 )
+ panicf("Failed seeking\n");
+ x = pos / CHUNKSIZE;
+ LDEBUGF("Check base 2 is %x (%d)\n",x,pos);
+
+ while (1) {
+ rc = read(fd, text, sizeof text);
+ DEBUGF("read %d bytes\n",rc);
+ if (rc < 0) {
+ panicf("Failed reading data\n");
+ }
+ else {
+ if (!rc)
+ break;
+ for (i=0; i<rc/CHUNKSIZE; i++ ) {
+ sprintf(tmp,"%c%06x,",name[1],x++);
+ if (strncmp(text+i*CHUNKSIZE,tmp,CHUNKSIZE)) {
+ int idx = pos + block*sizeof(text) + i*CHUNKSIZE;
+ DEBUGF("Mismatch in byte 0x%x (byte 0x%x of sector 0x%x)."
+ "\nExpected %.8s found %.8s\n",
+ idx, idx % SECTOR_SIZE, idx / SECTOR_SIZE,
+ tmp,
+ text+i*CHUNKSIZE);
+ DEBUGF("i=%x, idx=%x\n",i,idx);
+ dbg_dump_buffer(text+i*CHUNKSIZE - 0x20, 0x40, idx - 0x20);
return -1;
}
}
@@ -207,6 +299,64 @@ void dbg_type(char* name)
close(fd);
}
+int dbg_append(char* name)
+{
+ int x=0;
+ int size, fd, rc;
+ char tmp[CHUNKSIZE+1];
+
+ fd = open(name,O_RDONLY);
+ if (fd<0) {
+ DEBUGF("Failed opening file\n");
+ return -1;
+ }
+
+ size = lseek(fd, 0, SEEK_END);
+ DEBUGF("File is %d bytes\n", size);
+ x = size / CHUNKSIZE;
+ LDEBUGF("Check base is %x (%d)\n",x,size);
+
+ close(fd);
+
+ fd = open(name,O_RDWR|O_APPEND);
+ if (fd<0) {
+ DEBUGF("Failed opening file\n");
+ return -1;
+ }
+
+ sprintf(tmp,"%c%06x,",name[1],x++);
+ rc = write(fd, tmp, 8);
+ if ( rc < 0 )
+ panicf("Failed writing data\n");
+
+ close(fd);
+
+ return 0;
+}
+
+int dbg_dump(char* name, int offset)
+{
+ char buf[SECTOR_SIZE];
+
+ int rc;
+ int fd = open(name,O_RDONLY);
+ if (fd<0) {
+ DEBUGF("Failed opening file\n");
+ return -1;
+ }
+ lseek(fd, offset, SEEK_SET);
+ rc = read(fd, buf, sizeof buf);
+
+ if ( rc < 0 )
+ panicf("Error reading data\n");
+
+ close(fd);
+
+ dbg_dump_buffer(buf, rc, offset);
+
+ return 0;
+}
+
void dbg_tail(char* name)
{
unsigned char buf[SECTOR_SIZE*5];
@@ -240,14 +390,14 @@ void dbg_tail(char* name)
close(fd);
}
-void dbg_head(char* name)
+int dbg_head(char* name)
{
unsigned char buf[SECTOR_SIZE*5];
int fd,rc;
fd = open(name,O_RDONLY);
if (fd<0)
- return;
+ return -1;
DEBUGF("Got file descriptor %d\n",fd);
rc = read(fd, buf, SECTOR_SIZE*3);
@@ -265,19 +415,36 @@ void dbg_head(char* name)
}
close(fd);
+ return 0;
}
-int dbg_del(char* name)
+int dbg_trunc(char* name, int size)
{
- return remove(name);
-}
+ int fd,rc;
-char current_directory[256] = "\\";
-int last_secnum = 0;
+#if 1
+ fd = open(name,O_RDWR);
+ if (fd<0)
+ return -1;
-void dbg_prompt(void)
-{
- DEBUGF("C:%s> ", current_directory);
+ rc = ftruncate(fd, size);
+ if (rc<0) {
+ DEBUGF("ftruncate(%d) failed\n", size);
+ return -2;
+ }
+
+#else
+ fd = open(name,O_RDWR|O_TRUNC);
+ if (fd<0)
+ return -1;
+
+ rc = lseek(fd, size, SEEK_SET);
+ if (fd<0)
+ return -2;
+#endif
+
+ close(fd);
+ return 0;
}
int dbg_cmd(int argc, char *argv[])
@@ -306,6 +473,11 @@ int dbg_cmd(int argc, char *argv[])
" mkfile <file> <size (KB)>\n"
" chkfile <file>\n"
" del <file>\n"
+ " dump <file> <offset>\n"
+ " mkdir <dir>\n"
+ " trunc <file> <size>\n"
+ " wrtest <file>\n"
+ " append <file>\n"
);
return -1;
}
@@ -335,7 +507,7 @@ int dbg_cmd(int argc, char *argv[])
if (!strcasecmp(cmd, "head"))
{
if (arg1)
- dbg_head(arg1);
+ return dbg_head(arg1);
}
if (!strcasecmp(cmd, "tail"))
@@ -367,7 +539,41 @@ int dbg_cmd(int argc, char *argv[])
if (!strcasecmp(cmd, "del"))
{
if (arg1)
- return dbg_del(arg1);
+ return remove(arg1);
+ }
+
+ if (!strcasecmp(cmd, "dump"))
+ {
+ if (arg1) {
+ if (arg2)
+ return dbg_dump(arg1, atoi(arg2));
+ else
+ return dbg_dump(arg1, 0);
+ }
+ }
+
+ if (!strcasecmp(cmd, "dump"))
+ {
+ if (arg1)
+ return mkdir(arg1);
+ }
+
+ if (!strcasecmp(cmd, "wrtest"))
+ {
+ if (arg1)
+ return dbg_wrtest(arg1);
+ }
+
+ if (!strcasecmp(cmd, "append"))
+ {
+ if (arg1)
+ return dbg_append(arg1);
+ }
+
+ if (!strcasecmp(cmd, "trunc"))
+ {
+ if (arg1 && arg2)
+ return dbg_trunc(arg1, atoi(arg2));
}
return 0;
@@ -379,6 +585,10 @@ int main(int argc, char *argv[])
{
int rc,i;
struct partinfo* pinfo;
+ struct timeval tv;
+
+ gettimeofday(&tv, NULL);
+ srand(tv.tv_usec);
if(ata_init("disk.img")) {
DEBUGF("*** Warning! The disk is uninitialized\n");