Search in sources :

Example 1 with LOGFILE_PATTERN

use of com.facebook.buck.util.network.offline.OfflineScribeLogger.LOGFILE_PATTERN in project buck by facebook.

the class OfflineScribeLoggerTest method unsentLinesStoredForOffline.

@Test
public void unsentLinesStoredForOffline() throws Exception {
    final String whitelistedCategory = "whitelisted_category";
    final String whitelistedCategory2 = "whitelisted_category_2";
    final String blacklistedCategory = "blacklisted_category";
    final ImmutableList<String> blacklistCategories = ImmutableList.of(blacklistedCategory);
    final int maxScribeOfflineLogsKB = 7;
    final ProjectFilesystem filesystem = new ProjectFilesystem(tmp.getRoot());
    final Path logDir = filesystem.getBuckPaths().getOfflineLogDir();
    final ObjectMapper objectMapper = ObjectMappers.newDefaultInstance();
    String[] ids = { "test1", "test2", "test3", "test4" };
    char[] longLineBytes = new char[1000];
    Arrays.fill(longLineBytes, 'A');
    String longLine = new String(longLineBytes);
    char[] tooLongLineBytes = new char[6000];
    Arrays.fill(longLineBytes, 'A');
    String tooLongLine = new String(tooLongLineBytes);
    // As we set max space for logs to 7KB, then we expect storing data with 2 'longLine' (which,
    // given UTF-8 is used, will be ~ 2 * 1KB) to succeed. We then expect subsequent attempt to
    // store data with 'tooLongLine' (~6KB) to fail. We also expect that logfile created by first
    // fakeLogger ('test1' id) will be removed as otherwise data from last logger would not fit.
    //
    // Note that code sending already stored offline logs will be triggered by the first log() as
    // it succeeds, but further failing log() (and initiating storing) will stop sending. Hence, no
    // logs will be deleted due to the sending routine.
    FakeFailingOfflineScribeLogger fakeLogger = null;
    for (String id : ids) {
        fakeLogger = new FakeFailingOfflineScribeLogger(blacklistCategories, maxScribeOfflineLogsKB, filesystem, logDir, objectMapper, new BuildId(id));
        // Simulate network issues occurring for some of sending attempts (all after first one).
        // Logging succeeds.
        fakeLogger.log(whitelistedCategory, ImmutableList.of("hello world 1", "hello world 2"));
        // Logging fails.
        fakeLogger.log(whitelistedCategory, ImmutableList.of("hello world 3", "hello world 4"));
        // Event with blacklisted category for offline logging.
        fakeLogger.log(blacklistedCategory, ImmutableList.of("hello world 5", "hello world 6"));
        // Logging fails.
        fakeLogger.log(whitelistedCategory2, ImmutableList.of(longLine, longLine));
        // Logging fails, but offline logging rejects data as well - too big.
        fakeLogger.log(whitelistedCategory2, ImmutableList.of(tooLongLine));
        fakeLogger.close();
    }
    // Check correct logs are in the directory (1st log removed).
    Path[] expectedLogPaths = FluentIterable.from(ImmutableList.copyOf(ids)).transform(id -> filesystem.resolve(logDir.resolve(LOGFILE_PREFIX + id + LOGFILE_SUFFIX))).toArray(Path.class);
    ImmutableSortedSet<Path> logs = filesystem.getMtimeSortedMatchingDirectoryContents(logDir, LOGFILE_PATTERN);
    assertThat(logs, Matchers.allOf(hasItem(expectedLogPaths[1]), hasItem(expectedLogPaths[2]), hasItem(expectedLogPaths[3]), IsIterableWithSize.<Path>iterableWithSize(3)));
    // Check that last logger logged correct data.
    assertEquals(3, fakeLogger.getAttemptStoringCategoriesWithLinesCount());
    InputStream logFile = fakeLogger.getStoredLog();
    String[] whitelistedCategories = { whitelistedCategory, whitelistedCategory2 };
    String[][] whitelistedLines = { { "hello world 3", "hello world 4" }, { longLine, longLine } };
    Iterator<ScribeData> it = null;
    try {
        it = new ObjectMapper().readValues(new JsonFactory().createParser(logFile), ScribeData.class);
    } catch (Exception e) {
        fail("Obtaining iterator for reading the log failed.");
    }
    int dataNum = 0;
    try {
        while (it.hasNext()) {
            assertTrue(dataNum < 2);
            ScribeData data = it.next();
            assertThat(data.getCategory(), is(whitelistedCategories[dataNum]));
            assertThat(data.getLines(), Matchers.allOf(hasItem(whitelistedLines[dataNum][0]), hasItem(whitelistedLines[dataNum][1]), IsIterableWithSize.<String>iterableWithSize(2)));
            dataNum++;
        }
    } catch (Exception e) {
        fail("Reading stored offline log failed.");
    }
    logFile.close();
    assertEquals(2, dataNum);
}
Also used : Path(java.nio.file.Path) LOGFILE_PREFIX(com.facebook.buck.util.network.offline.OfflineScribeLogger.LOGFILE_PREFIX) Arrays(java.util.Arrays) BufferedInputStream(java.io.BufferedInputStream) ListenableFuture(com.google.common.util.concurrent.ListenableFuture) ObjectMappers(com.facebook.buck.util.ObjectMappers) LOGFILE_SUFFIX(com.facebook.buck.util.network.offline.OfflineScribeLogger.LOGFILE_SUFFIX) TemporaryPaths(com.facebook.buck.testutil.integration.TemporaryPaths) BuckEventBusFactory(com.facebook.buck.event.BuckEventBusFactory) Matchers.arrayContainingInAnyOrder(org.hamcrest.Matchers.arrayContainingInAnyOrder) BufferedOutputStream(java.io.BufferedOutputStream) ArrayList(java.util.ArrayList) Assert.assertThat(org.junit.Assert.assertThat) ProjectFilesystem(com.facebook.buck.io.ProjectFilesystem) Matchers.everyItem(org.hamcrest.Matchers.everyItem) ImmutableList(com.google.common.collect.ImmutableList) BuildId(com.facebook.buck.model.BuildId) FluentIterable(com.google.common.collect.FluentIterable) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Is.is(org.hamcrest.core.Is.is) ScribeLogger(com.facebook.buck.util.network.ScribeLogger) Assert.fail(org.junit.Assert.fail) LOGFILE_PATTERN(com.facebook.buck.util.network.offline.OfflineScribeLogger.LOGFILE_PATTERN) Pair(com.facebook.buck.model.Pair) Path(java.nio.file.Path) ImmutableSortedSet(com.google.common.collect.ImmutableSortedSet) Charsets(com.google.common.base.Charsets) ObjectArrays(com.google.common.collect.ObjectArrays) Iterator(java.util.Iterator) FakeFailingScribeLogger(com.facebook.buck.util.network.FakeFailingScribeLogger) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) Assert.assertTrue(org.junit.Assert.assertTrue) Matchers(org.hamcrest.Matchers) FileOutputStream(java.io.FileOutputStream) Test(org.junit.Test) IOException(java.io.IOException) FileInputStream(java.io.FileInputStream) FutureCallback(com.google.common.util.concurrent.FutureCallback) File(java.io.File) FileNotFoundException(java.io.FileNotFoundException) Futures(com.google.common.util.concurrent.Futures) List(java.util.List) Matchers.hasItem(org.hamcrest.Matchers.hasItem) JsonFactory(com.fasterxml.jackson.core.JsonFactory) Rule(org.junit.Rule) IsIterableWithSize(org.hamcrest.collection.IsIterableWithSize) Matchers.equalTo(org.hamcrest.Matchers.equalTo) Assert.assertEquals(org.junit.Assert.assertEquals) InputStream(java.io.InputStream) BufferedInputStream(java.io.BufferedInputStream) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) JsonFactory(com.fasterxml.jackson.core.JsonFactory) IOException(java.io.IOException) FileNotFoundException(java.io.FileNotFoundException) BuildId(com.facebook.buck.model.BuildId) ProjectFilesystem(com.facebook.buck.io.ProjectFilesystem) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) Test(org.junit.Test)

