/*
* Licensed to 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 org.apache.zeppelin.interpreter;
import static org.junit.Assert.*;
import java.io.IOException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class InterpreterOutputTest implements InterpreterOutputListener {
private InterpreterOutput out;
int numAppendEvent;
int numUpdateEvent;
@Before
public void setUp() {
out = new InterpreterOutput(this);
numAppendEvent = 0;
numUpdateEvent = 0;
}
@After
public void tearDown() throws IOException {
out.close();
}
@Test
public void testDetectNewline() throws IOException {
out.write("hello\nworld");
assertEquals(1, out.size());
assertEquals(InterpreterResult.Type.TEXT, out.getOutputAt(0).getType());
assertEquals("hello\n", new String(out.getOutputAt(0).toByteArray()));
assertEquals(1, numAppendEvent);
assertEquals(1, numUpdateEvent);
out.write("\n");
assertEquals("hello\nworld\n", new String(out.getOutputAt(0).toByteArray()));
assertEquals(2, numAppendEvent);
assertEquals(1, numUpdateEvent);
}
@Test
public void testFlush() throws IOException {
out.write("hello\nworld");
assertEquals("hello\n", new String(out.getOutputAt(0).toByteArray()));
assertEquals(1, numAppendEvent);
assertEquals(1, numUpdateEvent);
out.flush();
assertEquals("hello\nworld", new String(out.getOutputAt(0).toByteArray()));
assertEquals(2, numAppendEvent);
assertEquals(1, numUpdateEvent);
out.clear();
out.write("%html div");
assertEquals("", new String(out.getOutputAt(0).toByteArray()));
assertEquals(InterpreterResult.Type.HTML, out.getOutputAt(0).getType());
out.flush();
assertEquals("div", new String(out.getOutputAt(0).toByteArray()));
}
@Test
public void testType() throws IOException {
// default output stream type is TEXT
out.write("Text\n");
assertEquals(InterpreterResult.Type.TEXT, out.getOutputAt(0).getType());
assertEquals("Text\n", new String(out.getOutputAt(0).toByteArray()));
assertEquals(1, numAppendEvent);
assertEquals(1, numUpdateEvent);
// change type
out.write("%html\n");
assertEquals(InterpreterResult.Type.HTML, out.getOutputAt(1).getType());
assertEquals("", new String(out.getOutputAt(1).toByteArray()));
assertEquals(1, numAppendEvent);
assertEquals(1, numUpdateEvent);
// none TEXT type output stream does not generate append event
out.write("<div>html</div>\n");
assertEquals(InterpreterResult.Type.HTML, out.getOutputAt(1).getType());
assertEquals(1, numAppendEvent);
assertEquals(2, numUpdateEvent);
out.flush();
assertEquals("<div>html</div>\n", new String(out.getOutputAt(1).toByteArray()));
// change type to text again
out.write("%text hello\n");
assertEquals(InterpreterResult.Type.TEXT, out.getOutputAt(2).getType());
assertEquals(2, numAppendEvent);
assertEquals(4, numUpdateEvent);
assertEquals("hello\n", new String(out.getOutputAt(2).toByteArray()));
}
@Test
public void testChangeTypeInTheBeginning() throws IOException {
out.write("%html\nHello");
assertEquals(InterpreterResult.Type.HTML, out.getOutputAt(0).getType());
}
@Test
public void testChangeTypeWithMultipleNewline() throws IOException {
out.write("%html\n");
assertEquals(InterpreterResult.Type.HTML, out.getOutputAt(0).getType());
out.write("%text\n");
assertEquals(InterpreterResult.Type.TEXT, out.getOutputAt(1).getType());
out.write("\n%html\n");
assertEquals(InterpreterResult.Type.HTML, out.getOutputAt(2).getType());
out.write("\n\n%text\n");
assertEquals(InterpreterResult.Type.TEXT, out.getOutputAt(3).getType());
out.write("\n\n\n%html\n");
assertEquals(InterpreterResult.Type.HTML, out.getOutputAt(4).getType());
}
@Test
public void testChangeTypeWithoutData() throws IOException {
out.write("%html\n%table\n");
assertEquals(InterpreterResult.Type.HTML, out.getOutputAt(0).getType());
assertEquals(InterpreterResult.Type.TABLE, out.getOutputAt(1).getType());
}
@Test
public void testMagicData() throws IOException {
out.write("%table col1\tcol2\n\n%html <h3> This is a hack </h3>\t234\n".getBytes());
assertEquals(InterpreterResult.Type.TABLE, out.getOutputAt(0).getType());
assertEquals(InterpreterResult.Type.HTML, out.getOutputAt(1).getType());
assertEquals("col1\tcol2\n", new String(out.getOutputAt(0).toByteArray()));
out.flush();
assertEquals("<h3> This is a hack </h3>\t234\n", new String(out.getOutputAt(1).toByteArray()));
}
@Test
public void testTableCellFormatting() throws IOException {
out.write("%table col1\tcol2\n\n%html val1\tval2\n".getBytes());
assertEquals(InterpreterResult.Type.TABLE, out.getOutputAt(0).getType());
assertEquals("col1\tcol2\n", new String(out.getOutputAt(0).toByteArray()));
out.flush();
assertEquals("val1\tval2\n", new String(out.getOutputAt(1).toByteArray()));
}
@Test
public void testTruncate() throws IOException {
// output is truncated after the new line
InterpreterOutput.limit = 3;
out = new InterpreterOutput(this);
// truncate text
out.write("%text hello\nworld\n");
assertEquals("hello", new String(out.getOutputAt(0).toByteArray()));
out.getOutputAt(1).flush();
assertTrue(new String(out.getOutputAt(1).toByteArray()).contains("truncated"));
// truncate table
out = new InterpreterOutput(this);
out.write("%table key\tvalue\nhello\t100\nworld\t200\n");
assertEquals("key\tvalue", new String(out.getOutputAt(0).toByteArray()));
out.getOutputAt(1).flush();
assertTrue(new String(out.getOutputAt(1).toByteArray()).contains("truncated"));
// does not truncate html
out = new InterpreterOutput(this);
out.write("%html hello\nworld\n");
out.flush();
assertEquals("hello\nworld\n", new String(out.getOutputAt(0).toByteArray()));
// restore default
InterpreterOutput.limit = Constants.ZEPPELIN_INTERPRETER_OUTPUT_LIMIT;
}
@Override
public void onUpdateAll(InterpreterOutput out) {
}
@Override
public void onAppend(int index, InterpreterResultMessageOutput out, byte[] line) {
numAppendEvent++;
}
@Override
public void onUpdate(int index, InterpreterResultMessageOutput out) {
numUpdateEvent++;
}
}