Hi,
I'm reporting back on my unit-testing results.
class TestFileSystem {
...
public void test() throws Exception {
testFileSystem(getBaseDir() + "/fs"); // Passes
testAbsoluteRelative(); // Passes
testDirectories(getBaseDir()); // Passes
testMoveTo(getBaseDir()); // Passes
// ALL subsequent ones fail!
// testUnsupportedFeatures(getBaseDir());
// ...
The first 4 testXXX() calls now pass. I did manage to discover and fix a
few bugs in my FileChannel and RandomAccessFile classes using these tests,
so thanks!
The testUnsupportedFeatures() call fails because my file-system does indeed
support some of those features instead of throwing
UnsupportedOperationException.
All of the rest of the testXXX() calls that test more exotic H2 features
like zip:, memfs:, etc fail because I don't support them. I hope H2 does
not rely on those features if my connection URL is simply "
jdbc:h2:foofs:/abc;CIPHER=AES".
Can I now conclude that my file-system code meets the requirements needed
to run H2? Obviously not(!)... because the original problems -- namely, DB
file size increasing upon each run, and the exception during
connection-close -- still remain! The PageStore.compact() method is not
doing its compacting job for some reason and due to complete lack of H2
internals knowledge I don't know how to debug this further.
Any suggestions on what to do next?
Regards,
/PN
PS: Btw, I found a minor difference between H2's Channel and that of the
JDK spec. The last asserEquals in the following snippet fails...
class TestFileSystem {
...
private void testRandomAccess(String fsBase, int seed) throws Exception
{
StringBuilder buff = new StringBuilder();
String s = FileUtils.createTempFile(fsBase + "/tmp", ".tmp", false,
false);
File file = new File(TestBase.BASE_TEST_DIR + "/tmp");
file.getParentFile().mkdirs();
file.delete();
RandomAccessFile ra = new RandomAccessFile(file, "rw");
FileUtils.delete(s);
FileChannel f = FileUtils.open(s, "rw");
assertEquals(s, f.toString());
... because in the JDK spec there's no requirement that a file channel's
toString() must return the name of the file it is backing. As a quick fix,
I've added toString() to my own Channel class but this is just an fyi.
On Wednesday, April 30, 2014 9:59:10 PM UTC+5:30, Thomas Mueller wrote:
>
> Hi,
>
> Sure, H2 we can change, but I guess you want to support other applications
> as well, and some are not as easy to change. If you can show there is a bug
> in H2 or the unit test of H2: patches are welcome!
>
> > But if I could keep it optional, I would have preferred to /not/ use it
> at all!
>
> What I mean is:
>
> Legacy: For some libraries and applications that use java.io.* directly,
> you can use the bootclasspath part (changed java.io. classes). That way
> the application and library doesn't have to be changed, but starting the
> JVM is more complicated.
>
> Clean: For other libraries and applications, for example H2, that do have
> a file system abstraction or use Java 7 style NIO2. That simplifies
> starting those applications, as no bootclasspath hacks are needed.
>
> There might be mixed cases (both Legacy and Clean) within the same JVM,
> that would result in Legacy mode. But there are also Clean use cases, for
> example running the H2 server.
>
> Regards,
> Thomas
>
>
>
>
>
>
>
> On Wed, Apr 30, 2014 at 9:19 AM, PN <[email protected] <javascript:>>wrote:
>
>> Hi Thomas.
>>
>>
>> > I'm overriding 4 classes of the java.io package
>>>
>>> In theory, what you do should work, but making it 100% compatible with
>>> java.io.* is very hard, if not impossible: some applications may rely on
>>> implementation details. You could argue this is a bug in the application,
>>> but it's still problematic to have to change the bootclasspath to use your
>>> tool.
>>>
>>
>> By "application", I believe you mean H2 here. I would greatly appreciate
>> if you could share some insights on why achieving 100% compatibility with
>> java.io.* would be hard or impossible, especially when H2, like all Java
>> clients, would, in my guess,
>> a) be relying only on the public, documented class interface of
>> java.io.*
>> AND
>> b) H2's test suite (such as TestFileSystem) further asserting on this
>> compatibility or lack thereof.
>> AND
>> c) the fact of H2's availability on multiple OSes and JVMs.
>>
>> In fact, wouldn't this the current situation be a good usecase for
>> re-examining (a) or (b)?
>>
>> Just fyi, all that I'm doing in my tweaks to the 4 java.io.* classes is
>> scheme-routing. Meaning, every method body in my version now has a giant
>> if-else inside: If the scheme of the filename is "myfs:" then I route it to
>> my code; else I use the original code. That's all!
>>
>> So, if TestFileSystem is unable to pass some test, it may very well be
>> due to some bug in my code. Or, it could be because the H2 test suite is
>> too 'tight' in some of its assumptions (bootclasspath use or no-use being
>> one example, but there could be others too). Or, both.
>>
>> Since H2 has been around for many years, and would be much more stable
>> and robust by now in every way especially compared to my code which is just
>> work-in-progress, I would love to use H2 to test my code. But only if I
>> know at the outset that things like bootclasspath are allowed and no
>> implementation-specific java.io.* features are in use.
>>
>>
>> What I would do is keep that part (the java.io.* part) optional, so your
>>> tool can be used without having to change the bootclasspath. Then of course
>>> can only be used with H2 and Java 7+, but it's much cleaner and easier to
>>> use.
>>>
>>
>> But if I could keep it optional, I would have preferred to /not/ use it
>> at all! My constraints is: The older Java apps, that have no counterpart
>> for NIO2 of Java 7 or FilePath of H2, have to run alongside H2 in the same
>> JVM!
>>
>> Regards,
>> /PN
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "H2 Database" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected] <javascript:>.
>> To post to this group, send email to [email protected]<javascript:>
>> .
>> Visit this group at http://groups.google.com/group/h2-database.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>
--
You received this message because you are subscribed to the Google Groups "H2
Database" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/h2-database.
For more options, visit https://groups.google.com/d/optout.