Search in sources :

Example 1 with VoltCompiler

use of org.voltdb.compiler.VoltCompiler in project voltdb by VoltDB.

the class TestUpdateClasses method testRoleControl.

@Test
public void testRoleControl() throws Exception {
    System.out.println("\n\n-----\n testRoleControl \n-----\n\n");
    String pathToCatalog = Configuration.getPathToCatalogForTest("updateclasses.jar");
    String pathToDeployment = Configuration.getPathToCatalogForTest("updateclasses.xml");
    VoltProjectBuilder builder = new VoltProjectBuilder();
    builder.addLiteralSchema("-- Don't care");
    builder.setUseDDLSchema(true);
    RoleInfo[] groups = new RoleInfo[] { new RoleInfo("adhoc", true, false, false, false, false, false) };
    UserInfo[] users = new UserInfo[] { new UserInfo("adhocuser", "adhocuser", new String[] { "adhoc" }), new UserInfo("sysuser", "sysuser", new String[] { "ADMINISTRATOR" }) };
    builder.addRoles(groups);
    builder.addUsers(users);
    // Test defines its own ADMIN user
    builder.setSecurityEnabled(true, false);
    boolean success = builder.compile(pathToCatalog, 2, 1, 0);
    assertTrue("Schema compilation failed", success);
    MiscUtils.copyFile(builder.getPathToDeployment(), pathToDeployment);
    // This is maybe cheating a little bit?
    InMemoryJarfile jarfile = new InMemoryJarfile();
    for (Class<?> clazz : PROC_CLASSES) {
        VoltCompiler comp = new VoltCompiler(false);
        comp.addClassToJar(jarfile, clazz);
    }
    for (Class<?> clazz : EXTRA_CLASSES) {
        VoltCompiler comp = new VoltCompiler(false);
        comp.addClassToJar(jarfile, clazz);
    }
    Client auth_client = null;
    try {
        VoltDB.Configuration config = new VoltDB.Configuration();
        config.m_pathToCatalog = pathToCatalog;
        config.m_pathToDeployment = pathToDeployment;
        // Default client auth is going to fail, catch and keep chugging
        try {
            startSystem(config);
        } catch (IOException ioe) {
            assertTrue(ioe.getMessage().contains("Authentication rejected"));
        }
        m_client.close();
        // reconnect m_client with auth that will connect but no sysproc powers
        ClientConfig bad_config = new ClientConfig("adhocuser", "adhocuser");
        m_client = ClientFactory.createClient(bad_config);
        m_client.createConnection("localhost");
        // Need a client with the right auth
        ClientConfig auth_config = new ClientConfig("sysuser", "sysuser");
        auth_client = ClientFactory.createClient(auth_config);
        auth_client.createConnection("localhost");
        ClientResponse resp;
        resp = auth_client.callProcedure("@SystemCatalog", "CLASSES");
        System.out.println(resp.getResults()[0]);
        // New cluster, you're like summer vacation...
        assertEquals(0, resp.getResults()[0].getRowCount());
        assertFalse(VoltTableTestHelpers.moveToMatchingRow(resp.getResults()[0], "CLASS_NAME", PROC_CLASSES[0].getCanonicalName()));
        boolean threw = false;
        try {
            resp = auth_client.callProcedure(PROC_CLASSES[0].getSimpleName());
        } catch (ProcCallException pce) {
            assertTrue(pce.getMessage().contains("was not found"));
            threw = true;
        }
        assertTrue(threw);
        threw = false;
        try {
            resp = m_client.callProcedure("@UpdateClasses", jarfile.getFullJarBytes(), null);
        } catch (ProcCallException pce) {
            assertTrue(pce.getMessage().contains("does not have admin permission"));
            threw = true;
        }
        assertTrue(threw);
        resp = auth_client.callProcedure("@UpdateClasses", jarfile.getFullJarBytes(), null);
        assertEquals(ClientResponse.SUCCESS, resp.getStatus());
        // Are we still like summer vacation?
        resp = auth_client.callProcedure("@SystemCatalog", "CLASSES");
        VoltTable results = resp.getResults()[0];
        System.out.println(results);
        assertEquals(3, results.getRowCount());
        assertTrue(VoltTableTestHelpers.moveToMatchingRow(results, "CLASS_NAME", PROC_CLASSES[0].getCanonicalName()));
        assertEquals(1L, results.getLong("VOLT_PROCEDURE"));
        assertEquals(0L, results.getLong("ACTIVE_PROC"));
    } finally {
        if (auth_client != null) {
            auth_client.close();
        }
        teardownSystem();
    }
}
Also used : ClientResponse(org.voltdb.client.ClientResponse) Configuration(org.voltdb.VoltDB.Configuration) UserInfo(org.voltdb.compiler.VoltProjectBuilder.UserInfo) IOException(java.io.IOException) VoltTable(org.voltdb.VoltTable) VoltDB(org.voltdb.VoltDB) VoltCompiler(org.voltdb.compiler.VoltCompiler) RoleInfo(org.voltdb.compiler.VoltProjectBuilder.RoleInfo) VoltProjectBuilder(org.voltdb.compiler.VoltProjectBuilder) InMemoryJarfile(org.voltdb.utils.InMemoryJarfile) Configuration(org.voltdb.VoltDB.Configuration) Client(org.voltdb.client.Client) ClientConfig(org.voltdb.client.ClientConfig) ProcCallException(org.voltdb.client.ProcCallException) Test(org.junit.Test)

