1de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi/*
2de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi * Copyright (C) 2016 The Android Open Source Project
3de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi *
4de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi * Licensed under the Apache License, Version 2.0 (the "License");
5de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi * you may not use this file except in compliance with the License.
6de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi * You may obtain a copy of the License at
7de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi *
8de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi *      http://www.apache.org/licenses/LICENSE-2.0
9de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi *
10de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi * Unless required by applicable law or agreed to in writing, software
11de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi * distributed under the License is distributed on an "AS IS" BASIS,
12de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi * See the License for the specific language governing permissions and
14de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi * limitations under the License.
15de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi */
16de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi
17de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichipackage android.util;
18de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi
19de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichiimport junit.framework.TestCase;
20de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi
21de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichiimport java.io.PrintWriter;
22de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichiimport java.io.StringWriter;
23de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichiimport java.util.Arrays;
24de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichiimport java.util.Collections;
25de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichiimport java.util.List;
26de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi
27de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi
28de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichipublic class LocalLogTest extends TestCase {
29de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi
30de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi    public void testA() {
31de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        String[] lines = {
32de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            "foo",
33de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            "bar",
34de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            "baz"
35de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        };
36de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        String[] want = lines;
37de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        testcase(new LocalLog(10), lines, want);
38de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi    }
39de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi
40de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi    public void testB() {
41de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        String[] lines = {
42de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            "foo",
43de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            "bar",
44de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            "baz"
45de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        };
46de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        String[] want = {};
47de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        testcase(new LocalLog(0), lines, want);
48de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi    }
49de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi
50de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi    public void testC() {
51de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        String[] lines = {
52de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            "dropped",
53de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            "dropped",
54de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            "dropped",
55de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            "dropped",
56de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            "dropped",
57de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            "dropped",
58de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            "foo",
59de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            "bar",
60de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            "baz",
61de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        };
62de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        String[] want = {
63de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            "foo",
64de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            "bar",
65de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            "baz",
66de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        };
67de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        testcase(new LocalLog(3), lines, want);
68de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi    }
69de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi
70de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi    void testcase(LocalLog logger, String[] input, String[] want) {
71de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        for (String l : input) {
72de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            logger.log(l);
73de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        }
74de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        verifyAllLines(want, dump(logger).split("\n"));
75de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        verifyAllLines(reverse(want), reverseDump(logger).split("\n"));
76de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi    }
77de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi
78de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi    void verifyAllLines(String[] wantLines, String[] gotLines) {
79de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        for (int i = 0; i < wantLines.length; i++) {
80de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            String want = wantLines[i];
81de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            String got = gotLines[i];
82de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            String msg = String.format("%s did not contain %s", quote(got), quote(want));
83de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi            assertTrue(msg, got.contains(want));
84de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        }
85de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi    }
86de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi
87de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi    static String dump(LocalLog logger) {
88de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        StringWriter buffer = new StringWriter();
89de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        PrintWriter writer = new PrintWriter(buffer);
90de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        logger.dump(null, writer, new String[0]);
91de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        return buffer.toString();
92de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi    }
93de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi
94de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi    static String reverseDump(LocalLog logger) {
95de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        StringWriter buffer = new StringWriter();
96de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        PrintWriter writer = new PrintWriter(buffer);
97de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        logger.reverseDump(null, writer, new String[0]);
98de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        return buffer.toString();
99de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi    }
100de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi
101de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi    static String quote(String s) {
102de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        return '"' + s + '"';
103de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi    }
104de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi
105de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi    static String[] reverse(String[] ary) {
106de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        List<String> ls = Arrays.asList(ary);
107de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        Collections.reverse(ls);
108de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi        return  ls.toArray(new String[ary.length]);
109de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi    }
110de310dba78fa7cd60ad01cefa7fadb6d48fffcaaHugo Benichi}
111