Author: saces
Date: 2007-03-16 17:43:46 +0000 (Fri, 16 Mar 2007)
New Revision: 12155
Added:
trunk/freenet/src/freenet/node/fcp/TestDDAMessage.java
Log:
new TestDDA command
Added: trunk/freenet/src/freenet/node/fcp/TestDDAMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/TestDDAMessage.java
(rev 0)
+++ trunk/freenet/src/freenet/node/fcp/TestDDAMessage.java 2007-03-16
17:43:46 UTC (rev 12155)
@@ -0,0 +1,253 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.node.fcp;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import java.io.FilenameFilter;
+import java.util.Arrays;
+import java.util.Random;
+
+import freenet.node.Node;
+import freenet.support.HexUtil;
+import freenet.support.SimpleFieldSet;
+
+/**
+ * TestDDA
+ * Identifier=indent123unique [mandatory]
+ * DirToTest=/path/to/dir [mandatory] the dir to test
+ * TestList=true [default: false] can we
list the dir?
+ * ReadFilename=fileindir.ext the filename for read test
+ *
readtest skipped if missing or empty
+ * the read test file needs to be an existing regular file
+ * and must have size != 0!
+ * WriteFilename=hallo.test the filename for write test
+ * WriteFilename= the node will generate
an unique filename (recommended)
+ *
writetest skipped on missing
+ * if a name is given, the client have to make
sure the file doesn't exist!
+ *
+ * DeleteTestFile= [default: true]
+ * the testfile is only left if the read test was
ok.
+ *
+ *
+ *
+ */
+public class TestDDAMessage extends FCPMessage {
+
+ private short status = -1;
+
+ static final String name = "TestDDA";
+
+ private boolean resultList = false;
+ private boolean resultWrite = false;
+
+ private String writeTestFilename = null; // set if it is generated
+ private String readResult = null;
+ private String writeResult = null;
+ final boolean testlist;
+ final String identifier;
+ final String dir2test;
+ final String readfilename;
+ final String writefilename;
+
+ private final boolean deleteFile;
+
+ /**
+ * @throws MessageInvalidException
+ */
+ public TestDDAMessage(SimpleFieldSet fs) throws MessageInvalidException
{
+ identifier = fs.get("Identifier");
+ if(identifier == null)
+ throw new
MessageInvalidException(ProtocolErrorMessage.MISSING_FIELD, "No Identifier",
null, false);
+
+ dir2test = fs.get("DirToTest");
+ if(dir2test == null)
+ throw new
MessageInvalidException(ProtocolErrorMessage.MISSING_FIELD, "No Identifier",
identifier, false);
+ if(dir2test.trim().length() == 0)
+ throw new
MessageInvalidException(ProtocolErrorMessage.MISSING_FIELD, "DirToTest can't be
empty!", identifier, false);
+
+ String rfn = fs.get("ReadFilename");
+ if(rfn != null)
+ if (rfn.trim().length() > 0)
+ readfilename = rfn;
+ else
+ throw new
MessageInvalidException(ProtocolErrorMessage.INVALID_FIELD, "Read test filename
can't be empty!", identifier, false);
+ else readfilename = null;
+
+ String wfn = fs.get("WriteFilename");
+
+ if (wfn == null)
+ writefilename = null;
+ else
+ writefilename = wfn;
+
+ deleteFile = fs.getBoolean("DeleteTestFile", true);
+
+ testlist = fs.getBoolean("TestList", false);
+ }
+
+ public SimpleFieldSet getFieldSet() {
+ SimpleFieldSet fs = new SimpleFieldSet(true);
+ fs.putSingle("Identifier", identifier);
+ fs.putSingle("TestedDir", dir2test);
+ fs.putSingle("Status", getStatus());
+ if (status == 0) {
+ if (testlist)
+ fs.putSingle("ListTest",
getResultName(resultList));
+ else
+ fs.putSingle("ListTest", "Skipped");
+
+ if (readfilename != null) {
+ if (readResult == null) {
+ fs.putSingle("ReadTest",
getResultName(false));
+ } else {
+ fs.putSingle("ReadTest",
getResultName(true));
+ fs.putSingle("ReadResult", readResult);
+ }
+ } else
+ fs.putSingle("ReadTest", "Skipped");
+
+ if (writefilename != null) {
+ if (writeTestFilename != null) {
+ fs.putSingle("WriteFileName",
writeTestFilename);
+ } else {
+ fs.putSingle("WriteFileName",
writefilename);
+ }
+ fs.putSingle("WriteData", writeResult);
+ fs.putSingle("WriteTest",
getResultName(resultWrite));
+ } else
+ fs.putSingle("WriteTest", "Skipped");
+ } else if (status == -1) {
+ fs.putSingle("Description", "Test not started");
+ } else if (status == 1) {
+ fs.putSingle("Description", "Dir doesn't exist or isn't
acccessible");
+ } else
+ fs.putSingle("Description", "Unknown status? please
report");
+ return fs;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void run(FCPConnectionHandler handler, Node node)
+ throws MessageInvalidException {
+ realTest();
+ handler.outputHandler.queue(this);
+ }
+
+ private void realTest() throws MessageInvalidException {
+
+ // first test dir itself
+ File dir = new File(dir2test);
+
+ if (!dir.isDirectory()) {
+ status = 1;
+ return;
+ }
+
+
+ // can list dir?
+ FilenameFilter dirLimiter = new FilenameFilter() {
+ private int limit = 10;
+
+ public boolean accept(File dir, String name) {
+ if (limit <1) return false;
+ limit--;
+ return true;
+ }
+ };
+
+ String[] t_dirList = dir.list(dirLimiter);
+ resultList = (t_dirList != null);
+
+ // read
+ if (readfilename != null) {
+
+ File t_read = new File(dir, readfilename);
+
+ if (!t_read.isFile())
+ throw new
MessageInvalidException(ProtocolErrorMessage.FILE_NOT_FOUND, "Read test
filename must be an existing regular file!", identifier, false);
+
+ if (t_read.length() == 0)
+ throw new
MessageInvalidException(ProtocolErrorMessage.NOT_SUPPORTED, "Read test file
must have content! File size is null!", identifier, false);
+
+ // read first max 8 bytes
+ try {
+ FileInputStream fis = new
FileInputStream(t_read);
+ byte[] b = new byte[8];
+ int l;
+ try {
+ l = fis.read(b, 0, 8);
+ readResult = HexUtil.bytesToHex(b, 0
,l);
+ } catch (IOException e) {
+ }
+ fis.close();
+ } catch (FileNotFoundException e) {
+ } catch (IOException e) {
+ }
+ }
+
+ // write
+ if (writefilename != null) {
+
+ Random r = new Random();
+ byte[] b = new byte[8];
+
+ r.nextBytes(b);
+
+ File f;
+ try {
+ if (writefilename.trim().length() == 0) {
+ //generate one
+ f = File.createTempFile("NodeDDAtest",
".dat", dir);
+ writeTestFilename = f.getName();
+ } else {
+ f = new File(dir, writefilename);
+ if (f.exists()) {
+ throw new
MessageInvalidException(ProtocolErrorMessage.DISK_TARGET_EXISTS, "Write test
target file can't exist!", identifier, false);
+ }
+ }
+
+ f.deleteOnExit();
+
+ FileOutputStream fos = new FileOutputStream(f);
+ fos.write(b);
+ fos.close();
+
+ FileInputStream fis = new FileInputStream(f);
+
+ byte[] bb = new byte[8];
+
+ fis.read(bb);
+ fis.close();
+
+ writeResult= HexUtil.bytesToHex(bb, 0 ,8);
+ resultWrite = Arrays.equals(b, bb);
+
+ if (deleteFile)
+ f.delete();
+
+ } catch (IOException ioe) {
+ }
+ }
+ status = 0;
+ }
+
+ private String getStatus() {
+ if (status == 0) return "Done";
+ if (status > 0) return "Failed";
+ return "Unknown";
+ }
+
+ private String getResultName(boolean rn) {
+ if (rn) return "OK";
+ return "Failed";
+ }
+
+}