aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/aedifex/command/deploy.lux
blob: 7cdba510da9a4f39699bd386e28dde195a841ea3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
(.using
 [library
  [lux "*"
   ["_" test {"+" Test}]
   [abstract
    [monad {"+" do}]]
   [control
    ["[0]" maybe]
    ["[0]" try {"+" Try}]
    [concurrency
     ["[0]" async {"+" Async}]]
    [parser
     ["[0]" environment]]]
   [data
    ["[0]" binary ("[1]#[0]" equivalence)]
    ["[0]" text ("[1]#[0]" equivalence)
     ["%" format {"+" format}]
     [encoding
      ["[0]" utf8]]]
    ["[0]" format "_"
     ["[1]" binary]
     ["[0]" tar]
     ["[0]" xml]]
    [collection
     ["[0]" set]]]
   [math
    ["[0]" random]]
   [world
    ["[0]" file]
    ["[0]" program {"+" Program}]]]]
 [program
  [compositor
   ["[0]" export]]]
 [//
  ["$[0]" install]
  ["$[0]" version]
  [//
   ["$[0]" profile]
   ["$[0]" repository]]]
 [\\program
  ["[0]" /
   ["//[1]" /// "_"
    ["[1]" profile]
    ["[1][0]" action]
    ["[1][0]" pom]
    ["[1][0]" hash]
    ["[1][0]" repository {"+" Repository}
     ["[1]/[0]" remote]]
    ["[1][0]" artifact {"+" Artifact}
     ["[1]/[0]" extension]]]]])

(def: (execute! program repository fs artifact profile)
  (-> (Program Async) (Repository Async) (file.System Async)
      Artifact ///.Profile
      (Async (Try Text)))
  (do ///action.monad
    [.let [console ($version.echo "")]
     _ ($install.make_sources! fs (the ///.#sources profile))
     _ (/.do! console repository fs artifact profile)]
    (# console read_line [])))

(def: .public test
  Test
  (<| (_.covering /._)
      (do [! random.monad]
        [[artifact expected_pom profile]
         (random.one (function (_ profile)
                       (do maybe.monad
                         [artifact (the ///.#identity profile)
                          expected_pom (try.maybe (///pom.write profile))]
                         (in [artifact expected_pom profile])))
                     $profile.random)
         
         home (random.ascii/alpha 5)
         working_directory (random.ascii/alpha 5)
         .let [repository (///repository.mock $repository.mock
                                              $repository.empty)
               fs (file.mock (# file.default separator))
               program (program.async (program.mock environment.empty home working_directory))]]
        (in (do [! async.monad]
              [verdict (do [! ///action.monad]
                         [logging (..execute! program repository fs artifact profile)
                          expected_library (|> profile
                                               (the ///.#sources)
                                               set.list
                                               (export.library fs)
                                               (# ! each (format.result tar.writer)))

                          actual_pom (# repository download (///repository/remote.uri (the ///artifact.#version artifact) artifact ///artifact/extension.pom))
                          actual_library (# repository download (///repository/remote.uri (the ///artifact.#version artifact) artifact ///artifact/extension.lux_library))
                          actual_sha-1 (# repository download (///repository/remote.uri (the ///artifact.#version artifact) artifact (format ///artifact/extension.lux_library ///artifact/extension.sha-1)))
                          actual_sha-1 (# async.monad in
                                          (do try.monad
                                            [actual_sha-1 (# utf8.codec decoded actual_sha-1)]
                                            (# ///hash.sha-1_codec decoded actual_sha-1)))
                          actual_md5 (# repository download (///repository/remote.uri (the ///artifact.#version artifact) artifact (format ///artifact/extension.lux_library ///artifact/extension.md5)))
                          actual_md5 (# async.monad in
                                        (do try.monad
                                          [actual_md5 (# utf8.codec decoded actual_md5)]
                                          (# ///hash.md5_codec decoded actual_md5)))

                          .let [succeeded!
                                (text#= /.success logging)

                                deployed_library!
                                (binary#= expected_library
                                          actual_library)

                                deployed_pom!
                                (binary#= (|> expected_pom (# xml.codec encoded) (# utf8.codec encoded))
                                          actual_pom)

                                deployed_sha-1!
                                (# ///hash.equivalence =
                                   (///hash.sha-1 expected_library)
                                   actual_sha-1)

                                deployed_md5!
                                (# ///hash.equivalence =
                                   (///hash.md5 expected_library)
                                   actual_md5)]]
                         (in (and succeeded!
                                  deployed_library!
                                  deployed_pom!
                                  deployed_sha-1!
                                  deployed_md5!)))]
              (_.cover' [/.do! /.success]
                        (try.else false verdict)))))))