1d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden// Copyright 2016 Google Inc. All rights reserved.
2d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden//
3d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden// Licensed under the Apache License, Version 2.0 (the "License");
4d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden// you may not use this file except in compliance with the License.
5d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden// You may obtain a copy of the License at
6d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden//
7d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden//     http://www.apache.org/licenses/LICENSE-2.0
8d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden//
9d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden// Unless required by applicable law or agreed to in writing, software
10d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden// distributed under the License is distributed on an "AS IS" BASIS,
11d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden// See the License for the specific language governing permissions and
13d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden// limitations under the License.
14d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden
15d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Haydenpackage com.google.archivepatcher.shared;
16d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden
17d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Haydenimport org.junit.After;
18d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Haydenimport org.junit.Assert;
19d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Haydenimport org.junit.Before;
20d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Haydenimport org.junit.Test;
21d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Haydenimport org.junit.runner.RunWith;
22d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Haydenimport org.junit.runners.JUnit4;
23d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden
24d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Haydenimport java.io.File;
25d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Haydenimport java.io.FileOutputStream;
26d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Haydenimport java.io.IOException;
27d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden
28d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden/**
29d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden * Tests for {@link RandomAccessFileInputStreamFactory}.
30d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden */
31d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden@RunWith(JUnit4.class)
32d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden@SuppressWarnings("javadoc")
33d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Haydenpublic class RandomAccessFileInputStreamFactoryTest {
34d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden  /**
35d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden   * The object under test.
36d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden   */
37d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden  private RandomAccessFileInputStreamFactory factory = null;
38d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden
39d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden  /**
40d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden   * Test data written to the file.
41d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden   */
42d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden  private byte[] testData = null;
43d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden
44d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden  /**
45d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden   * The temp file.
46d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden   */
47d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden  private File tempFile = null;
48d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden
49d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden  @Before
50d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden  public void setup() throws IOException {
51d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden    testData = new byte[128];
52d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden    for (int x = 0; x < 128; x++) {
53d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden      testData[x] = (byte) x;
54d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden    }
55d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden    tempFile = File.createTempFile("ra-fist", "tmp");
56d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden    FileOutputStream out = new FileOutputStream(tempFile);
57d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden    out.write(testData);
58d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden    out.flush();
59d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden    out.close();
60d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden    tempFile.deleteOnExit();
61d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden    factory = new RandomAccessFileInputStreamFactory(tempFile, 0, testData.length);
62d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden  }
63d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden
64d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden  @After
65d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden  public void tearDown() {
66d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden    try {
67d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden      tempFile.delete();
68d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden    } catch (Exception ignored) {
69d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden      // Nothing to do
70d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden    }
71d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden  }
72d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden
73d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden  @Test
74d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden  public void testNewStream_MakesIdenticalStreams() throws IOException {
75d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden    RandomAccessFileInputStream rafis1 = factory.newStream();
76d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden    RandomAccessFileInputStream rafis2 = factory.newStream();
77d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden    try {
78d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden      Assert.assertNotSame(rafis1, rafis2);
79d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden      for (int x = 0; x < testData.length; x++) {
80d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden        Assert.assertEquals(x, rafis1.read());
81d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden        Assert.assertEquals(x, rafis2.read());
82d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden      }
83d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden      Assert.assertEquals(-1, rafis1.read());
84d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden      Assert.assertEquals(-1, rafis2.read());
85d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden    } finally {
86d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden      try {
87d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden        rafis1.close();
88d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden      } catch (Exception ignored) {
89d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden        // Nothing
90d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden      }
91d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden      try {
92d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden        rafis2.close();
93d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden      } catch (Exception ignored) {
94d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden        // Nothing
95d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden      }
96d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden    }
97d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden  }
98d84e46c30d0ea027d047ee4c75c040a173ec9ffcAndrew Hayden}
99