1b312c1a4338bcf3a4fdd1358d76df89b1c88243
[squelch.git] / src / test / java / net / jaekl / squelch / ArgsTest.java
1 package net.jaekl.squelch;
2
3 import static org.junit.Assert.*;
4
5 import java.io.ByteArrayOutputStream;
6 import java.io.IOException;
7 import java.io.OutputStreamWriter;
8 import java.io.PrintWriter;
9 import java.nio.charset.StandardCharsets;
10
11 import net.jaekl.squelch.util.FileMock;
12 import net.jaekl.squelch.util.FileUtilMock;
13
14 import org.junit.Test;
15
16 public class ArgsTest 
17 {
18         private static class Result {
19                 private boolean m_retVal;
20                 private Args m_args;
21                 private String m_stdout;
22                 
23                 public Result(boolean retVal, Args args, String stdout) {
24                         m_retVal = retVal;
25                         m_args = args;
26                         m_stdout = stdout;
27                 }
28                 
29                 public boolean getRetVal() { return m_retVal; }
30                 public Args getArgs() { return m_args; }
31                 public String getStdout() { return m_stdout; }
32         }
33
34         @Test
35         public void test_variousParams() throws IOException 
36         {
37                 Result result = null;
38                 
39                 String[] noParams = {};
40                 result = runWithParams(noParams);
41                 assertTrue(result.getRetVal());
42                 assertEquals(false, result.getArgs().isHelp());
43                 assertEquals("", result.getArgs().getUrl());
44                 assertEquals("", result.getArgs().getUser());
45                 assertEquals("", result.getArgs().getPass());
46                 assertEquals("", result.getStdout());
47                 
48                 String[] helpOnly = { "--help" };
49                 result = runWithParams(helpOnly);
50                 assertTrue(result.getRetVal());
51                 assertEquals(true, result.getArgs().isHelp());
52                 assertEquals("", result.getArgs().getUrl());
53                 assertEquals("", result.getArgs().getUser());
54                 assertEquals("", result.getArgs().getPass());
55                 validateUsageMessage(result.getStdout());
56                 
57                 String[] oneTwoThree = { "-r", "one", "-u", "two", "-p", "three" };
58                 result = runWithParams(oneTwoThree);
59                 assertTrue(result.getRetVal());
60                 assertEquals(false, result.getArgs().isHelp());
61                 assertEquals("one", result.getArgs().getUrl());
62                 assertEquals("two", result.getArgs().getUser());
63                 assertEquals("three", result.getArgs().getPass());
64                 assertEquals("", result.getStdout());
65                 
66                 String[] invalid = { "--bogus" };
67                 result = runWithParams(invalid);
68                 assertFalse(result.getRetVal());
69                 assertEquals(false, result.getArgs().isHelp());
70                 assertEquals("", result.getArgs().getUrl());
71                 assertEquals("", result.getArgs().getUser());
72                 assertEquals("", result.getArgs().getPass());
73                 validateUsageMessage(result.getStdout());
74         }
75         
76         @Test
77         public void test_configFile() throws IOException
78         {
79                 final String CONFIG_FILE_NAME = "configFileName";
80                 final String SIMPLE_CONTENT = "db.user=fred\n"
81                                                     + "db.password=p455w0rd\n"
82                                                     + "db.url=jdbc:postgresql://localhost/cfb\n";
83                 
84                 Result result = null;
85                 
86                 FileUtilMock.mock_setInst();
87                 FileMock configFileMock = FileUtilMock.mock_getInst().mock_newFile(CONFIG_FILE_NAME);
88                 FileUtilMock.mock_getInst().mock_setReadable(configFileMock, true);
89                 configFileMock.mock_setContent(SIMPLE_CONTENT.getBytes(StandardCharsets.UTF_8));
90                 
91                 String[] simple = { "-c", CONFIG_FILE_NAME };
92                 result = runWithParams(simple);
93                 assertTrue(result.getRetVal());
94                 assertEquals(false, result.getArgs().isHelp());
95                 assertEquals("jdbc:postgresql://localhost/cfb", result.getArgs().getUrl());
96                 assertEquals("fred", result.getArgs().getUser());
97                 assertEquals("p455w0rd", result.getArgs().getPass());
98                 assertEquals("", result.getStdout());
99                 
100         }
101         
102         // We expect the stdout string to contain a usage message.
103         // Do some sanity-checking to ensure that it looks vaguely correct.
104         private void validateUsageMessage(String stdout) 
105         {
106                 assertTrue(stdout.contains(this.getClass().getName()));
107                 assertTrue(stdout.contains("--help"));
108         }
109
110         private Result runWithParams(String[] params)
111                 throws IOException
112         {
113                 try (
114                                 ByteArrayOutputStream baos = new ByteArrayOutputStream();
115                                 PrintWriter pw = new PrintWriter(new OutputStreamWriter(baos, StandardCharsets.UTF_8));
116                         )
117                 {
118                         Args args = new Args(this.getClass().getName());
119                         boolean retVal = args.parseArgs(pw, params);
120
121                         pw.flush();
122                         baos.flush();
123                         String stdout = baos.toString(StandardCharsets.UTF_8.name());
124                         
125                         return new Result(retVal, args, stdout);
126                 }               
127         }
128 }