# Copyright (c) 2014 The Chromium OS 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 dbus
import os
import shutil
import tarfile
import tempfile

from autotest_lib.client.bin import test
from autotest_lib.client.common_lib import error

class platform_DebugDaemonDumpDebugLogs(test.test):
    version = 1

    def runDump(self, compressed):
        filename = 'compressed_dump.tgz' if compressed else 'uncompressed_dump.tar'
        tmp_file = os.path.join(self.tmp_dir, filename)
        try:
            fh = os.open(tmp_file, os.O_TRUNC | os.O_CREAT | os.O_WRONLY)
            self.iface.DumpDebugLogs(compressed, fh, signature="bh")
        except:
            raise
        finally:
            os.close(fh)

        mode = 'r:gz' if compressed else 'r:'
        with tarfile.open(tmp_file, mode) as tar_file:
            if len(tar_file.getmembers()) == 0:
                raise error.TestFail("%s log file list is empty." %
                       "compressed" if compressed else "uncompressed")


    def run_once(self, *args, **kwargs):
        bus = dbus.SystemBus()
        proxy = bus.get_object('org.chromium.debugd', '/org/chromium/debugd')
        self.iface = dbus.Interface(proxy,
                                    dbus_interface='org.chromium.debugd')
        self.tmp_dir = tempfile.mkdtemp()
        self.runDump(True)
        self.runDump(False)
        if os.path.exists(self.tmp_dir):
            shutil.rmtree(self.tmp_dir)