Example 2 with VoltCompiler

use of org.voltdb.compiler.VoltCompiler in project voltdb by VoltDB.

the class TestUpdateClasses method testBasic.

@Test
public void testBasic() throws Exception {
    System.out.println("\n\n-----\n testBasic \n-----\n\n");
    String pathToCatalog = Configuration.getPathToCatalogForTest("updateclasses.jar");
    String pathToDeployment = Configuration.getPathToCatalogForTest("updateclasses.xml");
    VoltProjectBuilder builder = new VoltProjectBuilder();
    builder.addLiteralSchema("-- Don't care");
    builder.setUseDDLSchema(true);
    boolean success = builder.compile(pathToCatalog, 2, 1, 0);
    assertTrue("Schema compilation failed", success);
    MiscUtils.copyFile(builder.getPathToDeployment(), pathToDeployment);
    // This is maybe cheating a little bit?
    InMemoryJarfile jarfile = new InMemoryJarfile();
    for (Class<?> clazz : PROC_CLASSES) {
        VoltCompiler comp = new VoltCompiler(false);
        comp.addClassToJar(jarfile, clazz);
    }
    for (Class<?> clazz : EXTRA_CLASSES) {
        VoltCompiler comp = new VoltCompiler(false);
        comp.addClassToJar(jarfile, clazz);
    }
    // Add a deployment file just to have something other than classes in the jar
    jarfile.put("deployment.xml", new File(pathToDeployment));
    try {
        VoltDB.Configuration config = new VoltDB.Configuration();
        config.m_pathToCatalog = pathToCatalog;
        config.m_pathToDeployment = pathToDeployment;
        startSystem(config);
        ClientResponse resp;
        resp = m_client.callProcedure("@SystemCatalog", "CLASSES");
        System.out.println(resp.getResults()[0]);
        // New cluster, you're like summer vacation...
        assertEquals(0, resp.getResults()[0].getRowCount());
        assertFalse(VoltTableTestHelpers.moveToMatchingRow(resp.getResults()[0], "CLASS_NAME", PROC_CLASSES[0].getCanonicalName()));
        boolean threw = false;
        try {
            resp = m_client.callProcedure(PROC_CLASSES[0].getSimpleName());
        } catch (ProcCallException pce) {
            assertTrue(pce.getMessage().contains("was not found"));
            threw = true;
        }
        assertTrue(threw);
        // First, some tests of incorrect parameters
        // only 1 param
        threw = false;
        try {
            resp = m_client.callProcedure("@UpdateClasses", jarfile.getFullJarBytes());
        } catch (ProcCallException pce) {
            assertTrue(pce.getMessage().contains("UpdateClasses system procedure requires exactly two parameters"));
            threw = true;
        }
        assertTrue(threw);
        // wrong jarfile param type
        threw = false;
        try {
            resp = m_client.callProcedure("@UpdateClasses", 10L, null);
        } catch (ProcCallException pce) {
            assertTrue(pce.getMessage().contains("UpdateClasses system procedure takes the jarfile bytes as a byte array"));
            threw = true;
        }
        assertTrue(threw);
        // wrong delete string param type
        threw = false;
        try {
            resp = m_client.callProcedure("@UpdateClasses", jarfile.getFullJarBytes(), 10L);
        } catch (ProcCallException pce) {
            assertTrue(pce.getMessage().contains("UpdateClasses system procedure takes the list of classes"));
            threw = true;
        }
        assertTrue(threw);
        resp = m_client.callProcedure("@UpdateClasses", jarfile.getFullJarBytes(), null);
        System.out.println(((ClientResponseImpl) resp).toJSONString());
        // Are we still like summer vacation?
        resp = m_client.callProcedure("@SystemCatalog", "CLASSES");
        VoltTable results = resp.getResults()[0];
        System.out.println(results);
        assertEquals(3, results.getRowCount());
        assertTrue(VoltTableTestHelpers.moveToMatchingRow(results, "CLASS_NAME", PROC_CLASSES[0].getCanonicalName()));
        assertEquals(1L, results.getLong("VOLT_PROCEDURE"));
        assertEquals(0L, results.getLong("ACTIVE_PROC"));
        // Can we turn it into a procedure?
        resp = m_client.callProcedure("@AdHoc", "create procedure from class " + PROC_CLASSES[0].getCanonicalName() + ";");
        System.out.println(((ClientResponseImpl) resp).toJSONString());
        resp = m_client.callProcedure(PROC_CLASSES[0].getSimpleName());
        assertEquals(ClientResponse.SUCCESS, resp.getStatus());
        results = resp.getResults()[0];
        assertEquals(10L, results.asScalarLong());
    } finally {
        teardownSystem();
    }
}
Also used : ClientResponse(org.voltdb.client.ClientResponse) Configuration(org.voltdb.VoltDB.Configuration) VoltTable(org.voltdb.VoltTable) VoltDB(org.voltdb.VoltDB) VoltCompiler(org.voltdb.compiler.VoltCompiler) VoltProjectBuilder(org.voltdb.compiler.VoltProjectBuilder) InMemoryJarfile(org.voltdb.utils.InMemoryJarfile) Configuration(org.voltdb.VoltDB.Configuration) File(java.io.File) ProcCallException(org.voltdb.client.ProcCallException) Test(org.junit.Test)

