19cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton/*
29cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton * Copyright (C) 2017 The Android Open Source Project
39cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton *
49cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton * Licensed under the Apache License, Version 2.0 (the "License");
59cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton * you may not use this file except in compliance with the License.
69cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton * You may obtain a copy of the License at
79cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton *
89cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton *       http://www.apache.org/licenses/LICENSE-2.0
99cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton *
109cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton * Unless required by applicable law or agreed to in writing, software
119cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton * distributed under the License is distributed on an "AS IS" BASIS,
129cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton * See the License for the specific language governing permissions and
149cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton * limitations under the License.
159cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton */
169cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton
179c80550cbbe357a89e2abeeb9c7769fcaefc3a65Jake Whartonpackage androidx.core.util
189cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton
198770f84ffe4cf2ee98744f30ee8b4cd659a65633Jake Whartonimport android.support.test.filters.SdkSuppress
209cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Whartonimport android.util.AtomicFile
219c80550cbbe357a89e2abeeb9c7769fcaefc3a65Jake Whartonimport androidx.testutils.assertThrows
229cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Whartonimport org.junit.Assert.assertArrayEquals
239cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Whartonimport org.junit.Assert.assertEquals
249cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Whartonimport org.junit.Before
259cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Whartonimport org.junit.Rule
269cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Whartonimport org.junit.Test
279cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Whartonimport org.junit.rules.TemporaryFolder
289cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Whartonimport java.io.IOException
299cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton
308770f84ffe4cf2ee98744f30ee8b4cd659a65633Jake Wharton@SdkSuppress(minSdkVersion = 17)
319cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Whartonclass AtomicFileTest {
329cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton    @get:Rule val temporaryFolder = TemporaryFolder()
339cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton
349cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton    private lateinit var file: AtomicFile
359cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton
369cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton    @Before fun before() {
379cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        file = AtomicFile(temporaryFolder.newFile())
389cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton    }
399cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton
409cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton    @Test fun tryWriteSuccess() {
419cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        file.tryWrite {
429cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton            it.write(byteArrayOf(0, 1, 2))
439cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        }
449cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        val bytes = file.openRead().use { it.readBytes() }
459cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        assertArrayEquals(byteArrayOf(0, 1, 2), bytes)
469cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton    }
479cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton
489cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton    @Test fun tryWriteFail() {
499cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        val os = file.startWrite()
509cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        os.write(byteArrayOf(0, 1, 2))
519cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        file.finishWrite(os)
529cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton
539cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        val failure = IOException("Broken!")
549cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        assertThrows<IOException> {
559cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton            file.tryWrite {
569cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton                it.write(byteArrayOf(3, 4, 5))
579cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton                throw failure
589cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton            }
599cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        }.isSameAs(failure)
609cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton
619cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        val bytes = file.openRead().use { it.readBytes() }
629cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        assertArrayEquals(byteArrayOf(0, 1, 2), bytes)
639cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton    }
649cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton
659cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton    @Test fun writeBytes() {
669cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        file.writeBytes(byteArrayOf(0, 1, 2))
679cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton
689cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        val bytes = file.openRead().use { it.readBytes() }
699cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        assertArrayEquals(byteArrayOf(0, 1, 2), bytes)
709cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton    }
719cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton
729cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton    @Test fun writeText() {
739cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        file.writeText("Hey")
749cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton
759cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        val bytes = file.openRead().use { it.readBytes() }
769cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        assertArrayEquals(byteArrayOf(72, 101, 121), bytes)
779cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton    }
789cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton
799cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton    @Test fun writeTextCharset() {
809cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        file.writeText("Hey", charset = Charsets.UTF_16LE)
819cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton
829cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        val bytes = file.openRead().use { it.readBytes() }
839cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        assertArrayEquals(byteArrayOf(72, 0, 101, 0, 121, 0), bytes)
849cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton    }
859cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton
869cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton    @Test fun readBytes() {
879cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        val os = file.startWrite()
889cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        os.write(byteArrayOf(0, 1, 2))
899cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        file.finishWrite(os)
909cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton
919cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        assertArrayEquals(byteArrayOf(0, 1, 2), file.readBytes())
929cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton    }
939cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton
949cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton    @Test fun readText() {
959cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        val os = file.startWrite()
969cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        os.write(byteArrayOf(72, 101, 121))
979cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        file.finishWrite(os)
989cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton
999cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        assertEquals("Hey", file.readText())
1009cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton    }
1019cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton
1029cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton    @Test fun readTextCharset() {
1039cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        val os = file.startWrite()
1049cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        os.write(byteArrayOf(72, 0, 101, 0, 121, 0))
1059cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        file.finishWrite(os)
1069cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton
1079cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton        assertEquals("Hey", file.readText(charset = Charsets.UTF_16LE))
1089cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton    }
1099cb884da9674e8e590fbaa52f549f8cc52fd0958Jake Wharton}
110