/*
 * Copyright 2008 the original author or authors.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.mockftpserver.fake.example;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.mockftpserver.fake.FakeFtpServer;
import org.mockftpserver.fake.filesystem.DirectoryEntry;
import org.mockftpserver.fake.filesystem.FileEntry;
import org.mockftpserver.fake.filesystem.FileSystem;
import org.mockftpserver.fake.filesystem.Permissions;
import org.mockftpserver.fake.filesystem.WindowsFakeFileSystem;
import org.mockftpserver.test.*;
import org.mockftpserver.test.AbstractTestCase;

/**
 * Example code illustrating how to programmatically configure a FakeFtpServer with a (simulated) Windows
 * filesystem, and including file/directory permissions.
 */
public class WindowsFakeFileSystemPermissionsTest extends AbstractTestCase implements IntegrationTest {

    private static final Logger LOG = LoggerFactory.getLogger(WindowsFakeFileSystemPermissionsTest.class);

    public void testFilesystemWithPermissions() throws Exception {

        final String USER1 = "joe";
        final String USER2 = "mary";
        final String GROUP = "dev";
        final String CONTENTS = "abcdef 1234567890";

        FileSystem fileSystem = new WindowsFakeFileSystem();
        DirectoryEntry directoryEntry1 = new DirectoryEntry("c:\\");
        directoryEntry1.setPermissions(new Permissions("rwxrwx---"));
        directoryEntry1.setOwner(USER1);
        directoryEntry1.setGroup(GROUP);

        DirectoryEntry directoryEntry2 = new DirectoryEntry("c:\\data");
        directoryEntry2.setPermissions(Permissions.ALL);
        directoryEntry2.setOwner(USER1);
        directoryEntry2.setGroup(GROUP);

        FileEntry fileEntry1 = new FileEntry("c:\\data\\file1.txt", CONTENTS);
        fileEntry1.setPermissionsFromString("rw-rw-rw-");
        fileEntry1.setOwner(USER1);
        fileEntry1.setGroup(GROUP);

        FileEntry fileEntry2 = new FileEntry("c:\\data\\run.exe");
        fileEntry2.setPermissionsFromString("rwxrwx---");
        fileEntry2.setOwner(USER2);
        fileEntry2.setGroup(GROUP);

        fileSystem.add(directoryEntry1);
        fileSystem.add(directoryEntry2);
        fileSystem.add(fileEntry1);
        fileSystem.add(fileEntry2);

        FakeFtpServer fakeFtpServer = new FakeFtpServer();
        fakeFtpServer.setFileSystem(fileSystem);

        LOG.info(fileSystem.toString());
    }

}