Aggregations

BuckEventBusFactory (com.facebook.buck.event.BuckEventBusFactory)1 ProjectFilesystem (com.facebook.buck.io.ProjectFilesystem)1 BuildId (com.facebook.buck.model.BuildId)1 Pair (com.facebook.buck.model.Pair)1 TemporaryPaths (com.facebook.buck.testutil.integration.TemporaryPaths)1 ObjectMappers (com.facebook.buck.util.ObjectMappers)1 FakeFailingScribeLogger (com.facebook.buck.util.network.FakeFailingScribeLogger)1 ScribeLogger (com.facebook.buck.util.network.ScribeLogger)1 LOGFILE_PATTERN (com.facebook.buck.util.network.offline.OfflineScribeLogger.LOGFILE_PATTERN)1 LOGFILE_PREFIX (com.facebook.buck.util.network.offline.OfflineScribeLogger.LOGFILE_PREFIX)1 LOGFILE_SUFFIX (com.facebook.buck.util.network.offline.OfflineScribeLogger.LOGFILE_SUFFIX)1 JsonFactory (com.fasterxml.jackson.core.JsonFactory)1 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)1 Charsets (com.google.common.base.Charsets)1 FluentIterable (com.google.common.collect.FluentIterable)1 ImmutableList (com.google.common.collect.ImmutableList)1 ImmutableSortedSet (com.google.common.collect.ImmutableSortedSet)1 ObjectArrays (com.google.common.collect.ObjectArrays)1 FutureCallback (com.google.common.util.concurrent.FutureCallback)1 Futures (com.google.common.util.concurrent.Futures)1