Example 3 with VoltCompiler

use of org.voltdb.compiler.VoltCompiler in project voltdb by VoltDB.

the class TestUpdateClasses method testCollidingClasses.

@Test
public void testCollidingClasses() throws Exception {
    System.out.println("\n\n-----\n testCollidingProc \n-----\n\n");
    String pathToCatalog = Configuration.getPathToCatalogForTest("updateclasses.jar");
    String pathToDeployment = Configuration.getPathToCatalogForTest("updateclasses.xml");
    VoltProjectBuilder builder = new VoltProjectBuilder();
    builder.addLiteralSchema("-- Don't care");
    builder.setUseDDLSchema(true);
    boolean success = builder.compile(pathToCatalog, 2, 1, 0);
    assertTrue("Schema compilation failed", success);
    MiscUtils.copyFile(builder.getPathToDeployment(), pathToDeployment);
    // This is maybe cheating a little bit?
    InMemoryJarfile jarfile = new InMemoryJarfile();
    for (Class<?> clazz : PROC_CLASSES) {
        VoltCompiler comp = new VoltCompiler(false);
        comp.addClassToJar(jarfile, clazz);
    }
    for (Class<?> clazz : EXTRA_CLASSES) {
        VoltCompiler comp = new VoltCompiler(false);
        comp.addClassToJar(jarfile, clazz);
    }
    try {
        VoltDB.Configuration config = new VoltDB.Configuration();
        config.m_pathToCatalog = pathToCatalog;
        config.m_pathToDeployment = pathToDeployment;
        startSystem(config);
        ClientResponse resp;
        resp = m_client.callProcedure("@SystemCatalog", "CLASSES");
        System.out.println(resp.getResults()[0]);
        // New cluster, you're like summer vacation...
        assertEquals(0, resp.getResults()[0].getRowCount());
        assertFalse(VoltTableTestHelpers.moveToMatchingRow(resp.getResults()[0], "CLASS_NAME", PROC_CLASSES[0].getCanonicalName()));
        boolean threw = false;
        try {
            resp = m_client.callProcedure(PROC_CLASSES[0].getSimpleName());
        } catch (ProcCallException pce) {
            assertTrue(pce.getMessage().contains("was not found"));
            threw = true;
        }
        assertTrue(threw);
        resp = m_client.callProcedure("@UpdateClasses", jarfile.getFullJarBytes(), null);
        System.out.println(((ClientResponseImpl) resp).toJSONString());
        // Are we still like summer vacation?
        resp = m_client.callProcedure("@SystemCatalog", "CLASSES");
        VoltTable results = resp.getResults()[0];
        System.out.println(results);
        assertEquals(3, results.getRowCount());
        assertTrue(VoltTableTestHelpers.moveToMatchingRow(results, "CLASS_NAME", PROC_CLASSES[0].getCanonicalName()));
        assertEquals(1L, results.getLong("VOLT_PROCEDURE"));
        assertEquals(0L, results.getLong("ACTIVE_PROC"));
        // Can we turn it into a procedure?
        resp = m_client.callProcedure("@AdHoc", "create procedure from class " + PROC_CLASSES[0].getCanonicalName() + ";");
        System.out.println(((ClientResponseImpl) resp).toJSONString());
        resp = m_client.callProcedure(PROC_CLASSES[0].getSimpleName());
        assertEquals(ClientResponse.SUCCESS, resp.getStatus());
        results = resp.getResults()[0];
        assertEquals(10L, results.asScalarLong());
        // now, let's collide identically simpleName'd classes
        InMemoryJarfile boom = new InMemoryJarfile();
        for (Class<?> clazz : COLLIDING_CLASSES) {
            VoltCompiler comp = new VoltCompiler(false);
            comp.addClassToJar(boom, clazz);
        }
        resp = m_client.callProcedure("@UpdateClasses", boom.getFullJarBytes(), null);
        System.out.println(((ClientResponseImpl) resp).toJSONString());
        // should be okay to have classnames with same simplename
        resp = m_client.callProcedure("@SystemCatalog", "CLASSES");
        results = resp.getResults()[0];
        System.out.println(results);
        assertEquals(5, results.getRowCount());
        assertTrue(VoltTableTestHelpers.moveToMatchingRow(results, "CLASS_NAME", COLLIDING_CLASSES[0].getCanonicalName()));
        assertEquals(1L, results.getLong("VOLT_PROCEDURE"));
        assertEquals(0L, results.getLong("ACTIVE_PROC"));
    } finally {
        teardownSystem();
    }
}
Also used : VoltDB(org.voltdb.VoltDB) ClientResponse(org.voltdb.client.ClientResponse) VoltCompiler(org.voltdb.compiler.VoltCompiler) Configuration(org.voltdb.VoltDB.Configuration) VoltProjectBuilder(org.voltdb.compiler.VoltProjectBuilder) InMemoryJarfile(org.voltdb.utils.InMemoryJarfile) Configuration(org.voltdb.VoltDB.Configuration) VoltTable(org.voltdb.VoltTable) ProcCallException(org.voltdb.client.ProcCallException) Test(org.junit.Test)

