### Question:
FSBlob extends AbstractBlob { @Override public URI getCanonicalId() { return canonicalId; } FSBlob(FSBlobStoreConnection connection, File baseDir, URI blobId, StreamManager manager,
         Set<File> modified); @Override URI getCanonicalId(); @Override InputStream openInputStream(); @Override OutputStream openOutputStream(long estimatedSize, boolean overwrite); @Override long getSize(); @Override boolean exists(); @Override void delete(); @Override Blob moveTo(URI blobId, Map<String, String> hints); static final String FORCE_MOVE_AS_COPY_AND_DELETE; }### Answer:
@Test public void testGetCanonicalId() { assertCanonical("file:foo"); assertCanonical("file:foo/bar"); assertCanonical("file:6a/1b/1e/info%3Afoo%2Fbar.baz%2E"); assertCanonical("file:..."); assertCanonical("file:.../foo"); assertCanonical("file:foo/..."); assertCanonical("file:foo/.../bar"); assertCanonical("file:foo/../bar", "file:bar"); assertCanonical("file:foo/bar/../../baz", "file:baz"); assertCanonical("file:foo/../bar/../qux", "file:qux"); assertCanonical("file:./foo", "file:foo"); assertCanonical("file:foo/./bar", "file:foo/bar"); assertCanonical("file:foo/bar/././baz", "file:foo/bar/baz"); assertCanonical("file:foo/./bar/./qux", "file:foo/bar/qux"); assertCanonical("FILE:foo", "file:foo"); assertCanonical("file:foo assertCanonical("file:foo }