Michael, I believe your test case sidesteps the issue here by manually building the changed file list. CvsLog.java uses file.getSimpleName(), and so the CvsFile objects never get created with the full path - just the filename.
So where you have done:
new CvsFile("subdir/subdir2/test.ext", "1.1", false)
new CvsFile(file.getSimpleName(), file.getRevision(), file.isDead())
Where file.getSimpleName just returns "text.ext" as specified in CVSChangeLogSet.java, where the doc is:
Gets just the last component of the path, like "zot.c"
I think using getFullName instead, as Jeremy suggested, might fix it, but I'm not sure if other code would be affected.