/* * Copyright 2023 dorkbox, llc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package dorkboxTest.network.rmi import dorkbox.netUtil.IPv4 import dorkbox.netUtil.IPv6 import dorkbox.network.Client import dorkbox.network.Configuration import dorkbox.network.Server import dorkbox.network.connection.Connection import dorkboxTest.network.BaseTest import dorkboxTest.network.rmi.cows.MessageWithTestCow import dorkboxTest.network.rmi.cows.TestCow import dorkboxTest.network.rmi.cows.TestCowImpl import org.junit.Assert import org.junit.Test class RmiSimpleActionsTest : BaseTest() { @Test fun testGlobalDelete() { val configuration = serverConfig() configuration.serialization.rmi.register(TestCow::class.java, TestCowImpl::class.java) configuration.serialization.register(MessageWithTestCow::class.java) configuration.serialization.register(UnsupportedOperationException::class.java) // for Client -> Server RMI configuration.serialization.rmi.register(TestCow::class.java, TestCowImpl::class.java) val server = Server(configuration) addEndPoint(server) val OBJ_ID = 3423 val testCowImpl = TestCowImpl(OBJ_ID) server.rmiGlobal.save(testCowImpl, OBJ_ID) Assert.assertTrue(server.rmiGlobal.delete(testCowImpl)) Assert.assertFalse(server.rmiGlobal.delete(testCowImpl)) Assert.assertFalse(server.rmiGlobal.delete(OBJ_ID)) val newId = server.rmiGlobal.save(testCowImpl) Assert.assertTrue(server.rmiGlobal.delete(newId)) Assert.assertFalse(server.rmiGlobal.delete(newId)) Assert.assertFalse(server.rmiGlobal.delete(testCowImpl)) val newId2 = server.rmiGlobal.save(testCowImpl) Assert.assertTrue(server.rmiGlobal.delete(testCowImpl)) Assert.assertFalse(server.rmiGlobal.delete(testCowImpl)) Assert.assertFalse(server.rmiGlobal.delete(newId2)) stopEndPoints() waitForThreads() } @Test fun rmiIPv4NetworkGlobalDelete() { rmiConnectionDelete(isIpv4 = true, isIpv6 = false) } private fun doConnect(isIpv4: Boolean, isIpv6: Boolean, runIpv4Connect: Boolean, client: Client) { when { isIpv4 && isIpv6 && runIpv4Connect -> client.connect(IPv4.LOCALHOST, 2000) isIpv4 && isIpv6 && !runIpv4Connect -> client.connect(IPv6.LOCALHOST, 2000) isIpv4 -> client.connect(IPv4.LOCALHOST, 2000) isIpv6 -> client.connect(IPv6.LOCALHOST, 2000) else -> client.connectIpc() } } fun rmiConnectionDelete(isIpv4: Boolean = false, isIpv6: Boolean = false, runIpv4Connect: Boolean = true, config: Configuration.() -> Unit = {}) { var RMI_ID = 0 val server = run { val configuration = serverConfig() configuration.enableIPv4 = isIpv4 configuration.enableIPv6 = isIpv6 config(configuration) configuration.serialization.rmi.register(TestCow::class.java, TestCowImpl::class.java) configuration.serialization.register(MessageWithTestCow::class.java) configuration.serialization.register(UnsupportedOperationException::class.java) // for Client -> Server RMI configuration.serialization.rmi.register(TestCow::class.java, TestCowImpl::class.java) val server = Server(configuration) addEndPoint(server) server.onMessage { m -> server.logger.error("Received finish signal for test for: Client -> Server") val `object` = m.testCow val id = `object`.id() Assert.assertEquals(23, id) server.logger.error("Finished test for: Client -> Server") rmi.delete(RMI_ID) val newID = RMI_ID+123 val testCow = TestCowImpl(newID) // we must manually save the object -- because if we don't we'll auto-create it when it gets sent across the network. // this happens BECAUSE `TestCow` is an RMI object!! rmi.save(testCow, newID) send(MessageWithTestCow(testCow)) } server } val client = run { val configuration = clientConfig() config(configuration) // configuration.serialization.registerRmi(TestCow::class.java, TestCowImpl::class.java) val client = Client(configuration) addEndPoint(client) client.onConnect { rmi.create(23) { RMI_ID = it client.logger.error("Running test for: Client -> Server") // RmiCommonTest.runTests(this@onConnect, this@create, 23) val m = MessageWithTestCow(this) m.number = 678 m.text = "sometext" this@onConnect.send(m) client.logger.error("Done with test for: Client -> Server") } } client.onMessage { _ -> // check if 23 still exists (it should not) val obj = rmi.get(RMI_ID) try { obj.id() Assert.fail(".id() should throw an exception, the backing RMI object doesn't exist!") } catch (e: Exception) { // this is expected } stopEndPoints() } client } server.bind(2000) doConnect(isIpv4, isIpv6, runIpv4Connect, client) waitForThreads() } @Test fun rmiReconnectPersistence() { var RMI_ID = 0 val server = run { val configuration = serverConfig() configuration.serialization.rmi.register(TestCow::class.java, TestCowImpl::class.java) configuration.serialization.register(MessageWithTestCow::class.java) configuration.serialization.register(UnsupportedOperationException::class.java) // for Client -> Server RMI configuration.serialization.rmi.register(TestCow::class.java, TestCowImpl::class.java) val server = Server(configuration) addEndPoint(server) server.onMessage { m -> server.logger.error("Received finish signal for test for: Client -> Server") val `object` = m.testCow val id = `object`.id() Assert.assertEquals(23, id) server.logger.error("Finished test for: Client -> Server") rmi.delete(RMI_ID) val newID = RMI_ID+123 val testCow = TestCowImpl(newID) // we must manually save the object -- because if we don't we'll auto-create it when it gets sent across the network. // this happens BECAUSE `TestCow` is an RMI object!! rmi.save(testCow, newID) send(MessageWithTestCow(testCow)) } server } val client = run { var firstRun = true val configuration = clientConfig() // configuration.serialization.registerRmi(TestCow::class.java, TestCowImpl::class.java) val client = Client(configuration) addEndPoint(client) client.onConnect { rmi.create(23) { RMI_ID = it client.logger.error("Running test for: Client -> Server") // RmiCommonTest.runTests(this@onConnect, this@create, 23) val m = MessageWithTestCow(this) m.number = 678 m.text = "sometext" this@onConnect.send(m) client.logger.error("Done with test for: Client -> Server") } } client.onMessage { _ -> // check if 23 still exists (it should not) val obj = rmi.get(RMI_ID) try { obj.id() Assert.fail(".id() should throw a timeout/exception, the backing RMI object doesn't exist!") } catch (e: Exception) { // this is expected } if (firstRun) { firstRun = false client.close(false) client.connectIpc() } else { stopEndPoints() } } client } server.bindIpc() client.connectIpc() waitForThreads() } }