### Question:
KeyProvider { public static String getBaseName(String versionName) throws IOException { int div = versionName.lastIndexOf('@'); if (div == -1) { throw new IOException("No version in key path " + versionName); } return versionName.substring(0, div); }  static Options options(Configuration conf); boolean isTransient(); abstract KeyVersion getKeyVersion(String versionName
                                            ); abstract List<String> getKeys(); Metadata[] getKeysMetadata(String... names); abstract List<KeyVersion> getKeyVersions(String name); KeyVersion getCurrentKey(String name); abstract Metadata getMetadata(String name); abstract KeyVersion createKey(String name, byte[] material,
                                       Options options); KeyVersion createKey(String name, Options options); abstract void deleteKey(String name); abstract KeyVersion rollNewVersion(String name,
                                             byte[] material
                                            ); KeyVersion rollNewVersion(String name); abstract void flush(); static String getBaseName(String versionName); static Path unnestUri(URI nestedUri); static KeyProvider findProvider(List<KeyProvider> providerList,
                                         String keyName); static final String DEFAULT_CIPHER_NAME; static final String DEFAULT_CIPHER; static final String DEFAULT_BITLENGTH_NAME; static final int DEFAULT_BITLENGTH; }### Answer:
@Test public void testParseVersionName() throws Exception { assertEquals("/a/b", KeyProvider.getBaseName("/a/b@3")); assertEquals("/aaa", KeyProvider.getBaseName("/aaa@112")); try { KeyProvider.getBaseName("no-slashes"); assertTrue("should have thrown", false); } catch (IOException e) { assertTrue(true); } }