1ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair/*
2ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Copyright 2008 the original author or authors.
3ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
4ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Licensed under the Apache License, Version 2.0 (the "License");
5ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * you may not use this file except in compliance with the License.
6ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * You may obtain a copy of the License at
7ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
8ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *      http://www.apache.org/licenses/LICENSE-2.0
9ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
10ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Unless required by applicable law or agreed to in writing, software
11ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * distributed under the License is distributed on an "AS IS" BASIS,
12ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * See the License for the specific language governing permissions and
14ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * limitations under the License.
15ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair */
16ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairpackage org.mockftpserver.fake.command
17ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
18ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.core.command.Command
19ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.core.command.CommandNames
20ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.core.command.ReplyCodes
21ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.fake.filesystem.FileEntry
22ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.fake.filesystem.FileSystemEntry
23ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.fake.filesystem.FileSystemException
24ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.fake.filesystem.Permissions
25ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
26ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair/**
27ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Abstract superclass for tests of Fake CommandHandlers that store a file (STOR, STOU, APPE)
28ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
29ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * @version $Revision: 80 $ - $Date: 2008-07-07 22:15:50 -0400 (Mon, 07 Jul 2008) $
30ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
31ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * @author Chris Mair
32ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair */
33ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairabstract class AbstractStoreFileCommandHandlerTest extends AbstractFakeCommandHandlerTest {
34ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
35ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    protected static final DIR = "/"
36ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    protected static final FILENAME = "file.txt"
37ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    protected static final FILE = p(DIR, FILENAME)
38ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    protected static final CONTENTS = "abc"
39ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
40ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    //-------------------------------------------------------------------------
41ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    // Tests Common to All Subclasses
42ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    //-------------------------------------------------------------------------
43ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
44ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testHandleCommand_NoWriteAccessToExistingFile() {
45ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        fileSystem.add(new FileEntry(path: FILE))
46ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        fileSystem.getEntry(FILE).permissions = Permissions.NONE
47ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        handleCommand([FILE])
48ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertSessionReply(ReplyCodes.WRITE_FILE_ERROR, ['filesystem.cannotWrite', FILE])
49ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
50ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
51ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testHandleCommand_NoWriteAccessToDirectoryForNewFile() {
52ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        fileSystem.getEntry(DIR).permissions = new Permissions('r-xr-xr-x')
53ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        handleCommand([FILE])
54ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertSessionReply(ReplyCodes.WRITE_FILE_ERROR, ['filesystem.cannotWrite', DIR])
55ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
56ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
57ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testHandleCommand_NoExecuteAccessToDirectory() {
58ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        fileSystem.add(new FileEntry(path: FILE))
59ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        fileSystem.getEntry(DIR).permissions = new Permissions('rw-rw-rw-')
60ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        handleCommand([FILE])
61ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertSessionReply(ReplyCodes.WRITE_FILE_ERROR, ['filesystem.cannotExecute', DIR])
62ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
63ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
64ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void testHandleCommand_ThrowsFileSystemException() {
65ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        fileSystem.addMethodException = new FileSystemException("bad", ERROR_MESSAGE_KEY)
66ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
67ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        handleCommand([FILE])
68ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertSessionReply(0, ReplyCodes.TRANSFER_DATA_INITIAL_OK)
69ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertSessionReply(1, ReplyCodes.WRITE_FILE_ERROR, ERROR_MESSAGE_KEY)
70ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
71ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
72ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    //-------------------------------------------------------------------------
73ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    // Abstract Method Declarations
74ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    //-------------------------------------------------------------------------
75ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
76ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
77ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Verify the created output file and return its full path
78ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @return the full path to the created output file; the path may be absolute or relative
79ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
80ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    protected abstract String verifyOutputFile()
81ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
82ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    //-------------------------------------------------------------------------
83ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    // Helper Methods
84ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    //-------------------------------------------------------------------------
85ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
86ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    protected void testHandleCommand(List parameters, String messageKey, String contents) {
87ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.dataToRead = CONTENTS.bytes
88ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        handleCommand(parameters)
89ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertSessionReply(0, ReplyCodes.TRANSFER_DATA_INITIAL_OK)
90ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assertSessionReply(1, ReplyCodes.TRANSFER_DATA_FINAL_OK, messageKey)
91ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
92ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        def outputFile = verifyOutputFile()
93ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
94ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        FileSystemEntry fileEntry = fileSystem.getEntry(outputFile)
95ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        def actualContents = fileEntry.createInputStream().text
96ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert actualContents == contents
97ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        assert fileEntry.permissions == userAccount.defaultPermissionsForNewFile
98ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
99ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
100ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    Command createValidCommand() {
101ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        return new Command(CommandNames.APPE, [FILE])
102ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
103ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
104ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    void setUp() {
105ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        super.setUp()
106ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        createDirectory(DIR)
107ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
108ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
109ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair}