Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@ class DiagnosticsViewModelTest {
@Test
fun diagnosticsViewModel_createDiagnosticsFile_success() {
val diagnosticsFileName =
"ria_digidoc_${viewModel.getAppVersion()}.${viewModel.getAppVersionCode()}_diagnostics.log"
"ria_digidoc_${viewModel.getAppVersion()}.${viewModel.getAppVersionCode()}_diagnostics.txt"
val diagnosticsFilePath: String = File(context.filesDir.path, "diagnostics").path
val resultFile = viewModel.createDiagnosticsFile(context, configurationProvider)

Expand All @@ -305,7 +305,7 @@ class DiagnosticsViewModelTest {
@Test
fun diagnosticsViewModel_createLogFile_success() {
val diagnosticsLogsFilePath =
"ria_digidoc_${viewModel.getAppVersion()}.${viewModel.getAppVersionCode()}_logs.log"
"ria_digidoc_${viewModel.getAppVersion()}.${viewModel.getAppVersionCode()}_logs.txt"
val logFolder = FileUtil.getLogsDirectory(context)
val resultFile = viewModel.createLogFile(context)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,7 @@ fun DiagnosticsScreen(
.putExtra(
Intent.EXTRA_TITLE,
sanitizeString(logFile.name, ""),
).setType("text/x-log")
).setType("text/plain")
.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION),
null,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,9 @@ class DiagnosticsViewModel
) : ViewModel() {
private val logTag = "SettingsViewModel"
private val logsFileName =
"ria_digidoc_${getAppVersion()}.${getAppVersionCode()}_logs.log"
"ria_digidoc_${getAppVersion()}.${getAppVersionCode()}_logs.txt"
private val diagnosticsFileName =
"ria_digidoc_${getAppVersion()}.${getAppVersionCode()}_diagnostics.log"
"ria_digidoc_${getAppVersion()}.${getAppVersionCode()}_diagnostics.txt"

private val _updatedConfiguration = MutableLiveData<ConfigurationProvider?>()
var updatedConfiguration: LiveData<ConfigurationProvider?> = _updatedConfiguration
Expand Down
2 changes: 2 additions & 0 deletions commons-lib/src/main/kotlin/ee/ria/DigiDoc/common/Constant.kt
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,8 @@ object Constant {
const val DIR_EXTERNALLY_OPENED_FILES = "external_files"
const val DEFAULT_CONTAINER_EXTENSION = "asice"

const val LIBDIGIDOCPP_LOG_FILE_NAME = "libdigidocpp.txt"

const val CDOC1_EXTENSION = "cdoc"
const val CDOC2_EXTENSION = "cdoc2"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import android.widget.Toast
import androidx.preference.PreferenceManager
import ee.ria.DigiDoc.common.Constant.DIR_SIVA_CERT
import ee.ria.DigiDoc.common.Constant.DIR_TSA_CERT
import ee.ria.DigiDoc.common.Constant.LIBDIGIDOCPP_LOG_FILE_NAME
import ee.ria.DigiDoc.common.preferences.EncryptedPreferences
import ee.ria.DigiDoc.configuration.provider.ConfigurationProvider
import ee.ria.DigiDoc.configuration.repository.ConfigurationRepository
Expand Down Expand Up @@ -325,7 +326,7 @@ class Initialization
setLibdigidocppLogLevel(isLoggingEnabled)
DigiDocConf
.instance()
.setLogFile(File(logDirectory, "libdigidocpp.log").absolutePath)
.setLogFile(File(logDirectory, LIBDIGIDOCPP_LOG_FILE_NAME).absolutePath)
}

private fun setLibdigidocppLogLevel(isLoggingEnabled: Boolean) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ object FileUtil {
}
if (files != null) {
for (file in files) {
if (file.extension == "log") {
if (file.extension == "txt" && file.name != diagnosticsLogsFileName) {
val header = """

===== File: ${file.getName()} =====
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,14 @@ import android.content.Context
import android.content.SharedPreferences
import android.util.Log
import androidx.preference.PreferenceManager
import ee.ria.DigiDoc.common.Constant.LIBDIGIDOCPP_LOG_FILE_NAME
import ee.ria.DigiDoc.utilsLib.R.string.main_diagnostics_logging_key
import ee.ria.DigiDoc.utilsLib.R.string.main_diagnostics_logging_running_key
import ee.ria.DigiDoc.utilsLib.date.DateUtil.dateFormat
import ee.ria.DigiDoc.utilsLib.date.DateUtil.dateTimeFormat
import ee.ria.DigiDoc.utilsLib.file.FileUtil
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.util.Date
import java.util.TimeZone
Expand Down Expand Up @@ -71,6 +73,7 @@ class LoggingUtil
private lateinit var logger: Logger
private var fileHandler: FileHandler? = null
private var isLoggingEnabled: Boolean = false
private var hasResetLogs: Boolean = false

fun initialize(
context: Context,
Expand All @@ -91,21 +94,43 @@ class LoggingUtil
} catch (se: SecurityException) {
Log.e(LOG_TAG, "Unable to close logging FileHandler", se)
}
if (logDirectory.exists()) {
logDirectory.deleteRecursively()

logDirectory.listFiles()?.forEach { file ->
if (file.name == LIBDIGIDOCPP_LOG_FILE_NAME) {
emptyLibdigidocppLog(file)
} else {
file.deleteRecursively()
}
}

if (!logDirectory.exists()) {
logDirectory.mkdirs()
}
}

private fun emptyLibdigidocppLog(logFile: File) {
try {
FileOutputStream(logFile).close()
} catch (ioe: IOException) {
Log.e(LOG_TAG, "Unable to empty the libdigidocpp log", ioe)
}
}

private fun setupLogger(context: Context) {
try {
val logDirectory = FileUtil.getLogsDirectory(context)
val logFile = File(logDirectory, "${dateFormat.format(Date())}.log")
val logFile = File(logDirectory, "${dateFormat.format(Date())}.txt")

if (!hasResetLogs) {
resetLogs(logDirectory)
hasResetLogs = true
}

resetLogs(logDirectory)
if (!logDirectory.exists()) {
logDirectory.mkdirs()
}

removeHandlers()

fileHandler = FileHandler(logFile.absolutePath, Int.MAX_VALUE, 1, true)
fileHandler?.formatter = LogFormatter()
Expand All @@ -124,6 +149,18 @@ class LoggingUtil
}
}

private fun removeHandlers() {
try {
logger.handlers.forEach { handler ->
logger.removeHandler(handler)
handler.close()
}
} catch (se: SecurityException) {
Log.e(LOG_TAG, "Unable to remove existing logging handlers", se)
}
fileHandler = null
}

fun format(record: LogRecord): String {
val timestamp = dateTimeFormat.format(Date(record.millis))
val timeZone = TimeZone.getDefault().id
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,29 @@

package ee.ria.DigiDoc.utilsLib.logging

import android.content.Context
import ee.ria.DigiDoc.common.Constant.LIBDIGIDOCPP_LOG_FILE_NAME
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TemporaryFolder
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito.mock
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
import org.mockito.Mockito.`when`
import org.mockito.junit.MockitoJUnitRunner
import java.io.File
import java.util.logging.Logger

@RunWith(MockitoJUnitRunner::class)
class LoggingUtilTest {
@get:Rule
val temporaryFolder = TemporaryFolder()

@Mock
private lateinit var mockLogger: Logging

Expand Down Expand Up @@ -74,4 +88,43 @@ class LoggingUtilTest {

verify(mockLogger, times(1)).debugLog(tag, message, null)
}

@Test
fun loggingUtil_initialize_keepsExistingLogsWhenCalledAgain() {
val filesDirectory = temporaryFolder.newFolder()
val context = mock(Context::class.java)
`when`(context.filesDir).thenReturn(filesDirectory)

LoggingUtil.initialize(context, Logger.getLogger("loggingUtilTest"), true)

val libdigidocppLog = File(File(filesDirectory, "logs"), LIBDIGIDOCPP_LOG_FILE_NAME)
libdigidocppLog.writeText("libdigidocpp entry")

LoggingUtil.initialize(context, Logger.getLogger("loggingUtilTest"), true)

assertTrue(libdigidocppLog.exists())
}

@Test
fun loggingUtil_resetLogs_deletesExistingLogs() {
val logsDirectory = temporaryFolder.newFolder("logs")
val appLog = File(logsDirectory, "01.01.2026.txt")
appLog.writeText("app entry")

LoggingUtil.resetLogs(logsDirectory)

assertFalse(appLog.exists())
}

@Test
fun loggingUtil_resetLogs_emptiesLibdigidocppLogInsteadOfDeletingIt() {
val logsDirectory = temporaryFolder.newFolder("logs")
val libdigidocppLog = File(logsDirectory, LIBDIGIDOCPP_LOG_FILE_NAME)
libdigidocppLog.writeText("libdigidocpp entry")

LoggingUtil.resetLogs(logsDirectory)

assertTrue(libdigidocppLog.exists())
assertEquals(0L, libdigidocppLog.length())
}
}
Loading