mirror of
https://github.com/TotalFreedomMC/TF-EssentialsX.git
synced 2025-08-05 20:12:54 +00:00
Prevent some rare cases of NPE and Deadlocks, better error handling on yaml load
This commit is contained in:
parent
019b49ef11
commit
51390a9698
8 changed files with 145 additions and 105 deletions
|
@ -1,6 +1,7 @@
|
|||
package com.earth2me.essentials;
|
||||
|
||||
import com.earth2me.essentials.settings.Settings;
|
||||
import com.earth2me.essentials.storage.ObjectLoadException;
|
||||
import com.earth2me.essentials.storage.StorageObject;
|
||||
import com.earth2me.essentials.storage.YamlStorageReader;
|
||||
import com.earth2me.essentials.storage.YamlStorageWriter;
|
||||
|
@ -11,7 +12,6 @@ import org.bukkit.World;
|
|||
import org.bukkit.World.Environment;
|
||||
import org.bukkit.plugin.InvalidDescriptionException;
|
||||
import org.junit.Test;
|
||||
import org.yaml.snakeyaml.Yaml;
|
||||
|
||||
|
||||
public class StorageTest extends TestCase
|
||||
|
@ -42,82 +42,94 @@ public class StorageTest extends TestCase
|
|||
@Test
|
||||
public void testSettings()
|
||||
{
|
||||
assertTrue(StorageObject.class.isAssignableFrom(Settings.class));
|
||||
ExecuteTimer ext = new ExecuteTimer();
|
||||
ext.start();
|
||||
final ByteArrayInputStream bais = new ByteArrayInputStream(new byte[0]);
|
||||
final Reader reader = new InputStreamReader(bais);
|
||||
final Settings settings = new YamlStorageReader(reader, null).load(Settings.class);
|
||||
ext.mark("load empty settings");
|
||||
final ByteArrayInputStream bais3 = new ByteArrayInputStream(new byte[0]);
|
||||
final Reader reader3 = new InputStreamReader(bais3);
|
||||
final Settings settings3 = new YamlStorageReader(reader3, null).load(Settings.class);
|
||||
ext.mark("load empty settings (class cached)");
|
||||
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
final PrintWriter writer = new PrintWriter(baos);
|
||||
new YamlStorageWriter(writer).save(settings);
|
||||
writer.close();
|
||||
ext.mark("write settings");
|
||||
byte[] written = baos.toByteArray();
|
||||
System.out.println(new String(written));
|
||||
final ByteArrayInputStream bais2 = new ByteArrayInputStream(written);
|
||||
final Reader reader2 = new InputStreamReader(bais2);
|
||||
final Settings settings2 = new YamlStorageReader(reader2, null).load(Settings.class);
|
||||
System.out.println(settings.toString());
|
||||
System.out.println(settings2.toString());
|
||||
ext.mark("reload settings");
|
||||
System.out.println(ext.end());
|
||||
//assertEquals("Default and rewritten config should be equal", settings, settings2);
|
||||
//that assertion fails, because empty list and maps return as null
|
||||
try
|
||||
{
|
||||
assertTrue(StorageObject.class.isAssignableFrom(Settings.class));
|
||||
ExecuteTimer ext = new ExecuteTimer();
|
||||
ext.start();
|
||||
final ByteArrayInputStream bais = new ByteArrayInputStream(new byte[0]);
|
||||
final Reader reader = new InputStreamReader(bais);
|
||||
final Settings settings = new YamlStorageReader(reader, null).load(Settings.class);
|
||||
ext.mark("load empty settings");
|
||||
final ByteArrayInputStream bais3 = new ByteArrayInputStream(new byte[0]);
|
||||
final Reader reader3 = new InputStreamReader(bais3);
|
||||
final Settings settings3 = new YamlStorageReader(reader3, null).load(Settings.class);
|
||||
ext.mark("load empty settings (class cached)");
|
||||
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
final PrintWriter writer = new PrintWriter(baos);
|
||||
new YamlStorageWriter(writer).save(settings);
|
||||
writer.close();
|
||||
ext.mark("write settings");
|
||||
byte[] written = baos.toByteArray();
|
||||
System.out.println(new String(written));
|
||||
final ByteArrayInputStream bais2 = new ByteArrayInputStream(written);
|
||||
final Reader reader2 = new InputStreamReader(bais2);
|
||||
final Settings settings2 = new YamlStorageReader(reader2, null).load(Settings.class);
|
||||
System.out.println(settings.toString());
|
||||
System.out.println(settings2.toString());
|
||||
ext.mark("reload settings");
|
||||
System.out.println(ext.end());
|
||||
//assertEquals("Default and rewritten config should be equal", settings, settings2);
|
||||
//that assertion fails, because empty list and maps return as null
|
||||
}
|
||||
catch (ObjectLoadException ex)
|
||||
{
|
||||
fail(ex.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUserdata()
|
||||
{
|
||||
FakeServer server = new FakeServer();
|
||||
World world = server.createWorld("testWorld", Environment.NORMAL);
|
||||
ExecuteTimer ext = new ExecuteTimer();
|
||||
ext.start();
|
||||
final ByteArrayInputStream bais = new ByteArrayInputStream(new byte[0]);
|
||||
final Reader reader = new InputStreamReader(bais);
|
||||
final com.earth2me.essentials.user.UserData userdata = new YamlStorageReader(reader, null).load(com.earth2me.essentials.user.UserData.class);
|
||||
ext.mark("load empty user");
|
||||
final ByteArrayInputStream bais3 = new ByteArrayInputStream(new byte[0]);
|
||||
final Reader reader3 = new InputStreamReader(bais3);
|
||||
final com.earth2me.essentials.user.UserData userdata3 = new YamlStorageReader(reader3, null).load(com.earth2me.essentials.user.UserData.class);
|
||||
ext.mark("load empty user (class cached)");
|
||||
|
||||
for (int j = 0; j < 10000; j++)
|
||||
try
|
||||
{
|
||||
userdata.getHomes().put("home", new Location(world, j, j, j));
|
||||
FakeServer server = new FakeServer();
|
||||
World world = server.createWorld("testWorld", Environment.NORMAL);
|
||||
ExecuteTimer ext = new ExecuteTimer();
|
||||
ext.start();
|
||||
final ByteArrayInputStream bais = new ByteArrayInputStream(new byte[0]);
|
||||
final Reader reader = new InputStreamReader(bais);
|
||||
final com.earth2me.essentials.user.UserData userdata = new YamlStorageReader(reader, null).load(com.earth2me.essentials.user.UserData.class);
|
||||
ext.mark("load empty user");
|
||||
final ByteArrayInputStream bais3 = new ByteArrayInputStream(new byte[0]);
|
||||
final Reader reader3 = new InputStreamReader(bais3);
|
||||
final com.earth2me.essentials.user.UserData userdata3 = new YamlStorageReader(reader3, null).load(com.earth2me.essentials.user.UserData.class);
|
||||
ext.mark("load empty user (class cached)");
|
||||
|
||||
for (int j = 0; j < 10000; j++)
|
||||
{
|
||||
userdata.getHomes().put("home", new Location(world, j, j, j));
|
||||
}
|
||||
ext.mark("change home 10000 times");
|
||||
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
final PrintWriter writer = new PrintWriter(baos);
|
||||
new YamlStorageWriter(writer).save(userdata);
|
||||
writer.close();
|
||||
ext.mark("write user");
|
||||
final ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
|
||||
final PrintWriter writer2 = new PrintWriter(baos2);
|
||||
new YamlStorageWriter(writer2).save(userdata);
|
||||
writer2.close();
|
||||
ext.mark("write user (cached)");
|
||||
byte[] written = baos.toByteArray();
|
||||
System.out.println(new String(written));
|
||||
ext.mark("debug output");
|
||||
final ByteArrayInputStream bais2 = new ByteArrayInputStream(written);
|
||||
final Reader reader2 = new InputStreamReader(bais2);
|
||||
final com.earth2me.essentials.user.UserData userdata2 = new YamlStorageReader(reader2, null).load(com.earth2me.essentials.user.UserData.class);
|
||||
ext.mark("reload file");
|
||||
final ByteArrayInputStream bais4 = new ByteArrayInputStream(written);
|
||||
final Reader reader4 = new InputStreamReader(bais4);
|
||||
final com.earth2me.essentials.user.UserData userdata4 = new YamlStorageReader(reader4, null).load(com.earth2me.essentials.user.UserData.class);
|
||||
ext.mark("reload file (cached)");
|
||||
System.out.println(userdata.toString());
|
||||
System.out.println(userdata2.toString());
|
||||
System.out.println(ext.end());
|
||||
}
|
||||
catch (ObjectLoadException ex)
|
||||
{
|
||||
fail(ex.getMessage());
|
||||
}
|
||||
ext.mark("change home 10000 times");
|
||||
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
final PrintWriter writer = new PrintWriter(baos);
|
||||
new YamlStorageWriter(writer).save(userdata);
|
||||
writer.close();
|
||||
ext.mark("write user");
|
||||
final ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
|
||||
final PrintWriter writer2 = new PrintWriter(baos2);
|
||||
new YamlStorageWriter(writer2).save(userdata);
|
||||
writer2.close();
|
||||
ext.mark("write user (cached)");
|
||||
byte[] written = baos.toByteArray();
|
||||
System.out.println(new String(written));
|
||||
ext.mark("debug output");
|
||||
final ByteArrayInputStream bais2 = new ByteArrayInputStream(written);
|
||||
final Reader reader2 = new InputStreamReader(bais2);
|
||||
final com.earth2me.essentials.user.UserData userdata2 = new YamlStorageReader(reader2, null).load(com.earth2me.essentials.user.UserData.class);
|
||||
ext.mark("reload file");
|
||||
final ByteArrayInputStream bais4 = new ByteArrayInputStream(written);
|
||||
final Reader reader4 = new InputStreamReader(bais4);
|
||||
final com.earth2me.essentials.user.UserData userdata4 = new YamlStorageReader(reader4, null).load(com.earth2me.essentials.user.UserData.class);
|
||||
ext.mark("reload file (cached)");
|
||||
System.out.println(userdata.toString());
|
||||
System.out.println(userdata2.toString());
|
||||
System.out.println(ext.end());
|
||||
com.earth2me.essentials.user.User test = new com.earth2me.essentials.user.User(null, ess);
|
||||
test.example();
|
||||
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue