/* * Copyright 2000-2009 JetBrains s.r.o. * * 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 com.intellij.history.core.storage; import com.intellij.history.core.LocalHistoryTestCase; import com.intellij.history.core.StoredContent; import com.intellij.history.core.StreamUtil; import com.intellij.history.core.changes.*; import com.intellij.history.core.tree.DirectoryEntry; import com.intellij.history.core.tree.Entry; import com.intellij.history.core.tree.FileEntry; import com.intellij.history.core.tree.RootEntry; import org.junit.Before; import org.junit.Test; import java.io.*; import java.util.List; public class StreamTest extends LocalHistoryTestCase { private DataInputStream is; private DataOutputStream os; @Before public void setUpStreams() throws IOException { PipedOutputStream pos = new PipedOutputStream(); os = new DataOutputStream(pos); is = new DataInputStream(new PipedInputStream(pos)); } @Test public void testString() throws Exception { StreamUtil.writeString(os, "hello"); assertEquals("hello", StreamUtil.readString(is)); } @Test public void testStringOrNull() throws Exception { StreamUtil.writeStringOrNull(os, "hello"); StreamUtil.writeStringOrNull(os, null); assertEquals("hello", StreamUtil.readStringOrNull(is)); assertNull(StreamUtil.readStringOrNull(is)); } @Test public void testFileEntry() throws Exception { Entry e = new FileEntry("file", new StoredContent(333), 123L, true); StreamUtil.writeEntry(os, e); Entry result = StreamUtil.readEntry(is); assertEquals(FileEntry.class, result.getClass()); assertEquals("file", result.getName()); assertEquals(333, ((StoredContent)result.getContent()).getContentId()); assertEquals(123L, result.getTimestamp()); assertTrue(result.isReadOnly()); } @Test public void testDoesNotWriteEntryParent() throws IOException { Entry parent = new DirectoryEntry(""); Entry e = new FileEntry("", new StoredContent(333), -1, false); parent.addChild(e); StreamUtil.writeEntry(os, e); assertNull(StreamUtil.readEntry(is).getParent()); } @Test public void testEmptyDirectoryEntry() throws IOException { Entry e = new DirectoryEntry("name"); StreamUtil.writeEntry(os, e); Entry result = StreamUtil.readEntry(is); assertEquals(DirectoryEntry.class, result.getClass()); assertEquals("name", result.getName()); } @Test public void testDirectoryEntryWithChildren() throws IOException { Entry dir = new DirectoryEntry(""); Entry subDir = new DirectoryEntry(""); dir.addChild(subDir); subDir.addChild(new FileEntry("a", new StoredContent(333), -1, false)); subDir.addChild(new FileEntry("b", new StoredContent(333), -1, false)); StreamUtil.writeEntry(os, dir); Entry result = StreamUtil.readEntry(is); List<Entry> children = result.getChildren(); assertEquals(1, children.size()); Entry e = children.get(0); assertEquals(DirectoryEntry.class, e.getClass()); assertSame(result, e.getParent()); children = e.getChildren(); assertEquals(2, children.size()); assertEquals(FileEntry.class, children.get(0).getClass()); assertSame(e, children.get(0).getParent()); assertEquals(FileEntry.class, children.get(1).getClass()); assertSame(e, children.get(1).getParent()); } @Test public void testCreateFileChange() throws IOException { Change c = new CreateFileChange(nextId(), "file"); StreamUtil.writeChange(os, c); Change read = StreamUtil.readChange(is); assertEquals(CreateFileChange.class, read.getClass()); CreateFileChange result = (CreateFileChange)read; assertEquals("file", result.getPath()); } @Test public void testCreateDirectoryChange() throws IOException { Change c = new CreateDirectoryChange(nextId(), "dir"); StreamUtil.writeChange(os, c); Change read = StreamUtil.readChange(is); assertEquals(CreateDirectoryChange.class, read.getClass()); CreateDirectoryChange result = (CreateDirectoryChange)read; assertEquals("dir", result.getPath()); } @Test public void testContentChange() throws IOException { Change c = new ContentChange(nextId(), "file", new StoredContent(333), 2L); StreamUtil.writeChange(os, c); Change read = StreamUtil.readChange(is); assertEquals(ContentChange.class, read.getClass()); ContentChange result = (ContentChange)read; assertEquals("file", result.getPath()); assertEquals(333, ((StoredContent)result.getOldContent()).getContentId()); assertEquals(2L, result.getOldTimestamp()); } @Test public void testDeleteChange() throws IOException { DirectoryEntry dir = new DirectoryEntry("dir"); dir.addChild(new FileEntry("file", new StoredContent(333), -1, false)); dir.addChild(new DirectoryEntry("subDir")); Change c = new DeleteChange(nextId(), "entry", dir); StreamUtil.writeChange(os, c); Change read = StreamUtil.readChange(is); assertEquals(DeleteChange.class, read.getClass()); DeleteChange result = (DeleteChange)read; assertEquals("entry", result.getPath()); Entry e = result.getDeletedEntry(); assertEquals(DirectoryEntry.class, e.getClass()); assertEquals("dir", e.getName()); assertEquals(2, e.getChildren().size()); assertEquals("dir/file", e.getChildren().get(0).getPath()); assertEquals("dir/subDir", e.getChildren().get(1).getPath()); } @Test public void testRenameChange() throws IOException { Change c = new RenameChange(nextId(), "new name", "old name"); StreamUtil.writeChange(os, c); Change read = StreamUtil.readChange(is); assertEquals(RenameChange.class, read.getClass()); RenameChange result = ((RenameChange)read); assertEquals("new name", result.getPath()); assertEquals("old name", result.getOldName()); } @Test public void testROStatusChange() throws IOException { Entry root = new RootEntry(); Change c = new ROStatusChange(nextId(), "f", true); StreamUtil.writeChange(os, c); Change read = StreamUtil.readChange(is); assertEquals(ROStatusChange.class, read.getClass()); ROStatusChange result = ((ROStatusChange)read); assertEquals("f", result.getPath()); assertEquals(true, result.getOldStatus()); } @Test public void testMoveChange() throws IOException { Change c = new MoveChange(nextId(), "dir2/file", "dir1"); StreamUtil.writeChange(os, c); Change read = StreamUtil.readChange(is); assertEquals(MoveChange.class, read.getClass()); MoveChange result = ((MoveChange)read); assertEquals("dir1/file", result.getOldPath()); assertEquals("dir2/file", result.getPath()); } @Test public void testPutLabelChange() throws IOException { Change c = new PutLabelChange(nextId(), "name", "projectId"); StreamUtil.writeChange(os, c); Change read = StreamUtil.readChange(is); assertEquals(PutLabelChange.class, read.getClass()); assertEquals("name", ((PutLabelChange)read).getName()); assertEquals("projectId", ((PutLabelChange)read).getProjectId()); } @Test public void testPutSystemLabelChange() throws IOException { Change c = new PutSystemLabelChange(nextId(), "name", "projectId", 123); StreamUtil.writeChange(os, c); Change read = StreamUtil.readChange(is); assertEquals(PutSystemLabelChange.class, read.getClass()); assertEquals("name", ((PutSystemLabelChange)read).getName()); assertEquals("projectId", ((PutSystemLabelChange)read).getProjectId()); assertEquals(123, ((PutSystemLabelChange)read).getColor()); } @Test public void testChangeSet() throws IOException { ChangeSet cs = cs(123, "name", new CreateFileChange(nextId(), "file")); cs.lock(); cs.write(os); ChangeSet read = new ChangeSet(is); ChangeSet result = read; assertEquals("name", read.getName()); assertEquals(123L, read.getTimestamp()); assertEquals(1, result.getChanges().size()); assertEquals(CreateFileChange.class, result.getChanges().get(0).getClass()); } @Test public void testChangeSetWithoutName() throws IOException { ChangeSet cs = cs((String)null); cs.lock(); cs.write(os); ChangeSet read = new ChangeSet(is); assertNull(read.getName()); } }