ftpd 2.0.1 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Changelog.md +6 -0
- data/Gemfile +2 -15
- data/Gemfile.lock +12 -51
- data/README.md +12 -0
- data/VERSION +1 -1
- data/bin/ftpdrb +17 -12
- data/examples/write_only.rb +61 -0
- data/ftpd.gemspec +59 -261
- data/lib/ftpd/session.rb +51 -51
- metadata +11 -153
- data/.travis.yml +0 -6
- data/features/example/eplf.feature +0 -14
- data/features/example/example.feature +0 -18
- data/features/example/read_only.feature +0 -63
- data/features/example/step_definitions/example_server.rb +0 -13
- data/features/ftp_server/abort.feature +0 -13
- data/features/ftp_server/allo.feature +0 -33
- data/features/ftp_server/append.feature +0 -94
- data/features/ftp_server/cdup.feature +0 -36
- data/features/ftp_server/command_errors.feature +0 -13
- data/features/ftp_server/concurrent_sessions.feature +0 -14
- data/features/ftp_server/delay_after_failed_login.feature +0 -23
- data/features/ftp_server/delete.feature +0 -60
- data/features/ftp_server/directory_navigation.feature +0 -59
- data/features/ftp_server/disconnect_after_failed_logins.feature +0 -25
- data/features/ftp_server/eprt.feature +0 -56
- data/features/ftp_server/epsv.feature +0 -37
- data/features/ftp_server/features.feature +0 -38
- data/features/ftp_server/file_structure.feature +0 -43
- data/features/ftp_server/get.feature +0 -80
- data/features/ftp_server/get_ipv6.feature +0 -46
- data/features/ftp_server/get_tls.feature +0 -23
- data/features/ftp_server/help.feature +0 -21
- data/features/ftp_server/implicit_tls.feature +0 -23
- data/features/ftp_server/invertability.feature +0 -15
- data/features/ftp_server/list.feature +0 -94
- data/features/ftp_server/list_tls.feature +0 -29
- data/features/ftp_server/logging.feature +0 -11
- data/features/ftp_server/login_auth_level_account.feature +0 -51
- data/features/ftp_server/login_auth_level_password.feature +0 -59
- data/features/ftp_server/login_auth_level_user.feature +0 -31
- data/features/ftp_server/max_connections.feature +0 -39
- data/features/ftp_server/mdtm.feature +0 -53
- data/features/ftp_server/mkdir.feature +0 -70
- data/features/ftp_server/mode.feature +0 -43
- data/features/ftp_server/name_list.feature +0 -77
- data/features/ftp_server/name_list_tls.feature +0 -30
- data/features/ftp_server/noop.feature +0 -17
- data/features/ftp_server/options.feature +0 -17
- data/features/ftp_server/pasv.feature +0 -30
- data/features/ftp_server/port.feature +0 -49
- data/features/ftp_server/put.feature +0 -79
- data/features/ftp_server/put_tls.feature +0 -23
- data/features/ftp_server/put_unique.feature +0 -56
- data/features/ftp_server/quit.feature +0 -23
- data/features/ftp_server/reinitialize.feature +0 -13
- data/features/ftp_server/rename.feature +0 -97
- data/features/ftp_server/rmdir.feature +0 -71
- data/features/ftp_server/site.feature +0 -13
- data/features/ftp_server/size.feature +0 -69
- data/features/ftp_server/status.feature +0 -18
- data/features/ftp_server/step_definitions/logging.rb +0 -10
- data/features/ftp_server/step_definitions/test_server.rb +0 -71
- data/features/ftp_server/structure_mount.feature +0 -13
- data/features/ftp_server/syntax_errors.feature +0 -18
- data/features/ftp_server/syst.feature +0 -18
- data/features/ftp_server/timeout.feature +0 -26
- data/features/ftp_server/type.feature +0 -59
- data/features/step_definitions/append.rb +0 -17
- data/features/step_definitions/client.rb +0 -27
- data/features/step_definitions/client_and_server_files.rb +0 -26
- data/features/step_definitions/client_files.rb +0 -16
- data/features/step_definitions/command.rb +0 -7
- data/features/step_definitions/connect.rb +0 -39
- data/features/step_definitions/delete.rb +0 -17
- data/features/step_definitions/directory_navigation.rb +0 -28
- data/features/step_definitions/error_replies.rb +0 -117
- data/features/step_definitions/features.rb +0 -23
- data/features/step_definitions/file_structure.rb +0 -18
- data/features/step_definitions/generic_send.rb +0 -11
- data/features/step_definitions/get.rb +0 -18
- data/features/step_definitions/help.rb +0 -20
- data/features/step_definitions/invalid_commands.rb +0 -13
- data/features/step_definitions/ipv6.rb +0 -11
- data/features/step_definitions/line_endings.rb +0 -9
- data/features/step_definitions/list.rb +0 -75
- data/features/step_definitions/login.rb +0 -84
- data/features/step_definitions/mkdir.rb +0 -11
- data/features/step_definitions/mode.rb +0 -17
- data/features/step_definitions/mtime.rb +0 -25
- data/features/step_definitions/noop.rb +0 -17
- data/features/step_definitions/options.rb +0 -11
- data/features/step_definitions/passive.rb +0 -10
- data/features/step_definitions/pending.rb +0 -5
- data/features/step_definitions/port.rb +0 -7
- data/features/step_definitions/put.rb +0 -31
- data/features/step_definitions/quit.rb +0 -17
- data/features/step_definitions/rename.rb +0 -13
- data/features/step_definitions/rmdir.rb +0 -11
- data/features/step_definitions/server_files.rb +0 -63
- data/features/step_definitions/server_title.rb +0 -14
- data/features/step_definitions/size.rb +0 -22
- data/features/step_definitions/status.rb +0 -11
- data/features/step_definitions/success_replies.rb +0 -9
- data/features/step_definitions/system.rb +0 -12
- data/features/step_definitions/timing.rb +0 -21
- data/features/step_definitions/type.rb +0 -17
- data/features/support/env.rb +0 -6
- data/features/support/example_server.rb +0 -69
- data/features/support/file_templates/ascii_unix +0 -4
- data/features/support/file_templates/ascii_windows +0 -4
- data/features/support/file_templates/binary +0 -0
- data/features/support/test_client.rb +0 -258
- data/features/support/test_file_templates.rb +0 -35
- data/features/support/test_server.rb +0 -304
- data/features/support/test_server_files.rb +0 -59
- data/rake_tasks/cucumber.rake +0 -9
- data/rake_tasks/default.rake +0 -1
- data/rake_tasks/jeweler.rake +0 -52
- data/rake_tasks/spec.rake +0 -3
- data/rake_tasks/test.rake +0 -2
- data/rake_tasks/yard.rake +0 -3
- data/spec/command_sequence_checker_spec.rb +0 -85
- data/spec/connection_throttle_spec.rb +0 -101
- data/spec/connection_tracker_spec.rb +0 -99
- data/spec/data_server_factory_spec.rb +0 -104
- data/spec/disk_file_system_spec.rb +0 -322
- data/spec/exception_translator_spec.rb +0 -38
- data/spec/file_info_spec.rb +0 -61
- data/spec/ftp_server_error_spec.rb +0 -15
- data/spec/list_format/eplf_spec.rb +0 -63
- data/spec/list_format/ls_spec.rb +0 -272
- data/spec/list_path_spec.rb +0 -23
- data/spec/null_logger_spec.rb +0 -26
- data/spec/protocols_spec.rb +0 -159
- data/spec/server_spec.rb +0 -83
- data/spec/spec_helper.rb +0 -17
- data/spec/telnet_spec.rb +0 -77
- data/spec/translate_exceptions_spec.rb +0 -42
- data/testlib/network.rb +0 -17
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
Feature: Remove directory
|
|
2
|
-
|
|
3
|
-
As a client
|
|
4
|
-
I want to remove a directory
|
|
5
|
-
To reduce clutter
|
|
6
|
-
|
|
7
|
-
Background:
|
|
8
|
-
Given the test server is started
|
|
9
|
-
|
|
10
|
-
Scenario: Make directory
|
|
11
|
-
Given a successful login
|
|
12
|
-
And the server has directory "foo"
|
|
13
|
-
When the client successfully removes directory "foo"
|
|
14
|
-
Then the server should not have directory "foo"
|
|
15
|
-
|
|
16
|
-
Scenario: Directory of a directory
|
|
17
|
-
Given a successful login
|
|
18
|
-
And the server has directory "foo/bar"
|
|
19
|
-
When the client successfully removes directory "foo/bar"
|
|
20
|
-
Then the server should not have directory "foo/bar"
|
|
21
|
-
And the server has directory "foo"
|
|
22
|
-
|
|
23
|
-
Scenario: After cwd
|
|
24
|
-
Given a successful login
|
|
25
|
-
And the server has directory "foo/bar"
|
|
26
|
-
And the client successfully cd's to "foo"
|
|
27
|
-
When the client successfully removes directory "bar"
|
|
28
|
-
Then the server should not have directory "foo/bar"
|
|
29
|
-
|
|
30
|
-
Scenario: XRMD
|
|
31
|
-
Given a successful login
|
|
32
|
-
And the server has directory "foo"
|
|
33
|
-
When the client successfully sends "XRMD foo"
|
|
34
|
-
Then the server should not have directory "foo"
|
|
35
|
-
|
|
36
|
-
Scenario: Missing directory
|
|
37
|
-
Given a successful login
|
|
38
|
-
When the client removes directory "foo/bar"
|
|
39
|
-
Then the server returns a not found error
|
|
40
|
-
|
|
41
|
-
Scenario: Not logged in
|
|
42
|
-
Given a successful connection
|
|
43
|
-
When the client removes directory "foo"
|
|
44
|
-
Then the server returns a not logged in error
|
|
45
|
-
|
|
46
|
-
Scenario: Does not exist
|
|
47
|
-
Given a successful login
|
|
48
|
-
When the client removes directory "foo"
|
|
49
|
-
Then the server returns a not found error
|
|
50
|
-
|
|
51
|
-
Scenario: Remove a file
|
|
52
|
-
Given a successful login
|
|
53
|
-
And the server has file "foo"
|
|
54
|
-
When the client removes directory "foo"
|
|
55
|
-
Then the server returns a not a directory error
|
|
56
|
-
|
|
57
|
-
Scenario: Rmdir not enabled
|
|
58
|
-
Given the test server lacks rmdir
|
|
59
|
-
And a successful login
|
|
60
|
-
When the client removes directory "foo"
|
|
61
|
-
Then the server returns an unimplemented command error
|
|
62
|
-
|
|
63
|
-
Scenario: Missing path
|
|
64
|
-
Given a successful login
|
|
65
|
-
When the client sends "RMD"
|
|
66
|
-
Then the server returns a syntax error
|
|
67
|
-
|
|
68
|
-
Scenario: Access denied
|
|
69
|
-
Given a successful login
|
|
70
|
-
When the client removes directory "forbidden"
|
|
71
|
-
Then the server returns an access denied error
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
Feature: Site
|
|
2
|
-
|
|
3
|
-
As a client
|
|
4
|
-
I want to know this command is not supported
|
|
5
|
-
So that I can avoid using it
|
|
6
|
-
|
|
7
|
-
Background:
|
|
8
|
-
Given the test server is started
|
|
9
|
-
|
|
10
|
-
Scenario: Unimplemented
|
|
11
|
-
Given a successful connection
|
|
12
|
-
When the client sends command "SITE"
|
|
13
|
-
Then the server returns an unimplemented command error
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
Feature: Size
|
|
2
|
-
|
|
3
|
-
As a client
|
|
4
|
-
I want to know the size of a file
|
|
5
|
-
So that I can tell how long it will take to get it
|
|
6
|
-
|
|
7
|
-
Background:
|
|
8
|
-
Given the test server is started
|
|
9
|
-
|
|
10
|
-
Scenario: ASCII file with *nix line endings
|
|
11
|
-
Given a successful login
|
|
12
|
-
And the server has file "ascii_unix"
|
|
13
|
-
When the client successfully gets size of text "ascii_unix"
|
|
14
|
-
Then the reported size should be "83"
|
|
15
|
-
|
|
16
|
-
Scenario: ASCII file with windows line endings
|
|
17
|
-
Given a successful login
|
|
18
|
-
And the server has file "ascii_windows"
|
|
19
|
-
When the client successfully gets size of text "ascii_windows"
|
|
20
|
-
Then the reported size should be "83"
|
|
21
|
-
|
|
22
|
-
Scenario: Binary file
|
|
23
|
-
Given a successful login
|
|
24
|
-
And the server has file "binary"
|
|
25
|
-
When the client successfully gets size of binary "binary"
|
|
26
|
-
Then the reported size should be "256"
|
|
27
|
-
|
|
28
|
-
Scenario: File in subdirectory
|
|
29
|
-
Given a successful login
|
|
30
|
-
And the server has file "foo/ascii_unix"
|
|
31
|
-
Then the client successfully gets size of text "foo/ascii_unix"
|
|
32
|
-
|
|
33
|
-
Scenario: Non-root working directory
|
|
34
|
-
Given a successful login
|
|
35
|
-
And the server has file "foo/ascii_unix"
|
|
36
|
-
And the client successfully cd's to "foo"
|
|
37
|
-
Then the client successfully gets size of text "ascii_unix"
|
|
38
|
-
|
|
39
|
-
Scenario: Access denied
|
|
40
|
-
Given a successful login
|
|
41
|
-
When the client gets size of text "forbidden"
|
|
42
|
-
Then the server returns an access denied error
|
|
43
|
-
|
|
44
|
-
Scenario: Missing file
|
|
45
|
-
Given a successful login
|
|
46
|
-
When the client gets size of text "foo"
|
|
47
|
-
Then the server returns a not found error
|
|
48
|
-
|
|
49
|
-
Scenario: Not logged in
|
|
50
|
-
Given a successful connection
|
|
51
|
-
When the client gets size of text "foo"
|
|
52
|
-
Then the server returns a not logged in error
|
|
53
|
-
|
|
54
|
-
Scenario: Missing path
|
|
55
|
-
Given a successful login
|
|
56
|
-
When the client gets size with no path
|
|
57
|
-
Then the server returns a syntax error
|
|
58
|
-
|
|
59
|
-
Scenario: File system error
|
|
60
|
-
Given a successful login
|
|
61
|
-
When the client gets size of text "unable"
|
|
62
|
-
Then the server returns an action not taken error
|
|
63
|
-
|
|
64
|
-
Scenario: Read not enabled
|
|
65
|
-
Given the test server lacks read
|
|
66
|
-
And a successful login
|
|
67
|
-
And the server has file "foo"
|
|
68
|
-
When the client gets size of text "foo"
|
|
69
|
-
Then the server returns an unimplemented command error
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
Feature: Status
|
|
2
|
-
|
|
3
|
-
As a client
|
|
4
|
-
I want server status
|
|
5
|
-
To know what state the server is in
|
|
6
|
-
|
|
7
|
-
Background:
|
|
8
|
-
Given the test server is started
|
|
9
|
-
|
|
10
|
-
Scenario: Not logged in
|
|
11
|
-
Given a successful connection
|
|
12
|
-
When the client requests status
|
|
13
|
-
Then the server returns a not logged in error
|
|
14
|
-
|
|
15
|
-
Scenario: Server status
|
|
16
|
-
Given a successful login
|
|
17
|
-
When the client successfully requests status
|
|
18
|
-
Then the server returns its title
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
def server
|
|
4
|
-
@server ||= TestServer.new
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
Given /^the test server is started$/ do
|
|
8
|
-
server.start
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
Given /^the test server has TLS mode "(\w+)"$/ do |mode|
|
|
12
|
-
server.tls = mode.to_sym
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
Given(/^the test server is bound to "(.*?)"$/) do |ip_address|
|
|
16
|
-
server.interface = ip_address
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
Given /^the test server has logging (enabled|disabled)$/ do |state|
|
|
20
|
-
server.logging = state == 'enabled'
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
Given /^the test server lacks (\w+)$/ do |feature|
|
|
24
|
-
server.send "#{feature}=", false
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
Given /^the test server has auth level "(.*?)"$/ do |auth_level|
|
|
28
|
-
auth_level = Ftpd.const_get(auth_level)
|
|
29
|
-
server.auth_level = auth_level
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
Given /^the test server has session timeout set to (\S+) seconds$/ do
|
|
33
|
-
|timeout|
|
|
34
|
-
server.session_timeout = timeout.to_f
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
Given /^the test server has session timeout disabled$/ do
|
|
38
|
-
server.session_timeout = nil
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
Given /^the test server disallows low data ports$/ do
|
|
42
|
-
server.allow_low_data_ports = false
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
Given /^the test server allows low data ports$/ do
|
|
46
|
-
server.allow_low_data_ports = true
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
Given /^the test server has max_connections set to (\d+)$/ do |s|
|
|
50
|
-
server.max_connections = s.to_i
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
Given /^the test server has max_connections_per_ip set to (\d+)$/ do |s|
|
|
54
|
-
server.max_connections_per_ip = s.to_i
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
Given /^the test server has no max failed login attempts$/ do
|
|
58
|
-
server.max_failed_logins = nil
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
Given /^the test server has a max of (\d+) failed login attempts$/ do |s|
|
|
62
|
-
server.max_failed_logins = s.to_i
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
Given /^the test server has a failed login delay of (\S+) seconds$/ do |s|
|
|
66
|
-
server.failed_login_delay = s.to_f
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
Given /^the test server has a NAT IP of (\S+)$/ do |s|
|
|
70
|
-
server.nat_ip = s
|
|
71
|
-
end
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
Feature: Structure Mount
|
|
2
|
-
|
|
3
|
-
As a client
|
|
4
|
-
I want to know this command is not supported
|
|
5
|
-
So that I can avoid using it
|
|
6
|
-
|
|
7
|
-
Background:
|
|
8
|
-
Given the test server is started
|
|
9
|
-
|
|
10
|
-
Scenario: Unimplemented
|
|
11
|
-
Given a successful connection
|
|
12
|
-
When the client sends command "SMNT"
|
|
13
|
-
Then the server returns an unimplemented command error
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
Feature: Syntax Errors
|
|
2
|
-
|
|
3
|
-
As a client
|
|
4
|
-
I want good error messages
|
|
5
|
-
So that I can figure out what went wrong
|
|
6
|
-
|
|
7
|
-
Background:
|
|
8
|
-
Given the test server is started
|
|
9
|
-
|
|
10
|
-
Scenario: Empty command
|
|
11
|
-
Given a successful connection
|
|
12
|
-
When the client sends an empty command
|
|
13
|
-
Then the server returns a syntax error
|
|
14
|
-
|
|
15
|
-
Scenario: Command contains non-word characters
|
|
16
|
-
Given a successful connection
|
|
17
|
-
When the client sends a non-word command
|
|
18
|
-
Then the server returns a syntax error
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
Feature: Port
|
|
2
|
-
|
|
3
|
-
As a client
|
|
4
|
-
I want to identify the server
|
|
5
|
-
So that I know how it will behave
|
|
6
|
-
|
|
7
|
-
Background:
|
|
8
|
-
Given the test server is started
|
|
9
|
-
|
|
10
|
-
Scenario: Success
|
|
11
|
-
Given a successful connection
|
|
12
|
-
When the client successfully queries system ID
|
|
13
|
-
Then the server returns a system ID reply
|
|
14
|
-
|
|
15
|
-
Scenario: With argument
|
|
16
|
-
Given a successful login
|
|
17
|
-
When the client sends "SYST 1"
|
|
18
|
-
Then the server returns a syntax error
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
Feature: Port
|
|
2
|
-
|
|
3
|
-
As a programmer
|
|
4
|
-
I want idle sessions to timeout and disconnect
|
|
5
|
-
So that I can claim RFC compliance
|
|
6
|
-
|
|
7
|
-
Scenario: Session idle too long
|
|
8
|
-
Given the test server has session timeout set to 0.5 seconds
|
|
9
|
-
And the test server is started
|
|
10
|
-
And a successful login
|
|
11
|
-
When the client is idle for 0.6 seconds
|
|
12
|
-
Then the client should not be connected
|
|
13
|
-
|
|
14
|
-
Scenario: Session not idle too long
|
|
15
|
-
Given the test server has session timeout set to 0.5 seconds
|
|
16
|
-
And the test server is started
|
|
17
|
-
And a successful login
|
|
18
|
-
When the client is idle for 0 seconds
|
|
19
|
-
Then the client should be connected
|
|
20
|
-
|
|
21
|
-
Scenario: Timeout disabled
|
|
22
|
-
Given the test server has session timeout disabled
|
|
23
|
-
And the test server is started
|
|
24
|
-
And a successful login
|
|
25
|
-
When the client is idle for 0.6 seconds
|
|
26
|
-
Then the client should be connected
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
Feature: Representation Type
|
|
2
|
-
|
|
3
|
-
As a client
|
|
4
|
-
I want to set the representation type
|
|
5
|
-
So that I can interoperate with foreign operating systems
|
|
6
|
-
|
|
7
|
-
Background:
|
|
8
|
-
Given the test server is started
|
|
9
|
-
|
|
10
|
-
Scenario: ASCII/default
|
|
11
|
-
Given a successful login
|
|
12
|
-
Then the client successfully sets type "A"
|
|
13
|
-
|
|
14
|
-
Scenario: ASCII/Non-print
|
|
15
|
-
Given a successful login
|
|
16
|
-
Then the client successfully sets type "A N"
|
|
17
|
-
|
|
18
|
-
Scenario: ASCII/Telnet
|
|
19
|
-
Given a successful login
|
|
20
|
-
When the client successfully sets type "A T"
|
|
21
|
-
|
|
22
|
-
Scenario: Type IMAGE
|
|
23
|
-
Given a successful login
|
|
24
|
-
Then the client successfully sets type "I"
|
|
25
|
-
|
|
26
|
-
Scenario: Type EBCDIC
|
|
27
|
-
Given a successful login
|
|
28
|
-
When the client sets type "E"
|
|
29
|
-
Then the server returns a type not implemented error
|
|
30
|
-
|
|
31
|
-
Scenario: Type Local
|
|
32
|
-
Given a successful login
|
|
33
|
-
When the client sets type "L 7"
|
|
34
|
-
Then the server returns a type not implemented error
|
|
35
|
-
|
|
36
|
-
Scenario: Invalid Type
|
|
37
|
-
Given a successful login
|
|
38
|
-
When the client sets type "*"
|
|
39
|
-
Then the server returns an invalid type error
|
|
40
|
-
|
|
41
|
-
Scenario: Format Carriage Control
|
|
42
|
-
Given a successful login
|
|
43
|
-
When the client sets type "A C"
|
|
44
|
-
Then the server returns a type not implemented error
|
|
45
|
-
|
|
46
|
-
Scenario: Invalid Format
|
|
47
|
-
Given a successful login
|
|
48
|
-
When the client sets type "A *"
|
|
49
|
-
Then the server returns an invalid type error
|
|
50
|
-
|
|
51
|
-
Scenario: Not logged in
|
|
52
|
-
Given a successful connection
|
|
53
|
-
When the client sets type "S"
|
|
54
|
-
Then the server returns a not logged in error
|
|
55
|
-
|
|
56
|
-
Scenario: Missing parameter
|
|
57
|
-
Given a successful login
|
|
58
|
-
When the client sets type with no parameter
|
|
59
|
-
Then the server returns a syntax error
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
When /^the client appends (.*)$/ do |args|
|
|
4
|
-
capture_error do
|
|
5
|
-
step "the client successfully appends #{args}"
|
|
6
|
-
end
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
When /^the client successfully appends text "(.*?)" onto "(.*?)"$/ do
|
|
10
|
-
|local_path, remote_path|
|
|
11
|
-
client.append_text local_path, remote_path
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
When /^the client successfully appends binary "(.*?)" onto "(.*?)"$/ do
|
|
15
|
-
|local_path, remote_path|
|
|
16
|
-
client.append_binary local_path, remote_path
|
|
17
|
-
end
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'singleton'
|
|
4
|
-
|
|
5
|
-
class Clients
|
|
6
|
-
|
|
7
|
-
include Singleton
|
|
8
|
-
|
|
9
|
-
def initialize
|
|
10
|
-
@clients = {}
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def [](client_name)
|
|
14
|
-
@clients[client_name] ||= TestClient.new
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def close
|
|
18
|
-
@clients.values.each(&:close)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def client(client_name = nil)
|
|
24
|
-
client_name ||= 'client'
|
|
25
|
-
client_name = client_name.strip
|
|
26
|
-
Clients.instance[client_name]
|
|
27
|
-
end
|