1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.csuite.core;
18 
19 import com.google.common.annotations.VisibleForTesting;
20 import com.google.common.collect.ImmutableList;
21 
22 import org.junit.Assert;
23 
24 import java.nio.file.Files;
25 import java.nio.file.Path;
26 
27 public final class RoboLoginConfigProvider {
28     @VisibleForTesting static final String ROBOSCRIPT_FILE_SUFFIX = ".roboscript";
29     @VisibleForTesting static final String CRAWL_GUIDANCE_FILE_SUFFIX = "_cg.txt";
30     private static final String ROBOSCRIPT_CMD_FLAG = "--robo-script-file";
31     private static final String CRAWL_GUIDANCE_CMD_FLAG = "--text-guide-file";
32 
33     private final Path mLoginFilesDir;
34 
RoboLoginConfigProvider(Path loginFilesDir)35     public RoboLoginConfigProvider(Path loginFilesDir) {
36         Assert.assertTrue(
37                 "Please provide a valid directory that contains crawler login files.",
38                 Files.isDirectory(loginFilesDir));
39         this.mLoginFilesDir = loginFilesDir;
40     }
41 
42     /**
43      * Finds the config file to use from the given directory for the corresponding app package and
44      * returns the {@link RoboLoginConfig} that contains the resulting login arguments. The
45      * directory should contain only one config file per package name. If both Roboscript and
46      * CrawlGuidance files are present, only the Roboscript file will be used."
47      */
findConfigFor(String packageName, boolean isUtpClient)48     public RoboLoginConfig findConfigFor(String packageName, boolean isUtpClient) {
49         Path crawlGuidanceFile = mLoginFilesDir.resolve(packageName + CRAWL_GUIDANCE_FILE_SUFFIX);
50         Path roboScriptFile = mLoginFilesDir.resolve(packageName + ROBOSCRIPT_FILE_SUFFIX);
51 
52         if (Files.exists(roboScriptFile) && !isUtpClient) {
53             return new RoboLoginConfig(
54                     ImmutableList.of(ROBOSCRIPT_CMD_FLAG, roboScriptFile.toString()));
55         }
56 
57         if (Files.exists(crawlGuidanceFile) && !isUtpClient) {
58             return new RoboLoginConfig(
59                     ImmutableList.of(CRAWL_GUIDANCE_CMD_FLAG, crawlGuidanceFile.toString()));
60         }
61 
62         if (Files.exists(roboScriptFile) && isUtpClient) {
63             return new RoboLoginConfig(
64                     ImmutableList.of(
65                             "--crawler-asset", "robo.script=" + roboScriptFile.toString()));
66         }
67 
68         if (Files.exists(crawlGuidanceFile) && isUtpClient) {
69             return new RoboLoginConfig(
70                     ImmutableList.of("--crawl-guidance-proto-path", crawlGuidanceFile.toString()));
71         }
72 
73         return new RoboLoginConfig(ImmutableList.of());
74     }
75 
76     /*
77      * A class returned by RoboLoginConfigProvider that contains the login arguments
78      * to be passed to the crawler.
79      */
80     public static final class RoboLoginConfig {
81         private final ImmutableList<String> mLoginArgs;
82 
RoboLoginConfig(ImmutableList<String> loginArgs)83         public RoboLoginConfig(ImmutableList<String> loginArgs) {
84             this.mLoginArgs = loginArgs;
85         }
86 
87         /* Returns the login arguments for this config which can be passed to the crawler. */
getLoginArgs()88         public ImmutableList<String> getLoginArgs() {
89             return mLoginArgs;
90         }
91     }
92 }
93