Example 4 with VoltCompiler

use of org.voltdb.compiler.VoltCompiler in project voltdb by VoltDB.

the class TestUpdateClasses method testBadInitializerClasses.

@Test
public void testBadInitializerClasses() throws Exception {
    System.out.println("\n\n-----\n testBadInitializerClasses \n-----\n\n");
    String pathToCatalog = Configuration.getPathToCatalogForTest("updateclasses.jar");
    String pathToDeployment = Configuration.getPathToCatalogForTest("updateclasses.xml");
    VoltProjectBuilder builder = new VoltProjectBuilder();
    builder.addLiteralSchema("-- Don't care");
    builder.setUseDDLSchema(true);
    boolean success = builder.compile(pathToCatalog, 2, 1, 0);
    assertTrue("Schema compilation failed", success);
    MiscUtils.copyFile(builder.getPathToDeployment(), pathToDeployment);
    try {
        VoltDB.Configuration config = new VoltDB.Configuration();
        config.m_pathToCatalog = pathToCatalog;
        config.m_pathToDeployment = pathToDeployment;
        startSystem(config);
        ClientResponse resp;
        InMemoryJarfile boom = new InMemoryJarfile();
        VoltCompiler comp = new VoltCompiler(false);
        comp.addClassToJar(boom, org.voltdb_testprocs.updateclasses.testBadInitializerProc.class);
        boolean threw = false;
        try {
            resp = m_client.callProcedure("@UpdateClasses", boom.getFullJarBytes(), null);
            System.out.println(((ClientResponseImpl) resp).toJSONString());
        } catch (ProcCallException pce) {
            pce.printStackTrace();
            threw = true;
        }
        assertTrue("Bad class jar should have thrown", threw);
        threw = false;
        boom = new InMemoryJarfile();
        comp = new VoltCompiler(false);
        comp.addClassToJar(boom, org.voltdb_testprocs.updateclasses.BadClassLoadClass.class);
        try {
            resp = m_client.callProcedure("@UpdateClasses", boom.getFullJarBytes(), null);
            System.out.println(((ClientResponseImpl) resp).toJSONString());
        } catch (ProcCallException pce) {
            pce.printStackTrace();
            threw = true;
        }
        assertTrue("Bad class jar should have thrown", threw);
    } finally {
        teardownSystem();
    }
}
Also used : VoltDB(org.voltdb.VoltDB) ClientResponse(org.voltdb.client.ClientResponse) VoltCompiler(org.voltdb.compiler.VoltCompiler) Configuration(org.voltdb.VoltDB.Configuration) VoltProjectBuilder(org.voltdb.compiler.VoltProjectBuilder) InMemoryJarfile(org.voltdb.utils.InMemoryJarfile) Configuration(org.voltdb.VoltDB.Configuration) ProcCallException(org.voltdb.client.ProcCallException) Test(org.junit.Test)

