/*
 * Copyright 2013 Google Inc.
 * Copyright 2018 Andreas Schildbach
 *
 * 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.bitcoinj.store;

import static org.junit.Assert.assertEquals;

import java.io.File;

import org.bitcoinj.core.Address;
import org.bitcoinj.core.ECKey;
import org.bitcoinj.core.NetworkParameters;
import org.bitcoinj.core.StoredBlock;
import org.bitcoinj.params.UnitTestParams;
import org.junit.Before;
import org.junit.Test;

public class SPVBlockStoreTest {
    private static final NetworkParameters UNITTEST = UnitTestParams.get();

    @Test
    public void basics() throws Exception {
        File f = File.createTempFile("spvblockstore", null);
        f.delete();
        f.deleteOnExit();
        SPVBlockStore store = new SPVBlockStore(UNITTEST, f);

        Address to = Address.fromKey(UNITTEST, new ECKey());
        // Check the first block in a new store is the genesis block.
        StoredBlock genesis = store.getChainHead();
        assertEquals(UNITTEST.getGenesisBlock(), genesis.getHeader());
        assertEquals(0, genesis.getHeight());

        // Build a new block.
        StoredBlock b1 = genesis.build(genesis.getHeader().createNextBlock(to).cloneAsHeader());
        store.put(b1);
        store.setChainHead(b1);
        store.close();

        // Check we can get it back out again if we rebuild the store object.
        store = new SPVBlockStore(UNITTEST, f);
        StoredBlock b2 = store.get(b1.getHeader().getHash());
        assertEquals(b1, b2);
        // Check the chain head was stored correctly also.
        StoredBlock chainHead = store.getChainHead();
        assertEquals(b1, chainHead);
    }
}

@@ -1075,18 +1075,53 @@
 ();%0A
-%0A    @Test
+    private File blockStoreFile;%0A%0A    @Before
 %0A   
@@ -1137,14 +1137,13 @@
 oid 
-basics
+setup
 () t
@@ -1172,15 +1172,23 @@
     
+blockStore
 File 
-f 
 = Fi
@@ -1233,25 +1233,38 @@
 l);%0A        
-f
+blockStoreFile
 .delete();%0A 
@@ -1270,17 +1270,30 @@
         
-f
+blockStoreFile
 .deleteO
@@ -1297,24 +1297,85 @@
 teOnExit();%0A
+    %7D%0A%0A    @Test%0A    public void basics() throws Exception %7B%0A
         SPVB
@@ -1420,17 +1420,30 @@
 ITTEST, 
-f
+blockStoreFile
 );%0A%0A    
@@ -2067,17 +2067,30 @@
 ITTEST, 
-f
+blockStoreFile
 );%0A     
@@ -2331,11 +2331,469 @@
 );%0A    %7D
+%0A%0A    @Test(expected = BlockStoreException.class)%0A    public void twoStores_onSameFile() throws Exception %7B%0A        new SPVBlockStore(UNITTEST, blockStoreFile);%0A        new SPVBlockStore(UNITTEST, blockStoreFile);%0A    %7D%0A%0A    @Test%0A    public void twoStores_butSequentially() throws Exception %7B%0A        SPVBlockStore store = new SPVBlockStore(UNITTEST, blockStoreFile);%0A        store.close();%0A        store = new SPVBlockStore(UNITTEST, blockStoreFile);%0A    %7D
 %0A%7D%0A

Add tests for file locking.