1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
15 # Popcorn testing services
19 # Popcorn allows you to test your apps using nitunit blackbox testing.
21 # With blackbox testing you compare the output of your program with a result file.
23 # To get started with blackbox testing, create a nitunit test suite and imports
24 # the `pop_tests` module.
26 # You then need to build the app that will be tested by nitunit as shown in the
27 # `test_example_hello` method.
28 # Calling `run_test` will automatically set the `host` and `port` used for testing.
30 # Redefine the `client_test` method to write your scenario.
31 # Here we use `curl` to access some URI on the app.
34 # module test_example_hello is test_suite
37 # import example_hello
39 # class TestExampleHello
42 # fun test_example_hello do
44 # app.use("/", new HelloHandler)
48 # redef fun client_test do
49 # system "curl -s {host}:{port}"
50 # system "curl -s {host}:{port}/"
51 # system "curl -s {host}:{port}///////////"
52 # system "curl -s {host}:{port}/not_found"
53 # system "curl -s {host}:{port}/not_found/not_found"
58 # The blackbox testing needs a reference result file against wich the test output
60 # Create your expected result file in `test_example_hello.sav/test_example_hello.res`.
62 # Test your app by running nitunit:
65 # nitunit ./example_hello.nit
68 # See `examples/hello_world` for the complete example.
77 # Use localhost for testing
78 var test_host
= "localhost"
80 # Return a new port for each instance
83 return 10000+20000.rand
87 # Thread running the App to test.
91 # Host used by tested App.
94 # Port used by tested App.
102 # Hide testing concept to force nitcorn to actually run
103 "NIT_TESTING".setenv
("false")
105 app
.listen
(host
, port
)
110 # Thread running the test client.
114 # Test suite to execute.
115 var test_suite
: TestPopcorn
118 test_suite
.client_test
124 # TestSuite for Popcorn blackbox testing.
128 # Host used to run App.
129 var host
: String = test_host
131 # Port used to run App.
132 var port
: Int = test_port
134 # Directory of the current test suite
136 # Useful when your tested app need to load some external files.
137 var test_path
: String = "NIT_TESTING_PATH".environ
.dirname
139 # Run the test suite on the App.
140 fun run_test
(app
: App) do
141 var server
= new AppThread(host
, port
, app
)
145 var client
= new ClientThread(self)
153 # Redefine this method to implement your test scenario.
154 fun client_test
do end
156 # Regex to catch and hide the port from the output to get consistent results
157 var host_re
: Regex = "localhost:\[0-9\]+".to_re
159 # Execute a System function.
160 fun system
(cmd
: String, title
: nullable String)
162 title
= title
or else cmd
163 title
= title
.replace
(host_re
, "localhost:*****")
164 print
"\n[Client] {title}"