package com.redhat.lightblue.migrator; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; import com.redhat.lightblue.client.http.LightblueHttpClient; import com.redhat.lightblue.client.request.data.DataFindRequest; /** * Verify that generated and non generated jobs are retrieved for processing in desired proportions, i.e. that * migration and consistency checking can happen in parallel. * * @author mpatercz * */ @RunWith(MockitoJUnitRunner.class) public class WeightsTest { double acceptableThreshold = 0.05; @Mock LightblueHttpClient lightblueClient; Controller controller; @Test public void testGeneratedAndNongeneratedJobsAreQueriedInEqualProportions() throws Exception { MainConfiguration mainCfg = Mockito.spy(new MainConfiguration()); mainCfg.setName("TestWeightMainConfiguration"); MigrationConfiguration cfg = new MigrationConfiguration(); cfg.setConfigurationName("TestWeightConfiguration"); cfg.setThreadCount(1); cfg.setPeriod(null); // no consistency check cfg.setSleepIfNoJobs(false); // speed up things // tie mocked client to main conf Mockito.doReturn(lightblueClient).when(mainCfg).getLightblueClient(); controller = Mockito.spy(new Controller(mainCfg)); // handle conf reload Mockito.doReturn(new MigrationConfiguration[]{cfg}).when(controller).getMigrationConfigurations(); Mockito.doReturn(cfg).when(lightblueClient).data(Mockito.isA(DataFindRequest.class), Mockito.eq(MigrationConfiguration.class)); final int[] generated = new int[1]; final int[] nongenerated = new int[1]; final int[] any = new int[1]; // observe migrationjob queries and count them by type Mockito.when(lightblueClient.data(Mockito.isA(DataFindRequest.class), Mockito.eq(MigrationJob[].class))).thenAnswer(new Answer<MigrationJob[]>() { @Override public MigrationJob[] answer(InvocationOnMock invocation) throws Throwable { DataFindRequest r = (DataFindRequest) invocation.getArguments()[0]; String body = r.getBody(); if (body.contains("{\"field\":\"generated\",\"op\":\"=\",\"rvalue\":true}")) { generated[0]++; } else if (body.contains("{\"field\":\"generated\",\"op\":\"=\",\"rvalue\":false}")) { nongenerated[0]++; } else { any[0]++; } return null; } }); controller.start(); int loops = 0; while(any[0] < 5000) { Thread.sleep(100); if (loops++ > 10000) { throw new RuntimeException("Something's wrong, it shouldn't take that long"); } } controller.setStopped(); while(controller.isAlive()) { Thread.sleep(10); } System.out.println("generated="+generated[0]); System.out.println("nongenerated="+nongenerated[0]); System.out.println("any="+any[0]); Assert.assertTrue("Generated + nongenerated query count should be equal or so to any query count", Math.abs(generated[0]+nongenerated[0]-any[0]) < acceptableThreshold*any[0]); Assert.assertTrue("Generated - nongenerated query count should be zero or so", Math.abs(generated[0]-nongenerated[0]) < acceptableThreshold*any[0]); } }