Mercurial > hg > thermostat-ng > agent
changeset 1737:b239f24bbecd
Fix WebAppTest races.
Reviewed-by: omajid
Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2015-May/013774.html
author | Severin Gehwolf <sgehwolf@redhat.com> |
---|---|
date | Tue, 26 May 2015 12:13:31 +0200 |
parents | 767301642c26 |
children | 7d9b2bbefff0 |
files | integration-tests/itest-run/src/test/java/com/redhat/thermostat/itest/WebAppTest.java |
diffstat | 1 files changed, 54 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/integration-tests/itest-run/src/test/java/com/redhat/thermostat/itest/WebAppTest.java Tue May 26 09:55:40 2015 -0400 +++ b/integration-tests/itest-run/src/test/java/com/redhat/thermostat/itest/WebAppTest.java Tue May 26 12:13:31 2015 +0200 @@ -103,6 +103,7 @@ import com.redhat.thermostat.storage.model.AgentInformation; import com.redhat.thermostat.storage.model.AggregateCount; import com.redhat.thermostat.storage.model.HostInfo; +import com.redhat.thermostat.storage.model.Pojo; import com.redhat.thermostat.storage.mongodb.internal.MongoStorage; import com.redhat.thermostat.storage.query.Expression; import com.redhat.thermostat.storage.query.ExpressionFactory; @@ -240,8 +241,6 @@ private static final String TEST_USER = "testuser"; private static final String TEST_PASSWORD = "testpassword"; - private static final String PREP_USER = "prepuser"; - private static final String PREP_PASSWORD = "preppassword"; private static final double EQUALS_DELTA = 0.00000000000001; private static final String THERMOSTAT_USERS_FILE = getConfigurationDir() + "/thermostat-users.properties"; private static final String THERMOSTAT_ROLES_FILE = getConfigurationDir() + "/thermostat-roles.properties"; @@ -323,6 +322,21 @@ System.out.println("RESTORED web.auth!"); } } + + private static long countAllData(BackingStorage storage, Category<AggregateCount> cat) { + try { + String countAllDataDesc = "QUERY-COUNT " + cat.getName(); + StatementDescriptor<AggregateCount> desc = new StatementDescriptor<>(cat, countAllDataDesc); + PreparedStatement<AggregateCount> statement = storage.prepareStatement(desc); + Cursor<AggregateCount> cursor = statement.executeQuery(); + assert cursor.hasNext(); + AggregateCount aggregate = cursor.next(); + long count = aggregate.getCount(); + return count; + } catch (StatementExecutionException | DescriptorParsingException e) { + throw new AssertionError(e); + } + } // PRE: storage started with --permitLocalhostException private static void setupMongodbUser() throws Exception { @@ -602,7 +616,7 @@ private static void addCpuData(int numberOfItems) throws IOException { BackingStorage storage = getAndConnectBackingStorage(); - storage.registerCategory(CpuStatDAO.cpuStatCategory); + Category<AggregateCount> cat = registerCatoriesForWrite(storage, CpuStatDAO.cpuStatCategory); for (int i = 0; i < numberOfItems; i++) { CpuStat pojo = new CpuStat("test-agent-id", i, new double[] {i, i*2}); @@ -612,13 +626,33 @@ add.set(Key.TIMESTAMP.getName(), pojo.getTimeStamp()); add.apply(); } + waitForDataCount(numberOfItems, storage, cat); + storage.getConnection().disconnect(); + } + + private static void waitForDataCount(int expectedCount, BackingStorage storage, Category<AggregateCount> cat) { + long count = countAllData(storage, cat); + int currCount = 0; + final int MAX_CYCLES = 5; + while (count != expectedCount && currCount < MAX_CYCLES) { + try { + Thread.sleep(250); + } catch (InterruptedException ignored) {} + count = countAllData(storage, cat); + } + + } - storage.getConnection().disconnect(); + private static <T extends Pojo> Category<AggregateCount> registerCatoriesForWrite(BackingStorage storage, Category<T> cat) { + storage.registerCategory(cat); + Category<AggregateCount> adaptedCategory = new CategoryAdapter<T, AggregateCount>(cat).getAdapted(AggregateCount.class); + storage.registerCategory(adaptedCategory); + return adaptedCategory; } private static void addHostInfoData(int numberOfItems) throws IOException { BackingStorage storage = getAndConnectBackingStorage(); - storage.registerCategory(HostInfoDAO.hostInfoCategory); + Category<AggregateCount> cat = registerCatoriesForWrite(storage, HostInfoDAO.hostInfoCategory); for (int i = 0; i < numberOfItems; i++) { HostInfo hostInfo = new HostInfo("test-host-agent-id", "foo " + i, "linux " + i, "kernel", "t8", i, i * 1000); @@ -632,13 +666,13 @@ add.set(HostInfoDAO.osNameKey.getName(), hostInfo.getOsName()); add.apply(); } - + waitForDataCount(numberOfItems, storage, cat); storage.getConnection().disconnect(); } private static void addAgentConfigData(List<AgentInformation> items) throws IOException { BackingStorage storage = getAndConnectBackingStorage(); - storage.registerCategory(AgentInfoDAO.CATEGORY); + Category<AggregateCount> cat = registerCatoriesForWrite(storage, AgentInfoDAO.CATEGORY); for (AgentInformation info: items) { Add<AgentInformation> add = storage.createAdd(AgentInfoDAO.CATEGORY); @@ -649,7 +683,7 @@ add.set(AgentInfoDAO.STOP_TIME_KEY.getName(), info.getStopTime()); add.apply(); } - + waitForDataCount(items.size(), storage, cat); storage.getConnection().disconnect(); } @@ -661,22 +695,23 @@ doDeleteData(HostInfoDAO.hostInfoCategory, "test-host-agent-id"); } - private static void doDeleteData(Category<?> category, String agentId) throws IOException { - String[] roleNames = new String[] { - Roles.REGISTER_CATEGORY, - Roles.ACCESS_REALM, - Roles.LOGIN, - Roles.PURGE - }; - Storage storage = getAndConnectStorage(PREP_USER, PREP_PASSWORD, roleNames); - storage.registerCategory(category); + private static <T extends Pojo> void doDeleteData(Category<T> category, String agentId) throws IOException { + BackingStorage storage = getAndConnectBackingStorage(); + Category<AggregateCount> cat = registerCatoriesForWrite(storage, category); + // FIXME: The method signature suggests it deletes data for the given agent + // in the given category. But it actually deletes any records in + // any category matching the agentId parameter. This should get + // changed from purge to a remove operation. storage.purge(agentId); + waitForDataCount(0, storage, cat); storage.getConnection().disconnect(); } private static void deleteAgentConfigData(List<AgentInformation> items) throws IOException { BackingStorage storage = getAndConnectBackingStorage(); - storage.registerCategory(AgentInfoDAO.CATEGORY); + Category<AggregateCount> cat = registerCatoriesForWrite(storage, AgentInfoDAO.CATEGORY); + + long countPriorRemove = countAllData(storage, cat); ExpressionFactory factory = new ExpressionFactory(); Remove<AgentInformation> remove = storage.createRemove(AgentInfoDAO.CATEGORY); Set<String> agentIds = new HashSet<>(); @@ -686,6 +721,7 @@ Expression expression = factory.in(Key.AGENT_ID, agentIds, String.class); remove.where(expression); remove.apply(); + waitForDataCount((int)(countPriorRemove - items.size()), storage, cat); storage.getConnection().disconnect(); }