Example 5 with VoltCompiler

use of org.voltdb.compiler.VoltCompiler in project voltdb by VoltDB.

the class TestUpdateClasses method testDeleteClasses.

// Delete tests:
// single file match
// * match
// ** match
// comma-separated matches
// combine new jarfile with deleted stuff
// deleting inner classes
@Test
public void testDeleteClasses() throws Exception {
    System.out.println("\n\n-----\n testCollidingProc \n-----\n\n");
    String pathToCatalog = Configuration.getPathToCatalogForTest("updateclasses.jar");
    String pathToDeployment = Configuration.getPathToCatalogForTest("updateclasses.xml");
    VoltProjectBuilder builder = new VoltProjectBuilder();
    builder.addLiteralSchema("-- Don't care");
    builder.setUseDDLSchema(true);
    boolean success = builder.compile(pathToCatalog, 2, 1, 0);
    assertTrue("Schema compilation failed", success);
    MiscUtils.copyFile(builder.getPathToDeployment(), pathToDeployment);
    // This is maybe cheating a little bit?
    InMemoryJarfile jarfile = new InMemoryJarfile();
    for (Class<?> clazz : PROC_CLASSES) {
        VoltCompiler comp = new VoltCompiler(false);
        comp.addClassToJar(jarfile, clazz);
    }
    for (Class<?> clazz : EXTRA_CLASSES) {
        VoltCompiler comp = new VoltCompiler(false);
        comp.addClassToJar(jarfile, clazz);
    }
    for (Class<?> clazz : COLLIDING_CLASSES) {
        VoltCompiler comp = new VoltCompiler(false);
        comp.addClassToJar(jarfile, clazz);
    }
    try {
        VoltDB.Configuration config = new VoltDB.Configuration();
        config.m_pathToCatalog = pathToCatalog;
        config.m_pathToDeployment = pathToDeployment;
        startSystem(config);
        ClientResponse resp;
        // Make sure we're clean
        resp = m_client.callProcedure("@SystemCatalog", "CLASSES");
        assertEquals(0, resp.getResults()[0].getRowCount());
        // Add the jarfile we built
        resp = m_client.callProcedure("@UpdateClasses", jarfile.getFullJarBytes(), null);
        resp = m_client.callProcedure("@SystemCatalog", "CLASSES");
        assertEquals(PROC_CLASSES.length + EXTRA_CLASSES.length + COLLIDING_CLASSES.length, resp.getResults()[0].getRowCount());
        // remove one class
        assertTrue(findClassInSystemCatalog(PROC_CLASSES[0].getCanonicalName()));
        resp = m_client.callProcedure("@UpdateClasses", null, PROC_CLASSES[0].getCanonicalName());
        assertFalse(findClassInSystemCatalog(PROC_CLASSES[0].getCanonicalName()));
        // remove everything under fullddlfeatures
        assertTrue(findClassInSystemCatalog(COLLIDING_CLASSES[0].getCanonicalName()));
        assertTrue(findClassInSystemCatalog(COLLIDING_CLASSES[1].getCanonicalName()));
        resp = m_client.callProcedure("@UpdateClasses", null, "org.voltdb_testprocs.fullddlfeatures.*");
        assertFalse(findClassInSystemCatalog(COLLIDING_CLASSES[0].getCanonicalName()));
        assertFalse(findClassInSystemCatalog(COLLIDING_CLASSES[1].getCanonicalName()));
        // Remove everything left
        assertTrue(findClassInSystemCatalog(PROC_CLASSES[1].getCanonicalName()));
        assertTrue(findClassInSystemCatalog(EXTRA_CLASSES[0].getCanonicalName()));
        resp = m_client.callProcedure("@UpdateClasses", null, "org.voltdb**");
        assertFalse(findClassInSystemCatalog(PROC_CLASSES[1].getCanonicalName()));
        assertFalse(findClassInSystemCatalog(EXTRA_CLASSES[0].getCanonicalName()));
        resp = m_client.callProcedure("@SystemCatalog", "CLASSES");
        assertEquals(0, resp.getResults()[0].getRowCount());
        // put everything back
        // Add the jarfile we built
        resp = m_client.callProcedure("@UpdateClasses", jarfile.getFullJarBytes(), null);
        resp = m_client.callProcedure("@SystemCatalog", "CLASSES");
        assertEquals(PROC_CLASSES.length + EXTRA_CLASSES.length + COLLIDING_CLASSES.length, resp.getResults()[0].getRowCount());
        // delete the common simple names from both packages simultaneously
        resp = m_client.callProcedure("@UpdateClasses", null, "**testImportProc   , **testCreateProcFromClassProc");
        resp = m_client.callProcedure("@SystemCatalog", "CLASSES");
        // should be the only thing left
        assertEquals(1, resp.getResults()[0].getRowCount());
        assertTrue(findClassInSystemCatalog(EXTRA_CLASSES[0].getCanonicalName()));
        // make a jar without the extra
        InMemoryJarfile jarfile2 = new InMemoryJarfile();
        for (Class<?> clazz : PROC_CLASSES) {
            VoltCompiler comp = new VoltCompiler(false);
            comp.addClassToJar(jarfile2, clazz);
        }
        for (Class<?> clazz : COLLIDING_CLASSES) {
            VoltCompiler comp = new VoltCompiler(false);
            comp.addClassToJar(jarfile2, clazz);
        }
        // finally, delete what's left and put the new jar in simultaneously
        resp = m_client.callProcedure("@UpdateClasses", jarfile2.getFullJarBytes(), "**updateclasses.*");
        resp = m_client.callProcedure("@SystemCatalog", "CLASSES");
        // extra class should be gone, others installed
        assertEquals(PROC_CLASSES.length + COLLIDING_CLASSES.length, resp.getResults()[0].getRowCount());
        assertFalse(findClassInSystemCatalog(EXTRA_CLASSES[0].getCanonicalName()));
        assertTrue(findClassInSystemCatalog(PROC_CLASSES[0].getCanonicalName()));
        assertTrue(findClassInSystemCatalog(PROC_CLASSES[1].getCanonicalName()));
        assertTrue(findClassInSystemCatalog(COLLIDING_CLASSES[0].getCanonicalName()));
        assertTrue(findClassInSystemCatalog(COLLIDING_CLASSES[1].getCanonicalName()));
        // now add a class with inner classes
        InMemoryJarfile inner = new InMemoryJarfile();
        VoltCompiler comp = new VoltCompiler(false);
        comp.addClassToJar(inner, org.voltdb_testprocs.updateclasses.InnerClassesTestProc.class);
        resp = m_client.callProcedure("@UpdateClasses", inner.getFullJarBytes(), null);
        // old stuff should have survived
        assertTrue(findClassInSystemCatalog(PROC_CLASSES[0].getCanonicalName()));
        assertTrue(findClassInSystemCatalog(PROC_CLASSES[1].getCanonicalName()));
        assertTrue(findClassInSystemCatalog(COLLIDING_CLASSES[0].getCanonicalName()));
        assertTrue(findClassInSystemCatalog(COLLIDING_CLASSES[1].getCanonicalName()));
        // Did we get the new class and inner classes too?
        assertTrue(findClassInSystemCatalog("org.voltdb_testprocs.updateclasses.InnerClassesTestProc"));
        assertTrue(findClassInSystemCatalog("org.voltdb_testprocs.updateclasses.InnerClassesTestProc$InnerNotPublic"));
        assertTrue(findClassInSystemCatalog("org.voltdb_testprocs.updateclasses.InnerClassesTestProc$InnerWithConstructorArgs"));
        assertTrue(findClassInSystemCatalog("org.voltdb_testprocs.updateclasses.InnerClassesTestProc$InnerWithEasyConstructor"));
        assertTrue(findClassInSystemCatalog("org.voltdb_testprocs.updateclasses.InnerClassesTestProc$InnerWithNoConstructor"));
        // now just delete the parent class
        resp = m_client.callProcedure("@UpdateClasses", null, "org.voltdb_testprocs.updateclasses.InnerClassesTestProc");
        // old stuff should have survived
        resp = m_client.callProcedure("@SystemCatalog", "CLASSES");
        // Non-inner stuff should have survived
        assertEquals(PROC_CLASSES.length + COLLIDING_CLASSES.length, resp.getResults()[0].getRowCount());
        assertTrue(findClassInSystemCatalog(PROC_CLASSES[0].getCanonicalName()));
        assertTrue(findClassInSystemCatalog(PROC_CLASSES[1].getCanonicalName()));
        assertTrue(findClassInSystemCatalog(COLLIDING_CLASSES[0].getCanonicalName()));
        assertTrue(findClassInSystemCatalog(COLLIDING_CLASSES[1].getCanonicalName()));
        // Inner classes and parent gone
        assertFalse(findClassInSystemCatalog("org.voltdb_testprocs.updateclasses.InnerClassesTestProc"));
        assertFalse(findClassInSystemCatalog("org.voltdb_testprocs.updateclasses.InnerClassesTestProc$InnerNotPublic"));
        assertFalse(findClassInSystemCatalog("org.voltdb_testprocs.updateclasses.InnerClassesTestProc$InnerWithConstructorArgs"));
        assertFalse(findClassInSystemCatalog("org.voltdb_testprocs.updateclasses.InnerClassesTestProc$InnerWithEasyConstructor"));
        assertFalse(findClassInSystemCatalog("org.voltdb_testprocs.updateclasses.InnerClassesTestProc$InnerWithNoConstructor"));
        // Empty string has no effect
        resp = m_client.callProcedure("@UpdateClasses", null, "");
        // old stuff should have survived
        resp = m_client.callProcedure("@SystemCatalog", "CLASSES");
        // Non-inner stuff should have survived
        assertEquals(PROC_CLASSES.length + COLLIDING_CLASSES.length, resp.getResults()[0].getRowCount());
        assertTrue(findClassInSystemCatalog(PROC_CLASSES[0].getCanonicalName()));
        assertTrue(findClassInSystemCatalog(PROC_CLASSES[1].getCanonicalName()));
        assertTrue(findClassInSystemCatalog(COLLIDING_CLASSES[0].getCanonicalName()));
        assertTrue(findClassInSystemCatalog(COLLIDING_CLASSES[1].getCanonicalName()));
        // pattern that matches nothing has no effect
        resp = m_client.callProcedure("@UpdateClasses", null, "com.voltdb.*");
        // old stuff should have survived
        resp = m_client.callProcedure("@SystemCatalog", "CLASSES");
        // Non-inner stuff should have survived
        assertEquals(PROC_CLASSES.length + COLLIDING_CLASSES.length, resp.getResults()[0].getRowCount());
        assertTrue(findClassInSystemCatalog(PROC_CLASSES[0].getCanonicalName()));
        assertTrue(findClassInSystemCatalog(PROC_CLASSES[1].getCanonicalName()));
        assertTrue(findClassInSystemCatalog(COLLIDING_CLASSES[0].getCanonicalName()));
        assertTrue(findClassInSystemCatalog(COLLIDING_CLASSES[1].getCanonicalName()));
    } finally {
        teardownSystem();
    }
}
Also used : VoltDB(org.voltdb.VoltDB) ClientResponse(org.voltdb.client.ClientResponse) VoltCompiler(org.voltdb.compiler.VoltCompiler) Configuration(org.voltdb.VoltDB.Configuration) VoltProjectBuilder(org.voltdb.compiler.VoltProjectBuilder) InMemoryJarfile(org.voltdb.utils.InMemoryJarfile) Configuration(org.voltdb.VoltDB.Configuration) Test(org.junit.Test)

Aggregations

VoltCompiler (org.voltdb.compiler.VoltCompiler)43 InMemoryJarfile (org.voltdb.utils.InMemoryJarfile)26 File (java.io.File)16 ClientResponse (org.voltdb.client.ClientResponse)15 ProcCallException (org.voltdb.client.ProcCallException)15 Test (org.junit.Test)13 Configuration (org.voltdb.VoltDB.Configuration)12 VoltProjectBuilder (org.voltdb.compiler.VoltProjectBuilder)11 VoltDB (org.voltdb.VoltDB)9 IOException (java.io.IOException)5 FileInputStream (java.io.FileInputStream)4 VoltTable (org.voltdb.VoltTable)4 Catalog (org.voltdb.catalog.Catalog)4 URL (java.net.URL)3 DeploymentType (org.voltdb.compiler.deploymentfile.DeploymentType)3 VoltFile (org.voltdb.utils.VoltFile)3 PrintWriter (java.io.PrintWriter)2 Path (java.nio.file.Path)2 HashMap (java.util.HashMap)2 UUID (java.util.UUID)2