com.streamsets.datacollector.http.TestLogServlet.java Source code

Java tutorial

Introduction

Here is the source code for com.streamsets.datacollector.http.TestLogServlet.java

Source

/**
 * Copyright 2015 StreamSets Inc.
 *
 * Licensed under the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 com.streamsets.datacollector.http;

import com.streamsets.datacollector.http.WebServerTask;
import com.streamsets.datacollector.json.ObjectMapperFactory;
import com.streamsets.datacollector.log.LogUtils;
import com.streamsets.datacollector.main.MainStandalonePipelineManagerModule;
import com.streamsets.datacollector.main.PipelineTaskModule;
import com.streamsets.datacollector.main.RuntimeInfo;
import com.streamsets.datacollector.main.RuntimeModule;
import com.streamsets.datacollector.task.Task;
import com.streamsets.datacollector.task.TaskWrapper;
import com.streamsets.datacollector.util.Configuration;

import dagger.ObjectGraph;

import org.apache.commons.io.IOUtils;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.ServerSocket;
import java.net.URL;
import java.util.List;
import java.util.Map;
import java.util.UUID;

public class TestLogServlet {

    private static final String CONVERSION_PATTERN = "%d{ISO8601} [user:%X{s-user}] [pipeline:%X{s-entity}] [thread:%t] %-5p %c{1} - %m%n";

    private String createTestDir() {
        File dir = new File("target", UUID.randomUUID().toString());
        Assert.assertTrue(dir.mkdirs());
        return dir.getAbsolutePath();
    }

    private int getRandomPort() throws Exception {
        ServerSocket ss = new ServerSocket(0);
        int port = ss.getLocalPort();
        ss.close();
        return port;
    }

    private String baseDir;
    private Task server;
    private static File logFile;
    private static File oldLogFile;

    @Before
    public void setup() throws Exception {
        server = null;
        baseDir = createTestDir();
        String log4jConf = new File(baseDir, "log4j.properties").getAbsolutePath();
        File logFile = new File(baseDir, "x.log");
        Writer writer = new FileWriter(log4jConf);
        IOUtils.write(LogUtils.LOG4J_APPENDER_STREAMSETS_FILE_PROPERTY + "=" + logFile.getAbsolutePath(), writer);
        writer.close();
        Assert.assertTrue(new File(baseDir, "etc").mkdir());
        Assert.assertTrue(new File(baseDir, "data").mkdir());
        Assert.assertTrue(new File(baseDir, "log").mkdir());
        Assert.assertTrue(new File(baseDir, "web").mkdir());
        System.setProperty(RuntimeModule.SDC_PROPERTY_PREFIX + RuntimeInfo.CONFIG_DIR, baseDir + "/etc");
        System.setProperty(RuntimeModule.SDC_PROPERTY_PREFIX + RuntimeInfo.DATA_DIR, baseDir + "/data");
        System.setProperty(RuntimeModule.SDC_PROPERTY_PREFIX + RuntimeInfo.LOG_DIR, baseDir + "/log");
        System.setProperty(RuntimeModule.SDC_PROPERTY_PREFIX + RuntimeInfo.STATIC_WEB_DIR, baseDir + "/web");
    }

    @After
    public void cleanup() {
        System.getProperties().remove(RuntimeModule.SDC_PROPERTY_PREFIX + RuntimeInfo.CONFIG_DIR);
        System.getProperties().remove(RuntimeModule.SDC_PROPERTY_PREFIX + RuntimeInfo.DATA_DIR);
        System.getProperties().remove(RuntimeModule.SDC_PROPERTY_PREFIX + RuntimeInfo.LOG_DIR);
        System.getProperties().remove(RuntimeModule.SDC_PROPERTY_PREFIX + RuntimeInfo.STATIC_WEB_DIR);
    }

    private String startServer() throws Exception {
        try {
            logFile = new File(baseDir, "test.log");
            Writer writer = new FileWriter(logFile);
            writer.write("hello\n");
            writer.close();
            Thread.sleep(1000); // for log files to have different lastModified timestamp
            oldLogFile = new File(baseDir, "test.log.1");
            writer = new FileWriter(oldLogFile);
            writer.write("bye\n");
            writer.close();
            File log4fConfig = new File(baseDir, "log4j.properties");
            writer = new FileWriter(log4fConfig);
            writer.write(LogUtils.LOG4J_APPENDER_STREAMSETS_FILE_PROPERTY + "=" + logFile.getAbsolutePath() + "\n");
            writer.write(LogUtils.LOG4J_APPENDER_STREAMSETS_LAYOUT_CONVERSION_PATTERN + "=" + CONVERSION_PATTERN);
            writer.close();

            int port = getRandomPort();
            Configuration conf = new Configuration();
            conf.set(WebServerTask.HTTP_PORT_KEY, port);
            conf.set(WebServerTask.AUTHENTICATION_KEY, "none");
            writer = new FileWriter(
                    new File(System.getProperty(RuntimeModule.SDC_PROPERTY_PREFIX + RuntimeInfo.CONFIG_DIR),
                            "sdc.properties"));
            conf.save(writer);
            writer.close();
            ObjectGraph dagger = ObjectGraph.create(MainStandalonePipelineManagerModule.class);
            RuntimeInfo runtimeInfo = dagger.get(RuntimeInfo.class);
            runtimeInfo.setAttribute(RuntimeInfo.LOG4J_CONFIGURATION_URL_ATTR,
                    new URL("file://" + baseDir + "/log4j.properties"));
            server = dagger.get(TaskWrapper.class);

            server.init();
            server.run();
            return "http://127.0.0.1:" + port;
        } catch (Exception e) {
            System.out.println("Got exception " + e);
            return null;
        }
    }

    private void stopServer() {
        if (server != null) {
            server.stop();
        }
    }

    @Test
    public void testLogs() throws Exception {
        String baseLogUrl = startServer() + "/rest/v1/system/logs";
        try {
            HttpURLConnection conn = (HttpURLConnection) new URL(baseLogUrl + "/files").openConnection();
            Assert.assertEquals(HttpURLConnection.HTTP_OK, conn.getResponseCode());
            Assert.assertTrue(conn.getContentType().startsWith("application/json"));
            List list = ObjectMapperFactory.get().readValue(conn.getInputStream(), List.class);
            Assert.assertEquals(2, list.size());
            for (int i = 0; i < 2; i++) {
                Map map = (Map) list.get(i);
                String log = (String) map.get("file");
                if (log.equals("test.log")) {
                    Assert.assertEquals(logFile.lastModified(), (long) map.get("lastModified"));
                } else {
                    Assert.assertEquals(oldLogFile.lastModified(), (long) map.get("lastModified"));
                }
            }
            conn = (HttpURLConnection) new URL(baseLogUrl + "/files/" + oldLogFile.getName()).openConnection();
            Assert.assertEquals(HttpURLConnection.HTTP_OK, conn.getResponseCode());
            Assert.assertTrue(conn.getContentType().startsWith("text/plain"));
            List<String> lines = IOUtils.readLines(conn.getInputStream());
            Assert.assertEquals(1, lines.size());
            Assert.assertEquals("bye", lines.get(0));
        } finally {
            stopServer();
        }
    }

}