#!/usr/bin/env python
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os
import unittest

import test_env
from test_case import TestCaseWithFuzzer


class DictionaryTest(TestCaseWithFuzzer):

    @property
    def dictionary(self):
        return self.fuzzer.dictionary

    def test_find_on_device(self):
        resource = self.ns.resource('dictionary')

        self.dictionary.find_on_device()
        self.assertFalse(self.dictionary.nspath)

        self.touch_on_device(self.ns.resource_abspath('dictionary'))
        self.dictionary.find_on_device()
        self.assertEqual(self.dictionary.nspath, resource)

    def test_replace(self):
        resource = self.ns.resource('dictionary')

        self.touch_on_device(self.ns.resource_abspath('dictionary'))
        self.assertEqual(self.dictionary.nspath, resource)

        # Missing local replacement
        local_dict = 'local_dict'
        self.assertError(
            lambda: self.dictionary.replace(local_dict),
            'No such file: {}'.format(local_dict))
        self.host.touch(local_dict)

        # Valid
        relpath = local_dict
        self.assertEqual(self.dictionary.nspath, resource)
        self.dictionary.replace(local_dict)
        self.assertEqual(self.dictionary.nspath, self.ns.data(relpath))
        self.assertScpTo(local_dict, self.ns.data_abspath(relpath))


if __name__ == '__main__':
    unittest.main()
