Whitespace only

Before

1/*
2 * Nextcloud - Android Client
3 *
4 * SPDX-FileCopyrightText: 2019 Chris Narkiewicz <hello@ezaquarii.com>
5 * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
6 */
7package com.nextcloud.client.logger
8
9import org.junit.Assert.assertEquals
10import org.junit.Assert.assertNotNull
11import org.junit.Assert.assertNull
12import org.junit.Assert.assertTrue
13import org.junit.Test
14import org.junit.runner.RunWith
15import org.junit.runners.Suite
16import java.util.Date
17import java.util.SimpleTimeZone
18import java.util.concurrent.TimeUnit
19
20@RunWith(Suite::class)
21@Suite.SuiteClasses(
22 LogEntryTest.ToString::class,
23 LogEntryTest.Parse::class
24)
25class LogEntryTest {
26 private companion object {
27 const val SEVEN_HOUR = 7L
28 }
29
30 class ToString {
31 @Test
32 fun `to string`() {
33 val entry = LogEntry(
34 timestamp = Date(0),
35 level = Level.DEBUG,
36 tag = "tag",
37 message = "some message"
38 )
39 assertEquals("1970-01-01T00:00:00.000Z;D;tag;some message", entry.toString())
40 }
41
42 @Test
43 fun `to string with custom time zone`() {
44 val entry = LogEntry(
45 timestamp = Date(0),
46 level = Level.DEBUG,
47 tag = "tag",
48 message = "some message"
49 )
50 val sevenHours = TimeUnit.HOURS.toMillis(SEVEN_HOUR).toInt()
51 val tz = SimpleTimeZone(sevenHours, "+0700")
52 assertEquals("1970-01-01T07:00:00.000+0700;D;tag;some message", entry.toString(tz))
53 }
54
55 @Test
56 fun `semicolons are removed from entry tags`() {
57 val entry = LogEntry(
58 timestamp = Date(0),
59 level = Level.DEBUG,
60 tag = "t;a;g",
61 message = "some message"
62 )
63 assertEquals("1970-01-01T00:00:00.000Z;D;t a g;some message", entry.toString())
64 }
65
66 @Test
67 fun `message newline is converted`() {
68 val entry = LogEntry(
69 timestamp = Date(0),
70 level = Level.DEBUG,
71 tag = "tag",
72 message = "multine\nmessage\n"
73 )
74 assertTrue(entry.toString().endsWith(";multine\\nmessage\\n"))
75 }
76
77 @Test
78 fun `tag can contain unicode characters`() {
79 val entry = LogEntry(
80 timestamp = Date(0),
81 level = Level.DEBUG,
82 tag =
83 """靖康緗素雜記""",
84 message = "夏炉冬扇"
85 )
86 assertEquals("1970-01-01T00:00:00.000Z;D;靖康緗素雜記;夏炉冬扇", entry.toString())
87 }
88 }
89
90 class Parse {
91 @Test
92 fun `regexp parser`() {
93 val entry = "1970-01-01T00:00:00.000Z;D;tag;some message"
94 val parsed = LogEntry.parse(entry)
95 assertNotNull(parsed)
96 parsed as LogEntry
97 assertEquals(Date(0), parsed.timestamp)
98 assertEquals(Level.DEBUG, parsed.level)
99 assertEquals("tag", parsed.tag)
100 assertEquals("some message", parsed.message)
101 }
102
103 @Test
104 fun `malformed log entries are rejected`() {
105 assertNull("no miliseconds", LogEntry.parse("1970-01-01T00:00:00Z;D;tag;a message"))
106 assertNull("not zulu", LogEntry.parse("1970-01-01T00:00:00.000+00:00;D;tag;a message"))
107 assertNull("not utc", LogEntry.parse("1970-01-01T01:00:00.000+01:00;D;tag;a message"))
108 assertNull("bad month", LogEntry.parse("1970-13-01T00:00:00.000Z;D;tag;a message"))
109 assertNull("bad year", LogEntry.parse("0000-01-01T00:00:00.000Z;D;tag;a message"))
110 assertNull("bad day", LogEntry.parse("1970-01-32T00:00:00.000Z;D;tag;a message"))
111 assertNull("bad hour", LogEntry.parse("1970-01-01T25:00:00.000Z;D;tag;a message"))
112 assertNull("bad minute", LogEntry.parse("1970-01-01T00:61:00.000Z;D;tag;a message"))
113 assertNull("bad second", LogEntry.parse("1970-01-01T00:00:61.000Z;D;tag;a message"))
114 assertNull("bad level", LogEntry.parse("1970-01-01T00:00:00.000Z;?;tag;a message"))
115 assertNull("empty tag", LogEntry.parse("1970-01-01T00:00:00.000Z;D;;a message"))
116 assertNull("empty string", LogEntry.parse(""))
117 }
118
119 @Test
120 fun `semicolon in tag tears the tag`() {
121 val parsed = LogEntry.parse("1970-01-01T00:00:00.000Z;D;t;ag;a message")
122 assertNotNull(parsed)
123 assertEquals("Tag is cut; no parse error expected", "t", parsed?.tag)
124 assertEquals("Tag is cut; no parse error expected", "ag;a message", parsed?.message)
125 }
126
127 @Test
128 fun `message can have semicolons`() {
129 val parsed = LogEntry.parse("1970-01-01T00:00:00.000Z;D;tag;a;message;with;semi;colons")
130 assertEquals("a;message;with;semi;colons", parsed?.message)
131 }
132 }
133}
134

