/* * Copyright (C) 2015 The Android Open Source Project * * Licensed 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.android.ide.common.blame; import com.android.annotations.NonNull; import com.android.ide.common.blame.parser.ParsingFailedException; import com.android.ide.common.blame.parser.PatternAwareOutputParser; import com.android.ide.common.blame.parser.ToolOutputParser; import com.android.ide.common.blame.parser.util.OutputLineReader; import com.android.ide.common.process.ProcessException; import com.android.ide.common.process.ProcessOutput; import com.android.ide.common.res2.RecordingLogger; import com.android.utils.ILogger; import com.google.common.base.Charsets; import org.junit.BeforeClass; import org.junit.Test; import org.mockito.Mockito; import java.io.File; import java.io.IOException; import java.util.List; public class ParsingProcessOutputHandlerTest { private static ParsingProcessOutputHandler sParsingProcessOutputHandler; private static RecordingLogger sLogger; private static PatternAwareOutputParser sFakePatternParser; private static MessageReceiver sMessageReceiver; @BeforeClass public static void setUp() throws Exception { sLogger = new RecordingLogger(); sFakePatternParser = new FakePatternAwareOutputParser(); sMessageReceiver = Mockito.mock(MessageReceiver.class); sParsingProcessOutputHandler = new ParsingProcessOutputHandler( new ToolOutputParser(sFakePatternParser, sLogger), sMessageReceiver); } @Test public void testRewriteMessages() throws IOException, ProcessException { String original = "error example\ntwo line error\nnext line\nsomething else"; sParsingProcessOutputHandler.handleOutput(processOutputFromErrorString(original)); Mockito.verify(sMessageReceiver).receiveMessage(new Message( Message.Kind.ERROR, "errorText", "originalText", new SourceFilePosition( new SourceFile(FakePatternAwareOutputParser.ERROR_EXAMPLE_FILE), new SourcePosition(1, 2, 3, 4, 5, 6) ))); Mockito.verify(sMessageReceiver).receiveMessage(new Message( Message.Kind.WARNING, "two line warning", new SourceFilePosition( new SourceFile(FakePatternAwareOutputParser.TWO_LINE_ERROR_FILE), new SourcePosition(1, 2, -1) ))); Mockito.verify(sMessageReceiver).receiveMessage(new Message( Message.Kind.SIMPLE, "something else", SourceFilePosition.UNKNOWN)); Mockito.verifyNoMoreInteractions(sMessageReceiver); String expected = "AGPBI: {" + "\"kind\":\"error\"," + "\"text\":\"errorText\"," + "\"sources\":[{" + "\"file\":\"" + FakePatternAwareOutputParser.ERROR_EXAMPLE_FILE.getAbsolutePath() + "\",\"position\":{\"startLine\":1,\"startColumn\":2,\"startOffset\":3," + "\"endLine\":4,\"endColumn\":5,\"endOffset\":6}}]," + "\"original\":\"original_text\"}\n" + "AGPBI: {\"kind\":\"warning\"," + "\"text\":\"two line warning\"," + "\"sources\":[{\"file\":\"" + FakePatternAwareOutputParser.TWO_LINE_ERROR_FILE.getAbsolutePath() + "\"," + "\"position\":{\"startLine\":1,\"startColumn\":2}}]}\n" + "AGPBI: {\"kind\":\"simple\"," + "\"text\":\"something else\"," + "\"sources\":[{}]}"; } @Test public void parseException() throws IOException, ProcessException { String original = "two line error"; sParsingProcessOutputHandler.handleOutput(processOutputFromErrorString(original)); Mockito.verifyNoMoreInteractions(sMessageReceiver); } private static ProcessOutput processOutputFromErrorString(String original) throws IOException { ProcessOutput processOutput = sParsingProcessOutputHandler.createOutput(); processOutput.getErrorOutput().write(original.getBytes(Charsets.UTF_8)); return processOutput; } private static class FakePatternAwareOutputParser implements PatternAwareOutputParser { static final File ERROR_EXAMPLE_FILE = new File("error/source"); static final File TWO_LINE_ERROR_FILE = new File("error/source/2"); @Override public boolean parse(@NonNull String line, @NonNull OutputLineReader reader, @NonNull List<Message> messages, @NonNull ILogger logger) throws ParsingFailedException { if (line.equals("two line error")) { String nextLine = reader.readLine(); if ("next line".equals(nextLine)) { messages.add(new Message( Message.Kind.WARNING, "two line warning", "two line warning", new SourceFilePosition( TWO_LINE_ERROR_FILE, new SourcePosition(1, 2, -1)))); } else { throw new ParsingFailedException(); } return true; } if (line.equals("error example")) { messages.add( new Message( Message.Kind.ERROR, "errorText", "original_text", new SourceFilePosition( ERROR_EXAMPLE_FILE, new SourcePosition(1, 2, 3, 4, 5, 6)))); return true; } return false; } } }