aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/aedifex/command/deploy.lux
blob: 62c1ef931622e255978d951470e1e76ed3d308f3 (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 (value@ ///.#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 (value@ ///.#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
                                               (value@ ///.#sources)
                                               set.list
                                               (export.library fs)
                                               (# ! each (format.result tar.writer)))

                          actual_pom (# repository download (///repository/remote.uri (value@ ///artifact.#version artifact) artifact ///artifact/extension.pom))
                          actual_library (# repository download (///repository/remote.uri (value@ ///artifact.#version artifact) artifact ///artifact/extension.lux_library))
                          actual_sha-1 (# repository download (///repository/remote.uri (value@ ///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 (value@ ///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)))))))