After

1/*
2 * Nextcloud - Android Client
3 *
4 * SPDX-FileCopyrightText: 2019 Chris Narkiewicz <hello@ezaquarii.com>
5 * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
6 */
7package com.nextcloud.client.logger
8
9import org.junit.Assert.assertEquals
10import org.junit.Assert.assertNotNull
11import org.junit.Assert.assertNull
12import org.junit.Assert.assertTrue
13import org.junit.Test
14import org.junit.runner.RunWith
15import org.junit.runners.Suite
16import java.util.Date
17import java.util.SimpleTimeZone
18import java.util.concurrent.TimeUnit
19
20@RunWith(Suite::class)
21@Suite.SuiteClasses(
22 LogEntryTest.ToString::class,
23 LogEntryTest.Parse::class
24)
25class LogEntryTest {
26 private companion object {
27 const val SEVEN_HOUR = 7L
28 }
29
30 class ToString {
31 @Test
32 fun `to string`() {
33 val entry = LogEntry(
34 timestamp = Date(0),
35 level = Level.DEBUG,
36 tag = "tag",
37 message = "some message"
38 )
39 assertEquals("1970-01-01T00:00:00.000Z;D;tag;some message", entry.toString())
40 }
41
42 @Test
43 fun `to string with custom time zone`() {
44 val entry = LogEntry(
45 timestamp = Date(0),
46 level = Level.DEBUG,
47 tag = "tag",
48 message = "some message"
49 )
50 val sevenHours = TimeUnit.HOURS.toMillis(SEVEN_HOUR).toInt()
51 val tz = SimpleTimeZone(sevenHours, "+0700")
52 assertEquals("1970-01-01T07:00:00.000+0700;D;tag;some message", entry.toString(tz))
53 }
54
55 @Test
56 fun `semicolons are removed from entry tags`() {
57 val entry = LogEntry(
58 timestamp = Date(0),
59 level = Level.DEBUG,
60 tag = "t;a;g",
61 message = "some message"
62 )
63 assertEquals("1970-01-01T00:00:00.000Z;D;t a g;some message", entry.toString())
64 }
65
66 @Test
67 fun `message newline is converted`() {
68 val entry = LogEntry(
69 timestamp = Date(0),
70 level = Level.DEBUG,
71 tag = "tag",
72 message = "multine\nmessage\n"
73 )
74 assertTrue(entry.toString().endsWith(";multine\\nmessage\\n"))
75 }
76
77 @Test
78 fun `tag can contain unicode characters`() {
79 val entry = LogEntry(
80 timestamp = Date(0),
81 level = Level.DEBUG,
82 tag =
83 """靖康緗素雜記""",
84 message = "夏炉冬扇"
85 )
86 assertEquals("1970-01-01T00:00:00.000Z;D;靖康緗素雜記;夏炉冬扇", entry.toString())
87 }
88 }
89
90 class Parse {
91 @Test
92 fun `regexp parser`() {
93 val entry = "1970-01-01T00:00:00.000Z;D;tag;some message"
94 val parsed = LogEntry.parse(entry)
95 assertNotNull(parsed)
96 parsed as LogEntry
97 assertEquals(Date(0), parsed.timestamp)
98 assertEquals(Level.DEBUG, parsed.level)
99 assertEquals("tag", parsed.tag)
100 assertEquals("some message", parsed.message)
101 }
102
103 @Test
104 fun `malformed log entries are rejected`() {
105 assertNull("no miliseconds", LogEntry.parse("1970-01-01T00:00:00Z;D;tag;a message"))
106 assertNull("not zulu", LogEntry.parse("1970-01-01T00:00:00.000+00:00;D;tag;a message"))
107 assertNull("not utc", LogEntry.parse("1970-01-01T01:00:00.000+01:00;D;tag;a message"))
108 assertNull("bad month", LogEntry.parse("1970-13-01T00:00:00.000Z;D;tag;a message"))
109 assertNull("bad year", LogEntry.parse("0000-01-01T00:00:00.000Z;D;tag;a message"))
110 assertNull("bad day", LogEntry.parse("1970-01-32T00:00:00.000Z;D;tag;a message"))
111 assertNull("bad hour", LogEntry.parse("1970-01-01T25:00:00.000Z;D;tag;a message"))
112 assertNull("bad minute", LogEntry.parse("1970-01-01T00:61:00.000Z;D;tag;a message"))
113 assertNull("bad second", LogEntry.parse("1970-01-01T00:00:61.000Z;D;tag;a message"))
114 assertNull("bad level", LogEntry.parse("1970-01-01T00:00:00.000Z;?;tag;a message"))
115 assertNull("empty tag", LogEntry.parse("1970-01-01T00:00:00.000Z;D;;a message"))
116 assertNull("empty string", LogEntry.parse(""))
117 }
118
119 @Test
120 fun `semicolon in tag tears the tag`() {
121 val parsed = LogEntry.parse("1970-01-01T00:00:00.000Z;D;t;ag;a message")
122 assertNotNull(parsed)
123 assertEquals("Tag is cut; no parse error expected", "t", parsed?.tag)
124 assertEquals("Tag is cut; no parse error expected", "ag;a message", parsed?.message)
125 }
126
127 @Test
128 fun `message can have semicolons`() {
129 val parsed = LogEntry.parse("1970-01-01T00:00:00.000Z;D;tag;a;message;with;semi;colons")
130 assertEquals("a;message;with;semi;colons", parsed?.message)
131 }
132 }
133}
134

Before

source_file
block_comment "/*\n * Nextcloud - Android Client\n *\n * SPDX-FileCopyrightTex"...
package_header
package "package"
qualified_identifier
identifier "com"
. "."
identifier "nextcloud"
. "."
identifier "client"
. "."
identifier "logger"
import
import "import"
qualified_identifier
identifier "org"
. "."
identifier "junit"
. "."
identifier "Assert"
. "."
identifier "assertEquals"
import
import "import"
qualified_identifier
identifier "org"
. "."
identifier "junit"
. "."
identifier "Assert"
. "."
identifier "assertNotNull"
import
import "import"
qualified_identifier
identifier "org"
. "."
identifier "junit"
. "."
identifier "Assert"
. "."
identifier "assertNull"
import
import "import"
qualified_identifier
identifier "org"
. "."
identifier "junit"
. "."
identifier "Assert"
. "."
identifier "assertTrue"
import
import "import"
qualified_identifier
identifier "org"
. "."
identifier "junit"
. "."
identifier "Test"
import
import "import"
qualified_identifier
identifier "org"
. "."
identifier "junit"
. "."
identifier "runner"
. "."
identifier "RunWith"
import
import "import"
qualified_identifier
identifier "org"
. "."
identifier "junit"
. "."
identifier "runners"
. "."
identifier "Suite"
import
import "import"
qualified_identifier
identifier "java"
. "."
identifier "util"
. "."
identifier "Date"
import
import "import"
qualified_identifier
identifier "java"
. "."
identifier "util"
. "."
identifier "SimpleTimeZone"
import
import "import"
qualified_identifier
identifier "java"
. "."
identifier "util"
. "."
identifier "concurrent"
. "."
identifier "TimeUnit"
class_declaration (+1095 nodes collapsed)

After

source_file
block_comment "/*\n * Nextcloud - Android Client\n *\n * SPDX-FileCopyrightTex"...
package_header
package "package"
qualified_identifier
identifier "com"
. "."
identifier "nextcloud"
. "."
identifier "client"
. "."
identifier "logger"
import
import "import"
qualified_identifier
identifier "org"
. "."
identifier "junit"
. "."
identifier "Assert"
. "."
identifier "assertEquals"
import
import "import"
qualified_identifier
identifier "org"
. "."
identifier "junit"
. "."
identifier "Assert"
. "."
identifier "assertNotNull"
import
import "import"
qualified_identifier
identifier "org"
. "."
identifier "junit"
. "."
identifier "Assert"
. "."
identifier "assertNull"
import
import "import"
qualified_identifier
identifier "org"
. "."
identifier "junit"
. "."
identifier "Assert"
. "."
identifier "assertTrue"
import
import "import"
qualified_identifier
identifier "org"
. "."
identifier "junit"
. "."
identifier "Test"
import
import "import"
qualified_identifier
identifier "org"
. "."
identifier "junit"
. "."
identifier "runner"
. "."
identifier "RunWith"
import
import "import"
qualified_identifier
identifier "org"
. "."
identifier "junit"
. "."
identifier "runners"
. "."
identifier "Suite"
import
import "import"
qualified_identifier
identifier "java"
. "."
identifier "util"
. "."
identifier "Date"
import
import "import"
qualified_identifier
identifier "java"
. "."
identifier "util"
. "."
identifier "SimpleTimeZone"
import
import "import"
qualified_identifier
identifier "java"
. "."
identifier "util"
. "."
identifier "concurrent"
. "."
identifier "TimeUnit"
class_declaration (+1095 nodes collapsed)